トップページ > 記事閲覧
シューティングゲームを作っているのですが…初歩的
名前:そうりえ 日時: 2023/10/28 12:16

#include "Player_Enemy.h" #include<DxLib.h> #include"typedef_characters.h" #include<math.h> Player player; Enemy enemy; Bullet *bullet = new Bullet[shot]; void Player_Enemy::LoadGraphs() { player.g_graph = LoadGraph("E:\\Aseprite\\chara0001.png"); enemy.Eg_graph = LoadGraph("E:\\Aseprite\\chara0002.png"); for (int i = 0; i < shot; i++) bullet[i].Bg_graph = LoadGraph("E:\\Aseprite\\chara0002.png"); } void Player_Enemy::PlayerMove() { char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } //移動処理 if (key[KEY_INPUT_W]) { player.y -= 5.0f; } if (key[KEY_INPUT_S]) { player.y += 5.0f; } if (key[KEY_INPUT_D]) { player.x += 5.0f; } if (key[KEY_INPUT_A]) { player.x -= 5.0f; } //範囲指定 if (player.y > 400) { player.y == 400; } if (player.y < 0) { player.y == 0; } if (player.x > 500) { player.x == 500; } if (player.x < 0) { player.x == 0; } //描画処理 DrawGraph(player.x, player.y, player.g_graph, true); } void Player_Enemy::EnemyMove() { if (enemy.y < 100) { enemy.y += 10.0f; } if (enemy.y>100) { enemy.y +=0; } if (enemy.count > 100) { enemy.x += 10; enemy.y -= 10; } DrawGraph(enemy.x, enemy.y, enemy.Eg_graph, true); enemy.count++; } void Player_Enemy::EnemyShooting() { //弾生成 if (bullet->flag==true&&bullet->count%50==0) { for (int i = 0; i < shot; ++i) { bullet[i].x = cos(bullet[i].angle[i]) * 30 + enemy.x; bullet[i].y = sin(bullet[i].angle[i]) * 30 + enemy.y; } } bullet->count++; } void Player_Enemy::EnemyDrawshooting() { for (int i = 0; i < shot; ++i) { DrawGraph(bullet[i].x, bullet[i].y, bullet[i].Bg_graph, true); } } void Player_Enemy::EnemyProgress() { if (bullet->flag) { for (int i = 0; i < shot; ++i) { bullet[i].x += cos(bullet[i].angle[i]) * 1; bullet[i].y += sin(bullet[i].angle[i]) * 1; } } } はじめまして、そうりえともうします。 只今趣味でシューティングゲームを作っているのですが、 enemyクラス(EnemyProgress(),EnemyDrawshooting(),EnemyShooting())の部分で自機を中心に円状に ある程度距離を離して弾を配置し円状に広がるように移動することはできるのですが、弾を一発ずつしか打てません。 5発一定の間隔で打ちたいと考えております。 ここからどのような方法で5発円状に同時に写すことができるのでしょうか?
メンテ

Page: 1 | 2 |

Re: シューティングゲームを作っているのですが…初歩的 ( No.6 )
名前:そうりえ 日時:2023/10/30 07:59

