CollisionTile::CollisionTile(PlacementConfig config_) : config(config_), edges({{ // left CollisionBox(vec2<float>(0, 0), 0, -infinity, 0, infinity, infinity), // right CollisionBox(vec2<float>(util::EXTENT, 0), 0, -infinity, 0, infinity, infinity), // top CollisionBox(vec2<float>(0, 0), -infinity, 0, infinity, 0, infinity), // bottom CollisionBox(vec2<float>(0, util::EXTENT), -infinity, 0, infinity, 0, infinity), }}) { tree.clear(); // Compute the transformation matrix. const float angle_sin = std::sin(config.angle); const float angle_cos = std::cos(config.angle); rotationMatrix = { { angle_cos, -angle_sin, angle_sin, angle_cos } }; reverseRotationMatrix = { { angle_cos, angle_sin, -angle_sin, angle_cos } }; // Stretch boxes in y direction to account for the map tilt. const float _yStretch = 1.0f / std::cos(config.pitch); // The amount the map is squished depends on the y position. // Sort of account for this by making all boxes a bit bigger. yStretch = std::pow(_yStretch, 1.3); }
Player::Player(Vector2f position, Controls *con): Character(position, 10), Controlled(con), posStart(position), ani(&pos, Vector2f(0, 0), "media/animation/Billy/body", 8), feetAnimation(&pos, Vector2f(0, 0), "media/animation/Billy/feet", 24) { walkBox = CollisionBox(&pos, Vector2f(0, 18), 8); bodyBox = CollisionBox(&pos, Vector2f(0, 7), 12); weapon = new Sword(&pos); }
CollisionBox Player::getCollisionBox() { double left = position_.x - 5; double right = left + width_; double top = position_.y + 5; double bottom = top - height_; return CollisionBox(left, right, top, bottom); }
CollisionBox Spikes::getCollisionBox() { double left = position_.x - width_/2.0; double right = position_.x + width_/2.0; double top = position_.y + height_/2.0; double bottom = position_.y - width_/2.0; return CollisionBox(left, right, top, bottom); }
CollisionBox Bullet::getCollisionBox() { double min_x = position_.x - 2.5; double min_y = position_.y - 2.5; double max_x = position_.x + 2.5; double max_y = position_.y + 2.5; return CollisionBox(min_x, max_x, max_y, min_y); }
Monster::Monster(int width, int height, float x, float y, GLuint texture) :GameObjectS(width, height, x, y, texture, 0){ this->damage = 30; this->speed = 0.00025f; this->health = 20; this->maxHealth = 20; this->points = 35; this->readyToAttack = true; this->cooldown = 0; this->multiplier = 1.0; int boxSizes; if (width > height){ boxSizes = width; } else{ boxSizes = height; this->radius = height * 0.6f; } this->box = CollisionBox(x - boxSizes / 2, y - boxSizes / 2, boxSizes, boxSizes); this->center = Point2D(x, y); }
void loadMap(const char* path) { Vector2f *origo = new Vector2f(0,0); FILE *file; if (!(file = fopen(path, "r"))) { std::cout << "Failed to open file: " << path << std::endl; exit(-1); } const int MAXSTR = 256; char buffer[MAXSTR]; char str1[MAXSTR]; char str2[MAXSTR]; float x = 0, y = 0, r = 0, x2 = 0, y2 = 0; int num_back; while (fgets(buffer, MAXSTR, file)) { num_back = sscanf(buffer, "%[^{\n]{%[^}\n]}", str1, str2); if (num_back != 2) { continue; } if (strcmp(str1, "box") == 0) { num_back = sscanf(str2, "%f,%f,%f", &x, &y, &r); if (num_back != 3) { continue; } staticBoxes[numStatic] = CollisionBox(origo, Vector2f(x, y), r); numStatic += 1; } else if (strcmp(str1, "line") == 0) { num_back = sscanf(str2, "%f,%f,%f,%f", &x, &y, &x2, &y2); if (num_back != 4) { continue; } collisionLines[numCollisionLines] = CollisionLine(Vector2f(x, y), Vector2f(x2, y2)); numCollisionLines += 1; } else if (strcmp(str1, "img") == 0) { num_back = sscanf(str2, "%[^,\n],%f,%f", str1, &x, &y); if (num_back != 3) { continue; } images[numImages] = cs::Image(Vector2f(x, y), str1); numImages += 1; } else if (strcmp(str1, "bg") == 0) { num_back = sscanf(str2, "%[^,\n],%f,%f", str1, &x, &y); if (num_back != 3) { continue; } sf::Texture *texture = Resources::getTexture(str1); bgs[numBgs].setTexture(*texture); bgs[numBgs].setOrigin(sf::Vector2f((float)texture->getSize().x, (float)texture->getSize().y) / 2.0f); bgs[numBgs].setPosition(x, y); numBgs += 1; } else if (strcmp(str1, "spawn") == 0) { num_back = sscanf(str2, "%[^,\n],%f,%f", str1, &x, &y); if (num_back != 3) { continue; } World::addSpawn(new Spawn(Vector2f(x, y), str1)); } } fclose(file); }
// ---------------------------------------------------------------------------- // ChecksCollision - test if any collision occurs with BCPlayer // ---------------------------------------------------------------------------- bool ControlCollision::CheckCollision( CEnemy *MyEnemy, int WhichCollisionToUse, BaseSpaceShip *Mydemon ) { return CollisionBox( Mydemon, MyEnemy, true ); }
void InitGameMemory(game_memory *Memory, Canvas &canvas) { // �I�~�y���y�p�|�y�x�p���y�� game_state* GameState = (game_state*)Memory->PermanentStorage; InitializeArena(&GameState->WorldArena, Memory->PermanentStorageSize - sizeof(game_state), (uint8*)Memory->PermanentStorage + sizeof(game_state)); GameState->World = PushStruct(&GameState->WorldArena, world); world *World = GameState->World; World->TileMap = PushStruct(&GameState->WorldArena, tile_map); tile_map *TileMap = World->TileMap; GameState->Tick = 0; GameState->TimeElapsedFromLastTick = 0; // Camera GameState->CameraPos.Tile = Vec2i(0, 0); GameState->CameraPos.TilePos = Vec2f(0, 0); GameState->CameraOrigin = GameState->ScreenSize / 2.0f; GameState->EntityToCameraIn = Rect(-7, -5, 7, 5); GameState->EntityToCameraOut = Rect(-8, -6, 8, 6); // �H�p�s�����x�y���� �������p�z���� GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_sprite, "sand_tile_01.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_object_sprite_001, "object_storage_01.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_object_sprite_stone1, "object_stone_01.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_player_image, "robot_base_horizontal.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_player_image_v, "robot_base_vertical.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_player_image_ur, "robot_base_diagonal_ur.png"); GameState->LoadGameSpriteFromImage(canvas, GameState->GameSprites.tmp_player_image_ul, "robot_base_diagonal_ul.png"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_ground_sprite_01, "ground_concrete_tileset"); GameState->AddGameSpriteFrameFromImage(canvas, GameState->GameSprites.tmp_ground_sprite_01, "ground_tile_01.png"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_torso, "robot_torso"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_down, "track_v_down"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_left, "track_h_left"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_right, "track_h_right"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_up, "track_v_up"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_ur, "track_d_ur"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_ul, "track_d_ul"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_br, "track_d_br"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_player_image_track_bl, "track_d_bl"); GameState->LoadGameSpriteFromResource(canvas, &GameState->game_resources, GameState->GameSprites.tmp_wall_sprite1, "tileset_brick_wall"); // Player entity // GameState->PlayerEntity = AddEntity(GameState); GameState->PlayerEntity->Position.Tile = Vec2i(0, 0); GameState->PlayerEntity->Position.TilePos = Vec2f(0, 0); GameState->PlayerEntity->EntityType = EntityType_Robot; GameState->PlayerEntity->CollisionType = 1; GameState->PlayerEntity->CollisionBox = Rectf(-0.45f, -0.25f, 0.45f, 0.25f); GameState->PlayerEntity->Controller.Active = 1; GameState->PlayerEntity->Mass = 20000.0f; GameState->PlayerEntity->RResistance = 0.008f; SetEntityToActive(GameState->PlayerEntity, GameState); World->TileSizeMeters = Vec2f(1.0f, 1.0f); World->TileSizePixels = Vec2f(100.0f, 100.0f); World->MetersToPixels = World->TileSizePixels / World->TileSizeMeters; World->g = 4.2f; TileMap->TileChunkSize = Vec2ui(16, 16); //TileMap->CenterChunkPosition = TileMap->TileChunksCount / (uint32)2; GameState->TilesOnHalfScreen.width = (int)((GameState->ScreenSize.width / 2) / World->TileSizePixels.x) + 1; GameState->TilesOnHalfScreen.height = (int)((GameState->ScreenSize.height / 2) / World->TileSizePixels.y) + 1; Vec2i TilesPerScreen = GameState->TilesOnHalfScreen * 2; for (int32 ScreenY = -16; ScreenY < 16; ScreenY++) { for (int32 ScreenX = -16; ScreenX < 16; ScreenX++) { for (int32 TY = 0; TY < TilesPerScreen.y; TY++) { for (int32 TX = 0; TX < TilesPerScreen.x; TX++) { int32 AbsTileX = ScreenX * TilesPerScreen.x + TX; int32 AbsTileY = ScreenY * TilesPerScreen.y + TY; SetTileValue(&GameState->WorldArena, TileMap, Vec2i(AbsTileX, AbsTileY), rand() % 16 + 1); } } } } /* for (int32 Y = 1; Y < 4; Y++) { for (int32 X = 1; X < 5; X++) { SetTileValue(&GameState->WorldArena, TileMap, Vec2i(X, Y), 5); SetTileValue(&GameState->WorldArena, TileMap, Vec2i(X - 7, Y), 5); SetTileValue(&GameState->WorldArena, TileMap, Vec2i(X - 5, Y + 6), 4); } } */ // Game entities GameState->TiledEntities.Entities = PushArray(&GameState->WorldArena, 4096, entity); GameState->TiledEntities.GroupSize = 4096; GameState->TiledEntities.EntityCount = 0; GameState->TiledEntities.NextGroup = 0; AddEntityToGroup(&GameState->WorldArena, &GameState->TiledEntities); // �N���|�u�r���z ���q���u�{�� �~�u �y�������|���x���u������ // Add many stone entities world_position EntityPos; //Rectf CollisionBox(-0.4f, 0.0f, 0.4f, 0.3f); Rectf CollisionBox(-0.5f, -0.5f, 0.5f, 0.5f); for (int32 Y = 1; Y < 10; Y++) { for (int32 X = 1; X < 10; X++) { EntityPos.Tile = Vec2i(X, Y); EntityPos.TilePos = Vec2f(0, 0); uint32 StoneIndex = AddEntityToGroup(&GameState->WorldArena, &GameState->TiledEntities); entity *Entity = GetEntityFromGroupByIndex(&GameState->TiledEntities, StoneIndex); Entity->EntityType = EntityType_Storage; Entity->Position = EntityPos; Entity->CollisionType = 1; Entity->CollisionBox = CollisionBox; AddEntityToTile(GameState->World->TileMap, EntityPos.Tile, StoneIndex); } } /* EntityPos.Tile = Vec2i(1, 1); EntityPos.TilePos = Vec2f(0, 0); entity *Entity = AddEntity(GameState); Entity->EntityType = EntityType_Stone; Entity->Position = EntityPos; Entity->CollisionType = 1; Entity->CollisionBox = CollisionBox; //SetEntityToActive(Entity, GameState); /* Entity = AddEntity(GameState); Entity->EntityType = EntityType_Wall; EntityPos.Tile = Vec2i(0, -2); Entity->Position = EntityPos; Entity->CollisionType = 1; Entity->CollisionBox = Rectf(-0.5f, -0.1f, 0.5f, 0.1f); Entity->EntityFrame = 0; //SetEntityToActive(Entity, GameState); */ // Call to camera reset to activate entities in camera space MapEntitiesInCameraSpace(GameState); GameState->IsInitialized = 1; }