Last active
September 13, 2017 13:35
-
-
Save ChunChunMorning/bcb562592ed99bde6a54a9b7753028e1 to your computer and use it in GitHub Desktop.
7時間ハッカソン テーマ「波」
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# include <Siv3D.hpp> | |
# include <HamFramework.hpp> | |
void Main() | |
{ | |
Window::SetTitle(L"Before Momotaro"); | |
Graphics::SetBackground(Palette::Green); | |
Graphics::SetTargetFrameRateHz(60); | |
const Texture peachTexture(Emoji(L"🍑"), TextureDesc::Mipped); | |
const std::array<Texture, 3> playerTextures = { | |
Texture(Emoji(L"🐕"), TextureDesc::Mipped), | |
Texture(Emoji(L"🐒"), TextureDesc::Mipped), | |
Texture(Emoji(L"🐦"), TextureDesc::Mipped) | |
}; | |
const std::array<Texture, 3> plantTextures = { | |
Texture(Emoji(L"☘"), TextureDesc::Mipped), | |
Texture(Emoji(L"🍀"), TextureDesc::Mipped), | |
Texture(Emoji(L"🌷"), TextureDesc::Mipped) | |
}; | |
const Texture rockTexture(Emoji(L"🍪"), TextureDesc::Mipped); | |
const Texture enemyTexture(Emoji(L"👻"), TextureDesc::Mipped); | |
const Font font(30); | |
Vec2 playerPos(0, 64); | |
int playerType = 0; | |
Vec2 peachPos(0, 240); | |
Array<Vec2> waves; | |
Array<std::pair<Vec2, int32>> plants; | |
Array<Vec2> rocks; | |
Array<Vec2> enemies; | |
double plantInterval = 1000; | |
double rockInterval = 1000; | |
double enemyInterval = 0; | |
Camera2D camera(peachPos, 1, false, false, 10, 1.1, 0.2); | |
for(double x = 0; x < Window::Width() * 1.5; x += 60) | |
{ | |
waves.emplace_back(x - Window::Width() / 2, Random(140, 340)); | |
} | |
for(double x = 60; x < Window::Width(); x += 120) | |
{ | |
plants.emplace_back( | |
Vec2(x - Window::Width() / 2, RandomBool() ? 64 : (Window::Height() - 64)), | |
Random<int32>(0, 2) | |
); | |
} | |
while (System::Update()) | |
{ | |
if(System::FrameCount() % 180 == 0) | |
{ | |
waves.emplace_back(camera.getPos().x + 500, Random(140, 340)); | |
} | |
if(plantInterval > 120) | |
{ | |
plants.emplace_back( | |
Vec2(camera.getPos().x - 350, RandomBool() ? 64 : (Window::Height() - 64)), | |
Random<int32>(0, 2) | |
); | |
plantInterval = 0; | |
} | |
if(rockInterval > 250) | |
{ | |
switch (Random(0, 10)) | |
{ | |
case 0: | |
case 1: | |
rocks.emplace_back(camera.getPos().x - 350, 184); | |
break; | |
case 2: | |
case 3: | |
rocks.emplace_back(camera.getPos().x - 350, 240); | |
break; | |
case 4: | |
case 5: | |
rocks.emplace_back(camera.getPos().x - 350, 296); | |
break; | |
case 6: | |
rocks.emplace_back(camera.getPos().x - 350, 184); | |
rocks.emplace_back(camera.getPos().x - 350, 240); | |
break; | |
case 7: | |
rocks.emplace_back(camera.getPos().x - 350, 240); | |
rocks.emplace_back(camera.getPos().x - 350, 296); | |
break; | |
default: | |
break; | |
} | |
rockInterval = 0; | |
} | |
if(enemyInterval > 400) | |
{ | |
switch (Random(0, 3)) | |
{ | |
case 0: | |
enemies.emplace_back(camera.getPos().x - 400, 64); | |
break; | |
case 1: | |
enemies.emplace_back(camera.getPos().x - 400, Window::Height() - 64); | |
break; | |
case 2: | |
enemies.emplace_back(camera.getPos().x - 400, 64); | |
enemies.emplace_back(camera.getPos().x - 400, Window::Height() - 64); | |
break; | |
default: | |
break; | |
} | |
enemyInterval = 0; | |
} | |
for(auto& wave : waves) | |
{ | |
wave.moveBy(-0.6, 0); | |
} | |
const bool scared = AnyOf( | |
enemies, | |
[&](const Vec2& e){ | |
return RectF(Arg::center = e, 136, 128).intersects(playerPos); | |
} | |
); | |
if(KeyX.down()) | |
{ | |
playerType = (playerType + 1) % playerTextures.size(); | |
} | |
if(!scared || playerType == 0) | |
{ | |
if(KeyLeft.pressed()) | |
{ | |
playerPos.x -= 2; | |
} | |
if(KeyRight.pressed()) | |
{ | |
playerPos.x += 2; | |
} | |
} | |
if(KeyZ.down() && playerType == 0) | |
{ | |
Erase_if(enemies, [&](const Vec2& e){ return RectF(Arg::center = e, 136, 128).intersects(playerPos); }); | |
} | |
if(KeyZ.down() && playerType == 1 && !scared) | |
{ | |
playerPos.y = playerPos.y > 320 ? 64 : (Window::Height() - 64); | |
} | |
if(KeyZ.pressed() && playerType == 2 && !scared && Math::Abs(playerPos.x - peachPos.x) < 136) | |
{ | |
peachPos.y += playerPos.y > 320 ? -0.5 : 0.5; | |
peachPos.y = Clamp<double>(peachPos.y, 128 * 1.25, Window::Height() - 128 * 1.25); | |
} | |
if(!AnyOf(rocks, [&](const Vec2& e){return e.x < peachPos.x && RectF(Arg::center = e, 136, 128).intersects(peachPos); })) | |
{ | |
peachPos.x -= 0.5; | |
plantInterval += 0.5; | |
rockInterval += 0.5; | |
enemyInterval += 0.5; | |
} | |
camera.setTargetPos({peachPos.x, 240}); | |
camera.update(); | |
Erase_if(waves, [&](const Vec2& e){ return e.x < camera.getPos().x - 1000; }); | |
Erase_if(plants, [&](const std::pair<Vec2, int32>& e){ return e.first.x > camera.getPos().x + 350; }); | |
Erase_if(rocks, [&](const Vec2& e){ return e.x > camera.getPos().x + 350; }); | |
Erase_if(enemies, [&](const Vec2& e){ return e.x > camera.getPos().x + 350; }); | |
Rect(0, 128, Window::Width(), Window::Height() - 2 * 128).draw(Palette::Dodgerblue); | |
{ | |
const auto ct = camera.createTransformer(); | |
for(const auto& wave : waves) | |
{ | |
Ellipse(wave, 20, 2).draw(Palette::Aliceblue); | |
} | |
for(const auto& plant : plants) | |
{ | |
RectF(Arg::center = plant.first, 136 * 0.5, 128 * 0.5)(plantTextures[plant.second]).draw(); | |
} | |
for(const auto& rock : rocks) | |
{ | |
RectF(Arg::center = rock, 136 * 0.5, 128 * 0.5)(rockTexture).draw(); | |
} | |
for(const auto& enemy : enemies) | |
{ | |
RectF(Arg::center = enemy, 136 * 0.8, 128 * 0.8) | |
.movedBy(0, std::sin(System::FrameCount() * 0.3))(enemyTexture).draw(); | |
} | |
if(playerType != 0 && scared) | |
{ | |
RectF(Arg::center = playerPos, 136 * 0.8, 128 * 0.8) | |
.movedBy(std::sin(System::FrameCount()), 0)(playerTextures[playerType]).draw(); | |
} | |
else | |
{ | |
RectF(Arg::center = playerPos, 136 * 0.8, 128 * 0.8) | |
.movedBy(0, std::sin(System::FrameCount() * 0.05))(playerTextures[playerType]).draw(); | |
} | |
font(L"Z:", playerType == 0 ? L"追い払う" : (playerType == 1 ? L"岸へ飛ぶ" : L"風起こし")).draw(playerPos.x - 150, playerPos.y + 20, Palette::Whitesmoke); | |
font(L"X:", playerType == 0 ? L"猿" : (playerType == 1 ? L"雉" : L"犬")).draw(playerPos.x + 30, playerPos.y + 20, Palette::Whitesmoke); | |
RectF(Arg::center = peachPos, 136 * 0.5, 128 * 0.5) | |
.movedBy(0, 2 * std::sin(System::FrameCount() * 0.05))(peachTexture.flip()).draw(); | |
} | |
font(ToFixed(-peachPos.x / 100, 2), L" m").draw(10, 10, Palette::Whitesmoke); | |
if(KeyS.down()) | |
{ | |
ScreenCapture::SaveCurrentFrame(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment