#include "items.h" #include Items* Items::instance; void Items::Init() { CoinSprite = LoadTexture("Assets/coinspritesheets.png"); // Texture loading fxCoin = LoadSound("Assets/Coin01.wav"); coins.clear(); canSpawn = true; timer = 0; } void Items::SetTimer() { canSpawn = false; timer = 0; } void Items::Update(Bird* _player) { // 파이프를 지나갈 떄 까지는 코인 스폰을 시키지 않는다. if (!canSpawn) { timer++; if (timer > 55) // 파이프가 100픽셀이고 스피드가 2이므로 50프레임이 지나야 파이프와 겹치지 않는다. 넉넉하게 55프레임으로 하였다. { canSpawn = true; timer = 0; } }else { int spawn = GetRandomValue(0, 1000); // 코인이 발생할 확률 if (spawn < 2 && canSpawn == true) // 코인이 발생할 확률을 1000분의 10 즉 1%로 설정함 { Coin coin; coin.Init(&CoinSprite); coins.push_back(coin); } } // 각 코인별로 로직을 실행한다. if (coins.size() > 0) { for (unsigned int i = 0;i < coins.size();i++) { coins[i].Update(); // 개별 코인 업데이트 함수 // 코인과 플레이어간의 상호작용 Rectangle birdRect = _player->GetPosition(); // 플레이어 위치 확인 if (coins[i].GetCollision(birdRect)) // 코인과 플레이어가 부딪히는지 확인 { _player->SetAddScore(3); // 플레이어 점수를 올림. 여기에서는 3점을 올리기로 함 PlaySound(fxCoin); // 코인 획득 사운드 coins.erase(coins.begin() + i); // 코인이 플레이어와 부딪히면 배열에서 제거 }else { // 코인을 배열에서 제거하기 if (coins[i].GetPosition() <= 0) coins.erase(coins.begin() + i); // 코인이 왼쪽 끝에 가면 배열에서 제거 } } } } void Items::Draw() { if (coins.size() >0 ) { for (unsigned int i = 0;i< coins.size();i++) { coins[i].Draw(); } } } Items::~Items() { UnloadTexture(CoinSprite); // Texture unloading UnloadSound(fxCoin); // Sound unloading }