キャラクタの画像をゲーム画面に表示させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まま

キャラクタの画像をゲーム画面に表示させたい

#1

投稿記事 by まま » 4年前

現在、C++でゲーム開発をすすめているのですが、
キャラクタを描画できずに苦戦しています。
実行すると、真っ黒の画面が表示されるのみで、キャラクタ画像が表示されません。
キャラクタを表示されるようにするには、どうすればよりでしょうか?

以下がコードになります。


Player.h

コード:

#pragma once
#include "DxLib.h"
#include <stdio.h>
#include <string>
using namespace std;

class Player {
private:
	string name;
	int HP = 100;
	int MP = 50;
	int Player_x = 400;
	int Player_y = 400;
	int Hitpoint;
	int MoveSpeed = 3;
	int Shot_Now;
	int Player_g = LoadGraph("画像/キャラクタ01.png");


//銃撃
public:void Shot() {

}

	  //回転
public:void Rotate() {

}

	   //銃の切り替え
public:void ShotChange() {

}

	   //分裂
public:void Split() {

}

	   //瞬間移動
public:void MoveingMoments() {

}

	   //スローシステム
public:void Srow() {

}

	   //ダメージ処理
public:void Damage() {

}

	   //自機画像の出力
public:void PlayerGraph() { 
	DrawGraph(Player_x, Player_y, Player_g, TRUE);
} 

	   //値を返すメソッド
public:string setname() { return name; }
public:int setHP() { return HP; }
public:int setMP() { return MP; }
public:int setHitpoint() { return Hitpoint; }
public:int setMoveSpeed() { return MoveSpeed; }
public:bool setShot_Now() { return Shot_Now; }

};

test.cpp

コード:

#include "DxLib.h"
#include "Player.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	Player player;

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {

		player.PlayerGraph();

		WaitKey();

		DxLib_End();    // DXライブラリ終了処理
		return 0;


	}
}

お手数おかけしますが、よろしくお願いします。

Bull
記事: 149
登録日時: 9年前

Re: キャラクタの画像をゲーム画面に表示させたい

#2

投稿記事 by Bull » 4年前

キャラクタ画像が表示されない理由ですが、ScreenFlip 関数の前に何も描画されていないので何も表示されません。
また SetDrawScreen(DX_SCREEN_BACK) なので、DrawGraph 関数で裏画面に描画されますが、そのあとにすぐ WaitKey 関数でキー入力待ちになるので、やはり表示はされません。
さらにキー入力があった後で DxLib_End 関数が呼ばれ、すぐに return するのでプログラムはそのまま終了します。

直し方はいろいろありますが、キャラクタ画像を表示するだけなら以下のようすればできます。

コード:

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);

	Player player;

	//while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
													//削除
		player.PlayerGraph();
		ScreenFlip();								//追加
		WaitKey();

		DxLib_End();    // DXライブラリ終了処理
		return 0;


	//}												//削除
}

かずま

Re: キャラクタの画像をゲーム画面に表示させたい

#3

投稿記事 by かずま » 4年前

静止画の描画なら、 WaitKey(); で止めても構いませんが、
動画なら、ProcessMessage() の while ループが必要でしょう。
使っている DXライブラリの API の意味を一つずつ理解していますか?

コード:

#include "DxLib.h"
#include <string>
using namespace std;

class Player {
private:
	string name;
	int HP = 100;
	int MP = 50;
	int Player_x = 400;
	int Player_y = 200;  // ★
	int Hitpoint;
	int MoveSpeed = 3;
	int Shot_Now;
	int Player_g = LoadGraph("画像/キャラクタ01.png");

public:
	void Shot() { }            // 銃撃
	void Rotate() { }          // 回転
	void ShotChange() { }      // 銃の切り替え
	void Split() { }           // 分裂
	void MoveingMoments() {    // 瞬間移動
		if (Player_x > 640) Player_x = 0;  // ★
		Player_x += MoveSpeed;             // ★
	}
	void Srow() { }             //スローシステム
	void Damage() { }          // ダメージ処理
	void PlayerGraph() {       // 自機画像の出力
		DrawGraph(Player_x, Player_y, Player_g, TRUE);
	} 

	string setname() { return name; }
	int setHP() { return HP; }
	int setMP() { return MP; }
	int setHitpoint() { return Hitpoint; }
	int setMoveSpeed() { return MoveSpeed; }
	bool setShot_Now() { return Shot_Now; }
};

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	ChangeWindowMode(TRUE);         // 全画面ではなくウインドウを使用
	DxLib_Init();                   // DXライブラリ初期化
	SetDrawScreen(DX_SCREEN_BACK);  // 描画は裏画面に行う

	Player player;

	while (ProcessMessage() == 0) { // 次の表示時刻まで待つ
		ClearDrawScreen();          // 画面クリア
		player.PlayerGraph();       // 描画
		player.MoveingMoments();    // 描画位置変更
		ScreenFlip();               // 裏画面を表画面に反映
	}

	DxLib_End();                    // DXライブラリ終了処理
	return 0;
}
Moveing とか Srow って綴りが間違っていませんか?

返信

“C言語何でも質問掲示板” へ戻る