質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C++

    3457questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Windows

    1441questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • DXライブラリ

    56questions

    DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

シューティングゲーム

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 911

rapini-01

score 4

現在C言語とDxlibを使用してシューティングゲームを作成しています。
左下に体力バーを表記して相手が衝突するたびに減少していき、ゼロになった場合ゲームオーバー画面が出る様にしたいのですが、どうプログラムすればいいのか分かりません。分かる方がいたらどう入力するべきなのか教えてください。

include "Game.h"

include "Common.h"

include "DxLib.h"

//========================================//
struct OBJECT_DATA {
int image;
int x;
int y;
int width;
int height;
int speed;
int score;
int shot_index;
int shot_wait_time;

OBJECT_DATA( ) {
this->image = 0;
this->x = 0;
this->y = 0;
this->width = 0;
this->height = 0;
this->speed = 0;
this->shot_index = 0;
this->shot_wait_time = 0;
}
OBJECT_DATA( int image,
int x, int y,
int width, int height,
int speed,
int shot_index = 0, int shot_wait_time = 0 ) {
this->image = image;
this->x = x;
this->y = y;
this->width = width;
this->height = height;
this->speed = speed;
this->shot_index = shot_index;
this->shot_wait_time = shot_wait_time;
}
};
//========================================//
int run( );

void initialize( );
void update( );
void draw( );
void finish( );

void updatePlayer( );
void updateShot( );
void updateEnemy( );
void updateBg( );

BOOL hitJudge( OBJECT_DATA* obj_a, OBJECT_DATA* obj_b );
void drawObject( OBJECT_DATA* obj );
void drawScore();
void drawHp();
//========================================//
const char* PLAYER_IMAGE_NAME = RESOURCE_PATH "ダウンロード.png";
const int PLAYER_MOVE_SPEED = 7;
const int PLAYER_SIZE_WIDTH = 42;
const int PLAYER_SIZE_HEIGHT = 20;
const int PLAYER_SHOT_WAIT_TIME = 10;
const int SCORE = 80;
const int SCORE_TIME = 15;

const char* SHOT_IMAGE_NAME = RESOURCE_PATH "Btnw1kKCMAAKF7L.png";
const int MAX_SHOT_NUM = 20;
const int SHOT_MOVE_SPEED = 20;
const int SHOT_SIZE_WIDTH = 30;
const int SHOT_SIZE_HEIGHT = 32;

const char* ENEMY_IMAGE_NAME = RESOURCE_PATH "enemy.png";
const int MAX_ENEMY_NUM = 20;
const int ENEMY_MOVE_SPEED = 10;
const int ENEMY_SIZE_WIDTH = 32;
const int ENEMY_SIZE_HEIGHT = 40;
const int ENEMY_CREATE_WAIT_TIME = 10;

const char* BG_IMAGE_NAME = RESOURCE_PATH "bg.png";
const int MAX_BG_NUM = 2;
const int BG_MOVE_SPEED = 2;
const int BG_SIZE_WIDTH = 640;
const int BG_SIZE_HEIGHT = 480;

const char* END_IMAGE_NAME = RESOURCE_PATH "BYnaPvrCUAAwbQu.jpg";
//========================================//
static OBJECT_DATA g_player;
static OBJECT_DATA g_shot_array[ MAX_SHOT_NUM ];
static OBJECT_DATA g_enemy_array[ MAX_ENEMY_NUM ];
static OBJECT_DATA g_bg_array[ MAX_BG_NUM ];
static int g_enemy_create_wait = 0;
static int g_score = 0;
static int g_hp = 100;
static int g_damege = 0;
//========================================//
int run( ) {
int result = 0;

if ( initGame( ) == TRUE ) {
initialize( );
while ( isLoop( ) ) {
update( );
draw( );
flip( );
}
finish( );
endGame( );
} else {
result = -1;
}

return result;
}

