Ejemplo n.º 1
0
void updateLabelColor(Menu *menu, SDL_Renderer *windowRenderer, SDL_Rect *mouseRect)
{
	/* The color for the labels. */
	SDL_Color inColor = {255, 255, 255};
	SDL_Color outColor = {200, 200, 200};

	if(rectCollision(*mouseRect, menu->quitRect))
	{
		if(menu->quitColor.r != 255)
		{
			menu->quitColor = inColor;
			SDL_DestroyTexture(menu->quitLabel);
			SDL_Surface* quitSurface = TTF_RenderText_Solid(menu->font, "Quit", menu->quitColor);
			menu->quitLabel = SDL_CreateTextureFromSurface(windowRenderer, quitSurface);
			SDL_FreeSurface(quitSurface);
		}
	}

	else
	{
		if(menu->quitColor.r != 200)
		{
			menu->quitColor = outColor;
			SDL_DestroyTexture(menu->quitLabel);
			SDL_Surface* quitSurface = TTF_RenderText_Solid(menu->font, "Quit", menu->quitColor);
			menu->quitLabel = SDL_CreateTextureFromSurface(windowRenderer, quitSurface);
			SDL_FreeSurface(quitSurface);
		}
	}

	if(rectCollision(*mouseRect, menu->startRect))
	{
		if(menu->startColor.r != 255)
		{
			menu->startColor = inColor;
			SDL_DestroyTexture(menu->startLabel);
			SDL_Surface *startSurface = TTF_RenderText_Solid(menu->font, "Start", menu->startColor);
			menu->startLabel = SDL_CreateTextureFromSurface(windowRenderer, startSurface);
			SDL_FreeSurface(startSurface);
		}
	}

	else
	{
		if(menu->startColor.r != 200)
		{
			menu->startColor = outColor;
			SDL_DestroyTexture(menu->startLabel);
			SDL_Surface *startSurface = TTF_RenderText_Solid(menu->font, "Start", menu->startColor);
			menu->startLabel = SDL_CreateTextureFromSurface(windowRenderer, startSurface);
			SDL_FreeSurface(startSurface);
		}
	}
}
Ejemplo n.º 2
0
void firstMenu(Menu *menu, SDL_Renderer *windowRenderer, Context *context)
{
	/* Get the mouse position */
	SDL_Rect mouseRect;
	mouseRect.w = 0;
	mouseRect.h = 0;
	Uint32 mouseState = SDL_GetMouseState(&mouseRect.x, &mouseRect.y);

	/* Update the color of the labels */
	updateLabelColor(menu, windowRenderer, &mouseRect);

	/* Draw the label on the renderer */
	SDL_RenderCopy(windowRenderer, menu->quitLabel, NULL, &menu->quitRect);
	SDL_RenderCopy(windowRenderer, menu->startLabel, NULL, &menu->startRect);

	/* Test the click events. */
	if(rectCollision(mouseRect, menu->quitRect) && (mouseState & SDL_BUTTON(1)))
		*context = QUIT;
	else if(rectCollision(mouseRect, menu->startRect) && (mouseState & SDL_BUTTON(1)))
		*context = GAME;
}
Ejemplo n.º 3
0
void GameMap::removeObject(TRect point)
{
        TRect r;
        TStringList * l = map.GetList("objects");
        for (int i=0; i<l->Count; i++)
        {
                String name = l->Strings[i];
                r.left = StrToInt(map.Get("objects."+name+".left"));
                r.top  = StrToInt(map.Get("objects."+name+".top"));
                r.right = r.left+32;
                r.bottom = r.top +32;
                if (rectCollision(convertRect(r),convertRect(point)))
                        map.RemoveFromList("objects",l->Strings[i]);
        }
        delete l;
}
Ejemplo n.º 4
0
void InGame_updatePlayer(InGame* self)
{
	if(!self->map)
		return;

	//4 tiles / object / dynamic tiles are needed because the rect player has 4 points.
	Tile* topLeftTile         = NULL;
	Tile* topRightTile        = NULL;
	Tile* bottomLeftTile      = NULL;
	Tile* bottomRightTile     = NULL;

	Tile* topLeftDynamics     = NULL;
	Tile* topRightDynamics    = NULL;
	Tile* bottomLeftDynamics  = NULL;
	Tile* bottomRightDynamics = NULL;

	//Update the player gravity
	Player_updateGravity(self->player);

	//Then check collisions
	const SDL_Rect* pRect = Drawable_getRect((Drawable*)self->player);
	bottomLeftTile        = Map_getTileInfo(self->map, pRect->x, pRect->y + pRect->h + 1); //+1 are here to check if we will be on collision if we move the player by gravity of 1 pixel.
	bottomRightTile       = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y + pRect->h + 1);
	topLeftTile           = Map_getTileInfo(self->map, pRect->x, pRect->y);
	topRightTile          = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y);

	//If the tile on our foot is something SOLID, such as ground
	if(bottomLeftTile && (Tile_getInfo(bottomLeftTile) & SOLID) ||
	   bottomRightTile && (Tile_getInfo(bottomRightTile) & SOLID))
    {
		//Get the tile rect on where we entered in collision
		const SDL_Rect* tileRect;
		if(bottomRightTile)
		{
			bottomRightTile->updateCollision(bottomRightTile);
			tileRect = Drawable_getRect((Drawable*)bottomRightTile);
		}

		else if(bottomLeftTile)
		{
			bottomLeftTile->updateCollision(bottomLeftTile);
			tileRect = Drawable_getRect((Drawable*)bottomLeftTile);
		}
		int32_t y = tileRect->y - 1;
		((Drawable*)self->player)->setPosition((Drawable*)self->player, pRect->x, y - pRect->h); //The reposition the player correctly
		Player_setSpeedY(self->player, 0); //And set its gravity to 0
    }

	//The same for tile on our head
	else if(topLeftTile && (Tile_getInfo(topLeftTile) & SOLID) ||
	        topRightTile && (Tile_getInfo(topRightTile) & SOLID))
    {
		const SDL_Rect* tileRect;
		if(topRightTile)
		{
			topRightTile->updateCollision(topRightTile);
			tileRect = Drawable_getRect((Drawable*)topRightTile);
		}
		if(topLeftTile)
		{
			topLeftTile->updateCollision(topLeftTile);
			tileRect = Drawable_getRect((Drawable*)topLeftTile);
		}
		int32_t y = tileRect->y + tileRect->h + 1;
		((Drawable*)self->player)->setPosition((Drawable*)self->player, pRect->x, y);
		Player_setSpeedY(self->player, 0);
    }

	//We we aren't not on something, then we fall.
	else
		Player_setSpeedY(self->player, Player_getSpeedY(self->player) + GRAVITY);

    //Check on dynamic side
    bottomLeftDynamics  = Map_getDynamicTile(self->map, pRect->x, pRect->y + pRect->h);
    bottomRightDynamics = Map_getDynamicTile(self->map, pRect->x + pRect->w, pRect->y + pRect->h);

    uint32_t i;

	//Useful for not doing the work 4 times (we can use a loop)
	Tile* dynamicTile[4];
	dynamicTile[0] = bottomLeftDynamics;
	dynamicTile[1] = bottomRightDynamics;
	dynamicTile[2] = NULL;
	dynamicTile[3] = NULL;
	uint32_t dynamicTileID, sizeDynamicTile = 4;
	const SDL_Rect* r = Drawable_getRect((Drawable*)self->player);

	//Loop for checking collisions with all dynamic tiles
	for(dynamicTileID=0; dynamicTileID < sizeDynamicTile; dynamicTileID++)
	{
		//If we haven't a dynamic tile on this case
		if(!dynamicTile[dynamicTileID])
			continue;

		Tile* tile = dynamicTile[dynamicTileID];

		//Or if the dynamic tile is not an ennemy
		if(!(Tile_getInfo(tile) & ENNEMY))
			continue;

		//Or if the ennemy isn't destroyd yet (it lives)
		else if(tile && !tile->canDestroy)
		{
			//Look if indeed we are on collision. It is needed because dynamic tiles don't fit all the dynamic cases (definition of dynamic cases : all the tiles can be nowhere of any size.
			const SDL_Rect* tileRect = Drawable_getRect((Drawable*)tile);
			if(rectCollision(tileRect, pRect))
			{
				//If we fall, then the ennemy is killed
				if(self->player->speedY > 0)
				{
					InGame_addScore(self, 100);
					tile->canDestroy = true;
					Player_setSpeedY(self->player, JUMP_SPEED);
				}
			}
		}
	}

	//Check if something solid is on our side. We do the same thing that for falling.
	Player_updateMovement(self->player);
	pRect           = Drawable_getRect((Drawable*)self->player);
	bottomLeftTile  = Map_getTileInfo(self->map, pRect->x, pRect->y + pRect->h);
	bottomRightTile = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y + pRect->h);
	topLeftTile     = Map_getTileInfo(self->map, pRect->x, pRect->y);
	topRightTile    = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y);

	//on left
	if(bottomLeftTile && (Tile_getInfo(bottomLeftTile) & SOLID) ||
	   topLeftTile && (Tile_getInfo(topLeftTile) & SOLID))
    {
		const SDL_Rect* tileRect;
		if(topLeftTile)
		{
			topLeftTile->updateCollision(topLeftTile);
			tileRect = Drawable_getRect((Drawable*)topLeftTile);
		}
		if(bottomLeftTile)
		{
			bottomLeftTile->updateCollision(bottomLeftTile);
			tileRect = Drawable_getRect((Drawable*)bottomLeftTile);
		}

		uint32_t x = tileRect->x + tileRect->w + 1;
		((Drawable*)self->player)->setPosition((Drawable*)self->player, x, pRect->y);
    }

	//on right
	else if(topRightTile && (Tile_getInfo(topRightTile) & SOLID) ||
	        bottomRightTile && (Tile_getInfo(bottomRightTile) & SOLID))
    {
		const SDL_Rect* tileRect;
		if(topRightTile)
		{
			topRightTile->updateCollision(topRightTile);
			tileRect = Drawable_getRect((Drawable*)topRightTile);
		}
		if(bottomRightTile)
		{
			bottomRightTile->updateCollision(bottomRightTile);
			tileRect = Drawable_getRect((Drawable*)bottomRightTile);
		}

		int32_t x = tileRect->x - 1;
		((Drawable*)self->player)->setPosition((Drawable*)self->player, x - pRect->w, pRect->y);
    }

	//Reload tile information.
	pRect           = Drawable_getRect((Drawable*)self->player);
	bottomLeftTile  = Map_getTileInfo(self->map, pRect->x, pRect->y + pRect->h);
	bottomRightTile = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y + pRect->h);
	topLeftTile     = Map_getTileInfo(self->map, pRect->x, pRect->y);
	topRightTile    = Map_getTileInfo(self->map, pRect->x + pRect->w, pRect->y);

	Object* bottomLeftObject  = Map_getObjectInfo(self->map, pRect->x, pRect->y + pRect->h);
	Object* bottomRightObject = Map_getObjectInfo(self->map, pRect->x + pRect->w, pRect->y + pRect->h);
	Object* topLeftObject     = Map_getObjectInfo(self->map, pRect->x, pRect->y);
	Object* topRightObject    = Map_getObjectInfo(self->map, pRect->x + pRect->w, pRect->y);

	//Then check if we are on a coin
	Tile* tiles[4];
	tiles[0] = bottomLeftTile;
	tiles[1] = bottomRightTile;
	tiles[2] = topRightTile;
	tiles[3] = topLeftTile;
	for(i=0; i < 4; i++)
	{
		if(tiles[i] && !tiles[i]->canDestroy && Tile_getInfo(tiles[i]) & SCORE)
		{
			tiles[i]->updateCollision(tiles[i]);
			MusicManager_playSound(globalVar_musics, COIN_SOUND);
			InGame_addScore(self, 100);
		}
	}

	Object* objects[4];
	objects[0] = bottomLeftObject;
	objects[1] = bottomRightObject;
	objects[2] = topLeftObject;
	objects[3] = topRightObject;

	for(i=0; i < 4; i++)
	{
		if(objects[i] && (Object_getInfo(objects[i]) & FINISH) && !self->hasWon)
		{
			objects[i]->updateCollision(objects[i]);
			self->hasWon = true;
		}
	}
	   
	//Then recheck on dynamic trace
    bottomLeftDynamics  = Map_getDynamicTile(self->map, pRect->x, pRect->y + pRect->h);
    bottomRightDynamics = Map_getDynamicTile(self->map, pRect->x + pRect->w, pRect->y + pRect->h);
    topLeftDynamics  = Map_getDynamicTile(self->map, pRect->x, pRect->y);
    topRightDynamics = Map_getDynamicTile(self->map, pRect->x + pRect->w, pRect->y);

	//Same thing that for falling
	dynamicTile[0] = bottomLeftDynamics;
	dynamicTile[1] = bottomRightDynamics;
	dynamicTile[2] = topRightDynamics;
	dynamicTile[3] = topLeftDynamics;
	for(dynamicTileID=0; dynamicTileID < sizeDynamicTile; dynamicTileID++)
	{
		if(!dynamicTile[dynamicTileID])
			continue;
		Tile* tile = dynamicTile[dynamicTileID];

		if(!(Tile_getInfo(tile) & ENNEMY))
			continue;

		else if(tile && !tile->canDestroy)
		{
			//Except that we die if we touch an ennemy
			const SDL_Rect* tileRect = Drawable_getRect((Drawable*)tile);
			if(rectCollision(tileRect, pRect))
			{
				self->hasDied = true;
				return;
			}
		}
	}
}