Exemple #1
0
void Collision::tileCollision(MonsterManager* mm, TileMap* tileMap)
{
    vUnit* mons = mm->getMonsters();
    viUnit iter = mons->begin();
    for (; iter != mons->end(); iter++)
    {
        if ((*iter)->isTileCollision())
        {
            tileCollision(*iter, tileMap);
        }
    }
}
Exemple #2
0
	void SnakeBoss::update()
	{
		//snake update
		float distance, angle;
		float x, y;

		_pieces[0]->setCenter(getX(), getY());
		_pieces[0]->setAngleR(getAngleR());
		_pieces[0]->setSpeed(getSpeed());
		//_pieces[0]->activate();

		for (int i = 1; i < LENGTH; i++)
		{
			distance = myUtil::getDistance(_pieces[i - 1]->getX(), _pieces[i - 1]->getY(), _pieces[i]->getX(), _pieces[i]->getY());
			angle = myUtil::getAngle(_pieces[i - 1]->getX(), _pieces[i - 1]->getY(), _pieces[i]->getX(), _pieces[i]->getY());

			while (angle < 0) angle += M_PI * 2;
			while (angle >(M_PI * 2)) angle -= M_PI * 2;

			if (distance > 45)
			{
				x = cos(angle) * 45;
				y = -sin(angle) * 45;
				_pieces[i]->setCenter(_pieces[i - 1]->getX() + x, _pieces[i - 1]->getY() + y);
				_pieces[i]->setAngleR(angle);
			}
			else
			{
				_pieces[i]->setX(_pieces[i]->getX() - cos(_pieces[i]->getAngleR()) * 9.9);
				_pieces[i]->setY(_pieces[i]->getY() + sin(_pieces[i]->getAngleR()) * 9.9);
			}
			
		}


		//moving
		if (!tileCollision() ||
			getX() < 0 || getX() > MAP_SIZE_X * METER_TO_PIXEL ||
			getY() < 0 || getY() > MAP_SIZE_Y * METER_TO_PIXEL)
		{
			setAccel(0);
			setAccelY(GRAVITY_ACCEL / 2);

			//angle = min(M_PI / 4, abs((myUtil::getDistance(getX(), getY(), _player->getX(), _player->getY()) / (_option.width() / 2)) * (M_PI / 8)));
		}
		else
		{
			angle = min(M_PI, abs((myUtil::getDistance(getX(), getY(), _player->getX(), _player->getY()) / (_option.width() / 2)) * (M_PI)));

			setAccelY(0);
			
			setAccel(METER_TO_PIXEL * 80);
			//setSpeed(METER_TO_PIXEL * 80);
			int direct = 0;
			float destAngle = myUtil::getAngle(getX(), getY(), _player->getX(), _player->getY() - METER_TO_PIXEL * 5);
			float sourAngle = getAngleR();

			while (destAngle < 0) destAngle += M_PI * 2;
			while (destAngle >(M_PI * 2)) destAngle -= M_PI * 2;
			while (sourAngle < 0) sourAngle += M_PI * 2;
			while (sourAngle >(M_PI * 2)) sourAngle -= M_PI * 2;
			while (angle < 0) angle += M_PI * 2;
			while (angle >(M_PI * 2)) angle -= M_PI * 2;

			if (destAngle > sourAngle)
			{
				if (abs(destAngle - sourAngle) < (M_PI / 32)) direct = 0;
				else if (abs(destAngle - sourAngle) > M_PI) direct = 2;
				else direct = 1;
			}
			else
			{
				if (abs(destAngle - sourAngle) < (M_PI / 32)) direct = 0;
				else if (abs(destAngle - sourAngle) > M_PI) direct = 1;
				else direct = 2;
			}

			switch (direct)
			{
			case 1:
				setAngleR(sourAngle + (angle * TIMEMANAGER->getElapsedTime()));
				break;
			case 2:
				setAngleR(sourAngle - (angle * TIMEMANAGER->getElapsedTime()));
				break;
			case 0:
				setAngleR(destAngle);
				break;
			}
		}

		activate();
	}
Exemple #3
0
int game(int maze) {
    ENEMY enemy1 = {0,0,0,0,CYAN};
    ENEMY enemy2 = {0,0,0,0,CYAN};
    ENEMY enemy3 = {0,0,0,0,CYAN};
    ENEMY enemy4 = {0,0,0,0,CYAN};
    PLAYER player;
    GATE gate1;
    SWITCH tile1;
    SWITCH winTile;
    GATE gate2 = {0,0,0,0,RED};
    GATE gate3 = {0,0,0,0,RED};
    SWITCH tile2 = {0,0,0,BLUE};
    SWITCH tile3 = {0,0,0,BLUE};

    player.x = 0;
    player.y = 70;
    player.speed = 1;
    player.size = 5;
    player.color = RED;
    winTile.x = 200;
    winTile.y = 70;
    winTile.size = 20;
    winTile.color = GREEN;
    gate1.x = 49;
    gate1.y = 97;
    gate1.length = 40;
    gate1.direction = 1;
    gate1.color = RED;
    tile1.x = 10;
    tile1.y = 10;
    tile1.size = 10;
    tile1.color = BLUE;
    if (maze == 2) {
        player.x = 0;
        player.y = 75;
        player.speed = 1;
        player.size = 5;
        player.color = RED;
        winTile.x = 75;
        winTile.y = 75;
        winTile.size = 15;
        winTile.color = GREEN;
        gate1.x = 66;
        gate1.y = 65;
        gate1.length = 9;
        gate1.direction = 1;
        gate1.color = RED;
        tile1.x = 10;
        tile1.y = 143;
        tile1.size = 8;
        tile1.color = BLUE;
        gate2.x = 38;
        gate2.y = 46;
        gate2.length = 10;
        gate2.direction = 0;
        gate2.color = RED;
        tile2.x = 10;
        tile2.y = 10;
        tile2.size = 10;
        tile2.color = BLUE;
        gate3.x = 122;
        gate3.y = 148;
        gate3.length = 10;
        gate3.direction = 1;
        gate3.color = RED;
        tile3.x = 66;
        tile3.y = 143;
        tile3.size = 8;
        tile3.color = BLUE;
        enemy1.x = 100;
        enemy1.y = 75;
        enemy1.speed = -1;
        enemy1.size = 5;
        enemy1.color = CYAN;
        enemy2.x = 120;
        enemy2.y = 75;
        enemy2.speed = 2;
        enemy2.size = 5;
        enemy2.color = CYAN;
        enemy3.x = 121;
        enemy3.y = 100;
        enemy3.speed = 2;
        enemy3.size = 5;
        enemy3.color = CYAN;
        enemy4.x = 120;
        enemy4.y = 60;
        enemy4.speed = -1;
        enemy4.size = 5;
        enemy4.color = CYAN;

    }
    drawRect(winTile.y, winTile.x, winTile.size, winTile.size, winTile.color);
    waitForVblank();

    int oldPlayerX = player.x;
    int oldPlayerY = player.y;
    int newPlayerX = oldPlayerX;
    int newPlayerY = oldPlayerY;


    while(1) {
        drawRect(oldPlayerY, oldPlayerX , player.size, player.size, WHITE);
        if(KEY_DOWN_NOW(BUTTON_SELECT)) {
            return 0;
        }
        int neg = -1 * player.speed;
        if(KEY_DOWN_NOW(BUTTON_UP))
        {
            int wall = horWallCollision(oldPlayerX, oldPlayerY, player.size, neg);
            int edge = yEdgeCollision(oldPlayerY, player.size, neg);
            newPlayerY += MAX(edge, wall);

        }
        if(KEY_DOWN_NOW(BUTTON_LEFT))
        {
            int wall = vertWallCollision(oldPlayerX, oldPlayerY, player.size, neg);
            int edge = xEdgeCollision(oldPlayerX, player.size, neg);
            newPlayerX += MAX(edge, wall);
        }
        if(KEY_DOWN_NOW(BUTTON_RIGHT))
        {
            int wall = vertWallCollision(oldPlayerX, oldPlayerY, player.size, player.speed);
            int edge = xEdgeCollision(oldPlayerX, player.size,  player.speed);
            newPlayerX += MIN(edge, wall);
        }
        if(KEY_DOWN_NOW(BUTTON_DOWN))
        {
            int wall = horWallCollision(oldPlayerX, oldPlayerY, player.size, player.speed);
            int edge = yEdgeCollision(oldPlayerY, player.size,  player.speed);
            newPlayerY += MIN(wall, edge);
        }
        //Update
        drawRect(oldPlayerY, oldPlayerX , player.size, player.size, WHITE); //Erase old Player Location
        // drawRect(tile1.x, tile1.y, tile1.size, tile1.size, tile1.color);    //Redraw Tile
        drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, RED);     //Draw Line
        if(tileCollision(oldPlayerX,oldPlayerY , player.size, tile1)) {     //Check collision with tile
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, WHITE);//Erase and redraw gate with new direction
            gate1.direction = 0;
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, RED);
        }
        drawRect(tile1.y, tile1.x, tile1.size, tile1.size, tile1.color);
        drawRect(tile2.y, tile2.x, tile2.size, tile2.size, tile2.color);
        drawRect(tile3.y, tile3.x, tile3.size, tile3.size, tile3.color);
        drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, RED);
        drawLine(gate2.x, gate2.y, gate2.length, gate2.direction, RED);
        drawLine(gate3.x, gate3.y, gate3.length, gate3.direction, RED);
        if(tileCollision(oldPlayerX,oldPlayerY , player.size, tile1)) {     //Check collision with tile
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, WHITE);//Erase and redraw gate with new direction
            gate1.direction = 0;
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, RED);
        }
        if(tileCollision(oldPlayerX,oldPlayerY , player.size, tile3)) {     //Check collision with tile
            drawLine(gate2.x, gate2.y, gate2.length, gate2.direction, WHITE);//Erase and redraw gate with new direction
            gate2.direction = 1;
            drawLine(gate2.x, gate2.y, gate2.length, gate2.direction, RED);
        }
        if(tileCollision(oldPlayerX,oldPlayerY , player.size, tile2)) {     //Check collision with tile
            drawLine(gate3.x, gate3.y, gate3.length, gate3.direction, WHITE);//Erase and redraw gate with new direction
            gate3.direction = 0;
            drawLine(gate3.x, gate3.y, gate3.length, gate3.direction, RED);
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, BLACK);//Erase and redraw gate with new direction
            gate1.direction = 1;
            drawLine(gate1.x, gate1.y, gate1.length, gate1.direction, RED);
        }

        drawRect(enemy1.y, enemy1.x, enemy1.size, enemy1.size, WHITE);
        if(horWallCollision(enemy1.x, enemy1.y, enemy1.size, enemy1.speed) == 0) {
            enemy1.speed *= -1;
        }
        enemy1.y += enemy1.speed;
        drawRect(enemy1.y, enemy1.x, enemy1.size, enemy1.size, enemy1.color);

        drawRect(enemy2.y, enemy2.x, enemy2.size, enemy2.size, WHITE);
        if(horWallCollision(enemy2.x, enemy2.y, enemy2.size, enemy2.speed) == 0) {
            enemy2.speed *= -1;
        }
        enemy2.y += enemy2.speed;
        drawRect(enemy2.y, enemy2.x, enemy2.size, enemy2.size, enemy2.color);


        drawRect(enemy3.y, enemy3.x, enemy3.size, enemy3.size, WHITE);
        if(vertWallCollision(enemy3.x, enemy3.y, enemy3.size, enemy3.speed) == 0) {
            enemy3.speed *= -1;
        }
        enemy3.x += enemy3.speed;
        drawRect(enemy3.y, enemy3.x, enemy3.size, enemy3.size, enemy3.color);

        drawRect(enemy4.y, enemy4.x, enemy4.size, enemy4.size, WHITE);
        if(vertWallCollision(enemy4.x, enemy4.y, enemy4.size, enemy4.speed) == 0) {
            enemy4.speed *= -1;
        }
        enemy4.x += enemy4.speed;
        drawRect(enemy4.y, enemy4.x, enemy4.size, enemy4.size, enemy4.color);

        if(enemyCollision(newPlayerX, newPlayerY, player.size, enemy1)) {
            return 2;
        }

        if(enemyCollision(newPlayerX, newPlayerY, player.size, enemy2)) {
            return 2;
        }
        if(enemyCollision(newPlayerX, newPlayerY, player.size, enemy3)) {
            return 2;
        }
        if(enemyCollision(newPlayerX, newPlayerY, player.size, enemy4)) {
            return 2;
        }

        if (KEY_DOWN_NOW(BUTTON_SELECT)) {
            return 0;
        }
        if (tileCollision(newPlayerX, newPlayerY, player.size, winTile)) {
            return 1;
        }

        drawRect(newPlayerY, newPlayerX, player.size, player.size, player.color);
        oldPlayerX = newPlayerX;
        oldPlayerY = newPlayerY;
        waitForVblank();
    }
    return 0;
}