void initialize( ) {
g_player = OBJECT_DATA( LoadGraph( PLAYER_IMAGE_NAME ),
0, ( WINDOW_SIZE_HEIGHT - PLAYER_SIZE_HEIGHT ) / 2,
PLAYER_SIZE_WIDTH, PLAYER_SIZE_HEIGHT,
PLAYER_MOVE_SPEED );

int shot_image = LoadGraph( SHOT_IMAGE_NAME );
for ( int i = 0; i < MAX_SHOT_NUM; i++ ) {
g_shot_array[ i ] = OBJECT_DATA( shot_image,
WINDOW_SIZE_WIDTH, WINDOW_SIZE_HEIGHT,
SHOT_SIZE_WIDTH, SHOT_SIZE_HEIGHT,
SHOT_MOVE_SPEED );
}
int enemy_image = LoadGraph( ENEMY_IMAGE_NAME );
for ( int i = 0; i < MAX_ENEMY_NUM; i++ ) {
g_enemy_array[ i ] = OBJECT_DATA( enemy_image,
-ENEMY_SIZE_WIDTH, 0,
ENEMY_SIZE_WIDTH, ENEMY_SIZE_HEIGHT,
ENEMY_MOVE_SPEED );
}

int bg_image = LoadGraph( BG_IMAGE_NAME );
for ( int i = 0; i < MAX_BG_NUM; i++ ) {
g_bg_array[ i ] = OBJECT_DATA( bg_image,
BG_SIZE_WIDTH * i, 0,
BG_SIZE_WIDTH, BG_SIZE_HEIGHT,
BG_MOVE_SPEED );
}
g_enemy_create_wait = 0;
g_score = 0;
g_damege = 0;
}

void update( ) {
updatePlayer( );
updateShot( );
updateEnemy( );
updateBg( );
}

void draw( ) {
int end_image = LoadGraph(END_IMAGE_NAME);
for ( int i = 0; i < MAX_BG_NUM; i++ ) {
drawObject( &g_bg_array[ i ] );
}

drawObject( &g_player );

for ( int i = 0; i < MAX_SHOT_NUM; i++ ) {
drawObject( &g_shot_array[ i ] );
}

for (int i = 0; i < MAX_ENEMY_NUM; i++) {
drawObject(&g_enemy_array[i]);
}
drawScore();
drawHp();
if (g_hp <= 0) {
DrawGraph(0, 0, end_image, FALSE);
}
}

void finish( ) {
DeleteGraph( g_player.image );
DeleteGraph( g_shot_array[ 0 ].image );
DeleteGraph( g_enemy_array[ 0 ].image );
DeleteGraph( g_bg_array[ 0 ].image );
}

void updatePlayer( ) {
if ( getKey( KEY_TYPE::HOLD_RIGHT ) ) {
g_player.x += g_player.speed;
}
if ( getKey( KEY_TYPE::HOLD_LEFT ) ) {
g_player.x += -g_player.speed;
}
if ( getKey( KEY_TYPE::HOLD_UP ) ) {
g_player.y += -g_player.speed;
}
if ( getKey( KEY_TYPE::HOLD_DOWN ) ) {
g_player.y += g_player.speed;
}
if ( getKey( KEY_TYPE::HOLD_BUTTON_A ) ) {
g_player.shot_wait_time++;
if ( g_player.shot_wait_time >= PLAYER_SHOT_WAIT_TIME ) {
g_shot_array[ g_player.shot_index ].x = g_player.x + g_player.width;
g_shot_array[ g_player.shot_index ].y = g_player.y + ( g_player.height - g_shot_array[ g_player.shot_index ].height ) / 2;
g_player.shot_wait_time = 0;
g_player.shot_index++;
g_player.shot_index %= MAX_SHOT_NUM;
}
}

g_player.x = max( g_player.x, 0 );
g_player.x = min( g_player.x, WINDOW_SIZE_WIDTH - PLAYER_SIZE_WIDTH );
g_player.y = max( g_player.y, 0 );
g_player.y = min( g_player.y, WINDOW_SIZE_HEIGHT - PLAYER_SIZE_HEIGHT );
}

void updateShot( ) {
for ( int i = 0; i < MAX_SHOT_NUM; i++ ) {
g_shot_array[ i ].x += SHOT_MOVE_SPEED;
}
}

void updateEnemy( ) {
for ( int i = 0; i < MAX_ENEMY_NUM; i++ ) {
g_enemy_array[ i ].x += -g_enemy_array[ i ].speed;

for ( int j = 0; j < MAX_SHOT_NUM; j++ ) {
if ( hitJudge( &g_shot_array[ j ], &g_enemy_array[ i ] ) ) {
g_shot_array[ j ].x = WINDOW_SIZE_WIDTH;
g_enemy_array[ i ].x = -g_enemy_array[ i ].width;
}
}

if ( hitJudge( &g_player, &g_enemy_array[ i ] ) ) {
g_player.y = WINDOW_SIZE_HEIGHT;
g_enemy_array[ i ].x = -g_enemy_array[ i ].width;
}
}

g_enemy_create_wait++;
if ( g_enemy_create_wait >= ENEMY_CREATE_WAIT_TIME ) {
for ( int i = 0; i < MAX_ENEMY_NUM; i++ ) {
if ( g_enemy_array[ i ].x <= -g_enemy_array[ i ].x ) {
g_enemy_array[ i ].x = WINDOW_SIZE_WIDTH;
g_enemy_array[ i ].y = getRandom( WINDOW_SIZE_HEIGHT - g_enemy_array[ i ].height );
g_enemy_create_wait = 0;
break;
}
}
}
}

void updateBg( ) {
for ( int i = 0; i < MAX_BG_NUM; i++ ) {
g_bg_array[ i ].x += -BG_MOVE_SPEED;
if ( g_bg_array[ i ].x <= -WINDOW_SIZE_WIDTH ) {
g_bg_array[ i ].x = WINDOW_SIZE_WIDTH;
}
}
}

BOOL hitJudge( OBJECT_DATA* obj_a, OBJECT_DATA* obj_b ) {
BOOL result = FALSE;
int cx = obj_a->x + obj_a->width / 2;
int cy = obj_a->y + obj_a->height / 2;
int tx = obj_b->x;
int ty = obj_b->y;
int tw = obj_b->width;
int th = obj_b->height;

if ( cx > tx &&
cx < tx + tw &&
cy > ty &&
cy < ty + th ) {
result = TRUE;
}

return result;
}

void drawObject( OBJECT_DATA* obj ) {
int image = obj->image;
int x = obj->x;
int y = obj->y;
DrawGraph( x, y, image, TRUE );
}

void drawScore() {
DrawFormatString(550, 20, GetColor(255, 255, 0), "SCORE:%d", g_score);
}
void drawHp() {
DrawFormatString(0, 20, GetColor(255, 0, 255), "HP:%d", g_hp);
}

学校のC言語で課題が出されたので、サンプルのシューティングゲームを使ってゲームを制作しています。

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • edo_m18

    2017/02/23 16:24

    コード部分は、バッククォート3つでくくるとハイライト・整形してくれるので、回答者の人が理解しやすくなるように必ず記述してください。 (いい回答はいい質問から、です)

    キャンセル

  • PineMatsu

    2017/02/23 16:56

    プログラムを記載するのはいいのですが、このプログラムがどこまで動いて何が動かないのかまたは何が出来てないのか、などもっと具体的に書いてもらわないと回答しようがありません。プログラムの全文を載せてこれを読んで(解読して)答えろというのは虫が良すぎます。回答者もそれほど暇じゃない。ましてやこのソースにはコメントが一切ないじゃないですか。

    キャンセル

  • 退会済みユーザー

    2017/04/17 16:40

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

0

回答の前に、まずはどのようにすればソースコードが貼り付けられるかを勉強しましょう。
ざっくり言えば、次の画像で囲った位置に貼り付ければ問題ないです
説明用画像

