Resultat 1 till 5 av 5

Ämne: Klasser

  1. #1

    C++ Klasser

    Hej,

    Är väldigt färsk på C++ och går nu en kurs där jag lär mig detta och DirectX.
    Jag är tidigare (mer) van vid att programmera i C och Java och jag känner mig lite osäker på när jag ska använda klasser i c++.

    Vi håller nu på med ett enkelt projekt, jag ska göra en Space Invaders-klon. Jag har satt upp Win32koden i en WinMain.cpp och ska kalla funktioner som sköter spellogiken.

    Hade jag gjort som när jag skriver Java hade jag haft ett Game-objekt som innehöll dessa funktioner, typ såhär:

    Kod:
    Game.h:
    
    #ifndef GAME_H
    #define GAME_H
    
    #include <Windows.h>
    
    class Game
    {
    
    public:
      bool Init(HWND);
      void Update(HWND);
      void End(HWND);
    
    }
    #endif
    
    Game.cpp:
    
    #include "WinMain.h"
    #include "Directx.h"
    #include "Game.h"
    using namespace std;
    
    /**Initialize the Game**/
    bool Game::Init(HWND hWnd)
    {
      if(!initD3D(hWnd)) return false;
    }
    
    void Game::Update(HWND hWnd)
    {
      ScreenUpdate();
    }
    
    void Game::End(HWND hWnd)
    {
      ReleaseD3D();
    }
    Och hade jag gjort på C-vis hade jag gjort såhär:

    Kod:
    Game.h:
    
    #ifndef GAME_H
    #define GAME_H
    
    #include <Windows.h>
    
    bool GameInit(HWND);
    void GameUpdate(HWND);
    void GameEnd(HWND);
    
    #endif
    
    Game.cpp:
    
    #include "WinMain.h"
    #include "Directx.h"
    #include "Game.h"
    using namespace std;
    
    /**Initialize the Game**/
    bool GameInit(HWND hWnd)
    {
       if(!initD3D(hWnd)) return false;
    }
    
    void GameUpdate(HWND hWnd)
    {
       ScreenUpdate();
    }
    
    void GameEnd(HWND hWnd)
    {
       ReleaseD3D();
    }
    Så frågan är: vilket sätt borde jag skriva på, och varför?

  2. #2
    Jag brukar ha ett game-objekt som i ditt Java-exempel. Det enda main() gör är att skapa en instans av detta objekt och anropa lämplig startmetod i det.

    Jag använder både Java och C++ och jag bygger upp mina spel likandant i båda språken.

    Jag tycker att det blir ganska smidigt samla metoder som jobbar på samma typ av data i samma klass. Men om du vill mer C-liknande så är det väl ingen som kan säga att det är fel.
    /Peter Welzien

  3. #3
    Ok, så det är mest en smaksak och påverkar inte prestandan?

  4. #4
    Allt påverkar prestandan, men troligtvis inget som spelar någon större roll.

    Funderar dock på ditt första exempel, menar du att funktionerna skall vara statiska?

    Kod:
    Game game;
    ...
    game.Update(hWnd)
    eller

    Kod:
    Game::Update(hWnd);
    Kör man som i det första exemplet, så behöver man inte skicka runt x antal argument(obetydlig prestandavinst, men trevligare), och kan köra något sådant här istället:

    Kod:
    void main() {
      Game game(hWnd);
      if( false == game.IsInitalized()) HandleError();
      game.Update();
      // inget End() anrop.
    }
    
    class Game {
      public:
        Game(HWND);
        ~Game();
        
        bool IsInitialized() const;
        void Update();
      private:
        HWND hWnd;
        bool initialized;
    };
    
    Game::Game(HWND wnd) : hWnd(wnd), initialized(false) {
      if(initD3D(hWnd)) initialized = true;
    }
    
    Game::~Game() {
      if( initialized ) ReleaseD3D();
    }
    
    void Game::Update() {
      assert(initialized && "Game is not initialized!");
      ScreenUpdate();
    }
    
    bool Game::IsInitialized() const {
      return initialized;
    }

  5. #5
    Nej jag hade inte tänkt använda statiska funktioner.
    Det där såg ju mycket snyggare ut, tack!

    Över lag sen då, när jag ska skriva kod för input, för direct3d och för ljud osv. Ska jag göra klasser för de också? Jag känner mig bekväm i båda sätten, men finns det något som är "best practice" så att säga?
    Och inte bara i spel utan C++ generellt, är det vanligt att göra allt i klasser?

Bokmärken

Behörigheter för att posta

  • Du får inte posta nya ämnen
  • Du får inte posta svar
  • Du får inte posta bifogade filer
  • Du får inte redigera dina inlägg
  •