概要
現在、右向きに進んでいく2Dのスクロール系のゲームを作成しております。
ゲームの主人公(コード内におけるheroという名前です)が左向きに攻撃する処理は描けているのですが、右向きに攻撃をする処理をうまく描くことができず、質問をさせていただきました。
以下は対象のコードです。
コード
C/C++
1void DrawBall(int key) { 2 // 発射処理 3 // 右向き 4 if (IsBKeyTrigger(key) == TRUE && g_stagedata.hero.turn == FALSE) { 5 // 空きを探す 6 int i; 7 for (i = 0; i < MAX_BALL; i++) { 8 if (g_stagedata.balls[i].living == FALSE) break; 9 } 10 if (i < MAX_BALL) { 11 g_stagedata.balls[i].living = TRUE; 12 g_stagedata.balls[i].x = g_stagedata.hero.x + IMG_CHIPSIZE; 13 g_stagedata.balls[i].y = g_stagedata.hero.y; 14 } 15 // 左向き 16 }else if (IsBKeyTrigger(key) == TRUE && g_stagedata.hero.turn == TRUE) { 17 // 空きを探す 18 int i; 19 for (i = 0; i < MAX_BALL; i++) { 20 if (g_stagedata.balls[i].living == FALSE) break; 21 } 22 if (i < MAX_BALL) { 23 g_stagedata.balls[i].living = TRUE; 24 g_stagedata.balls[i].x = g_stagedata.hero.x - IMG_CHIPSIZE; 25 g_stagedata.balls[i].y = g_stagedata.hero.y; 26 } 27 } 28 // ボールの描画と移動 29 float mv = 350.0f * g_frametime; // 移動量計算 30 for (int i = 0; i < MAX_BALL; i++) { 31 if (g_stagedata.balls[i].living == FALSE) continue; 32 g_stagedata.balls[i].x += mv; 33 34 // マップ当たり判定 35 AtariInfo atari = CheckBlock(g_stagedata.balls[i].x, g_stagedata.balls[i].y, 36 g_stagedata.balls[i].x); 37 if (atari.DR == TRUE || atari.UR == TRUE) g_stagedata.balls[i].living = FALSE; 38 // 画面外に出ても消滅 39 if (g_stagedata.balls[i].x > g_stagedata.scrollx + 1000) { 40 g_stagedata.balls[i].living = FALSE; 41 } 42 43 DrawGraph((int)(g_stagedata.balls[i].x - g_stagedata.scrollx), 44 (int)g_stagedata.balls[i].y, 45 g_imghandles.ball, TRUE); 46 } 47 if (g_stagedata.hero.turn == TRUE) { 48 for (int i = 0; i < MAX_BALL; i++) { 49 if (g_stagedata.balls[i].living == FALSE) continue; 50 g_stagedata.balls[i].x -= mv; 51 52 // マップ当たり判定 53 AtariInfo atari = CheckBlock(g_stagedata.balls[i].x, g_stagedata.balls[i].y, 54 g_stagedata.balls[i].x); 55 if (atari.DR == TRUE || atari.UR == TRUE) g_stagedata.balls[i].living = FALSE; 56 // 画面外に出ても消滅 57 if (g_stagedata.balls[i].x > g_stagedata.scrollx - 1000) { 58 g_stagedata.balls[i].living = FALSE; 59 } 60 61 DrawGraph((int)(g_stagedata.balls[i].x - g_stagedata.scrollx), 62 (int)g_stagedata.balls[i].y, 63 g_imghandles.ball, TRUE); 64 } 65 } 66} 67 68// キートリガー処理 69BOOL IsBKeyTrigger(int key) { 70 if (key & PAD_INPUT_B) { 71 if (g_stagedata.g_bkey_prev == FALSE) { 72 g_stagedata.g_bkey_prev = TRUE; 73 return TRUE; 74 } 75 } 76 else { 77 g_stagedata.g_bkey_prev = FALSE; 78 } 79 return FALSE; 80}
発生している問題
右向き(g_stagedata.hero.turn==FALSE)に攻撃(ボール)を飛ばすことはできているのですが、左(g_stagedata.hero.turn==TRUE)を向いたときに左にボールを飛ばすことができません。また、右向きでボールを飛ばした後に、左を向いた場合、右向きに飛ばしたボールが消えてしまう現象も発生しております。
解決するために考えている方法
現在、自分の考えている解決方法として蛇足的ではありますが、void DrawBall()関数内の処理を左向きと右向きで完全に分けて記述する方法で、解決できるのではないかと考えております。
もし、上記のコードの処理において、左向きに攻撃する(ボールを飛ばす)かつ、一度右向きに飛ばしたボールを消させない方法がわかる方がいらっしゃいましたら、アドバイスをいただけると幸いです。
補足
主人公=hero
攻撃=ball(ボール)
向き=turn(FALSE:右向き、TRUE=左向き)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/21 01:13