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

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

ただいまの
回答率

90.99%

  • C++

    2941questions

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

  • DXライブラリ

    47questions

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

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

解決済

回答 3

投稿 編集

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

x066

score 5

やりたいこと

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

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

出来ている部分

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

Control.cpp

#include "pch.h"
#include "control.h"

CONTROL::CONTROL()
{
    //プレイヤークラスの生成
    //player = new PLAYER;
    //back = new BACK;
    ENEMY enemy(-20, 0, 3);//引数の指定
}

CONTROL::~CONTROL()
{
    //プレイヤークラスの解放
    //delete player;
}

void CONTROL::All()
{
    //back->All(); 
    //player->All();
    enemy->All();
}

Control.h

//#include "player.h"    
//#include "BACK.h"
#include "enemy.h"

class CONTROL{
private:
    //プレイヤークラスのポインタ
    //PLAYER *player;
    //BACK *back;
    ENEMY *enemy;

public:
    CONTROL();
    ~CONTROL();
    void All();
};

pch.cpp

#include "pch.h"

pch.h

//警告を消すための記述
#pragma warning(disable:4244)
#define _CRT_SECURE_NO_WARNINGS

//DXライブラリとdefine.hの取り込み
#include "DxLib.h"
#include "define.h"

出来ていない部分

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

enemy.cpp

#include "pch.h"
#include "enemy.h"

ENEMY::ENEMY(int ex, int ey ,int espeed)
{
    /*LoadDivGraph("images/enemy.png", 3, 1, 3, 27, 25, gh);*/
    gh = LoadGraph("images/enemy.png"); // 画像のロード

    GetGraphSize(gh, &width, &height);

    x = ex;
    y = ey;
    x_speed = espeed;
}

void ENEMY::Move()
{
    x = x + x_speed;

    if (x > 600)
    {
        x_speed = -3;
        x_speed = +x_speed;
    }
    else if (x < 0)
    {
        x_speed = 3;
        x_speed = +x_speed;
    }
    else;
}

void ENEMY::Draw()
{
        DrawGraph(x, y, gh, TRUE);
}

void ENEMY::All()
{
    Move();
    Draw();
    /*++count;
    return endflag;*/
}

enemy.h

class ENEMY{
private:
    int x, y;
    int gh;

    int width, height,x_speed;

public:
    ENEMY(int ex, int ey ,int espeed);//コンストラクト
    void Move();
    void Draw();
    void All();

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

こんにちは。

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

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

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

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


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

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


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


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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

check解決した方法

0

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • C++

    2941questions

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

  • DXライブラリ

    47questions

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

  • トップ
  • C++に関する質問
  • シューティングゲームにおけるクラスのコンストラクタから引数の指定がうまくいかない