ページ 1 / 1
DxLibでの開発について
Posted: 2020年11月05日(木) 23:40
by Albina_kun
学校の課題でのゲーム制作(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の定義が無効です:最初の条件はテストを満たしていません。ループボディは実行されません。」とのことでした。
お力をお貸しいただけたら幸いです。
Re: DxLibでの開発について
Posted: 2020年11月06日(金) 00:30
by みけCAT
エラーの原因は、初期値 PositionY = 0 ではループ条件 PositionY >= 700 が真にならないことですね。
条件は PositionY <= 700 の間違いではないでしょうか?
また、この条件を直しても、画像が2×701枚全部一気に描画され、モーションにはならないでしょう。
モーションにするには、1回描画するごとにウェイトと画面クリアを入れるといいでしょう。
(本当は描画位置を状態として管理し、1フレームごとにメインループに戻すべきですが、
この段階ではメインループが無いようなので…)
Re: DxLibでの開発について
Posted: 2020年11月06日(金) 23:26
by Albina_kun
コード:
#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を使用してみましたが表示が上手くいきませんでした。
Re: DxLibでの開発について
Posted: 2020年11月06日(金) 23:59
by みけCAT
ブロックの描写位置がループ変数に依存しなくなってしまいましたね。
なぜそのように変更したのでしょうか?
Re: DxLibでの開発について
Posted: 2020年11月06日(金) 23:59
by Albina_kun
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は使用しても大丈夫なのでしょうか?(ゲームプログラムの館を見た際にあまり使わないほうがいいと書いてあったので)
Re: DxLibでの開発について
Posted: 2020年11月07日(土) 16:05
by Albina_kun
追加で質問をさせていただきます。
現在、タイトル画面のスタートボタンを押すとデバッグの終了(テストのため)をし、それ以外ならそのまま画面が停止している状態のコードを書いています。
コード:
#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;
}
}
このように書くと、右側はちゃんと認識するのですが、左上からスタートボタンの外側の左端をクリックしてもなぜか反応してしまい、また終了するのではなくもう一度タイトル画面がロードされてしまいます。
どのようにすればいいか、お知恵をお貸しいただけたら幸いです。
Re: DxLibでの開発について
Posted: 2020年11月21日(土) 17:43
by 参照魚
>右側はちゃんと認識するのですが、左上から...
まずはprintfDX()でMousePositionX と MousePositionXの値を表示してみて、値がifの条件式に合致するか確認してみてはいかがでしょうか?
>また終了するのではなくもう一度タイトル画面が...
DxLib_End()を呼んでもゲームの流れが変わるわけではないので、次のループでまたGAME_TITLEのところが実行されます。switch(Root)のRootの値を適切に変更(例えばGAME_ENDのようなcaseを新たに追加する)する必要があります。