タイトルの画像が表示されません!

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: タイトルの画像が表示されません!

Re: タイトルの画像が表示されません!

#4

by けいすけ きさ » 8年前

解決しました!
ありがとうございました。

Re: タイトルの画像が表示されません!

#3

by けいすけ きさ » 8年前

みけCAT さんが書きました:DrawGameTitle()関数内にProcessMessage()関数の呼び出しがあり、書いてはいけない処理となっています。
指摘された通りにwhile文をけして修正しました。

コード:

void DrawGameTitle() {
	DrawGraph(0, 0, imghandles.title, FALSE);
		if (CheckHitKey(KEY_INPUT_RETURN) == 1) {
			gamestate = GAME_MAIN;
		}
}
するとタイトル画像はきちんと表示されました。
しかし、エンターキーを押すと画面が真っ白になり、アイテムやかごの画像が表示されません。
先ほどとソースコードは変えていないのに意味が分からないです。
しいていうならメインループの前にサウンドのループ再生処理を書き加えたくらいです。
もちろんその音もなってくれませんでした。

コード:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//ウィンドウサイズを変更する
	SetGraphMode(640, 480, 32);
	SetBackgroundColor(255, 255, 255);
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化
	Load();
	Init();
	PlaySoundMem(sndhandles.back, DX_PLAYTYPE_LOOP);
	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(key) == 0 && key[KEY_INPUT_ESCAPE] == 0) {
		ClearDrawScreen();
		switch (gamestate)
		{
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			count++;
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		default:
			break;
		}
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}

Re: タイトルの画像が表示されません!

#2

by みけCAT » 8年前

DrawGameTitle()関数内にProcessMessage()関数の呼び出しがあり、書いてはいけない処理となっています。
このループがあるためにEnterキーを押すまで画面の更新がされず、またEnterキーを押すとgamestate = GAME_MAIN;が実行されてしまうので、タイトル画面は1フレームしか描画されません。
テストはしていませんが、このwhileループを削除すると改善しそうです。

タイトルの画像が表示されません!

#1

by けいすけ きさ » 8年前

先日も質問させていただきましたが、現在落ちゲーを製作しています。問題は山ほどあるのですが、とりあえずタイトルの描画だけでも完成させたいです。なのに何をしてもタイトル画像が表示されません。本当にどうしたらいいか意味不明です。
助けてください。
gamemain.h

コード:

#ifndef __GAMEMAIN_H__ 
#define __GAMEMAIN_H__

#include <DxLib.h>

#define CHIP 32               //ピクセルサイズ
#define STAGE_WIDTH	640	      // ステージの幅
#define STAGE_HEIGHT 480	  // ステージの高さ
#define NUM_MAX 10            //アイテム総数
#define PI 3.141592653589793  //円周率
#define STRN 256              //キーボード



enum GameState {				//(列挙体の定義をかく)ゲーム状態
	GAME_TITLE, GAME_MAIN,
	GAME_OVER
};
extern GameState gamestate;

//かご
struct Basket_Data {
	int x, y;
};
Basket_Data basket;

//アイテム
struct Item_Data {
	int flag;//フラグ
	int cnt;//
	double x, y;
	double angle;//角度
	double speed;//速さ
};
Item_Data item[NUM_MAX];

//関数プロトタイプ宣言
void DrawGameTitle();
void DrawGameOver();
void DrawGameMain();
void Draw_Score();

#endif
#pragma once


gamemain.cpp

コード:

#include"gamemain.h"
#include"loading.h"
#include<math.h>

GameState gamestate = GAME_TITLE;

int count;    //カウンタ(メインループ)
int key[STRN];//キー
int sum;      //合計(アイテム)
int point;    //得点
int f = 2;        //速さ

//初期化
void Init() {
	basket.x = 320;
	basket.y = 360;
	count = 0;
}

//かご描画
void Graph_Basket() {
	DrawGraph(basket.x, basket.y, imghandles.basket, TRUE);
}

//かご移動
void Operate_Basket() {
	if (key[KEY_INPUT_LEFT] > 0)
		basket.x -= 8;
	if (key[KEY_INPUT_RIGHT] > 0)
		basket.x += 8;
	if (basket.x + CHIP * 2 > STAGE_WIDTH)
		basket.x = STAGE_WIDTH - CHIP * 2;
	if (basket.x < (CHIP / 2))
		basket.x = (CHIP / 2);
}

//アイテム登録
void Item_Enter() {
	int n = GetRand((NUM_MAX - 1));                   //ランダムでアイテム選択
	item[n].flag = 1;			                //アイテムの存在フラグを立てる
	item[n].cnt = 0;			                //カウンタ初期化
	item[n].speed = f;			                //発射スピードを2に
	item[n].angle = PI / 2;		                //角度は真下である90°
	item[n].x = GetRand(STAGE_WIDTH - 20);	    //x座標は0~620のランダムな値
	item[n].y = 0;				                //y座標は0
}

//i番のアイテムがかごの中にあるか
//1:ある 0:ない
int Item_Basket_Exit(int i) {
	//もしカゴの中にあれば
	if (basket.x - 10 < item[i].x && item[i].x < basket.x + 84 && basket.y - 10 < item[i].y&&item[i].y < basket.y + 60) {
		PlaySoundMem(sndhandles.hit, DX_PLAYTYPE_BACK);
		sum += (i + 1);
		Draw_Score();
		return 1;
	}
	return 0;
}

