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;
}
There are 10 types of people in the world:
Those who understand binary, and those who don't.