DxLibでの開発について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Albina_kun
記事: 4
登録日時: 3年前

DxLibでの開発について

#1

投稿記事 by Albina_kun » 3年前

学校の課題でのゲーム制作(DxLibを使用)での質問です。
現在、画像を読み込みそれが上から降ってくるようなモーションを特定のY座標で停止させるプログラムを書いています。
が、for分を用いて書いてみてもエラーが出てしまうので質問を書かせていただきました。

GameのMainになるコード

コード:

#include "DxLib.h"
#include "GameMain.h"
#include "GameTitle.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	/*ゲーム背景を白色に設定*/
	SetBackgroundColor(255, 255, 255);
	SetMainWindowText("タイトル");

	if (DxLib_Init() == -1)
	{
		return -1;
	}
	/*ゲームの画面サイズを1920*1080に設定*/
	SetGraphMode(ScreenSizeX, ScreenSizeY, GameBit);

	/*ゲーム起動時にマウスカーソルを表示*/
	SetMouseDispFlag(TRUE);

	/*ゲームタイトルの表示*/
	TitleScreen();

	/*何かのキーが押されるまで待機*/
	WaitKey();

	/*DxLibの終了処理*/
	DxLib_End();

	return 0;
}
Mainになるもののヘッダーファイル

コード:

#pragma once
/*ゲーム画面のサイズの指定*/
int ScreenSizeX = 1920;
int ScreenSizeY = 1080;
int GameBit = 32;
タイトル画面の処理をしているコード

コード:

#include "DxLib.h"
#include "GameTitle.h"

void TitleScreen() {
	unsigned int Cr_Black;
	int TitleLogo;

	/*タイトルロゴの文字の色の取得*/
	Cr_Black = GetColor(0, 0, 0);

	/*タイトルロゴの文字サイズの作成*/
	TitleLogo = CreateFontToHandle(NULL, 180, 3);

	for (int PositionY = 0; PositionY >= 700; PositionY++) {
		/*左下のマイナスブロックの描写*/
		LoadGraphScreen(200, PositionY, "image/Title_MinusBlock.png", TRUE);

		/*右下のプラスブロックの描写*/
		LoadGraphScreen(1450, PositionY, "image/Title_PlassBlock.png", TRUE);
	}


	/*引力工場のタイトルロゴの表示*/
	DrawStringToHandle(575, 120, "タイトル", Cr_Black, TitleLogo);

	/*中央スタートボタンの描写*/
	LoadGraphScreen(550, 550,"image/StartButton.png", TRUE);

	WaitKey();

}
タイトル処理のヘッダーファイル

コード:

#pragma once

/*タイトル画面の関数の定義*/
void TitleScreen();
エラー内容は、「for-loopの定義が無効です:最初の条件はテストを満たしていません。ループボディは実行されません。」とのことでした。

お力をお貸しいただけたら幸いです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: DxLibでの開発について

#2

投稿記事 by みけCAT » 3年前

エラーの原因は、初期値 PositionY = 0 ではループ条件 PositionY >= 700 が真にならないことですね。
条件は PositionY <= 700 の間違いではないでしょうか?

また、この条件を直しても、画像が2×701枚全部一気に描画され、モーションにはならないでしょう。
モーションにするには、1回描画するごとにウェイトと画面クリアを入れるといいでしょう。
(本当は描画位置を状態として管理し、1フレームごとにメインループに戻すべきですが、
この段階ではメインループが無いようなので…)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Albina_kun
記事: 4
登録日時: 3年前

Re: DxLibでの開発について

#3

投稿記事 by Albina_kun » 3年前

コード:

#include "DxLib.h"
#include "GameTitle.h"

void TitleScreen() {
	unsigned int Cr_Black;
	int TitleLogo;

	/*タイトルロゴの文字の色の取得*/
	Cr_Black = GetColor(0, 0, 0);

	/*タイトルロゴの文字サイズの作成*/
	TitleLogo = CreateFontToHandle(NULL, 180, 3);


	for (int i = 0; i <= 700; i++) {
		/*左下のマイナスブロックの描写*/
		LoadGraphScreen(200, 700, "image/Title_MinusBlock.png", TRUE);

		/*右下のプラスブロックの描写*/
		LoadGraphScreen(1450, 700, "image/Title_PlassBlock.png", TRUE);

		WaitTimer(100);
	}
	/*引力工場のタイトルロゴの表示*/
	DrawStringToHandle(575, 120, "タイトル", Cr_Black, TitleLogo);

	/*中央スタートボタンの描写*/
	LoadGraphScreen(550, 550,"image/StartButton.png", TRUE);

	WaitKey();

}

このように変更し、WaitTimerを使用してみましたが表示が上手くいきませんでした。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: DxLibでの開発について

#4

投稿記事 by みけCAT » 3年前

ブロックの描写位置がループ変数に依存しなくなってしまいましたね。
なぜそのように変更したのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Albina_kun
記事: 4
登録日時: 3年前

Re: DxLibでの開発について

#5

投稿記事 by Albina_kun » 3年前

GameのMainになるコード

コード:

#include "DxLib.h"
#include "GameMain.h"
#include "GameSystem.h"

