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); } } }
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(); }
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; }