避けゲー
体験実習 実習課題 避けゲー
準備
Game.zipを解凍し、Visual Studio 2022 で付属のソリューション/プロジェクトを開く。imageフォルダにタイトル用・リザルト用・猫用・蛇用の画像を配置する。(例:title.png,result.png,cat.png,snake.png)
課題01:タイトル画面の背景を表示しよう
ファイル:TitleScene.cpp
void TitleScene::Init()
{
isFinished = false;
// ToDo: 背景画像を一度だけロードするコードを追加しよう
if ( bgImage == -1 )
{
bgImage = LoadGraph( "______" ); // ← 画像ファイル名を入力
}
}- 穴埋め:
"______"に"image/title.png"を入れて F5 で確認。
課題02:タイトル画面からプレイ画面へ遷移しよう
ファイル:TitleScene.cpp
void TitleScene::Update(float deltaTime)
{
// ToDo: スペースキーが押されたらシーン終了(PlaySceneへ移行)
if ( CheckHitKey( KEY_INPUT_SPACE ) )
{
isFinished = true; // そのままでOK
}
}- 確認:F5 でタイトル画面を表示し、スペースキーでゲーム開始に進むこと。
課題03:プレイ画面の初期設定をしよう
ファイル:PlayScene.cpp
void PlayScene::Init()
{
isFinished = false;
enemies.clear();
// ToDo: プレイヤー初期位置を画面中央にセット(Y座標は地面から半分上)
player.x = WINDOW_WIDTH / 2;
player.y = GROUND_Y - CHARACTER_SIZE / 2;
// ToDo: プレイヤーの移動速度を設定しよう
playerSpeed = _____f; // 例:150.0f
// ToDo: 敵の落下速度を設定しよう
enemySpeed = _____f; // 例:150.0f
// ToDo: 敵の出現間隔を設定しよう
enemySpawnInterval = _____f; // 例:0.5f
// ToDo: 敵生成タイマー初期化
enemySpawnTimer = 0.0f;
// ToDo: スコア初期化
score = 0.0;
// ToDo: 画像とフォントを一度だけロードするコードを追加しよう
if ( playerImage == -1 ) playerImage = LoadGraph( "______" ); // cat.png
if ( enemyImage == -1 ) enemyImage = LoadGraph( "______" ); // snake.png
if ( scoreFont == -1 ) scoreFont = CreateFontToHandle( "メイリオ", 64, 0, DX_FONTTYPE_NORMAL );
}- 穴埋め例:
playerSpeed = 150.0f;enemySpeed = 150.0f;enemySpawnInterval = 0.5f;LoadGraph("image/cat.png")/LoadGraph("image/snake.png")
課題04:プレイヤーを左右に動かそう
ファイル:PlayScene.cpp
void PlayScene::Update(float deltaTime)
{
// ToDo: 左右キーで player.x を更新しよう
if ( CheckHitKey( KEY_INPUT_LEFT ) )
{
player.x -= _____f * deltaTime; // playerSpeed を使おう
}
else if ( CheckHitKey( KEY_INPUT_RIGHT ) )
{
player.x += _____f * deltaTime;
}
// (以降はスコアや敵生成など…)
}- 穴埋め:
playerSpeedを入れて動作確認。
課題05:敵を定期的に生成しよう
ファイル:PlayScene.cpp (同じ Update 内)
// 一定時間後、敵生成
// ToDo: タイマーに経過時間を加算
enemySpawnTimer += Scene::DeltaTime(); // または deltaTime
// ToDo: タイマーが間隔を超えたら CreateEnemy() を呼び出し、タイマーをリセット
if ( enemySpawnTimer > enemySpawnInterval )
{
CreateEnemy();
}- 確認:F5 で蛇(enemy)が落ちてくるかチェック。
課題06:当たり判定とリザルト画面へ遷移しよう
ファイル:PlayScene.cpp
bool PlayScene::IsHit()
{
for ( auto& e : enemies )
{
float dx = player.x - e.x;
float dy = player.y - e.y;
// ToDo: 衝突判定を完成させよう(距離の2乗 <= 半径の2乗)
if ( (dx*dx) + (dy*dy) <= _____ )
{
return true;
}
}
return false;
}void PlayScene::Update(float deltaTime)
{
// …(敵更新・描画の直前)
if ( IsHit() )
{
isFinished = true; // リザルトシーンへ
}
}- 穴埋め:
CHARACTER_SIZE * CHARACTER_SIZEを入れて確認。
###課題07:リザルト画面の背景を表示しよう
ファイル:ResultScene.cpp
void ResultScene::Init()
{
isFinished = false;
// ToDo: 背景画像をロード
if ( bgImage == -1 )
{
bgImage = LoadGraph( "______" ); // たとえば "image/result.png"
}
}- 穴埋め:
"image/result.png"を指定し、スペースキーでタイトルに戻ることを確認。
発展課題
- BGMを追加してみる
- ハイスコアをファイルに書き出してみる
- プレイヤーのアニメーション切り替え