ありがとうございます。 プログラミングに関してはすべて自分で組み立てているのである程度は理解しているつもりです。 main.cpp //ヘッダーファイル読み込み #include <DxLib.h> #include"typedef_characters.h" #include"Player_Enemy.h" // プログラムは WinMain から始まります。 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //Player_Enemyクラスを読み込み Player_Enemy PE; if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } ChangeWindowMode(TRUE); char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } //画像をロード PE.LoadGraphs(); while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && key[KEY_INPUT_ESCAPE] == 0) { //プレイヤー描写と敵の描写および弾の描写後動き PE.PlayerMove(); PE.EnemyMove(); PE.EnemyInit(); PE.EnemyProgress(); ScreenFlip(); } //終了処理 DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } typedef_characters.h #pragma once //defineによる定義 #define shot 12 #define shot1 100 //それぞれのプレイヤー、敵、弾の構造体を宣言 typedef struct Player { float x = 10; float y = 200; int chara_hp; int g_graph; bool flag = false; }; typedef struct Enemy { float x; float y; bool flag = true; bool flag_1 = true; bool flag_2 = true; int E_hp; int Eg_graph; int count = 0; }; typedef struct Bullet { float x; float y; int count = 15; bool flag = true; int Bg_graph; int angle[shot] = { 360,330,300,270,240,210,180,150,120,90,60,30 }; }; typedef struct BulletMAX { float x[shot]; float y[shot]; bool flag = true; int Bg_graph[shot]; int angle[shot1]; }; Player_Enemy.cpp #include "Player_Enemy.h" #include<DxLib.h> #include"typedef_characters.h" #include<math.h> #include"KindsBullets.h" //構造体を宣言 Player player; Enemy enemy; Bullet *bullet = new Bullet[shot]; BULLET_KINDS BKinds; BulletMAX* bulletmax = new BulletMAX[shot]; //敵、プレイヤー、敵の画像をロード void Player_Enemy::LoadGraphs() { player.g_graph = LoadGraph("E:\\Aseprite\\chara0001.png"); enemy.Eg_graph = LoadGraph("E:\\Aseprite\\chara0002.png"); for (int i = 0; i < shot; i++) bullet[i].Bg_graph = LoadGraph("E:\\Aseprite\\bulletskincolor.png"); for (int i = 0; i < shot; i++) bulletmax[i].Bg_graph[i] = LoadGraph("E:\\Aseprite\\bulletskincolor.png"); } //プレイヤーの動作や表示を行う void Player_Enemy::PlayerMove() { //キー入力をできるようにする char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } //移動処理 if (key[KEY_INPUT_W]) { player.y -= 5.0f; } if (key[KEY_INPUT_S]) { player.y += 5.0f; } if (key[KEY_INPUT_D]) { player.x += 5.0f; } if (key[KEY_INPUT_A]) { player.x -= 5.0f; } //範囲指定,yが400以上だったら if (player.y > 400) {       //400にする player.y == 400; } //y軸が0以下だったら if (player.y < 0) { //0にする player.y == 0; }     //xが500以上だったら if (player.x > 500) { //500にする player.x == 500; }     //xが0以下だったら if (player.x < 0) { //xを0にする player.x == 0; } //描画処理 DrawGraph(player.x, player.y, player.g_graph, true); } //敵の動き、描写をする void Player_Enemy::EnemyMove() { //yが100まで if (enemy.y < 100) { //y軸に+10ずつ動かす enemy.y += 10.0f; } //100を超えたら if (enemy.y>100) { //y軸に0ずつ移動する enemy.y += 0; } //カウンターが100以上だったら if (enemy.count > 100) { //敵を右に10ドットずつ動かす enemy.x += 10; //敵を上に10ずつ動かす enemy.y -= 10; } //敵を描画する DrawGraph(enemy.x, enemy.y, enemy.Eg_graph, true); //カウンターを増やす     enemy.count++; } //敵の弾の初期化及び動き描写をする。 void Player_Enemy::EnemyInit() { //GetGraphSizeの為に画像サイズを取得する //x軸での画像サイズ取得(弾) int blsizex; //y軸での画像サイズ取得(弾) int blsizey; //x軸及びy軸での画像サイズ取得(敵) int ensizex, ensizey; //弾生成 if (bullet->flag==true&&bullet->count%60==0) {        //画像サイズ取得 GetGraphSize(bullet->Bg_graph, &blsizex, &blsizey); GetGraphSize(enemy.Eg_graph, &ensizex, &ensizey); //for (int i = 0; i < shot; ++i) { // // bullet[i].x = cos(bullet[i].angle[i]) * 30 + enemy.x + (ensizex - blsizex) / 2; // bullet[i].y = sin(bullet[i].angle[i]) * 30 + enemy.y + (ensizey - blsizey) / 2; // //}          // 初期化処理  for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) {    //bulletmaxにそれぞれ初期位置を設置                 bulletmax[i].x[j] = cos(bullet[i].angle[j]) * 30+enemy.x; bulletmax[i].y[j] = sin(bullet[i].angle[j]) * 30+enemy.y; bulletmax[i].Bg_graph[j] = enemy.Eg_graph; } } }    //カウンターを増やす bullet->count++; } //ここは本来は描画しようと思ったが、今はなし void Player_Enemy::EnemyDrawshooting() { for (int j = 0; j < 5; ++j) { for (int i = 0; i < shot; ++i) { } } } //弾の動き及び描写 void Player_Enemy::EnemyProgress() { if (bullet->flag) { //for (int j = 0; j < 10; ++j) { // for (int i = 0; i < shot; ++i) { // bullet[i].x += cos(bullet[i].angle[i]) * 2; // bullet[i].y += sin(bullet[i].angle[i]) * 2; // // DrawGraph(bullet[i].x, bullet[i].y, bullet[i].Bg_graph, true); // } //}        //弾を動かし、及び描写する for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) { //x軸及びy軸にそれぞれ放射状になるように動かす                  bulletmax[i].x[j] += cos(bullet[i].angle[j]) * 5; bulletmax[i].y[j] += sin(bullet[i].angle[j]) * 5; //弾を描画する DrawGraph(bulletmax[i].x[j], bulletmax[i].y[j], bulletmax[i].Bg_graph[j], true); } } } } //ヘッダー宣言 Player_Enemy.h #pragma once class Player_Enemy { public: //それぞれの関数を宣言 void LoadGraphs(); void PlayerMove(); void PlayerShooting(); void EnemyMove(); void EnemyDrawshooting(); void EnemyInit(); void EnemyProgress(); }; KindsBullets.h //ヘッダーを宣言 #pragma once #include"typedef_characters.h" #define shots 12 //構造体を宣言 Enemy En; Bullet* bullet = new Bullet[shot]; //弾の種類を列挙する enum { BULLET_1, BULLET_2, BULLET_3, BULLET_MAX }; //弾の構造体を宣言する typedef struct { int x; int y; int flag; int count; int kinds_graph; int angle[shots]; }BULLET_KINDS; //それぞれの列挙体に構造体を入れる BULLET_KINDS Bullet_Kinds[BULLET_MAX] = { { En.x, En.y, En.flag, En.count, bullet->Bg_graph, { 360,330,300,270,240,210,180,150,120,90,60,30 } }, { En.x , En.y , En.flag_1, En.count, bullet->Bg_graph, { 360,330,300,270,240,210,180,150,120,90,60,30 } }, { En.x , En.y, En.flag_2, En.count, En.Eg_graph, { 360,330,300,270,240,210,180,150,120,90,60,30 } }, }; 簡単ではありますが以上となります。 よろしいでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.7 )
名前:管理人 日時:2023/10/30 12:12

