+ added readme
* fixed timebased movement & maxfps
This commit is contained in:
parent
39af185188
commit
cecfe55ba5
6 changed files with 109 additions and 10 deletions
4
KKK/README.md
Normal file
4
KKK/README.md
Normal 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
36
KKK/game/include/config.h
Normal 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:
|
||||
}
|
|
@ -11,6 +11,7 @@ namespace endofthejedi {
|
|||
|
||||
class GLWindow {
|
||||
private:
|
||||
//X-related stuff
|
||||
Display* m_display;
|
||||
Window m_rootwnd;
|
||||
GLint m_attributes[23] =
|
||||
|
@ -35,25 +36,44 @@ class GLWindow {
|
|||
GLXContext m_glcontext;
|
||||
XWindowAttributes m_gwa;
|
||||
Atom m_atomWmDeleteWindow;
|
||||
//End of X related stuff
|
||||
|
||||
unsigned int m_width;
|
||||
unsigned int m_height;
|
||||
|
||||
//mainloop condition
|
||||
bool m_running = false;
|
||||
|
||||
double m_fps;
|
||||
//if maxfps = 0 there's no fps limit
|
||||
double m_maxfps;
|
||||
|
||||
void handleevents();
|
||||
|
||||
protected:
|
||||
virtual void handle(XEvent event);
|
||||
//ancestors shall override these methods
|
||||
virtual void init();
|
||||
//called by mainloop periodically
|
||||
//time shall be used for timebased movement
|
||||
virtual void render(double time);
|
||||
//called by handle on window 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:
|
||||
//initializes the X Window & creates an OpenGL context
|
||||
GLWindow(unsigned int width, unsigned int height);
|
||||
~GLWindow();
|
||||
|
||||
//mainloop does event handling & calls render/swap
|
||||
void loop();
|
||||
void stop();
|
||||
void swap();
|
||||
//stops the mainloop by setting m_running false
|
||||
void stop();
|
||||
|
||||
//getters
|
||||
unsigned int getheight() const {
|
||||
return m_height;
|
||||
}
|
||||
|
@ -61,6 +81,23 @@ class GLWindow {
|
|||
unsigned int getwidth() const {
|
||||
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
2
KKK/game/src/config.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
#include <include/config.h>
|
||||
|
|
@ -31,6 +31,7 @@ public:
|
|||
|
||||
int main(int argc, const char *argv[]) {
|
||||
MainWindow window(500, 500);
|
||||
window.setmaxfps(60);
|
||||
window.loop();
|
||||
window.stop();
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <iostream>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define UNUSED(foo) (void)foo;
|
||||
|
||||
|
@ -73,6 +74,14 @@ endofthejedi::GLWindow::~GLWindow() {
|
|||
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) {
|
||||
if (event.type == Expose) {
|
||||
XWindowAttributes attribs;
|
||||
|
@ -93,25 +102,35 @@ void endofthejedi::GLWindow::swap() { glXSwapBuffers(m_display, m_window); }
|
|||
|
||||
void endofthejedi::GLWindow::loop() {
|
||||
m_running = true;
|
||||
|
||||
timespec prev;
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &prev);
|
||||
timespec current;
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, &prev);
|
||||
clock_gettime(CLOCK_MONOTONIC_RAW, ¤t);
|
||||
|
||||
double delta = 0.0;
|
||||
double sleeptime = 0.0;
|
||||
|
||||
while (m_running) {
|
||||
|
||||
if (XPending(m_display) > 0) {
|
||||
XEvent xev;
|
||||
XNextEvent(m_display, &xev);
|
||||
handle(xev);
|
||||
}
|
||||
|
||||
handleevents();
|
||||
render(delta);
|
||||
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, ¤t);
|
||||
delta = diff(prev, current).tv_nsec;
|
||||
prev = current;
|
||||
if(delta > 0.0) {
|
||||
m_fps = (1000000000.0/delta);
|
||||
std::cout << m_fps << "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue