Permalänk
Medlem

HGE applikation

sitter i slutskedet av mitt HGE program, men har fastnat på sista biten.
har i uppgifit att göra ett snake spel med hjälp av spelmotorn HGE, har i stort sätt allting klart för mig, förutom "svansen" på ormen.

har en sprite som ska representera huvudet som kan kollidera med pickups för poäng eller gameover, men får inte till det så att vid varje pickup rendera en sprite bakom som följer efter.

bifogar exempel på gameklassen (header/cpp) o runt detta har jag annat för bl.a menyer o highscore lista osv, men närmast ligger "Character" klassen , som hanterar inputs för rörelser för just det objektet, men kollision osv sköter jag i Game klassen. men får bara inte till det med svansen.

det jag tänker mig är en array av "Tail" klass objekt där första index renderar sin sprite på huvudets tidigare position, o andra index på första vid nästa rendering osv. får inte till det alls, o sen hur varje objekt ska avgöra vart det ska renderas vid nästa update, på något sett räkna ut x,y position o vilken riktning man rör sig i o hitta något mönster där. helt borta just nu.

hoppas jag inte är för otydlig med vad jag försöker få fram, o hoppas innerligt på en hjälpande hand.

Game Header

class Game : public GameObject { public: friend class MainObject; Game (); virtual ~Game (); int update (); void render (); int getScore(); int getNrOfTail(); private: int mScreenWidth, mScreenHeight; // Tilemap Data // --------------------------------------- HTEXTURE mTileTexture; hgeSprite* mWallSprite; hgeSprite* mBackgroundSprite; static const int NR_OF_ROWS = 12; static const int NR_OF_COLUMNS = 16; Tile *mTileMap[NR_OF_ROWS][NR_OF_COLUMNS]; int mTileWidth; int mTileHeight; // --------------------------------------- //data for character // --------------------------------------- HTEXTURE mAnimationTexture; Character *mCharacter; // --------------------------------------- //data for Tail // --------------------------------------- HTEXTURE mTailTexture; Tail **mTail; int mNrOfTail; // --------------------------------------- //Data for pickup // --------------------------------------- HTEXTURE mPickupTexture; hgeSprite *mPickup; float mPickupPosX, mPickupPosY; // --------------------------------------- //Data for badPickup // --------------------------------------- HTEXTURE mBadPickupTexture; hgeSprite *mBadPickup; float mBadPickupPosX, mBadPickupPosY; // --------------------------------------- int mScore; };

Game CPP ------------------------------------------------------------------------------------------------------------------------------------------------------------

Game::Game () { srand(time(0)); mScreenWidth = hge->System_GetState(HGE_SCREENWIDTH); mScreenHeight = hge->System_GetState(HGE_SCREENHEIGHT); //Load Resources for character // ----------------------------------------------------------- mAnimationTexture = hge->Texture_Load( "Images/Character.png" ); mCharacter = new Character ( mAnimationTexture, 100, 100 ); // ----------------------------------------------------------- //Load Resources for Tail // ----------------------------------------------------------- mTailTexture = hge->Texture_Load( "Images/Tail.png" ); mNrOfTail = 5; mTail = new Tail *[mNrOfTail]; for (int i=0; i < mNrOfTail; i++) { mTail[i] = new Tail ( mTailTexture,100,100); } // ----------------------------------------------------------- //Load Resources for Pickup // ----------------------------------------------------------- mPickupTexture = hge->Texture_Load( "Images/Pickup.png" ); mPickup = new hgeSprite ( mPickupTexture, 0, 0, 32, 32 ); mPickupPosX = rand()%mScreenWidth; mPickupPosY = rand()%mScreenHeight; // ----------------------------------------------------------- //Load Resources for BadPickup // ----------------------------------------------------------- mBadPickupTexture = hge->Texture_Load( "Images/BadPick.png" ); mBadPickup = new hgeSprite ( mBadPickupTexture, 0, 0, 32, 32 ); mBadPickupPosX = rand()%mScreenWidth; mBadPickupPosY = rand()%mScreenHeight; // ----------------------------------------------------------- // Load Resources for map // ----------------------------------------------------------- mTileTexture = hge->Texture_Load( "Images/tileset.png" ); mBackgroundSprite = new hgeSprite ( mTileTexture, 0, 0, 50, 50 ); mWallSprite = new hgeSprite ( mTileTexture, 50, 0, 50, 50 ); // ----------------------------------------------------------- // Create Tilemap // Tilemaps are created in separate textfiles, with numbers representing tiletypes // ----------------------------------------------------------- mTileWidth = 50; mTileHeight = 50; // Load tilemap from file std::ifstream tileMapFile("tilemap.txt"); int type = -1; // Build a "Chessboard" of Tiles to be the Level for ( int i = 0; i < NR_OF_ROWS; i++ ) { for ( int j = 0; j < NR_OF_COLUMNS; j++ ) { tileMapFile >> type; if ( type == TILETYPE_WALL ) { mTileMap[i][j] = new Tile ( mWallSprite, j*50, i*50, false ); } if ( type == TILETYPE_BG ) { mTileMap[i][j] = new Tile ( mBackgroundSprite, j*50, i*50, true ); } } } // Close file tileMapFile.close(); // ----------------------------------------------------------- //starting value score mScore =0; } Game::~Game () { // Free Resources Map // ----------------------------------------------------------- hge->Texture_Free( mTileTexture ); delete mBackgroundSprite; delete mWallSprite; for ( int i = 0; i < NR_OF_ROWS; i++ ) { for ( int j = 0; j < NR_OF_COLUMNS; j++ ) { delete mTileMap[i][j]; } } // ----------------------------------------------------------- // Free memory for texture char/pickups hge->Texture_Free( mAnimationTexture ); hge->Texture_Free ( mPickupTexture ); hge->Texture_Free ( mBadPickupTexture ); delete mCharacter; delete mPickup; delete mBadPickup; } int Game::update () { int state = STATE_UNCHANGED; // Update Tilemap // ----------------------------------------------------------- for ( int i = 0; i < NR_OF_ROWS; i++ ) { for ( int j = 0; j < NR_OF_COLUMNS; j++ ) { mTileMap[i][j]->update(); } } // ----------------------------------------------------------- // Get Collision Box from Character hgeRect characterBox; mCharacter->getBoundingBox(&characterBox); //Get Collision box from pickups hgeRect PickupBox; mPickup->GetBoundingBox(mPickupPosX,mPickupPosY,&PickupBox); // Character collides with pickup if ( characterBox.Intersect(&PickupBox) ) { // Give pickup a new random position mPickupPosX = rand()%mScreenWidth; mPickupPosY = rand()%mScreenHeight; mScore += 10; mCharacter->setSpeed(0.1f); //give bad pickup random position mBadPickupPosX = rand()%mScreenWidth; mBadPickupPosY = rand()%mScreenHeight; } //Get Collision box from bad pickups hgeRect BadPickupBox; mBadPickup->GetBoundingBox(mBadPickupPosX,mBadPickupPosY,&BadPickupBox); // Character collides with bad pickup if ( characterBox.Intersect(&BadPickupBox) ) { //ends the game ofstream toFile; toFile.open("CurrentScore.txt"); toFile << mScore; toFile.close(); state = STATE_NAME; } mCharacter->update(); for(int i = 0; i < mNrOfTail; i++) { mTail[i]->update(); } return state; } void Game::render () { // Render Tilemap // ----------------------------------------------------------- for ( int i = 0; i < NR_OF_ROWS; i++ ) { for ( int j = 0; j < NR_OF_COLUMNS; j++ ) { mTileMap[i][j]->render(); } } // ----------------------------------------------------------- mPickup->Render( mPickupPosX, mPickupPosY ); mBadPickup->Render( mBadPickupPosX, mBadPickupPosY ); mCharacter->render(); for(int i = 0; i < mNrOfTail; i++) { mTail[i]->render(); } } int Game::getScore() { return mScore; } int Game::getNrOfTail() { return mNrOfTail; }

Visa signatur

There are 10 types of people in the world:
Those who understand binary, and those who don't.

Permalänk

På god väg

Det du pratar om att skapa en "tail" class är nog att vara på rät väg. Om vaje "tail" del håller koll på sin egen position så behöver du inte räkna ut det varje gång.

Ett tips är att skapa en Mainclass till ormen som både huvudet och svans ärver alternativt att huvudet är ett specialfall av svans eller tvärtom. och för att skicka positionerna från en del till en annan kan du göra igenom att lägga dem in en länkad lista istället för en array.

Ett annat set att gå till väga om man inte bryr sig om hur det ser ut grafiskt utan att alla delar bara är likadana rutor är att hela tiden lägga sista svansdelen framför huvudet och sedan låta den representera huvudet och så vidare.