それを踏まえた上で、あなたがどういったコードを書くべきなのかについて。

左下に体力バーを表記して相手が衝突するたびに減少していき、ゼロになった場合ゲームオーバー画面が出る様にしたい

ということですので、これをまずは1つづつ要素に分解していきます。

  1. まず、現在の状況を「戦闘中の画面」にする
  2. 体力バー・自機・敵機(相手)を左下に描画する
  3. 敵機を動かす
  4. 自機と敵機との当たり判定を行い、成功すると自機の体力を減少させる
  5. 自機の体力をチェックし、ゼロであれば5.に、そうでなければ1.に進む
  6. 現在の状況を「ゲームオーバーの画面」に移行させる

上記の1.から4.までを毎フレーム行うようにすれば、あなたの目的は達成できると思われます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ソースコードは細かくは見ていませんが、自分だったらどうするかを書いていきます。

まず、実際のゲームシーンと、ゲームオーバーシーンで処理を分ける必要があるかと思います。

どうするかといいますと、ソースのupdate関数とdraw関数が実際のゲームシーンの処理と描画を行うと思われるので、それとは別にゲームオーバー用のupdate関数(例えばgameover_update関数)とdraw関数(例えばgameover_draw関数)を用意します。

それと現在ゲーム中なのかゲームオーバーシーンなのかを判定するためにグローバル変数(例えばg_now_scene)を用意し、ゲーム中であれば1、ゲームオーバーシーンなら2などを入れることにします。

つぎにメインループ(while(isLoop()))でこの変数を確認し
while ( isLoop( ) ) {
if (g_now_scene == 1) {
update( );
draw( );
} else if (g_now_scene == 2) {
gameover_update();
gameover_draw();
}
flip( );
}

のような感じで処理を2分します。

gameover_update(),gameover_draw()にはゲームオーバー画面での処理を書いてください。

体力バーについては、DrawBoxという関数で異なる色の四角形を二つ体力によって描けばそれらしくはなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【janken.RandomTacitcs cannot be resolved to a type...

    以下コードの下から4行目の部分で janken.RandomTacitcs cannot be resolved to a type とエラーが出ます。 どのように修正すればいいで

  • 解決済

    JavaScriptの小技募集

    JavaScriptは良くも悪くも記述の自由度が高い言語ですよね。 そんなJavaScriptには現場で使われるちょっとした小技や必須のテクニック、競技や問題向けの小技や荒技が存在

  • 受付中

    点数別分布グラフ

    点数分布のグラフですが、少し長いように感じました。もう少し短くすることはできますか? またこのコードに対して何かご意見がありましたらお願いします。 #inc

  • 解決済

    「PaintEventArgs e 」を使わずに、線を描写する場所を選択することは可能ですか?

    いつも大変お世話になっております。 また分かりにくい質問になってしまいます。 申し訳ございません。 picturebox1~4や別フォームのpictureboxから、graph

  • 受付中

    unity 3Dキャラ視点での移動方法

    現在unityちゃんを使って移動をしています。 3Dゲーム開発講座を使っているのですが、 移動方法がワールド座標での方向固定でカメラをキャラに追尾させても 歩く方向はやは

  • 解決済

    pictureboxの拡縮について

    いつも大変お世話になっております。 picturebox上でホイールを回すことで、描画した線を拡大したいのですが、どのようにプログラムを組み立てていけばいいのかわからず困って

  • 解決済

    C++でのオセロゲームについて

    色々手を尽くしましたが、自力で解決できないため教えていただければと思い質問いたします。 学習のためhttps://gist.github.com/mia-0032/5325961

  • 解決済

    CGDataProviderReleaseDataCallbackが呼ばれない

    前提・実現したいこと CGDataProviderReleaseDataCallbackが呼ばれるようにしたい。 referanceの読み方がわかればできるのかもしれませんが、理解

同じタグがついた質問を見る

  • C++

    3457questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Windows

    1441questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • DXライブラリ

    56questions

    DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。