+ added readme

* fixed timebased movement & maxfps
This commit is contained in:
End 2016-09-14 04:14:39 +02:00
parent 39af185188
commit cecfe55ba5
6 changed files with 109 additions and 10 deletions

4
KKK/README.md Normal file
View file

@ -0,0 +1,4 @@
Klassische Kepler Kriege
===
Game based on NewtonWars (https://github.com/Draradech/NewtonWars), rewritten in C++ with some more fancy OpenGL shitz.

36
KKK/game/include/config.h Normal file
View file

@ -0,0 +1,36 @@
#pragma once
#include <stdlib>
#include <stdio>
struct Config {
int maxPlayers;
int numPlanets;
int maxSegments;
int segmentSteps;
int numShots;
int fastmode;
int fullscreen;
int timeout;
int margintop;
int marginleft;
int marginright;
int marginbottom;
double playerSize;
int energy;
int realtime;
int debug;
double battlefieldW;
double battlefieldH;
int throttle;
char* ip;
char* message;
int pot;
int area;
};
class ConfigParser{
private:
protected:
public:
}

View file

@ -11,6 +11,7 @@ namespace endofthejedi {
class GLWindow { class GLWindow {
private: private:
//X-related stuff
Display* m_display; Display* m_display;
Window m_rootwnd; Window m_rootwnd;
GLint m_attributes[23] = GLint m_attributes[23] =
@ -35,25 +36,44 @@ class GLWindow {
GLXContext m_glcontext; GLXContext m_glcontext;
XWindowAttributes m_gwa; XWindowAttributes m_gwa;
Atom m_atomWmDeleteWindow; Atom m_atomWmDeleteWindow;
//End of X related stuff
unsigned int m_width; unsigned int m_width;
unsigned int m_height; unsigned int m_height;
//mainloop condition
bool m_running = false; bool m_running = false;
double m_fps;
//if maxfps = 0 there's no fps limit
double m_maxfps;
void handleevents();
protected: protected:
virtual void handle(XEvent event); //ancestors shall override these methods
virtual void init(); virtual void init();
//called by mainloop periodically
//time shall be used for timebased movement
virtual void render(double time); virtual void render(double time);
//called by handle on window resize
virtual void resize(); virtual void resize();
//the ancestor should call the handle function in this class, too,
//as it handles the close calls & resizing
virtual void handle(XEvent event);
public: public:
//initializes the X Window & creates an OpenGL context
GLWindow(unsigned int width, unsigned int height); GLWindow(unsigned int width, unsigned int height);
~GLWindow(); ~GLWindow();
//mainloop does event handling & calls render/swap
void loop(); void loop();
void stop();
void swap(); void swap();
//stops the mainloop by setting m_running false
void stop();
//getters
unsigned int getheight() const { unsigned int getheight() const {
return m_height; return m_height;
} }
@ -61,6 +81,23 @@ class GLWindow {
unsigned int getwidth() const { unsigned int getwidth() const {
return m_width; return m_width;
} }
double get_maxfps() const {
return m_maxfps;
}
double get_fps() const {
return m_fps;
}
bool get_running() const {
return m_running;
}
//setters
void set_maxfps(const double maxfps) {
m_maxfps = maxfps;
}
}; };
} }

2
KKK/game/src/config.cpp Normal file
View file

@ -0,0 +1,2 @@
#include <include/config.h>

View file

@ -31,6 +31,7 @@ public:
int main(int argc, const char *argv[]) { int main(int argc, const char *argv[]) {
MainWindow window(500, 500); MainWindow window(500, 500);
window.setmaxfps(60);
window.loop(); window.loop();
window.stop(); window.stop();
} }

View file

@ -2,6 +2,7 @@
#include <iostream> #include <iostream>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h>
#define UNUSED(foo) (void)foo; #define UNUSED(foo) (void)foo;
@ -73,6 +74,14 @@ endofthejedi::GLWindow::~GLWindow() {
XCloseDisplay(m_display); XCloseDisplay(m_display);
} }
void endofthejedi::GLWindow::handleevents() {
if (XPending(m_display) > 0) {
XEvent xev;
XNextEvent(m_display, &xev);
handle(xev);
}
}
void endofthejedi::GLWindow::handle(XEvent event) { void endofthejedi::GLWindow::handle(XEvent event) {
if (event.type == Expose) { if (event.type == Expose) {
XWindowAttributes attribs; XWindowAttributes attribs;
@ -93,25 +102,35 @@ void endofthejedi::GLWindow::swap() { glXSwapBuffers(m_display, m_window); }
void endofthejedi::GLWindow::loop() { void endofthejedi::GLWindow::loop() {
m_running = true; m_running = true;
timespec prev; timespec prev;
clock_gettime(CLOCK_MONOTONIC_RAW, &prev);
timespec current; timespec current;
clock_gettime(CLOCK_MONOTONIC_RAW, &prev);
clock_gettime(CLOCK_MONOTONIC_RAW, &current); clock_gettime(CLOCK_MONOTONIC_RAW, &current);
double delta = 0.0; double delta = 0.0;
double sleeptime = 0.0;
while (m_running) { while (m_running) {
handleevents();
if (XPending(m_display) > 0) {
XEvent xev;
XNextEvent(m_display, &xev);
handle(xev);
}
render(delta); render(delta);
swap(); swap();
if (m_maxfps > 0) {
sleeptime = ((1000000000.0/m_maxfps) - delta) + sleeptime;
if (sleeptime > 0.0) {
usleep((unsigned int)(sleeptime/1000.0));
sleeptime = sleeptime - (unsigned int)(sleeptime/1000.0);
}
}
clock_gettime(CLOCK_MONOTONIC_RAW, &current); clock_gettime(CLOCK_MONOTONIC_RAW, &current);
delta = diff(prev, current).tv_nsec; delta = diff(prev, current).tv_nsec;
prev = current; prev = current;
if(delta > 0.0) {
m_fps = (1000000000.0/delta);
std::cout << m_fps << "\n";
}
} }
} }