画像とRAMの容量

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

画像とRAMの容量

#1

投稿記事 by I am a beginner. » 7年前

 DXライブラリで初めてゲームをつくろうと思ってプログラムを書いたんですが、画像(22KB .jpg)も入れて動すとRAMの使用率が90%後半になってフリーズします。これは、パソコンの限界なのでしようか、それとも他に原因がありますか??どうしたらいいのかわかりません、どうか教えてください。

 画像を入れるために使った関数は、DrawGraph関数です。開発環境は、Microsoft visual C++ 2010 Express です。他に原因を見つけるために足りない情報がありましたら教えてください。

アバター
てんむすキツネ
記事: 88
登録日時: 9年前
住所: 岡山

Re: 画像とRAMの容量

#2

投稿記事 by てんむすキツネ » 7年前

いったい、いつの時代のPCなんですか?

描画は時間のかかる処理ではありますが、
1つ描画しただけでそこまで負荷はかからないかと・・・(ゲームであれば、数十個から数百個も描画します。 弾幕ゲーなんかになると千・・・)

どんなコードをかいているのでしょうか?
載せてくださると答えやすいです。

一応言っときますが
・ロードは最初の一回だけでいい
ですよ。
ひょっとして毎フレームロードしたりしてませんか?

あと、ゲーム用の画像であれば、pngがいいと思います。透明度を設定できるので。テスト用であれば問題ないです。
MLP!MLP!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 画像とRAMの容量

#3

投稿記事 by softya(ソフト屋) » 7年前

間違った使い方をしていると思いますので、codeタグを使ってソースコードを提示してください。
それとDrawGraphは画像を表示する関数でメモリに読み込むのはLoadGraph()ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

I am a beginner.

Re: 画像とRAMの容量

#4

投稿記事 by I am a beginner. » 7年前

[code = #include "DxLib.h"

//#define PI 3.141592654 //円周率
#define FLOOR_NUM 2 //フロア数
#define SPEED 1 //キャラクタの速さ
#define KEY_NUM 5 //使用キー数

//キャラクターの座標
int X = 130; //最大640 最小0
int Y = 150; //最大480 最小0

//キャラクターの向き
struct a{
int Left; /*左*/
int Up; /*上*/
int Right; /*右*/
int Down; /*下*/
int Vectol; /*向き*/
}Ch = {3,9,6,0,0};

//Check
struct b{
int Game; /*初期*/
int Option; /*オプション*/
int Help; /*ヘルプ*/
int Config; /*コンフィグ*/
int Game_Start; /*ゲームスタート*/
int Error; /*エラー*/
}Check = {0};

//セーブデータ
//int DATA[5] = {0};
//int hash = 0;

//色
int White = GetColor(255,255,255); //白

//フォント
int Font00;

//エリア
int Floor00,Floor01,Floor02; //ステージ画像
int Floors[FLOOR_NUM] = {0}; //部屋チェック

//その他
int Character_Name = 0; //キャラクター名
int Number = 0; //部屋番号

//初期画面 画像、文字表示
void GAME_Gamen(void){

DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

DrawStringToHandle( 100, 100, "GAME START", White, Font00 );
DrawStringToHandle( 100, 150, "OPTION", White, Font00 );
DrawStringToHandle( 100, 200, "HELP", White, Font00 );
DrawStringToHandle( 100, 250, "CONFIG", White, Font00 );
DrawStringToHandle( 100, 300, "DISCONTINUE", White, Font00 );
}

//OPTION画面 キャラクタ名変更
void Character_number(int num){
if(num == 0) DrawStringToHandle( 300, 100, "MAN", White, Font00 ); // 文字を描画する
else if(num == 1) DrawStringToHandle( 300, 100, "MAGICIAN", White, Font00 );
else if(num == 2) DrawStringToHandle( 300, 100, "SOLDIER", White, Font00 );
}

//OPTION画面 画像、文字表示
void Option_Character(int charactor,int *image,int *enemy){

DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

DrawStringToHandle( 100, 100, "CHARACTOR:", White, Font00 );
Character_number(Character_Name);
DrawStringToHandle( 100, 150, "RETURN",White, Font00 );

if(charactor == 0){
DrawGraph( 300, 300, *image, TRUE );
LoadDivGraph( "画像/キャラクタ11.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
}
else if(charactor == 1){
LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
LoadDivGraph( "画像/キャラクタ12.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
DrawGraph( 300, 300, *image, TRUE );
}
else if(charactor == 2){
LoadDivGraph( "画像/キャラクタ12.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
DrawGraph( 300, 300, *image, TRUE );
}
}

//HELP画面 画像、文字表示
void Help_Gamen(void){

DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

DrawStringToHandle( 200, 100, "OPERATION", White, Font00 );

DrawStringToHandle( 200, 150, "LEFT", White, Font00 );
DrawStringToHandle( 300, 150, "←", White, Font00 );

DrawStringToHandle( 200, 200, "UP", White, Font00 );
DrawStringToHandle( 300, 200, "↑", White, Font00 );

DrawStringToHandle( 200, 250, "RIGHT", White, Font00 );
DrawStringToHandle( 300, 250, "→", White, Font00 );

DrawStringToHandle( 200, 300, "DOWN", White, Font00 );
DrawStringToHandle( 300, 300, "↓", White, Font00 );

DrawStringToHandle( 200, 350, "ENTER",White, Font00 );
DrawStringToHandle( 300, 350, "DECISION", White, Font00 );

}

// キーの入力状態を更新する
int gpUpdateKey(int *keys,int *key){

char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る

for(int i = 0;i < KEY_NUM;i++){
*(key + i) = 0;
if(tmpKey[*(keys + i)] != 0) *(key + i) = *(key + i) + 1;
}
return 0;
}

//キャラクター操作
void Character_Control(int *key,int *image){

if( *(key + 2) >= 1){ /*上*/
Ch.Vectol = 0;
Ch.Up++;
if(Ch.Up >= 12) Ch.Up = 9;
Y = Y - SPEED;
}
else if( *(key + 1) >= 1){ /*左*/
Ch.Vectol = 1;
Ch.Left++;
if(Ch.Left >= 6) Ch.Left = 3;
X = X - SPEED;
}
else if( *(key + 4) >= 1){ /*下*/
Ch.Vectol = 2;
Ch.Down++;
if(Ch.Down >= 3) Ch.Down = 0;
Y = Y + SPEED;
}
else if( *(key + 3)>= 1){ /*右*/
Ch.Vectol = 3;
Ch.Right = Ch.Right + 1;
if(Ch.Right >= 9) Ch.Right = 6;
X = X + SPEED;
}

if(Ch.Vectol == 0){
switch(Ch.Up){

case 9 : DrawGraph( X, Y, *(image + 9), TRUE ); break; // 画像を表示
case 10 : DrawGraph( X, Y, *(image + 10), TRUE ); break; // 画像を表示
case 11 : DrawGraph( X, Y, *(image + 11), TRUE ); break; // 画像を表示
}
}
else if(Ch.Vectol == 1){
switch(Ch.Left){

case 3 : DrawGraph( X, Y, *(image + 3), TRUE ); break; // 画像を表示
case 4 : DrawGraph( X, Y, *(image + 4), TRUE ); break; // 画像を表示
case 5 : DrawGraph( X, Y, *(image + 5), TRUE ); break; // 画像を表

}
}
else if(Ch.Vectol == 2){
switch(Ch.Down){

case 0 : DrawGraph( X, Y, *(image + 0), TRUE ); break; // 画像を表示
case 1 : DrawGraph( X, Y, *(image + 1), TRUE ); break; // 画像を表示
case 2 : DrawGraph( X, Y, *(image + 2), TRUE ); break; // 画像を表示

}
}
else if(Ch.Vectol == 3){
switch(Ch.Right){

case 6 : DrawGraph( X, Y, *(image + 6), TRUE ); break; // 画像を表示
case 7 : DrawGraph( X, Y, *(image + 7), TRUE ); break; // 画像を表示
case 8 : DrawGraph( X, Y, *(image + 8), TRUE ); break; // 画像を表示

}
}
}

//敵のAI
void Enemy_AI(void){

}

//フロア
void Floor_Clear(int num){

int i;

for(i = 0;i < FLOOR_NUM;i++){
if(num == i) continue;
Floors = 0;
}
}

void Floor_second(void){

DrawGraph( 20, 20, Floor02, TRUE ); // データハンドルを使って画像を描画
Floor_Clear(Number);

if(X < 20) X = 20;
else if(X > 331) X = 331;
else if(Y < 60) Y = 60;
else if(Y > 191) Y = 191;

if( (X >= 69) && (X <= 71) && (Y == 60) ){
Number = 0;
X = 44;
Y = 21;
}
}

void Floor_first(void){

DrawGraph( 20, 20, Floor01, TRUE ); // データハンドルを使って画像を描画

Floor_Clear(Number);

if(X < 20) X = 20;
else if(X > 160) X = 160;
else if(Y < 20) Y = 20;
else if(Y > 292) Y = 292;

if((X >= 20) && (X < 84) && (Y >= 20) && (Y < 120)) X = 44;
if((X >= 84) && (Y < 110)) Y = 110;
if((X >= 84) && (Y < 120) && (X < 85)){
Y = 110;
X = 85;
}
if((X >= 20) && (X < 84) && (Y >= 20) && (Y < 21)){
Number = 1;
X = 70;
Y = 65;
}
}

/*
//セーブ
void SAVE_DATA(){

int i = 0;

DATA[0] = x;
DATA[1] = y;

FILE *fp = fopen("セーブデータ.txt","wb"); //ファイルを開く
if( fp == NULL){//NULLが返ってきたらエラー発生
DrawFormatString( 100, 240, White , "セーブできませんでした。"); // 文字を描画する
Check.Error = 1;
}

fwrite(DATA,sizeof(int),5,fp);

for(i = 0;i < 5;i++){
fprintf(fp,"%d",DATA);
}

fclose(fp); //ファイルを閉じる
}

//読み込み
void READ_DATA(void){

FILE *fp = fopen("セーブデータ.txt","rb");
if( fp == NULL ){
DrawFormatString( 100, 240, White , "データの読み取り失敗しました。");
Check.Error = 1;
}

fread(DATA,sizeof(int),5,fp);
fclose( fp );

x = DATA[0];
y = DATA[1];
}

//改竄チェック
void Check_hash(void){

int i;

for(i = 0;i < 4;i++)
{
hash += DATA;
}
hash = hash/10;
if(DATA[4] != hash) Check.Error = 1;
else DATA[4] = hash;
}
*/

//セレクト画面

void Select_Gamen(int select){
if(select == 100){ //ゲーム開始
Check.Game_Start = 1;
Floors[0] = 1;
}
else if(select == 150) Check.Option = 1; //オプションへ
else if(select == 200) Check.Help = 1; //ヘルプへ
else if(select == 250) Check.Config = 1; //コンフィグへ
else if(select == 300) DxLib_End(); //ゲーム終了
}

//初期画面
void Game_init(int *keys,int *key){

int a = 100;

Check.Game = 0;
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Option == 0) && (Check.Help == 0) && (Check.Config == 0) && (Check.Game_Start == 0)){
GAME_Gamen();
DrawFormatString( 50, a, White , "→"); // 文字を描画する

if( (*(key + 2) >= 1) && (a >= 150) ){
a = a - 50;
Sleep(150);
}
if( (*(key + 4) >= 1) && (a <= 250)){
a = a + 50;
Sleep(150);
}
DrawFormatString( 50, a, White , "→"); // 文字を描画する
if(*key >= 1) Select_Gamen(a);
}
}

//OPTION キャラチェンジ
void Option_change(int select){
if(select == 100) {
Character_Name++;
if(Character_Name >= 3) Character_Name = 0;
}
else if(select == 150){
Check.Game = 1;
Sleep(150);
}
}

//OPTION画面
void Option_init(int *keys,int *key,int *image,int *enemy){

int a = 100;

Check.Option = 0;

while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game == 0) && (Check.Help == 0) && (Check.Config == 0) && (Check.Game_Start == 0) ){
Option_Character(Character_Name,image,enemy);
DrawFormatString( 50, a, White , "→"); // 文字を描画する

if( (*(key + 2) >= 1) && (a >= 150) ){
a = a - 50;
Sleep(150);
}
if( (*(key + 4) >= 1) && (a <= 100)){
a = a + 50;
Sleep(150);
}
DrawFormatString( 50, a, White , "→"); // 文字を描画する
if(*key >= 1){
Sleep(150);
Option_change(a);
}
}
}

//HELP画面
void Help_init(int *keys,int *key){

Check.Help = 0;
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game == 0) && (Check.Option == 0) && (Check.Config == 0) && (Check.Game_Start == 0) ){
Help_Gamen();
DrawFormatString( 50, 400, White , "→"); // 文字を描画する
DrawFormatString( 100, 400, White , "RETURN"); // 文字を描画する

if(*key >= 1){
Check.Game = 1;
}
}
}

//ゲーム設定
void INIT(int *keys,int *key,int *image,int *enemy){

if(Check.Game_Start == 0){
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game_Start == 0)){
Game_init(keys,key);
Option_init(keys,key,image,enemy);
Help_init(keys,key);
}
}
}

//ゲーム
void Game(int *key,int *image){
//Floor00 = LoadGraph( "画像5/部屋/リンゴ.png" ); // 画像のロード
//DrawGraph( 480, 360, Floor00, TRUE ); // データハンドルを使って画像を描画

if(Number == 0) Floor_first();
if(Number == 1) Floor_second();

Character_Control(key,image);
}

//アイテム画面
void AITEM(void){
}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

////キャラクターの画像
int image[12] = {0};
int enemy[12] = {0};

//効果音
//int Sound;
//Sound = LoadSoundMem("サウンド/1up.wav"); // サウンド/1up.wavをロードし、識別番号をSongに格納

//フォント
Font00 = CreateFontToHandle( "MS Pゴシック",18,3,DX_FONTTYPE_ANTIALIASING_EDGE ); //"MS Pゴシック"の70pt,太さ3のフォントを作成

//エリア
Floor00 = LoadGraph( "画像5/部屋/画面②.png" ); // 画像のロード
Floor01 = LoadGraph( "画像5/部屋/部屋①.png" ); // 画像のロード
Floor02 = LoadGraph( "画像5/部屋/部屋②.png" ); // 画像のロード

//操作
int key_input[KEY_NUM] = {KEY_INPUT_RETURN/*Enter28*/,KEY_INPUT_LEFT/*←203*/,KEY_INPUT_UP/*↑200*/,KEY_INPUT_RIGHT/*→205*/,KEY_INPUT_DOWN/*↓208*/};
int key[KEY_NUM] = {0};

// while(裏画面を表画面に反映, メッセージ処理, 画面クリア
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(key_input,key)==0 ){

INIT(key_input,key,image,enemy);
Game(key,image);
}

DxLib_End(); // DXライブラリ終了処理
return 0;
}
[/code]
 雑で無駄に長いプログラムですみません。おっしゃる通りで、毎フレームロードしていました。また、pngに変更しました。アドバイス通りにプログラムを変更したら、問題が起こらなくなりました。解答ありがとうございました。

I am a beginner.

Re: 画像とRAMの容量

#5

投稿記事 by I am a beginner. » 7年前

コード:

#include "DxLib.h"

//#define PI 3.141592654			//円周率
#define FLOOR_NUM 2					//フロア数
#define	SPEED 1						//キャラクタの速さ
#define KEY_NUM 5					//使用キー数

//キャラクターの座標
int X = 130;						//最大640 最小0
int Y = 150;						//最大480 最小0

//キャラクターの向き
struct a{
	int Left;						/*左*/
	int Up;							/*上*/
	int Right;						/*右*/
	int Down;						/*下*/
	int Vectol;						/*向き*/
}Ch = {3,9,6,0,0};

//Check
struct b{
	int Game;						/*初期*/
	int Option;						/*オプション*/
	int Help;						/*ヘルプ*/
	int Config;						/*コンフィグ*/
	int Game_Start;					/*ゲームスタート*/
	int Error;						/*エラー*/
}Check = {0};

//セーブデータ
//int DATA[5] = {0};
//int hash = 0;

//色
int White = GetColor(255,255,255);	//白

//フォント
int Font00;

//エリア
int Floor00,Floor01,Floor02;		//ステージ画像
int Floors[FLOOR_NUM] = {0};		//部屋チェック

//その他
int Character_Name = 0;				//キャラクター名
int Number = 0;						//部屋番号

//初期画面 画像、文字表示
void GAME_Gamen(void){

	DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

	DrawStringToHandle( 100, 100, "GAME START", White, Font00 );
	DrawStringToHandle( 100, 150, "OPTION", White, Font00 );
	DrawStringToHandle( 100, 200, "HELP", White, Font00 );
	DrawStringToHandle( 100, 250, "CONFIG", White, Font00 );
	DrawStringToHandle( 100, 300, "DISCONTINUE", White, Font00 );
}

//OPTION画面 キャラクタ名変更
void Character_number(int num){
	if(num == 0)	DrawStringToHandle( 300, 100, "MAN", White, Font00 ); // 文字を描画する
	else if(num == 1)	DrawStringToHandle( 300, 100, "MAGICIAN", White, Font00 );
	else if(num == 2)	DrawStringToHandle( 300, 100, "SOLDIER", White, Font00 );
}

//OPTION画面 画像、文字表示
void Option_Character(int charactor,int *image,int *enemy){

	DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

	DrawStringToHandle( 100, 100, "CHARACTOR:", White, Font00 );
	Character_number(Character_Name);
	DrawStringToHandle( 100, 150, "RETURN",White, Font00 );

	if(charactor == 0){
		DrawGraph( 300, 300, *image, TRUE );
		LoadDivGraph( "画像/キャラクタ11.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
		LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
	}
	else if(charactor == 1){
		LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
		LoadDivGraph( "画像/キャラクタ12.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
		DrawGraph( 300, 300, *image, TRUE );
	}
	else if(charactor == 2){
		LoadDivGraph( "画像/キャラクタ12.png" , 12 , 3 , 4 , 32 , 32 , image ); // 画像の分割読み込み
		LoadDivGraph( "画像/キャラクタ13.png" , 12 , 3 , 4 , 32 , 32 , enemy ); // 画像の分割読み込み
		DrawGraph( 300, 300, *image, TRUE );
	}
}

//HELP画面 画像、文字表示
void Help_Gamen(void){

	DrawGraph( 0, 0, Floor00, TRUE ); // データハンドルを使って画像を描画

	DrawStringToHandle( 200, 100, "OPERATION", White, Font00 );

	DrawStringToHandle( 200, 150, "LEFT", White, Font00 );
	DrawStringToHandle( 300, 150, "←", White, Font00 );

	DrawStringToHandle( 200, 200, "UP", White, Font00 );
	DrawStringToHandle( 300, 200, "↑", White, Font00 );

	DrawStringToHandle( 200, 250, "RIGHT", White, Font00 );
	DrawStringToHandle( 300, 250, "→", White, Font00 );

	DrawStringToHandle( 200, 300, "DOWN", White, Font00 );
	DrawStringToHandle( 300, 300, "↓", White, Font00 );

	DrawStringToHandle( 200, 350, "ENTER",White, Font00 );
	DrawStringToHandle( 300, 350, "DECISION", White, Font00 );

}

// キーの入力状態を更新する
int gpUpdateKey(int *keys,int *key){

        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
		
		for(int i = 0;i < KEY_NUM;i++){
			*(key + i) = 0;
			if(tmpKey[*(keys + i)] != 0)	*(key + i) = *(key + i) + 1;
		}
        return 0;
}

//キャラクター操作
void Character_Control(int *key,int *image){

	if( *(key + 2) >= 1){			/*上*/
		Ch.Vectol = 0;
		Ch.Up++;
		if(Ch.Up >= 12)	Ch.Up = 9;
		Y = Y - SPEED;
		}
	else if( *(key + 1) >= 1){		/*左*/
		Ch.Vectol = 1;
		Ch.Left++;
		if(Ch.Left >= 6)	Ch.Left = 3;
		X = X - SPEED;
		}
	else if( *(key + 4) >= 1){		/*下*/
		Ch.Vectol = 2;
		Ch.Down++;
		if(Ch.Down >= 3)	Ch.Down = 0;
		Y = Y + SPEED;
		}
	else if( *(key + 3)>= 1){		/*右*/
		Ch.Vectol = 3;
		Ch.Right = Ch.Right + 1;
		if(Ch.Right >= 9)	Ch.Right = 6;
		X = X + SPEED;
		}

	if(Ch.Vectol == 0){
		switch(Ch.Up){
			
		case 9 : DrawGraph( X, Y, *(image + 9), TRUE );		break;      // 画像を表示
		case 10 : DrawGraph( X, Y, *(image + 10), TRUE );	break;      // 画像を表示
		case 11 : DrawGraph( X, Y,  *(image + 11), TRUE );	break;      // 画像を表示
		}
	}
	else if(Ch.Vectol == 1){
		switch(Ch.Left){
			
		case 3 : DrawGraph( X, Y,  *(image + 3), TRUE );	break;      // 画像を表示
		case 4 : DrawGraph( X, Y,  *(image + 4), TRUE );	break;      // 画像を表示
		case 5 : DrawGraph( X, Y, *(image + 5), TRUE );		break;      // 画像を表

		}
	}
	else if(Ch.Vectol == 2){
		switch(Ch.Down){
			
		case 0 : DrawGraph( X, Y,  *(image + 0), TRUE );	break;      // 画像を表示
		case 1 : DrawGraph( X, Y,  *(image + 1), TRUE );	break;      // 画像を表示
		case 2 : DrawGraph( X, Y,  *(image + 2), TRUE );	break;      // 画像を表示
		
		}
	}
	else if(Ch.Vectol == 3){
		switch(Ch.Right){
			
		case 6 : DrawGraph( X, Y,  *(image + 6), TRUE ); break;      // 画像を表示
		case 7 : DrawGraph( X, Y,  *(image + 7), TRUE ); break;      // 画像を表示
		case 8 : DrawGraph( X, Y,  *(image + 8), TRUE ); break;      // 画像を表示
		
		}
	}
}

//敵のAI
void Enemy_AI(void){

}

//フロア
void Floor_Clear(int num){

	int i;

	for(i = 0;i < FLOOR_NUM;i++){
		if(num == i)	continue;
		Floors[i] = 0;
	}
}

void Floor_second(void){

	DrawGraph( 20, 20, Floor02, TRUE ); // データハンドルを使って画像を描画
	Floor_Clear(Number);

	if(X < 20)	X = 20;
	else if(X > 331)	X = 331;
	else if(Y < 60)	Y = 60;
	else if(Y > 191)	Y = 191;

	if( (X >= 69) && (X <= 71) && (Y == 60) ){
		Number = 0;
		X = 44;
		Y = 21;
	}
}

void Floor_first(void){

	DrawGraph( 20, 20, Floor01, TRUE ); // データハンドルを使って画像を描画

	Floor_Clear(Number);

	if(X < 20)	X = 20;
	else if(X > 160)	X = 160;
	else if(Y < 20)	Y = 20;
	else if(Y > 292)	Y = 292;

	if((X >= 20) && (X < 84) && (Y >= 20) && (Y < 120))	X  = 44;
	if((X >= 84) && (Y < 110)) Y = 110;
	if((X >= 84) && (Y < 120) && (X < 85)){
		Y = 110;
		X = 85;
	}
	if((X >= 20) && (X < 84) && (Y >= 20) && (Y < 21)){
		Number = 1;
		X = 70;
		Y = 65;
	}
}

/*
//セーブ
void SAVE_DATA(){

	int i = 0;

	DATA[0] = x;
	DATA[1] = y;

	FILE *fp = fopen("セーブデータ.txt","wb");	//ファイルを開く
	if( fp == NULL){//NULLが返ってきたらエラー発生
		DrawFormatString( 100, 240, White , "セーブできませんでした。"); // 文字を描画する
		Check.Error = 1;
	}

	fwrite(DATA,sizeof(int),5,fp);

	for(i = 0;i < 5;i++){
		fprintf(fp,"%d",DATA[i]);
	}

	fclose(fp);	//ファイルを閉じる
}

//読み込み
void READ_DATA(void){

	FILE *fp = fopen("セーブデータ.txt","rb");
	if( fp == NULL ){
		DrawFormatString( 100, 240, White , "データの読み取り失敗しました。");
		Check.Error = 1;
	}

	fread(DATA,sizeof(int),5,fp);
	fclose( fp );

	x = DATA[0];
	y = DATA[1];
}

//改竄チェック
void Check_hash(void){
	
	int i;

	for(i = 0;i < 4;i++)
	{
		hash += DATA[i];
	}
	hash = hash/10;
	if(DATA[4] != hash)	Check.Error = 1;
	else	DATA[4] = hash;
}
*/

//セレクト画面

void Select_Gamen(int select){
	if(select == 100){							//ゲーム開始
		Check.Game_Start = 1;
		Floors[0] = 1;
	}
	else if(select == 150)	Check.Option = 1;	//オプションへ
	else if(select == 200)	Check.Help = 1;		//ヘルプへ
	else if(select == 250)	Check.Config = 1;	//コンフィグへ
	else if(select == 300)	DxLib_End();		//ゲーム終了
}

//初期画面
void Game_init(int *keys,int *key){

	int a = 100;

	Check.Game = 0;
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Option == 0) && (Check.Help == 0) && (Check.Config == 0) && (Check.Game_Start == 0)){
		GAME_Gamen();
		DrawFormatString( 50, a, White , "→"); // 文字を描画する

		if( (*(key + 2) >= 1) && (a >= 150) ){
			a = a - 50;
			Sleep(150);
		}
		if( (*(key + 4) >= 1) && (a <= 250)){
			a = a + 50;
			Sleep(150);
		}
		DrawFormatString( 50, a, White , "→"); // 文字を描画する
		if(*key >= 1)	Select_Gamen(a);
	}
}

//OPTION キャラチェンジ
void Option_change(int select){
	if(select == 100) {
		Character_Name++;
		if(Character_Name >= 3)	Character_Name = 0;
	}
	else if(select == 150){
		Check.Game = 1;
		Sleep(150);
	}
}

//OPTION画面
void Option_init(int *keys,int *key,int *image,int *enemy){

	int a = 100;

	Check.Option = 0;

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game == 0) && (Check.Help == 0) && (Check.Config == 0) && (Check.Game_Start == 0) ){
		Option_Character(Character_Name,image,enemy);
		DrawFormatString( 50, a, White , "→"); // 文字を描画する

		if( (*(key + 2) >= 1) && (a >= 150) ){
			a = a - 50;
			Sleep(150);
		}
		if( (*(key + 4) >= 1) && (a <= 100)){
			a = a + 50;
			Sleep(150);
		}
		DrawFormatString( 50, a, White , "→"); // 文字を描画する
		if(*key >= 1){
			Sleep(150);
			Option_change(a);
		}
	}
}

//HELP画面
void Help_init(int *keys,int *key){

	Check.Help = 0;
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game == 0) && (Check.Option == 0) && (Check.Config == 0) && (Check.Game_Start == 0) ){
		Help_Gamen();
		DrawFormatString( 50, 400, White , "→"); // 文字を描画する
		DrawFormatString( 100, 400, White , "RETURN"); // 文字を描画する

		if(*key >= 1){
			Check.Game = 1;
		}
	}
}

//ゲーム設定
void INIT(int *keys,int *key,int *image,int *enemy){

	if(Check.Game_Start == 0){
		while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(keys,key)==0 && (Check.Game_Start == 0)){
			Game_init(keys,key);
			Option_init(keys,key,image,enemy);
			Help_init(keys,key);
		}
	}
}

//ゲーム
void Game(int *key,int *image){
	//Floor00 = LoadGraph( "画像5/部屋/リンゴ.png" ); // 画像のロード
	//DrawGraph( 480, 360, Floor00, TRUE ); // データハンドルを使って画像を描画

	if(Number == 0)	Floor_first();
	if(Number == 1) Floor_second();

	Character_Control(key,image);
}

//アイテム画面
void AITEM(void){
}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

	////キャラクターの画像
	int image[12] = {0};
	int enemy[12] = {0};
	
	//効果音
	//int Sound;
	//Sound = LoadSoundMem("サウンド/1up.wav"); // サウンド/1up.wavをロードし、識別番号をSongに格納

	//フォント
	Font00 = CreateFontToHandle( "MS Pゴシック",18,3,DX_FONTTYPE_ANTIALIASING_EDGE );	//"MS Pゴシック"の70pt,太さ3のフォントを作成

	//エリア
	Floor00 = LoadGraph( "画像5/部屋/画面②.png" ); // 画像のロード
	Floor01 = LoadGraph( "画像5/部屋/部屋①.png" ); // 画像のロード
	Floor02 = LoadGraph( "画像5/部屋/部屋②.png" ); // 画像のロード

	//操作
	int key_input[KEY_NUM] = {KEY_INPUT_RETURN/*Enter28*/,KEY_INPUT_LEFT/*←203*/,KEY_INPUT_UP/*↑200*/,KEY_INPUT_RIGHT/*→205*/,KEY_INPUT_DOWN/*↓208*/};
	int key[KEY_NUM] = {0};

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey(key_input,key)==0 ){

		INIT(key_input,key,image,enemy);
		Game(key,image);
	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
 すみません、プログラムの貼り付けの仕方が間違っていたので、再度貼り付けました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 画像とRAMの容量

#6

投稿記事 by softya(ソフト屋) » 7年前

ループの中にLoadが無いのでメモリを消費する事は大丈夫です。
適当な画像で動かしてみましたがメモリは平和そのものです。50MB程度。

もしメモリが足らないとするとMicrosoft visual C++ 2010 Express をp起動しただけでメモリが不足気味とかありませんか?
あとハードディスクに空き容量はありますか? ない場合フリーズする可能性があります。

それとそれと大問題ですが、
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
に引っかかっているので、動作がうまく行っているのは奇跡的です。
今後のことを考えて「あちこちにDXライブラリ3大処理がある」のはやめたほうが良いと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

I am a beginner.

Re: 画像とRAMの容量

#7

投稿記事 by I am a beginner. » 7年前

 ご指摘ありがとうございます。ご指摘通りにDXライブラリ3大処理がたくさんあるので、できるだけ減らすために考えてみます。
まだまだゲームと言えるレベルではないですが、頑張ってみようと思います。
 助言のおかげで、プログラムを無事に実行することができました。ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 画像とRAMの容量

#8

投稿記事 by softya(ソフト屋) » 7年前

I am a beginner. さんが書きました: ご指摘ありがとうございます。ご指摘通りにDXライブラリ3大処理がたくさんあるので、できるだけ減らすために考えてみます。
まだまだゲームと言えるレベルではないですが、頑張ってみようと思います。
 助言のおかげで、プログラムを無事に実行することができました。ありがとうございました。
すいません。
メモリが足らなくなる原因は何だったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

I am a beginner.

Re: 画像とRAMの容量

#9

投稿記事 by I am a beginner. » 7年前

 誤解を生むような書き方をして申し訳ありませんでした。上記に書いてあるプログラムは、書き直したプログラムです。
アドバイスを頂いたので、すぐに書き直してしまいました。改善前のプログラムを保存していなかったので、改善後のプログ
ラムを載せてしまいました。ご心配頂き非常に感謝しております。理由ですが、毎回画像をロードしていたためだと思われます。
お手数お掛けします。

I am a beginner.

Re: 画像とRAMの容量

#10

投稿記事 by I am a beginner. » 7年前

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

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 画像とRAMの容量

#11

投稿記事 by Dixq (管理人) » 7年前

> できるだけ減らすために考えてみます。

できるだけと言わず、最初は必ず1つしか書かないようにすることをお勧めします。
今回の場合、Help_initなどにあるwhile文を撤廃し、
while文はWinMain関数の中だけにしか作らず、
WinMainのwhile文の中でswitch文を作り、そこから、必要な関数をコールしてやるようにすれば、すっきり見えると思います。

また、特定の機能単位や、オブジェクト単位でファイルわけするとコードが見やすくなります。
もし分割設計の仕方がよく分からない時は、うちのサイトでよければ
ゲームプログラミングの館の設計編をご覧頂けると幸いです。
http://dixq.net/g/

閉鎖

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