//i番の弾幕が画面内にあるか
//1:画面外 0:画面内
int Item_Feeld_Exit(int i) {
	//もし画面の中になければ
	if (!(15 <= item[i].x && item[i].x <= 630 && 0 <= item[i].y && item[i].y <= 450))
		return 1;
	return 0;
}

//軌道(アイテム)計算
void Item_calc() {
	int i;
	if (count % 30 == 0)//20カウントに一回(モニタが60Hz、60カウントは1秒)
		Item_Enter();
	for (i = 0; i < NUM_MAX; i++) {
		if (item[i].flag == 1) {
			item[i].x += cos(item[i].angle) * item[i].speed;//x成分計算
			item[i].y += sin(item[i].angle) * item[i].speed;//y成分計算
			if (Item_Basket_Exit(i) == 1)//かごの中にあるか?
				item[i].flag = 0;//弾を消す
			if (Item_Feeld_Exit(i) == 1)//画面の中にあるか?
				item[i].flag = 0;//弾を消す
		}
	}
}

//アイテムの描画
void Graph_Item() {
	int i;
	for (i = 0; i < 500; i++) {
		if (item[i].flag > 0) {
			DrawRotaGraphF(item[i].x, item[i].y, 1.0f, item[i].angle - PI / 2, imghandles.item[i], TRUE);
			//+PI/2は弾の向きを合わせるため
		}
	}
}


//
void Draw_Score() {
	point++;
	if (sum == 10) {
		point += 10;
		sum = 0;
		f++;
	}
	else if (sum > 10)
	{
		gamestate = GAME_OVER;
	}
}


//各表示
void Draw_Display() {
	DrawFormatString(0, 0, (0, 100, 180), "%d", sum);
	DrawFormatString(450, 0, (0, 180, 180), "%d", point);
}

//ゲームメイン関数
void DrawGameMain() {
	Operate_Basket();
	Item_calc();
	Graph_Basket();
	Graph_Item();
	Draw_Display();
}

//ゲームタイトル描画
void DrawGameTitle() {
	DrawGraph(0, 0, imghandles.title, FALSE);
		while (CheckHitKey(KEY_INPUT_RETURN) == 0) {
			if (ProcessMessage() == -1) {
				break;
			}
		}
		if (CheckHitKey(KEY_INPUT_RETURN) == 1) {
			gamestate = GAME_MAIN;
		}
}

//ゲームオーバー描画
void DrawGameOver() {
	ClearDrawScreen();
	DrawFormatString(330, 240, (0, 180, 180), "%d", point);
	WaitTimer(3000);
	gamestate = GAME_TITLE;
}

//キーがどれ位押されたかを判定する関数
int GetHitKeyStateAll_2(int KeyStateBuf[]) {
	char GetHitKeyStateAll_key[256];
	GetHitKeyStateAll(GetHitKeyStateAll_key);
	for (int i = 0; i < 256; i++) {
		if (GetHitKeyStateAll_key[i] == 1) KeyStateBuf[i]++;
		else                            KeyStateBuf[i] = 0;
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//ウィンドウサイズを変更する
	SetGraphMode(640, 480, 32);
	SetBackgroundColor(255, 255, 255);
	if (DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0) return -1;//初期化と裏画面化
	Load();
	Init();
	while (ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll_2(key) == 0 && key[KEY_INPUT_ESCAPE] == 0) {
		ClearDrawScreen();
		switch (gamestate)
		{
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			count++;
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		default:
			break;
		}
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}


loading.h

コード:

#ifndef __LOADING_H__
#define __LOADING_H__

#include <DxLib.h>


//画像
struct Img_Data {
	int title;
	int boad;
	int basket;
	int item[10];
};
extern Img_Data imghandles;

//音
struct Snd_Data {
	int back;
	int hit;
};
extern Snd_Data sndhandles;


BOOL Load();

#endif
#pragma once
loading.cpp

コード:

#include"loading.h"

Img_Data imghandles;
Snd_Data sndhandles;

BOOL Load() {

	if ((imghandles.title = LoadGraph("media\\title.png")) == -1) return FALSE;
	if ((imghandles.boad = LoadGraph("media\\boad.png")) == -1) return FALSE;
	if ((imghandles.basket = LoadGraph("media\\basket.png")) == -1) return FALSE;
	if ((imghandles.item[0] = LoadGraph("media\\num_1.png")) == -1) return FALSE;
	if ((imghandles.item[1] = LoadGraph("media\\num_2.png")) == -1) return FALSE;
	if ((imghandles.item[2] = LoadGraph("media\\num_3.png")) == -1) return FALSE;
	if ((imghandles.item[3] = LoadGraph("media\\num_4.png")) == -1) return FALSE;
	if ((imghandles.item[4] = LoadGraph("media\\num_5.png")) == -1) return FALSE;
	if ((imghandles.item[5] = LoadGraph("media\\num_6.png")) == -1) return FALSE;
	if ((imghandles.item[6] = LoadGraph("media\\num_7.png")) == -1) return FALSE;
	if ((imghandles.item[7] = LoadGraph("media\\num_8.png")) == -1) return FALSE;
	if ((imghandles.item[8] = LoadGraph("media\\num_9.png")) == -1) return FALSE;
	if ((imghandles.item[9] = LoadGraph("media\\num_10.png")) == -1) return FALSE;
	sndhandles.hit = LoadSoundMem("media\\hit.mp3");
	if (sndhandles.hit == -1) return FALSE;
	return TRUE;
}


ページトップ