/*画面の更新、画面消去、メッセージ表示の処理*/
namespace System {
	bool Update() { return (DxLib::ScreenFlip() != -1 && DxLib::ClearDrawScreen() != -1 && DxLib::ProcessMessage() != -1); }
}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	/*ゲーム背景を白色に設定*/
	SetBackgroundColor(255, 255, 255);
	SetMainWindowText("タイトル");

	if (DxLib_Init() == -1)
	{
		return -1;
	}

	/*初期化後に書く処理*/
	SetDrawScreen(DX_SCREEN_BACK);

	/*ゲームの画面サイズを1920*1080に設定*/
	SetGraphMode(ScreenSizeX, ScreenSizeY, GameBit);

	/*ゲーム起動時にマウスカーソルを表示*/
	SetMouseDispFlag(TRUE);

	/*メインループの処理*/
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
		/*ゲームシステムの実行*/
		MainSystem();

		/*何かのキーが押されるまで待機*/
		WaitKey();
	}


	/*DxLibの終了処理*/
	DxLib_End();

	return 0;
}

Gameの分岐点になるもの

コード:

#include "DxLib.h"
#include "GameTitle.h"

void MainSystem() {


	/*ゲームタイトルの表示*/
	TitleScreen();


}

タイトル画面のコード

コード:

#include "DxLib.h"
#include "GameTitle.h"

void TitleScreen() {
	unsigned int Cr_Black;
	int TitleLogo;
	int Title_MinusBlock;
	int Title_PlassBlock;
	int StartButton;

	int Count = 0;
	int PositionY = 0;

	/*タイトルロゴの文字の色の取得*/
	Cr_Black = GetColor(0, 0, 0);

	/*タイトルロゴの文字サイズの作成*/
	TitleLogo = CreateFontToHandle(NULL, 180, 3);

	/*タイトル画面のマイナスブロックの画像の読み込み*/
	Title_MinusBlock = LoadGraph("image/Title_MinusBlock.png");
	
	/*タイトル画面のプラスブロックの画像の読み込み*/
	Title_PlassBlock = LoadGraph("image/Title_PlassBlock.png");

	/*タイトル画面のスタートボタンの画像の読み込み*/
	StartButton = LoadGraph("image/StartButton.png");


	for (PositionY; PositionY <= 700; PositionY++) {
		if (PositionY <= 699) {

			/*左下のマイナスブロックの描写*/
			DrawGraph(200, PositionY, Title_MinusBlock, TRUE);

			/*右下のプラスブロックの描写*/
			DrawGraph(1450, PositionY, Title_PlassBlock, TRUE);

			WaitTimer(5);

			/*画面のクリア*/
			ClearDrawScreen();
		}
		else {

			DrawGraph(200, PositionY, Title_MinusBlock, TRUE);

			/*右下のプラスブロックの描写*/
			DrawGraph(1450, PositionY, Title_PlassBlock, TRUE);

			/*タイトルロゴの表示*/
			DrawStringToHandle(575, 120, "タイトル", Cr_Black, TitleLogo);

			/*中央スタートボタンの描写*/
			DrawGraph(550, 550, StartButton, TRUE);
		}
	}



}

このようにしたらモーションを付けることにできました。
コードに使ったWaitTimerは使用しても大丈夫なのでしょうか?(ゲームプログラムの館を見た際にあまり使わないほうがいいと書いてあったので)

Albina_kun
記事: 4
登録日時: 3年前

Re: DxLibでの開発について

#6

投稿記事 by Albina_kun » 3年前

追加で質問をさせていただきます。
現在、タイトル画面のスタートボタンを押すとデバッグの終了(テストのため)をし、それ以外ならそのまま画面が停止している状態のコードを書いています。

コード:

#include "DxLib.h"
#include "GameMain.h"
#include "GameTitle.h"

int Root = GAME_TITLE;

void MainSystem()
{
	int MousePositionX;/*マウスの位置Xを取得*/
	int MousePositionY;/*マウスの位置Yを取得*/

	/*マウスの位置を取得*/
	GetMousePoint(&MousePositionX, &MousePositionY);

	switch (Root) {
	/*ゲームタイトルの表示*/
	case GAME_TITLE:
		TitleScreen();
		/*スタートボタンにカーソルが合わさった時クリックされてるか調べる*/
		if (575 <= MousePositionX && MousePositionX<=1300 && 550 <= MousePositionY && MousePositionY <= 740) {
			/*スタートボタンが押されたら次へ、それ以外ならそのまま*/
			if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
				DxLib_End();
			}
		}
		else {
			WaitKey();
		}
		break;
	}
}

このように書くと、右側はちゃんと認識するのですが、左上からスタートボタンの外側の左端をクリックしてもなぜか反応してしまい、また終了するのではなくもう一度タイトル画面がロードされてしまいます。
どのようにすればいいか、お知恵をお貸しいただけたら幸いです。

参照魚
記事: 109
登録日時: 6年前

Re: DxLibでの開発について

#7

投稿記事 by 参照魚 » 3年前

>右側はちゃんと認識するのですが、左上から...
まずはprintfDX()でMousePositionX と MousePositionXの値を表示してみて、値がifの条件式に合致するか確認してみてはいかがでしょうか?

>また終了するのではなくもう一度タイトル画面が...
DxLib_End()を呼んでもゲームの流れが変わるわけではないので、次のループでまたGAME_TITLEのところが実行されます。switch(Root)のRootの値を適切に変更(例えばGAME_ENDのようなcaseを新たに追加する)する必要があります。

返信

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