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

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

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

解決済

2Dゲームにおける左向きに攻撃する処理の方法

maguro2020
maguro2020

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

3回答

0評価

0クリップ

313閲覧

投稿2022/03/20 04:33

概要
現在、右向きに進んでいく2Dのスクロール系のゲームを作成しております。
ゲームの主人公(コード内におけるheroという名前です)が左向きに攻撃する処理は描けているのですが、右向きに攻撃をする処理をうまく描くことができず、質問をさせていただきました。
以下は対象のコードです。
コード

C/C++

void DrawBall(int key) { // 発射処理 // 右向き if (IsBKeyTrigger(key) == TRUE && g_stagedata.hero.turn == FALSE) { // 空きを探す int i; for (i = 0; i < MAX_BALL; i++) { if (g_stagedata.balls[i].living == FALSE) break; } if (i < MAX_BALL) { g_stagedata.balls[i].living = TRUE; g_stagedata.balls[i].x = g_stagedata.hero.x + IMG_CHIPSIZE; g_stagedata.balls[i].y = g_stagedata.hero.y; } // 左向き }else if (IsBKeyTrigger(key) == TRUE && g_stagedata.hero.turn == TRUE) { // 空きを探す int i; for (i = 0; i < MAX_BALL; i++) { if (g_stagedata.balls[i].living == FALSE) break; } if (i < MAX_BALL) { g_stagedata.balls[i].living = TRUE; g_stagedata.balls[i].x = g_stagedata.hero.x - IMG_CHIPSIZE; g_stagedata.balls[i].y = g_stagedata.hero.y; } } // ボールの描画と移動 float mv = 350.0f * g_frametime; // 移動量計算 for (int i = 0; i < MAX_BALL; i++) { if (g_stagedata.balls[i].living == FALSE) continue; g_stagedata.balls[i].x += mv; // マップ当たり判定 AtariInfo atari = CheckBlock(g_stagedata.balls[i].x, g_stagedata.balls[i].y, g_stagedata.balls[i].x); if (atari.DR == TRUE || atari.UR == TRUE) g_stagedata.balls[i].living = FALSE; // 画面外に出ても消滅 if (g_stagedata.balls[i].x > g_stagedata.scrollx + 1000) { g_stagedata.balls[i].living = FALSE; } DrawGraph((int)(g_stagedata.balls[i].x - g_stagedata.scrollx), (int)g_stagedata.balls[i].y, g_imghandles.ball, TRUE); } if (g_stagedata.hero.turn == TRUE) { for (int i = 0; i < MAX_BALL; i++) { if (g_stagedata.balls[i].living == FALSE) continue; g_stagedata.balls[i].x -= mv; // マップ当たり判定 AtariInfo atari = CheckBlock(g_stagedata.balls[i].x, g_stagedata.balls[i].y, g_stagedata.balls[i].x); if (atari.DR == TRUE || atari.UR == TRUE) g_stagedata.balls[i].living = FALSE; // 画面外に出ても消滅 if (g_stagedata.balls[i].x > g_stagedata.scrollx - 1000) { g_stagedata.balls[i].living = FALSE; } DrawGraph((int)(g_stagedata.balls[i].x - g_stagedata.scrollx), (int)g_stagedata.balls[i].y, g_imghandles.ball, TRUE); } } } // キートリガー処理 BOOL IsBKeyTrigger(int key) { if (key & PAD_INPUT_B) { if (g_stagedata.g_bkey_prev == FALSE) { g_stagedata.g_bkey_prev = TRUE; return TRUE; } } else { g_stagedata.g_bkey_prev = FALSE; } return FALSE; }

発生している問題
右向き(g_stagedata.hero.turn==FALSE)に攻撃(ボール)を飛ばすことはできているのですが、左(g_stagedata.hero.turn==TRUE)を向いたときに左にボールを飛ばすことができません。また、右向きでボールを飛ばした後に、左を向いた場合、右向きに飛ばしたボールが消えてしまう現象も発生しております。

解決するために考えている方法
現在、自分の考えている解決方法として蛇足的ではありますが、void DrawBall()関数内の処理を左向きと右向きで完全に分けて記述する方法で、解決できるのではないかと考えております。
もし、上記のコードの処理において、左向きに攻撃する(ボールを飛ばす)かつ、一度右向きに飛ばしたボールを消させない方法がわかる方がいらっしゃいましたら、アドバイスをいただけると幸いです。

補足
主人公=hero
攻撃=ball(ボール)
向き=turn(FALSE:右向き、TRUE=左向き)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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