Skip to content

Instantly share code, notes, and snippets.

@ChunChunMorning
Last active September 13, 2017 13:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChunChunMorning/bcb562592ed99bde6a54a9b7753028e1 to your computer and use it in GitHub Desktop.
Save ChunChunMorning/bcb562592ed99bde6a54a9b7753028e1 to your computer and use it in GitHub Desktop.
7時間ハッカソン テーマ「波」
# 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