We now have FPS

This commit is contained in:
Thomas 2022-01-04 12:04:04 +01:00
parent c257c24488
commit 41399e6c19
No known key found for this signature in database
GPG Key ID: E538821A6CDFDAD7
9 changed files with 98 additions and 51 deletions

View File

@ -40,9 +40,9 @@ private:
void handleScoreSaving(); void handleScoreSaving();
// drawing methods // drawing methods
void display() const; void display(unsigned fps) const;
void displayGod() const; void displayGod() const;
void displayInvader(const Position& basePos, unsigned size, InvaderType type) const; void displayInvader(const Position& basePos, InvaderType type) const;
// managers // managers
@ -59,6 +59,7 @@ private:
bool invadersTouchPlayer() const; bool invadersTouchPlayer() const;
// god things // god things
void awakeGod();
void manageGod(); void manageGod();
void _manageGod_retrieve(bool back); void _manageGod_retrieve(bool back);

View File

@ -5,7 +5,7 @@
enum class GodState{ enum class GodState{
NONE, NONE,
LOAD, AWAKE,
WAIT, WAIT,
RETRIEVE1, RETRIEVE1,
RETRIEVE2, RETRIEVE2,

View File

@ -8,11 +8,11 @@
#include "mingl/shape/rectangle.h" #include "mingl/shape/rectangle.h"
#include "mingl/shape/circle.h" #include "mingl/shape/circle.h"
#include "mingl/gui/sprite.h" #include "mingl/gui/sprite.h"
#include "mingl/gui/text.h"
#include "utils.h" #include "utils.h"
#include "playMode.h" #include "playMode.h"
using namespace std; using namespace std;
using namespace nsGraphics;
class PixelManager{ class PixelManager{
public: public:
@ -39,6 +39,8 @@ public:
void drawSprite(nsGui::Sprite& sprite, const Position& pos) const; void drawSprite(nsGui::Sprite& sprite, const Position& pos) const;
void drawBackground() const; void drawBackground() const;
void drawFPS(unsigned fps) const;
PlayMode showInitialMenu() const; PlayMode showInitialMenu() const;
bool showDeathMenu() const; bool showDeathMenu() const;
unsigned getScreenHeight() const; unsigned getScreenHeight() const;

View File

@ -11,14 +11,17 @@
// ou alors faire une method dans Game ? // ou alors faire une method dans Game ?
#define INV_POS(i) confData.invadersSize*(i)+confData.invadersDistance*(i) #define INV_POS(i) confData.invadersSize*(i)+confData.invadersDistance*(i)
using namespace std;
using nsGraphics::RGBAcolor;
enum class WinValue{ enum class WinValue{
NOBODY, // should never be used NOBODY, // should never be used
PLAYERS, PLAYERS,
INVADERS, INVADERS,
}; };
using namespace std;
enum class InvaderType { enum class InvaderType {
TYPEA, TYPEA,
TYPEB, TYPEB,

View File

@ -2,9 +2,9 @@
/** Displays the screen once, and returns /** Displays the screen once, and returns
* * The more important stuff must be drawn last
*/ */
void Game::display() const { void Game::display(unsigned fps) const {
pm.drawBackground(); pm.drawBackground();
for (unsigned i = 0; i < this->grid.size(); ++i){ for (unsigned i = 0; i < this->grid.size(); ++i){
for (unsigned j = 0; j < this->grid[i].size(); ++j){ for (unsigned j = 0; j < this->grid[i].size(); ++j){
@ -12,7 +12,7 @@ void Game::display() const {
basePos.getX() + i * confData.invadersSize + i * confData.invadersDistance, basePos.getX() + i * confData.invadersSize + i * confData.invadersDistance,
basePos.getY() + j * confData.invadersSize + j * confData.invadersDistance basePos.getY() + j * confData.invadersSize + j * confData.invadersDistance
); );
displayInvader(vec, confData.invadersSize, grid[i][j]); displayInvader(vec, grid[i][j]);
} }
} }
@ -28,22 +28,25 @@ void Game::display() const {
} }
displayGod(); displayGod();
pm.drawFPS(fps);
} }
void Game::displayInvader(const Position& pos, unsigned size, InvaderType type) const { void Game::displayInvader(const Position& pos, InvaderType type) const {
if(type==InvaderType::NONE)return; if(type==InvaderType::NONE)return;
InvaderTypeDef invDef = confData.invadersDef.at(type); InvaderTypeDef invDef = confData.invadersDef.at(type);
switch(type){ switch(type){
case InvaderType::TYPEA:{ case InvaderType::TYPEA:{
pm.drawInvaderA(pos, size, invDef.color); pm.drawInvaderA(pos, confData.invadersSize, invDef.color);
return; return;
} }
case InvaderType::TYPEB:{ case InvaderType::TYPEB:{
pm.drawInvaderB(pos, size, invDef.color); pm.drawInvaderB(pos, confData.invadersSize, invDef.color);
return; return;
} }
case InvaderType::TYPEC:{ case InvaderType::TYPEC:{
pm.drawInvaderC(pos, size, invDef.color); pm.drawInvaderC(pos, confData.invadersSize, invDef.color);
return; return;
} }
} }
@ -58,7 +61,7 @@ void Game::displayGod() const {
switch (god.state) { switch (god.state) {
case GodState::NONE: case GodState::NONE:
return; return;
case GodState::LOAD: { case GodState::AWAKE: {
pm.displayGodBench(god.counter - GOD_BENCH_SIZE); pm.displayGodBench(god.counter - GOD_BENCH_SIZE);
Position leftHand = Position(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, god.counter - GOD_BENCH_SIZE); Position leftHand = Position(pm.getScreenWidth()-GOD_HAND_DISTANCE-GOD_HAND_SIZE, god.counter - GOD_BENCH_SIZE);
@ -93,17 +96,19 @@ void Game::displayGod() const {
} }
case GodState::RETRIEVE2:{ case GodState::RETRIEVE2:{
// similar with RETRIEVE1 // similar with RETRIEVE1
Position startPos(GOD_HAND_DISTANCE, 0); Position pos(GOD_HAND_DISTANCE, 0);
Position endPos = basePos+Position(INV_POS(god.throwedInvPos.getX()), INV_POS(god.throwedInvPos.getY())); Position endPos = basePos+Position(INV_POS(god.throwedInvPos.getX()), INV_POS(god.throwedInvPos.getY()));
applyBezier(startPos, god.thrownTransition, 1-(god.counter/100)); applyBezier(pos, god.thrownTransition, 1 - (god.counter / 100));
applyBezier(startPos, endPos, 1-(god.counter/100)); applyBezier(pos, endPos, 1 - (god.counter / 100));
pm.displayGodRightHand(startPos); pm.displayGodRightHand(pos);
pm.displayGodLeftHand(Position(GOD_HAND_DISTANCE, 0)); pm.displayGodLeftHand(Position(GOD_HAND_DISTANCE, 0));
// TODO maybe a little transition to pos to better reflect the invader's position ?
// but now, you come with me you invader ! // but now, you come with me you invader !
// pm.drawInvader1(); displayInvader(pos, god.thrownInvType);
break; break;
} }
case GodState::THROW:{ case GodState::THROW:{

View File

@ -83,14 +83,25 @@ WinValue Game::playGame(){ // returns when game is finished
basePos = Position(200, 0); basePos = Position(200, 0);
// GAMELOOP // GAMELOOP
#define MAX_FPS 1000 #define MAX_FPS 60
chrono::milliseconds fpsTime;
unsigned tmpFps = 0;
unsigned fps = 0;
while(window.isOpen()){ while(window.isOpen()){
auto targetTime = chrono::high_resolution_clock::now() + chrono::duration<double, ratio<1, MAX_FPS>>(1); chrono::time_point startTime = chrono::high_resolution_clock::now();
pm.startFrame(); pm.startFrame();
managePlayers(); managePlayers();
if(manageInvaders() && invadersTouchPlayer())return WinValue::INVADERS; if(manageInvaders()) { // if they went down
if (invadersTouchPlayer())return WinValue::INVADERS;
// TODO abstract this ?
if (basePos.getY() > 200 /*lambda value*/ && god.state==GodState::NONE) {
cout << "hey" << endl;
awakeGod();
}
}
moveMissiles(); moveMissiles();
remCollidingProjectiles(); remCollidingProjectiles();
@ -100,11 +111,23 @@ WinValue Game::playGame(){ // returns when game is finished
if(checkMissilesAndPlayers())return WinValue::INVADERS; if(checkMissilesAndPlayers())return WinValue::INVADERS;
if(checkTorpedosAndInvaders())return WinValue::PLAYERS; if(checkTorpedosAndInvaders())return WinValue::PLAYERS;
display(); display(fps);
pm.endFrame(); pm.endFrame();
this_thread::sleep_until(targetTime); chrono::time_point endTime = chrono::high_resolution_clock::now();
chrono::milliseconds frameTime = chrono::duration_cast<chrono::milliseconds>(endTime-startTime);
fpsTime = fpsTime + frameTime;
if(fpsTime>chrono::seconds(1)){
fps = tmpFps;
tmpFps = 0;
fpsTime = chrono::milliseconds(0);
}else ++tmpFps;
// old implementation, too volatile
// cout << "FPS : " << chrono::milliseconds(1000)/frameTime << endl;
this_thread::sleep_until(startTime+chrono::duration<double, ratio<1, MAX_FPS>>(1));
} }
return WinValue::NOBODY; return WinValue::NOBODY;
} }

View File

@ -1,11 +1,16 @@
#include "game.h" #include "game.h"
void Game::awakeGod() {
god.counter = 0;
god.state = GodState::AWAKE;
}
void Game::manageGod(){ void Game::manageGod(){
switch(god.state){ switch(god.state){
case GodState::NONE:{ case GodState::NONE:{
return; return;
} }
case GodState::LOAD:{ case GodState::AWAKE:{
if(god.counter==GOD_BENCH_SIZE){ if(god.counter==GOD_BENCH_SIZE){
god.counter = 0; god.counter = 0;
god.state = GodState::WAIT; god.state = GodState::WAIT;

View File

@ -1,6 +1,10 @@
#include <playMode.h> #include <playMode.h>
#include "pixelManager.h" #include "pixelManager.h"
#include "utils.h" #include "utils.h"
#include "god.h"
using namespace nsShape;
PixelManager::PixelManager(MinGL& a) : window(a) { PixelManager::PixelManager(MinGL& a) : window(a) {
window.initGlut(); window.initGlut();
@ -9,40 +13,40 @@ PixelManager::PixelManager(MinGL& a) : window(a) {
void PixelManager::drawInvaderA(const Position& baseVector, unsigned size, const RGBAcolor& color) const { void PixelManager::drawInvaderA(const Position& baseVector, unsigned size, const RGBAcolor& color) const {
float scale = size/(float)100; float scale = size/(float)100;
window << nsShape::Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGray); window << Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGray);
window << nsShape::Triangle(Position(35*scale, 50*scale)+baseVector, Position(15*scale, 25*scale)+baseVector, Position(15*scale, 75*scale)+baseVector, nsGraphics::KBlack); window << Triangle(Position(35*scale, 50*scale)+baseVector, Position(15*scale, 25*scale)+baseVector, Position(15*scale, 75*scale)+baseVector, nsGraphics::KBlack);
window << nsShape::Triangle(Position(25*scale, 50*scale)+baseVector, Position(10*scale, 25*scale)+baseVector, Position(10*scale, 75*scale)+baseVector, nsGraphics::KGray); window << Triangle(Position(25*scale, 50*scale)+baseVector, Position(10*scale, 25*scale)+baseVector, Position(10*scale, 75*scale)+baseVector, nsGraphics::KGray);
window << nsShape::Triangle(Position(65*scale, 50*scale)+baseVector, Position(85*scale, 25*scale)+baseVector, Position(85*scale, 75*scale)+baseVector, nsGraphics::KBlack); window << Triangle(Position(65*scale, 50*scale)+baseVector, Position(85*scale, 25*scale)+baseVector, Position(85*scale, 75*scale)+baseVector, nsGraphics::KBlack);
window << nsShape::Triangle(Position(75*scale, 50*scale)+baseVector, Position(90*scale, 25*scale)+baseVector, Position(90*scale, 75*scale)+baseVector, nsGraphics::KGray); window << Triangle(Position(75*scale, 50*scale)+baseVector, Position(90*scale, 25*scale)+baseVector, Position(90*scale, 75*scale)+baseVector, nsGraphics::KGray);
window << nsShape::Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack); window << Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack);
} }
void PixelManager::drawInvaderB(const Position& baseVector, unsigned size, const RGBAcolor& color) const { void PixelManager::drawInvaderB(const Position& baseVector, unsigned size, const RGBAcolor& color) const {
float scale = size/(float)100; float scale = size/(float)100;
window << nsShape::Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KRed); window << Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KRed);
window << nsShape::Rectangle(Position(25*scale, 30*scale)+baseVector, Position(45*scale, 40*scale)+baseVector, nsGraphics::KBlack); window << Rectangle(Position(25*scale, 30*scale)+baseVector, Position(45*scale, 40*scale)+baseVector, nsGraphics::KBlack);
window << nsShape::Rectangle(Position(55*scale, 30*scale)+baseVector, Position(75*scale, 40*scale)+baseVector, nsGraphics::KBlack); window << Rectangle(Position(55*scale, 30*scale)+baseVector, Position(75*scale, 40*scale)+baseVector, nsGraphics::KBlack);
window << nsShape::Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack); window << Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack);
} }
void PixelManager::drawInvaderC(const Position& baseVector, unsigned size, const RGBAcolor& color) const { void PixelManager::drawInvaderC(const Position& baseVector, unsigned size, const RGBAcolor& color) const {
float scale = size/(float)100; float scale = size/(float)100;
window << nsShape::Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGreen); window << Circle(Position(50*scale, 50*scale)+baseVector, 50*scale, nsGraphics::KGreen);
window << nsShape::Circle(Position(35*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack); window << Circle(Position(35*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack);
window << nsShape::Circle(Position(65*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack); window << Circle(Position(65*scale, 35*scale)+baseVector, 10*scale, nsGraphics::KBlack);
window << nsShape::Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack); window << Rectangle(Position(35*scale, 65*scale)+baseVector, Position(65*scale, 72*scale)+baseVector, nsGraphics::KBlack);
} }
void PixelManager::drawPlayer(unsigned x, unsigned width, const nsGraphics::RGBAcolor& color) const { void PixelManager::drawPlayer(unsigned x, unsigned width, const nsGraphics::RGBAcolor& color) const {
width = width-10-10; width = width-10-10;
width = width/2; width = width/2;
window << nsShape::Triangle(Position(0+x, 720), Position(5+x, 720), Position(5+x, 720-PLAYER_HEIGHT/2), color); window << Triangle(Position(0+x, 720), Position(5+x, 720), Position(5+x, 720-PLAYER_HEIGHT/2), color);
window << nsShape::Rectangle(Position(5+x, 720), Position(5+width+x, 720-PLAYER_HEIGHT/2), color); window << Rectangle(Position(5+x, 720), Position(5+width+x, 720-PLAYER_HEIGHT/2), color);
window << nsShape::Rectangle(Position(5+width+x, 720), Position(15+width+x, 720-PLAYER_HEIGHT), color); window << Rectangle(Position(5+width+x, 720), Position(15+width+x, 720-PLAYER_HEIGHT), color);
window << nsShape::Rectangle(Position(15+width+x, 720), Position(15+width*2+x, 720-PLAYER_HEIGHT/2), color); window << Rectangle(Position(15+width+x, 720), Position(15+width*2+x, 720-PLAYER_HEIGHT/2), color);
window << nsShape::Triangle(Position(15+width*2+x, 720), Position(15+width*2+x, 720-PLAYER_HEIGHT/2), Position(20+width*2+x, 720), color); window << Triangle(Position(15+width*2+x, 720), Position(15+width*2+x, 720-PLAYER_HEIGHT/2), Position(20+width*2+x, 720), color);
window << nsShape::Triangle(Position(5+x,720-PLAYER_HEIGHT/2), Position(5+width+x,720-PLAYER_HEIGHT/2), Position(5+width+x,720-PLAYER_HEIGHT*0.9), color); window << Triangle(Position(5+x,720-PLAYER_HEIGHT/2), Position(5+width+x,720-PLAYER_HEIGHT/2), Position(5+width+x,720-PLAYER_HEIGHT*0.9), color);
window << nsShape::Triangle(Position(15+width+x,720-PLAYER_HEIGHT/2), Position(15+width*2+x,720-PLAYER_HEIGHT/2), Position(15+width+x,720-PLAYER_HEIGHT*0.9), color); window << Triangle(Position(15+width+x,720-PLAYER_HEIGHT/2), Position(15+width*2+x,720-PLAYER_HEIGHT/2), Position(15+width+x,720-PLAYER_HEIGHT*0.9), color);
} }
void PixelManager::askPlayerNameMenu(playerID pID, string& name) const { void PixelManager::askPlayerNameMenu(playerID pID, string& name) const {
@ -51,11 +55,11 @@ void PixelManager::askPlayerNameMenu(playerID pID, string& name) const {
} }
void PixelManager::drawMissile(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const { void PixelManager::drawMissile(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const {
window << nsShape::Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color); window << Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color);
} }
void PixelManager::drawTorpedo(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const { void PixelManager::drawTorpedo(const Position& baseVector, unsigned width, const nsGraphics::RGBAcolor& color) const {
window << nsShape::Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color); window << Rectangle(baseVector, baseVector + Position(width, width * PROJ_LENGTH_FACTOR), color);
} }
void PixelManager::drawSprite(nsGui::Sprite& sprite, const Position& pos) const { void PixelManager::drawSprite(nsGui::Sprite& sprite, const Position& pos) const {
@ -97,7 +101,7 @@ void PixelManager::endFrame() const {
} }
void PixelManager::displayGodBench(int y) const { void PixelManager::displayGodBench(int y) const {
window << Rectangle(Position(0, y), Position(0, y+GOD_BENCH_SIZE), nsGraphics::KBlack);
} }
void PixelManager::displayGodRightHand(const Position& pos) const { void PixelManager::displayGodRightHand(const Position& pos) const {
@ -107,3 +111,7 @@ void PixelManager::displayGodRightHand(const Position& pos) const {
void PixelManager::displayGodLeftHand(const Position& pos) const { void PixelManager::displayGodLeftHand(const Position& pos) const {
} }
void PixelManager::drawFPS(unsigned fps) const {
window << nsGui::Text(Position(getScreenWidth()-100, 10), "FPS : "+ to_string(fps), nsGraphics::KWhite);
}