コメント付けありがとうございます ただ、丁度気になっている箇所にコメントが無いようです //キー入力をできるようにする char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } ↑ こちらの部分が『キー入力をできるようにする』となっていますが、 各1行1行について、それぞれ何をしているか説明をすることはできますでしょうか? //弾生成 if (bullet->flag==true&&bullet->count%60==0) { ↑ 同じく、こちらも『弾生成』となっていますが、if文の中の式がどのような意味を持つのか 説明することはできますでしょうか?          // 初期化処理  for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) {    //bulletmaxにそれぞれ初期位置を設置                 bulletmax[i].x[j] = cos(bullet[i].angle[j]) * 30+enemy.x; bulletmax[i].y[j] = sin(bullet[i].angle[j]) * 30+enemy.y; bulletmax[i].Bg_graph[j] = enemy.Eg_graph; } } ↑ こちらは『初期化処理』となっていますが、 for (int i = 0; i < 10; i++) { と for (int j = 0; j < shot; j++) { の2行について説明を入れていただけますでしょうか?        //弾を動かし、及び描写する for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) { //x軸及びy軸にそれぞれ放射状になるように動かす                  bulletmax[i].x[j] += cos(bullet[i].angle[j]) * 5; bulletmax[i].y[j] += sin(bullet[i].angle[j]) * 5; //弾を描画する DrawGraph(bulletmax[i].x[j], bulletmax[i].y[j], bulletmax[i].Bg_graph[j], true); } } ↑ こちらも for (int i = 0; i < 10; i++) { と for (int j = 0; j < shot; j++) { の2行について 説明コメントを入れていただけますでしょうか? 恐らく、細かいコメントが付けられていない箇所 = あまり理解できていない箇所 である可能性が高いのではないかと思います
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.8 )
名前:そうりえ 日時:2023/10/30 15:12

