Re: 画像とRAMの容量
Posted: 2012年10月10日(水) 14:32
by I am a beginner.
[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に変更しました。アドバイス通りにプログラムを変更したら、問題が起こらなくなりました。解答ありがとうございました。