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

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

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

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

DXライブラリ

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

Q&A

解決済

3回答

2657閲覧

シューティングゲームにおけるクラスのコンストラクタから引数の指定がうまくいかない

x066

総合スコア23

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2018/01/11 15:13

編集2018/01/11 15:56

#やりたいこと
C++とDxライブラリを用いてシューティングゲームを作成しているのですが、クラスのコンストラクタからの引数の指定がうまくいきません。
エラーは発生せずに実行できますが、応答停止ウィンドウが出てきて停止してしまいます。引数から敵を簡単に作れるようにしたいのですが・・・
引数の指定や記述法で誤った部分があれば、教えてください。

こちらのサイトを参考に作らせていただきました。
開発環境はVisual Studio 2013です。

#出来ている部分
現在はプレイヤーの動きと弾の発射、背景の描画は出来ています。
Control関数を用いて全体の関数をコントロール、Dxライブラリ管理用のpchファイルも作成してあります。
敵以外の記述に関してはスラッシュで隠しています。

####Control.cpp

c++

1#include "pch.h" 2#include "control.h" 3 4CONTROL::CONTROL() 5{ 6 //プレイヤークラスの生成 7 //player = new PLAYER; 8 //back = new BACK; 9 ENEMY enemy(-20, 0, 3);//引数の指定 10} 11 12CONTROL::~CONTROL() 13{ 14 //プレイヤークラスの解放 15 //delete player; 16} 17 18void CONTROL::All() 19{ 20 //back->All(); 21 //player->All(); 22 enemy->All(); 23}

####Control.h

c++

1//#include "player.h" 2//#include "BACK.h" 3#include "enemy.h" 4 5class CONTROL{ 6private: 7 //プレイヤークラスのポインタ 8 //PLAYER *player; 9 //BACK *back; 10 ENEMY *enemy; 11 12public: 13 CONTROL(); 14 ~CONTROL(); 15 void All(); 16};

####pch.cpp

c++

1#include "pch.h"

####pch.h

c++

1//警告を消すための記述 2#pragma warning(disable:4244) 3#define _CRT_SECURE_NO_WARNINGS 4 5//DXライブラリとdefine.hの取り込み 6#include "DxLib.h" 7#include "define.h"

#出来ていない部分
敵に関するクラスの設定がうまくできていないようです。
敵に関する記述がされているソースコードを載せます。プレイヤーや他のコード部分の情報が必要な場合は連絡ください。
####enemy.cpp

c++

1#include "pch.h" 2#include "enemy.h" 3 4ENEMY::ENEMY(int ex, int ey ,int espeed) 5{ 6 /*LoadDivGraph("images/enemy.png", 3, 1, 3, 27, 25, gh);*/ 7 gh = LoadGraph("images/enemy.png"); // 画像のロード 8 9 GetGraphSize(gh, &width, &height); 10 11 x = ex; 12 y = ey; 13 x_speed = espeed; 14} 15 16void ENEMY::Move() 17{ 18 x = x + x_speed; 19 20 if (x > 600) 21 { 22 x_speed = -3; 23 x_speed = +x_speed; 24 } 25 else if (x < 0) 26 { 27 x_speed = 3; 28 x_speed = +x_speed; 29 } 30 else; 31} 32 33void ENEMY::Draw() 34{ 35 DrawGraph(x, y, gh, TRUE); 36} 37 38void ENEMY::All() 39{ 40 Move(); 41 Draw(); 42 /*++count; 43 return endflag;*/ 44}

####enemy.h

c++

1class ENEMY{ 2private: 3 int x, y; 4 int gh; 5 6 int width, height,x_speed; 7 8public: 9 ENEMY(int ex, int ey ,int espeed);//コンストラクト 10 void Move(); 11 void Draw(); 12 void All(); 13 14};

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

はっきりわかるのは下のコードが間違っています。

C++

1CONTROL::CONTROL() 2{ 3 ENEMY enemy(-20, 0, 3); 4}

ローカル変数のenemyは上記コンストラクタの終了とともに削除されています。

C++

1CONTROL::CONTROL() : enemy(-20, 0, 3) {}

C++

1CONTROL::CONTROL() 2{ 3 enemy = ENEMY(-20, 0, 3); 4}

と書くべきですが、
下のほうでやりたいならば、ENEMYクラスに代入演算子の定義が必要です。

また、応答停止ウィンドウがでるのはforやwhile等のループの部分で、
終了条件が間違っていたり、カウンタ変数のインクリメントを、
忘れているケースも多いかと思います。
提示されたコードだけでは、enemyの初期化が絶対に原因だとは断定できません。

投稿2018/01/12 11:12

colonq

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

回答ではないのですが、追記・修正依頼欄では狭いのでこちらから。

応答停止ウィンドウが出てきて停止してしまいます。

これはどこで停止しているのでしょうか? 我々は実行できませんから、x066さん以上に分からないですよ。
怪しいところにブレークポイントを張ってステップ実行していけば分かることが多いです。
初級者向けVisualStudio便利機能集Vol.2(デバッグ編)

引数から敵を簡単に作れるようにしたいのですが・・・

もう少し噛み砕いて下さい。
「引数」はコンストラクタの引数と思いますが、それを使って「敵」を作るなんてことはできません。「ENEMYのコンストラクタを次のソースのように呼び出して複数のENEMYオブジェクトを簡単に生成できるようにしたい」的な表現になるのではないかと想像しています。

投稿2018/01/12 01:07

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ご回答ありがとうございます。無事、実行可能になりました。
1つずつソースコードを確認したところ、colonq様から指摘いただいた部分に加えてdeleteによるメモリの解放が出来ていなかったことが原因だったようです。

お二人とも丁寧な回答をしてくださり、ありがとうございました

投稿2018/01/12 14:45

x066

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問