すみません。 それでは… //キー入力をできるようにする char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } ですが //キー入力をできるようにする //構造体tmpkey、keyを宣言 char tmpkey[256]; char key[256]; //GetHitKeyStateAll関数に入れる GetHitKeyStateAll(tmpkey); //for文にてすべてのキーを検索 for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) {  //あるキーが入力されたらそのキーに一加算 key[i]++; } else { //他は0を入れる。 key[i] = 0; } } 続きまして・・・ //弾生成 //if文よりbullet->flag==trueはbool関数を使用しているためtrueの時とbullet->count%60はカウントが60になったら0になる時に以下の処理をする。 if (bullet->flag==true&&bullet->count%60==0) { 続きまして…          // 初期化処理  //for文より、iは処理されるたびに一回処理されて10回まで処理される。jはshot回(12回)処理される。ネストになっている。 for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) {    //bulletmaxにそれぞれ初期位置を設置                 bulletmax[i].x[j] = cos(bullet[i].angle[j]) * 30+enemy.x; bulletmax[i].y[j] = sin(bullet[i].angle[j]) * 30+enemy.y; bulletmax[i].Bg_graph[j] = enemy.Eg_graph; } } 続きまして…  //弾を動かし、及び描写する //for文にてiとjでネストになっているそれぞれiは10回まで、jはshot(12回)迄になっている。 iの処理が入るとその中のjの処理が入るjの処理が終わるとiの一回目の処理が終わる for (int i = 0; i < 10; i++) { for (int j = 0; j < shot; j++) { //x軸及びy軸にそれぞれ放射状になるように動かす                  bulletmax[i].x[j] += cos(bullet[i].angle[j]) * 5; bulletmax[i].y[j] += sin(bullet[i].angle[j]) * 5; //弾を描画する DrawGraph(bulletmax[i].x[j], bulletmax[i].y[j], bulletmax[i].Bg_graph[j], true); } } 簡単ではありますが…よろしいでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.9 )
名前:管理人 日時:2023/10/30 18:43

ご説明の追加ありがとうございます 状況の理解が深まりました 最初にですが、No.4 では載せていただいたプログラムについて 『因みにコンパイルエラーとかはありません。』 とのことでしたが、私の手元でコンパイルしたところ以下のようなコンパイルエラーが発生しました Player_Enemy.cpp(8,9): error C2374: 'bullet': 再定義されています。2 回以上初期化されています。 確かに Bullet *bullet = new Bullet[shot]; という bullet に new Bullet[shot] を代入する、 という処理が Player_Enemy.cpp の 8行目と KindsBullets.h の 5行目の2箇所にありますので、エラーになります こちらのコンパイルエラーはそうりえさんの環境では発生しませんでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.10 )
名前:そうりえ 日時:2023/10/30 21:03

アッそうですね 確かにコンパイルエラーがでました。 Player_Enemy.cppにある二重の処理された部分のBullet* bullet = new Bullet[shot];を消しました。 コンパイルが通りました。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.11 )
名前:管理人 日時:2023/10/30 22:19

> Player_Enemy.cppにある二重の処理された部分のBullet* bullet = new Bullet[shot];を消しました。 > コンパイルが通りました。 了解しました 手元でもコンパイルが通りました 改めてプログラムを拝見したのですが、bullet関連のプログラムに混乱が見られます ・BULLET_KINDS や Bullet_Kinds が定義されているものの、何も使用されていない ・Bullet* bullet のメンバー変数 x, y が使用されておらず、flag, count は bullet[0] のみ使用されている( Bg_graph は LoadGraph でグラフィックハンドルの代入だけされている、ただ、そのグラフィックハンドルは使用されていない ) ・構造体Bullet と似た 構造体BulletMAX がある ・BulletMAX のメンバー変数 flag と angle は使用されていない ・bulletmax は new BulletMAX[shot] と、shot の長さの配列が代入されているが、構造体BulletMAX の中にも shot の長さの x, y, Bg_graph が存在する なので、この先にお話を進める前に、bullet関連のプログラムを整理してみてください m(_ _)m ( 整理ができたらお手数で申し訳ありませんが改めて main.cpp, Player_Enemy.cpp, KindsBullets.h, Player_Enemy.h, typedef_characters.h の内容を掲示板に貼り付けてください m(_ _)m )
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.12 )
名前:そうりえ 日時:2023/10/31 08:34

申し訳ないです。いろいろ試していたらこんがらがってました。 纏めたので再掲します。 因みにKindsBullets.hは消しました。 main.cpp #include <DxLib.h> #include"typedef_characters.h" #include"Player_Enemy.h" // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { Player_Enemy PE; if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } ChangeWindowMode(TRUE); char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } PE.LoadGraphs(); while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && key[KEY_INPUT_ESCAPE] == 0) { PE.PlayerMove(); PE.EnemyMove(); PE.EnemyInit(); PE.EnemyProgress(); ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } typedef_characters.h #pragma once #define shot 12 typedef struct Player { float x = 10; float y = 200; int chara_hp; int g_graph; bool flag = false; }; typedef struct Enemy { float x; float y; bool flag = true; bool flag_1 = true; bool flag_2 = true; int E_hp; int Eg_graph; int count = 0; }; typedef struct Bullet { float x; float y; int count = 15; bool flag = true; int Bg_graph; int angle[shot] = { 360,330,300,270,240,210,180,150,120,90,60,30 }; }; Player_Enemy.h #pragma once class Player_Enemy { public: void LoadGraphs(); void PlayerMove(); void EnemyMove(); void EnemyInit(); void EnemyProgress(); }; Player_Enemy.cpp #include "Player_Enemy.h" #include<DxLib.h> #include"typedef_characters.h" #include<math.h> Player player; Enemy enemy; Bullet* bullet = new Bullet[shot]; void Player_Enemy::LoadGraphs() { player.g_graph = LoadGraph("E:\\Aseprite\\chara0001.png"); enemy.Eg_graph = LoadGraph("E:\\Aseprite\\chara0002.png"); for (int i = 0; i < shot; i++) bullet[i].Bg_graph = LoadGraph("E:\\Aseprite\\bulletskincolor.png"); } void Player_Enemy::PlayerMove() { char tmpkey[256]; char key[256]; GetHitKeyStateAll(tmpkey); for (int i = 0; i < 256; i++) { if (tmpkey[i] != 0) { key[i]++; } else { key[i] = 0; } } //移動処理 if (key[KEY_INPUT_W]) { player.y -= 5.0f; } if (key[KEY_INPUT_S]) { player.y += 5.0f; } if (key[KEY_INPUT_D]) { player.x += 5.0f; } if (key[KEY_INPUT_A]) { player.x -= 5.0f; } //範囲指定 if (player.y > 400) { player.y == 400; } if (player.y < 0) { player.y == 0; } if (player.x > 500) { player.x == 500; } if (player.x < 0) { player.x == 0; } //描画処理 DrawGraph(player.x, player.y, player.g_graph, true); } void Player_Enemy::EnemyMove() { if (enemy.y < 100) { enemy.y += 10.0f; } if (enemy.y>100) { enemy.y += 0; } if (enemy.count > 100) { enemy.x += 10; enemy.y -= 10; } DrawGraph(enemy.x, enemy.y, enemy.Eg_graph, true); enemy.count++; } void Player_Enemy::EnemyInit() { int blsizex; int blsizey; int ensizex, ensizey; //弾生成 if (bullet->flag==true&&bullet->count%60==0) { GetGraphSize(bullet->Bg_graph, &blsizex, &blsizey); GetGraphSize(enemy.Eg_graph, &ensizex, &ensizey); for (int i = 0; i < 10; i++) { bullet[i].x = cos(bullet[i].angle[i]) * 30+enemy.x; bullet[i].y = sin(bullet[i].angle[i]) * 30 + enemy.y; bullet[i].Bg_graph = enemy.Eg_graph; } } bullet->count++; } void Player_Enemy::EnemyProgress() { if (bullet->flag) { for (int i = 0; i < 10; i++) { bullet[i].x += cos(bullet[i].angle[i]) * 5; bullet[i].y += sin(bullet[i].angle[i]) * 5; DrawGraph(bullet[i].x, bullet[i].y, bullet[i].Bg_graph, true); } } } 以上となります。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.13 )
名前:管理人 日時:2023/11/01 00:42

