This repository has been archived by the owner on Nov 15, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Klasa Game
Antek Bizon edited this page Mar 5, 2022
·
1 revision
Projekt gry został częściowo oparty o Entity-component-system (https://pl.wikipedia.org/wiki/Entity-component-system). Sercem naszej gry jest obiekt Game tworzony na samym początku działania aplikacji. To w nim znajduję się główna pętla. Odbywają się w niej trzy główne funkcje, odpowiadające za:
- odświeżenie informacji (funkcja Update);
- sprawdzanie kolizji (funkcja CheckCollision);
- rysowanie (funkcja Draw); Game przechowuje następujące informacje:
- tablicę wskaźników Sprite’ów potrzebną przy rysowaniu każdej ramki obrazu
- mapę Sprite’ów wykorzystywaną przy sprawdzaniu kolizji
- wskaźnik do obiektu Player
- pliki tekstur oraz audio
- różne rodzaje obiektów Menu
Game::Game()
: state(State::MOD_MENU),
mainMenu(this, { "Start", "Load", "Level", "Ranking", "Quit" }, Menu::Type::MAIN_MENU),
ingameMenu(this, { "Continue", "Save Game", "Back to Menu", "Quit" }, Menu::Type::PAUSE_MENU),
saveMenu(this, FindSaveFiles(), Menu::Type::PAUSE_MENU),
overwriteMenu(this, { "Overwrite?", "Cancel" }, Menu::Type::PAUSE_MENU),
loadMenu(this, FindLoadFiles(), Menu::Type::LOAD_MENU),
modMenu(this, { "Mod 1", "Mod 2", "Mod 3", "Quit" }, Menu::Type::MAIN_MENU),
diffLvlMenu(this, { "Easy", "Normal", "Hard", "Quit" }, Menu::Type::MAIN_MENU) {
InitWindow(screenWidth, screenHeight, "Pang");
InitAudioDevice();
SetExitKey(KEY_F10);
SetTargetFPS(60);
LoadTextures();
LoadAudio();
}
class Game {
public:
enum class State {
MAIN_MENU,
MOD_MENU,
DIFFLVL_MENU,
LEVEL_SELECTOR,
RANKING,
SAVE_MENU,
OVERWRITE_MENU,
LOAD_MENU,
ACTIVE,
PAUSED,
LEVEL_FINISHED,
GAME_START,
GAME_OVER,
GAME_FINISHED,
GAME_SAVED,
ERROR
} state;
const char *textureFiles[NUM_TEXTURES] = {"res/background/forestHD.png",
"res/background/landscape.png",
"res/background/bagno1.png",
"res/background/jungla1.png",
"res/background/jungla2.png",
"res/background/jungla3.png",
"res/background/las1.png",
"res/background/las2.png",
"res/background/las3.png",
"res/background/morze1.png",
"res/background/pustynia1.png",
"res/background/pustynia2.png",
"res/background/pustynia3.png",
"res/background/gory.png",
"res/background/miasto1.png",
"res/background/zima1.png",
"res/background/zima2.png",
"res/background/zima3.png",
"res/background/zima4.png",
"res/background/zima5.png",
"res/spritesheet.png",
"res/ladder.png",
"res/wall.png",
"res/platform1.png",
"res/platform2.png",
"res/ball/Explosion/enemyexplosion1.png",
"res/ball/Ball_1.png",
"res/ball/Ball_2.png",
"res/ball/Ball_3.png",
"res/ball/Ball_4.png",
"res/crab.png",
"res/weapons/line_straight.png",
"res/weapons/line_wiggled.png",
"res/weapons/ending.png",
"res/weapons/shot.png",
"res/weapons/mine.png",
"res/weapons/explosion.png",
"res/powerups/clock.png",
"res/powerups/boost.png",
"res/powerups/anchor.png",
"res/powerups/double.png",
"res/powerups/heart.png",
"res/powerups/score.png",
"res/hud/weapons.png",
"res/hud/boost.png",
"res/hud/double.png",
"res/ice.png",
"res/ball/ball_menu.png",
"res/enter_icon.png",
"res/esc_icon.png",
"res/backspace_icon.png",
"res/title.png"
};
Texture2D textures[NUM_TEXTURES];
const char *audioFiles[NUM_AUDIO] = {"res/audio/bounce.mp3",
"res/audio/game_over.mp3",
"res/audio/health_lose.mp3",
"res/audio/laser.mp3",
"res/audio/level_start.mp3",
"res/audio/level_completed.mp3",
"res/audio/powerup.mp3",
"res/audio/wall_destruction.mp3",
"res/audio/ball-breaking.mp3",
"res/audio/menu_select.mp3",
"res/audio/menu_enter.mp3",
"res/audio/menu_back.mp3",
"res/audio/walk.mp3",
"res/audio/harpun.mp3",
"res/audio/mine.mp3",
"res/audio/mine_explosion.mp3",
"res/audio/error.mp3"
};
Sound audio[NUM_AUDIO];
const char *musicFiles[NUM_MUSIC] = {"res/audio/background1.mp3",
"res/audio/background2.mp3",
"res/audio/background3.mp3",
"res/audio/background4.mp3",
"res/audio/background5.mp3"
};
Music music[NUM_MUSIC];
const float screenWidth = 1280;
const float screenHeight = 720;
const float wallThickness = 20;
const float panelHeight = 40;
const int NUM_LEVELS = 21;
Game();
~Game();
void LoadTextures();
void LoadAudio();
void Unload();
int MainLoop();
void Update();
void ChangeState(State newState);
void CheckCollision();
void MoveSprites();
void Spawn();
void Spawn(Sprite *sprite);
void SpawnLevel();
void Unspawn();
void StartGame();
void RestartLevel();
void Draw();
void DrawSprites();
void DrawBackground();
void DrawPanel();
void DrawGameSaved();
void DrawGameStart();
void DrawEndLevel();
void DrawGameOver();
void DrawEndGame();
void DrawLoadMenu();
void DrawLevelSelector();
void DrawRanking();
void DrawIcons();
void WriteGameData(std::ofstream&);
void ReadGameData(std::ifstream&);
bool SaveGame(int);
void LoadGame(int);
void SaveUsrData();
void LoadUsrData();
void RemoveSave(int);
std::vector<std::string> FindLoadFiles();
std::vector<std::string> FindSaveFiles();
void AddEnemy(float, float, Enemy::Kind, int);
void AddWeapon(float, float, int);
void AddScore(int);
void AddPowerup(float, float);
void PickAction(Powerup::Kind);
void CheckTime();
std::vector<Sprite*> GetSprites(Sprite::Type type);
short int numFiles;
std::vector<Sprite *> sprites;
std::map<Sprite::Type, std::vector<Sprite *>> spriteMap;
Player *player;
Weapon *weapon;
Font font;
TextureTypes backTexture = BACKGROUND_ANI2;
Rectangle backRec = { 0, 0, 1280, 720 };
short int backFrame = 0;
MusicTypes backMusic = NUM_MUSIC;
Rectangle hudWeapons = { 0, 0, 32, 32 };
int frameCounter = 0;
int sequenceFrameCounter;
Menu mainMenu;
Menu ingameMenu;
Menu saveMenu;
Menu overwriteMenu;
Menu loadMenu;
Menu modMenu;
Menu diffLvlMenu;
short int modNum;
short int saveNum;
bool endAnim = false;
State newAnim;
Vector2 animVec;
float animColor;
short int level = 1;
short int lives;
unsigned int score;
unsigned int timeBonus;
unsigned int rankScore[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
std::time_t endLevelTime;
short int levelTime;
int elapsedLevelTime;
short int weaponType = 1;
short int previousWeapon;
short int shootingLeft;
std::time_t lifeTime[3];
short int timeLeft[3];
bool stopTime = false;
short int laserCooldown;
short int speedBoost;
short int multiWeapon = 0;
};