Skip to content
This repository has been archived by the owner on Nov 15, 2022. It is now read-only.

Klasa Game

Antek Bizon edited this page Mar 5, 2022 · 1 revision

Obiekt game

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;
};
Clone this wiki locally