プログラムの整理お疲れ様です 内容を確認しやすくなりました プログラムを実行すると敵が1秒毎に10発の弾を放射状に打ち出すのが確認できたのですが、 最初のお書き込みでは > enemyクラス(EnemyProgress(),EnemyDrawshooting(),EnemyShooting())の部分で自機を中心に円状に > ある程度距離を離して弾を配置し円状に広がるように移動することはできるのですが、弾を一発ずつしか打てません。 > 5発一定の間隔で打ちたいと考えております。 とのことでしたが、弾を撃ちたいのは敵ではなく自機で間違いないでしょうか? プログラムを拝見する限りでは自機が弾を出すような処理は何処にも書かれていませんので、 現在敵が弾を出しているのと同じような処理を自機用にも書けば、自機からも弾を出すことができるようになると思います よろしければお試しください m(_ _)m
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.14 )
名前:そうりえ 日時:2023/11/01 08:01

敵から出したいと思っております。 自機からはまた別の処理をしていきたいので
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.15 )
名前:管理人 日時:2023/11/01 12:05

敵から出したいのですね、了解です > 5発一定の間隔で打ちたいと考えております。 現在10発一定の間隔で打っていると思いますが、これを半分の5発にしたいということでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.16 )
名前:そうりえ 日時:2023/11/01 13:45

10発の弾を一定の間隔で打ち、一回打ったら消え、一回打ったら消えではなく、一回打ってまた再度もう一回打っても前に打った 弾は消えないでほしいのです。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.17 )
名前:管理人 日時:2023/11/01 20:08

それを実現するには『弾が出ているかどうか』を変数に記憶しておき、 『弾が出ているかどうか』の変数が true だったら弾の処理を行い、false だったら弾の処理を行わない、 新たに弾を出す場合は『弾が出ているかどうか』の変数が false の配列要素を探して、false の配列要素が見つかったら そこに新たな弾の情報を格納した上で『弾が出ているかどうか』の変数を true にする、といった処理が必要です ( それによって『最初に弾を10発出し、1秒後に追加で弾を10発出す』が実現できます ) そうりえさんのプログラムでは 構造体Bullet のメンバー変数flag が恐らく 『弾が出ているかどうか』を記憶する変数なのだと思いますが、 現在は構造体の初期化時に true が代入され、以降は false にするような処理も無く 適切に扱われていない状態ですので、まず構造体Bullet のメンバー変数flag を適切に扱うようにする必要があります 構造体Bullet のメンバー変数flag が『弾が出ているかどうか』の情報を記憶する変数、 という点は理解されていますでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.18 )
名前:そうりえ 日時:2023/11/01 20:38

