シューティングゲームについて
H  2017/12/16(Sat) 21:12
既に公開されているシューティングゲームのソースを参考にして、以下のような、「弾に触れると得点が
1点加算される」ようにしたいと考えているのですが、現状では触れたとき画面上に存在するすべての弾が
消えて、その分だけ加算されるようになってしまいます。
これを希望のように動かすにはどのようなコードを書けばいいのでしょうか。
Siv3Dに出会ってまだ間もなく右も左もわからない状態です。回答してくだされば幸いです。


以下ソース

#include <Siv3D.hpp>

void Main() {
Window::SetTitle(L"Catch!");
Window::Resize(640, 480);

Array<Vec2> enemies;
bool ints = false;
//自機移動のための変数
Point pl_xy(300, 400);
//フレーム数のカウント
int framecount = 0;
//得点
int score = 0;

Font font(20);

while (System::Update()) {

framecount++;

//自機
const Rect player(pl_xy, 25, 25);
player.draw(Palette::White);

if (Input::KeyRight.pressed) {
pl_xy.x += 5;
}
if (Input::KeyLeft.pressed) {
pl_xy.x -= 5;
}
if (pl_xy.x > 615) { pl_xy.x = 615; }
if (pl_xy.x < 0) { pl_xy.x = 0; }


if (framecount % (24 - Min(framecount / 60, 18)) == 0) {
enemies.emplace_back(Random(40, 600), -40);
}


for (auto& apple : enemies) {
apple.y += 5.0;
}


for (auto& apple : enemies) {
Circle(apple,20).draw(Palette::Red);
}



Erase_if(enemies, [](const Vec2& p) {return p.y > 490; });
Erase_if(enemies, [&](const Vec2& e) {
if (std::any_of(enemies.begin(), enemies.end(), [pl_xy](const Vec2& e) { return pl_xy.distanceFrom(e) < 25.0; }))
{
++score;
return true;
}
else return e.y > 490.0;

});

font(score).draw();
}
}
記事編集
Reputeless  2017/12/17(Sun) 07:44
Erase_if(enemies, [&](const Vec2& e) で
std::any_of の条件が true のとき、要素を全部消すようにしているためです。
編集
件名
Re: シューティングゲームについて
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -