-
Notifications
You must be signed in to change notification settings - Fork 1
シューティングゲーム
Reputeless edited this page Mar 14, 2017
·
3 revisions
# include <Siv3D.hpp>
void Main()
{
Window::SetTitle(L"Siv Shooting | [Z]: shot / 十字キー: 移動");
const Texture texture(Image(640, 960,[n = PerlinNoise()](auto p)
{
return HSV(220, 0.9 * n.octaveNoise0_1(p.x / 160.0, Abs(p.y / 120.0 - 4.0), 8), 0.8);
}));
const Font font(20);
Array<Vec2> shots, bullets, enemies;
Triangle player(300, 200, 20.0);
int32 count = 0, crash = 0, score = 0, highSore = 0;
while (System::Update())
{
++count;
const int32 skyOffset = System::FrameCount() % 960 * 8;
texture(0, -skyOffset / 2, 640, 480).draw();
texture(0, -skyOffset, 640, 480).draw(Alpha(80));
if (count % (24 - Min(count / 60, 18)) == 0)
enemies.emplace_back(Random(40, 600), -40);
Vec2 dir(Input::KeyRight.pressed - Input::KeyLeft.pressed, Input::KeyDown.pressed - Input::KeyUp.pressed);
if (!dir.isZero())
player.moveBy(dir.setLength(Input::KeyShift.pressed ? 4.5 : 9.0));
player.setCentroid(Clamp(player.centroid().x, 0.0, 640.0), Clamp(player.centroid().y, 0.0, 480.0));
if (Input::KeyZ.pressed && count % 4 == 0)
shots.push_back(player.p0);
for (auto& shot : shots)
shot.y -= 8.0;
for (auto& bullet : bullets)
bullet.y += 4.0;
for (auto& enemy : enemies)
{
enemy.y += 2.0;
if (count % 60 == 0)
bullets.push_back(enemy);
}
if (AnyOf(bullets, [=](const Vec2& b) { return player.intersects(b); })
|| AnyOf(enemies, [=](const Vec2& e) { return e.y > 490.0; }))
{
count = score = 0;
crash = 60;
}
Erase_if(shots, [](const Vec2& s) { return s.y < -10.0; });
Erase_if(bullets, [](const Vec2& b) { return b.y > 490.0; });
Erase_if(enemies, [&](const Vec2& e) {
if (AnyOf(shots, [=](const Vec2& s) { return e.distanceFrom(s) < 20.0; }))
{
++score;
return true;
}
else return e.y > 490.0;
});
for (const auto& shot : shots)
Circle(shot, 7).drawFrame(4, 0, Palette::Orange);
for (const auto& bullet : bullets)
Circle(bullet, 4).draw();
for (const auto& enemy : enemies)
RectF(30, 30).setCenter(enemy).rotated(enemy.y / 100.0).draw(Palette::Black);
player.draw();
if (crash)
Window::ClientRect().draw(Alpha(--crash * 3));
font(L"Hi:{}\n{}"_fmt, highSore = Max(score, highSore), score).draw(20, 20);
}
}
- Siv3D の基本
- 図形を描く
- テクスチャを描く
- テキストを描く
- 文字列と数値の変換
- キーボード入力
- マウス入力
- サウンドの再生
- MIDI の再生
- ウィンドウと背景
- 図形のあたり判定
- 乱数
- ダイアログ
- ドラッグ & ドロップ
- アプリの状態
- テキストファイル
- INI, CSV, JSON
- バイナリファイル
- GUI
- アセット管理
- 画像編集
- Web カメラ
- マイク入力
- 経過時間の測定
- HSV カラー
- ファイルダウンロード
- 3D 描画
- 2D のレンダーステート
- 3D のレンダーステート
- パーティクル
- スクリーンショット
- アプリケーションの公開
- さらに学ぶには
- アプリランチャーを作ろう
- 音楽プレイヤーを作ろう
- 横スクロールゲームを作ろう
- ドット絵エディタを作ろう
- シーン遷移をサポートする SceneManager の使い方
- Siv3D ミニサンプル集
- タスクシステムを使う
- スケッチ
- 画像ビューアー
- オーディオスペクトラム
- マイク入力スペクトラム
- 文字色の反転
- 天気予報
- ドットお絵かき
- 15パズル
- ブロックくずし
- 時計
- 音楽プレイヤー
- ピアノ
- ライフゲーム
- シーン管理
- 地球
- 3Dシーン
- 3D交差判定
- Wooden Mirror
- シューティングゲーム
- Image to Polygon
- Sketch to Polygon
- 軌跡
- Plot3D
- テンポとピッチの変更
- 長方形の影
- Twitterクライアント
- Polygon to Mesh
- 3Dテキスト
- アプリ終了の確認
- 地形の生成
- アーカイブファイル
- GUIのアニメーション
- Aero Glassエフェクト
- Glitch
- リンクテキスト
- 付箋
- シーン切り替え(シルエット)
- MIDIシーケンサー
- 数つなぎ
- 画面を揺らす
- 対称定規
- aobench
- MIDIビジュアライザー
- 電卓
- 手書き文字認識
- 顔検出
- 音声合成
- Image to PhysicsBody