なるほど。 弾が出ているのかどうかのflagの部分の話であるのですね。 つまり、flagをいくつか用意してそのフラグを初期化し、フラグがtrueになったら 弾を出す。 そしてほかのflagを検索し、5秒後にまたフラグをtrueにする といった感じでしょうか?
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.19 )
名前:そうりえ 日時:2023/11/01 21:17

なるほど。。。 すみません。 最後にfalseを入れないといけないということですね。 わかりました。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.20 )
名前:そうりえ 日時:2023/11/01 21:35

void Player_Enemy::EnemyInit() { int blsizex; int blsizey; int ensizex, ensizey; for (int i = 0; i < shot; i++) { bullet[i].flag[i] = false; } //弾生成 //初期位置設定 for (int i = 0; i < shot; i++) { if (bullet->count % 50 == 0) { bullet[i].flag[i] = true; } if (bullet[i].flag[i]) { for (int i = 0; i < shot; i++) { bullet[i].x[i] = cos(bullet[i].angle[i]) * 30 + enemy.x; bullet[i].y[i] = sin(bullet[i].angle[i]) * 30 + enemy.y; bullet[i].Bg_graph[i] = enemy.Eg_graph; } } } bullet->count++; } void Player_Enemy::EnemyProgress() { for (int i = 0; i < shot; i++) { bullet[i].x[i] += cos(bullet[i].angle[i]) * 3; bullet[i].y[i] += sin(bullet[i].angle[i]) * 3; } for (int i = 0; i < shot; i++) { DrawGraph(bullet[i].x[i], bullet[i].y[i], bullet[i].Bg_graph[i], true); bullet[i].flag[i] = false; } } このようになりましたが、まだ一発ずつでしかうてないです。 ちょっと分からなくなってきました… 因みにほかの関数の部分は変えてません。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.21 )
名前:管理人 日時:2023/11/01 22:51

すみません、今気付きました Player_Enemy::EnemyInit() を初期化時に1回だけではなく、毎フレーム実行しているのですね… 『初期化処理』や『メインループ(若しくはフレーム)』の概念を理解されていないように感じます No.6 でそうりえさんは『自分で組み立てているのである程度理解している』と仰られていましたが、 自分で組んだプログラムについては完全に理解できていないとダメです というのも、どのように動作するかは完全に理解できている状態で組んだプログラムですらバグで 正常に動作しないことがあるので、理解できていない状態でなんとなく組んだプログラムが 期待通りの動作をする筈がないからです 申し訳ありませんがこちらの掲示板で何回かご返信するだけでそうりえさんが希望される処理を そうりえさんが理解できる形でお教えすることは非常に難しいので、解説サイトや書籍などで 基礎的なことを学ばれてきてください この『DXライブラリ置き場』にも『ゲームプログラム講座』で自機が弾を打つところまでは 解説していますので、よろしければご覧になってみてください m(_ _;m <DXライブラリ ゲームプログラム講座> https://dxlib.xsrv.jp/dxlecture_main.html
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.22 )
名前:そうりえ 日時:2023/11/02 08:22

ありがとうございました。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.23 )
名前:そうりえ 日時:2023/11/02 14:42

自分で考えてやってみます。 失礼いたしました。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.24 )
名前:そうりえ 日時:2023/11/03 15:05

何度かやっていたら 自己解決しました。 ありがとうございました。
メンテ
Re: シューティングゲームを作っているのですが…初歩的 ( No.25 )
名前:管理人 日時:2023/11/04 01:36

解決されたようで何よりです お力になれずすみませんでした
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存