画像とRAMの容量
Re: 画像とRAMの容量
いったい、いつの時代のPCなんですか?
描画は時間のかかる処理ではありますが、
1つ描画しただけでそこまで負荷はかからないかと・・・(ゲームであれば、数十個から数百個も描画します。 弾幕ゲーなんかになると千・・・)
どんなコードをかいているのでしょうか?
載せてくださると答えやすいです。
一応言っときますが
・ロードは最初の一回だけでいい
ですよ。
ひょっとして毎フレームロードしたりしてませんか?
あと、ゲーム用の画像であれば、pngがいいと思います。透明度を設定できるので。テスト用であれば問題ないです。
描画は時間のかかる処理ではありますが、
1つ描画しただけでそこまで負荷はかからないかと・・・(ゲームであれば、数十個から数百個も描画します。 弾幕ゲーなんかになると千・・・)
どんなコードをかいているのでしょうか?
載せてくださると答えやすいです。
一応言っときますが
・ロードは最初の一回だけでいい
ですよ。
ひょっとして毎フレームロードしたりしてませんか?
あと、ゲーム用の画像であれば、pngがいいと思います。透明度を設定できるので。テスト用であれば問題ないです。
MLP!MLP!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像とRAMの容量
間違った使い方をしていると思いますので、codeタグを使ってソースコードを提示してください。
それとDrawGraphは画像を表示する関数でメモリに読み込むのはLoadGraph()ですね。
それとDrawGraphは画像を表示する関数でメモリに読み込むのはLoadGraph()ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 画像とRAMの容量
[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に変更しました。アドバイス通りにプログラムを変更したら、問題が起こらなくなりました。解答ありがとうございました。
//#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に変更しました。アドバイス通りにプログラムを変更したら、問題が起こらなくなりました。解答ありがとうございました。
Re: 画像とRAMの容量
#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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像とRAMの容量
ループの中にLoadが無いのでメモリを消費する事は大丈夫です。
適当な画像で動かしてみましたがメモリは平和そのものです。50MB程度。
もしメモリが足らないとするとMicrosoft visual C++ 2010 Express をp起動しただけでメモリが不足気味とかありませんか?
あとハードディスクに空き容量はありますか? ない場合フリーズする可能性があります。
それとそれと大問題ですが、
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
に引っかかっているので、動作がうまく行っているのは奇跡的です。
今後のことを考えて「あちこちにDXライブラリ3大処理がある」のはやめたほうが良いと思いますよ。
適当な画像で動かしてみましたがメモリは平和そのものです。50MB程度。
もしメモリが足らないとするとMicrosoft visual C++ 2010 Express をp起動しただけでメモリが不足気味とかありませんか?
あとハードディスクに空き容量はありますか? ない場合フリーズする可能性があります。
それとそれと大問題ですが、
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
に引っかかっているので、動作がうまく行っているのは奇跡的です。
今後のことを考えて「あちこちにDXライブラリ3大処理がある」のはやめたほうが良いと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 画像とRAMの容量
ご指摘ありがとうございます。ご指摘通りにDXライブラリ3大処理がたくさんあるので、できるだけ減らすために考えてみます。
まだまだゲームと言えるレベルではないですが、頑張ってみようと思います。
助言のおかげで、プログラムを無事に実行することができました。ありがとうございました。
まだまだゲームと言えるレベルではないですが、頑張ってみようと思います。
助言のおかげで、プログラムを無事に実行することができました。ありがとうございました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 画像とRAMの容量
すいません。I am a beginner. さんが書きました: ご指摘ありがとうございます。ご指摘通りにDXライブラリ3大処理がたくさんあるので、できるだけ減らすために考えてみます。
まだまだゲームと言えるレベルではないですが、頑張ってみようと思います。
助言のおかげで、プログラムを無事に実行することができました。ありがとうございました。
メモリが足らなくなる原因は何だったのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 画像とRAMの容量
誤解を生むような書き方をして申し訳ありませんでした。上記に書いてあるプログラムは、書き直したプログラムです。
アドバイスを頂いたので、すぐに書き直してしまいました。改善前のプログラムを保存していなかったので、改善後のプログ
ラムを載せてしまいました。ご心配頂き非常に感謝しております。理由ですが、毎回画像をロードしていたためだと思われます。
お手数お掛けします。
アドバイスを頂いたので、すぐに書き直してしまいました。改善前のプログラムを保存していなかったので、改善後のプログ
ラムを載せてしまいました。ご心配頂き非常に感謝しております。理由ですが、毎回画像をロードしていたためだと思われます。
お手数お掛けします。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 画像とRAMの容量
> できるだけ減らすために考えてみます。
できるだけと言わず、最初は必ず1つしか書かないようにすることをお勧めします。
今回の場合、Help_initなどにあるwhile文を撤廃し、
while文はWinMain関数の中だけにしか作らず、
WinMainのwhile文の中でswitch文を作り、そこから、必要な関数をコールしてやるようにすれば、すっきり見えると思います。
また、特定の機能単位や、オブジェクト単位でファイルわけするとコードが見やすくなります。
もし分割設計の仕方がよく分からない時は、うちのサイトでよければ
ゲームプログラミングの館の設計編をご覧頂けると幸いです。
http://dixq.net/g/
できるだけと言わず、最初は必ず1つしか書かないようにすることをお勧めします。
今回の場合、Help_initなどにあるwhile文を撤廃し、
while文はWinMain関数の中だけにしか作らず、
WinMainのwhile文の中でswitch文を作り、そこから、必要な関数をコールしてやるようにすれば、すっきり見えると思います。
また、特定の機能単位や、オブジェクト単位でファイルわけするとコードが見やすくなります。
もし分割設計の仕方がよく分からない時は、うちのサイトでよければ
ゲームプログラミングの館の設計編をご覧頂けると幸いです。
http://dixq.net/g/