+ added readme
* fixed timebased movement & maxfps
This commit is contained in:
parent
39af185188
commit
cecfe55ba5
6 changed files with 109 additions and 10 deletions
KKK
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 {
|
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
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[]) {
|
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, ¤t);
|
clock_gettime(CLOCK_MONOTONIC_RAW, ¤t);
|
||||||
|
|
||||||
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, ¤t);
|
clock_gettime(CLOCK_MONOTONIC_RAW, ¤t);
|
||||||
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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue