処理落ちをしない書き方

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

処理落ちをしない書き方

#1

投稿記事 by しらす » 9年前

初歩的な質問ですいません。
音楽をかけると操作しているキャラクターが
かくかくした動きになってしまうのですが
どうすれば直るのでしょうか。
ご教授お願いします。

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 処理落ちをしない書き方

#2

投稿記事 by jay » 9年前

理由としては音楽を再生する時に余計な負荷が掛っている事が考えられます。

例えば
・気付かないうちに2重に再生している
・何度も読み込んで格納しようとしているなど、必要のない処理を何度も繰り返している
・前に再生したものをメモリから削除していないのでメモリが圧迫されている
・そもそも他に処理していることが多すぎる


などが考えられます
こういう質問をする時は問題のプログラムコードを張って直接誰かに指摘して貰うのが一番確実だと思いますよ。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

しらす

Re: 処理落ちをしない書き方

#3

投稿記事 by しらす » 9年前

すいません。
音楽をかけずにやっても同じでした。
全ての画面の切り替えに
switchではなくifをつかっていて、
一つ一つの画面で(フィールドで)
ゲームプログラミングの館の(22)で教えていただいた処理をしています。
しかしその一行結果のようにスーっと動かないのですが、
どうしたらいいいでしょうか。
直す点があったら教えてください。

アバター
Ciel
記事: 252
登録日時: 9年前

Re: 処理落ちをしない書き方

#4

投稿記事 by Ciel » 9年前

コードを貼ってくれないと、よく分かりません。
oui C'est la Vie♪

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

Re: 処理落ちをしない書き方

#5

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

勘ですが読み込みを描画途中にやっているに一票。
一番手っ取り早いのは、ソースコードを貼ってもらうことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

しらす

Re: 処理落ちをしない書き方

#6

投稿記事 by しらす » 9年前

C語を勉強し始めたばかりなので
配列が使われていなく、インデントがぐちゃぐちゃなのですが
よろしくお願いします。
切り替えの部分です↓
if(shyou==11){
            sf++;
DrawGraph( 0 , 0 , image11 , FALSE ) ;



if (ch.muki==0) //上向きならch.y座標を減らす
DrawGraph( ch.x , ch.y , image3 , TRUE ) ;
else if(ch.muki==1) //左向きならch.x座標を減らす
DrawGraph( ch.x , ch.y , image4 , TRUE ) ;
else if(ch.muki==2) //下向きならch.y座標を増やす
DrawGraph( ch.x , ch.y , image , TRUE ) ;
else if(ch.muki==3) //右向きならch.x座標を増やす
DrawGraph( ch.x , ch.y , image5 , TRUE ) ;






if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot2(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる。

}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;


}
if(ch.y==64&&ch.x==192 ){
ch.x =384;//kk
ch.y =64;
shyou=12;}
}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(shyou==12){
DrawGraph( 0 , 0 , image12 , FALSE ) ;



if (ch.muki==0) //上向きならch.y座標を減らす
DrawGraph( ch.x , ch.y , image3 , TRUE ) ;
else if(ch.muki==1) //左向きならch.x座標を減らす
DrawGraph( ch.x , ch.y , image4 , TRUE ) ;
else if(ch.muki==2) //下向きならch.y座標を増やす
DrawGraph( ch.x , ch.y , image , TRUE ) ;
else if(ch.muki==3) //右向きならch.x座標を増やす
DrawGraph( ch.x , ch.y , image5 , TRUE ) ;






if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot3(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる。

}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;


}
if(ch.y==320&&ch.x==384 ){
ch.x =128;
ch.y =384;

shyou=0;}
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(shyou==0){
DrawGraph( 0 , 0 , image2 , FALSE ) ;



if (ch.muki==0) //上向きならch.y座標を減らす
DrawGraph( ch.x , ch.y , image3 , TRUE ) ;
else if(ch.muki==1) //左向きならch.x座標を減らす
DrawGraph( ch.x , ch.y , image4 , TRUE ) ;
else if(ch.muki==2) //下向きならch.y座標を増やす
DrawGraph( ch.x , ch.y , image , TRUE ) ;
else if(ch.muki==3) //右向きならch.x座標を増やす
DrawGraph( ch.x , ch.y , image5 , TRUE ) ;






if(ch.x%32==0 && ch.y%32==0){ //座標が32で割り切れたら入力可能
ch.walking_flag=1; //歩くフラグを立てる。
if ( Key[ KEY_INPUT_UP ] == 1 ) //上ボタンが押されたら
ch.muki=0; //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
ch.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 ) //下ボタンが押されたら
ch.muki=2; //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
ch.muki=3; //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
if(ch.walking_flag==1) //もし歩くなら
if(can_or_cannot(ch.x,ch.y,ch.muki)==1)//行き先が歩けないなら
ch.walking_flag=0; //歩かないフラグを立てる。

}

if(ch.walking_flag==1){ //歩くフラグが立っていたら
if (ch.muki==0) //上向きならch.y座標を減らす
ch.y--;
else if(ch.muki==1) //左向きならch.x座標を減らす
ch.x--;
else if(ch.muki==2) //下向きならch.y座標を増やす
ch.y++;
else if(ch.muki==3) //右向きならch.x座標を増やす
ch.x++;

}
if(ch.y<40&&shyou==0){
st2-=15;
DrawGraph( ch.x , st2 , image15 , TRUE ) ;
ch.muki=0;

st++;
Key[ KEY_INPUT_UP ] =0;
Key[ KEY_INPUT_DOWN ] =0;
Key[ KEY_INPUT_RIGHT] =0;
Key[ KEY_INPUT_LEFT ] =0;
ch.walking_flag=0;
if(st2<ch.y+37)
st2=ch.y+37; }
}

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

Re: 処理落ちをしない書き方

#7

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

コードを貼り付ける機能がありますので、そっちを使ってください。
インデントが無くなるので読み辛いです。

コード:

コード。
あと原因は他の部分にあると思います。
貼られたコードをコメントアウトしても速度は変わらないのではないでしょうか?

【追記】
VC++なら、編集→詳細→選択範囲のフォーマットで自動インデントできますので試してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 処理落ちをしない書き方

#8

投稿記事 by jay » 9年前

softyaさんのおっしゃる通り、このプログラムの中にはそれ程処理が重くなる原因となりそうなものは見受けられないですね。

ならば画像の読み込み処理を何度も繰り返しているというのが一番に考えられる原因ですね
他にも必要がないのに何度も繰り返している処理があるならそれらも手直しした方がいいですね。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

しらす

Re: 処理落ちをしない書き方

#9

投稿記事 by しらす » 9年前

いろいろ試したところ
最初の方に間違いがあることが分かったのですが
ここからどうすればいいでしょうか。

コード:

#include "DxLib.h"

typedef struct{
int x,y,img,muki,walking_flag;
}ch_t;
int hantei[15][20] = {
{ 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,1,1,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1 },
};
int hantei2[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,1,0,0,2,1,1,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
int hantei3[15][20] = {
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1 },
{ 1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 },
{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
};
//256//384//224//352


int can_or_cannot(int x,int y,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei[y/32-1][x/32]>0)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei[y/32][x/32-1]>0)
return 1;
if(muki==2)//下向きなら
if(hantei[y/32+1][x/32]>0)
return 1;
if(muki==3)//右向きなら
if(hantei[y/32][x/32+1]>0)
return 1;
return 0;//正常
}
int can_or_cannot2(int x2,int y2,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei2[y2/32-1][x2/32]>0)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei2[y2/32][x2/32-1]>0)
return 1;
if(muki==2)//下向きなら
if(hantei2[y2/32+1][x2/32]>0||hantei2[y2/32][x2/32]==2)
return 1;
if(muki==3)//右向きなら
if(hantei2[y2/32][x2/32+1]==1)
return 1;
return 0;//正常
}
int can_or_cannot3(int x2,int y2,int muki){//進めるかを判定する
if(muki==0)//上向きなら
if(hantei3[y2/32-1][x2/32]>0)//進めるか判定
return 1;//エラー
if(muki==1)//左向きなら
if(hantei3[y2/32][x2/32-1]>0)
return 1;
if(muki==2)//下向きなら
if(hantei3[y2/32+1][x2/32]>0||hantei2[y2/32][x2/32]==2)
return 1;
if(muki==3)//右向きなら
if(hantei3[y2/32][x2/32+1]==1)
return 1;
return 0;//正常
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image, image2,image3,image4,image5,image10,image11,image12,image13,image14,image15,image16,image17,image18,image19,image20,image21,img[20],sound;
char Key[256];
ch_t ch;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理

ch.x =320;
ch.y =224;
ch.walking_flag=0;
ch.muki=2;
int sb;


sb=0;
if(sb==1)



SetDrawScreen( DX_SCREEN_BACK ) ;


image = LoadGraph( "satou.png" ) ; //back.bmpのハンドルを代入
image2 = LoadGraph( "sibafu.bmp" ) ; //char.pngのハンドルを代入
image3 = LoadGraph( "satouu.png" ) ;
image4 = LoadGraph( "satoum.png" ) ;
image5 = LoadGraph( "satouh.png" ) ;
image10 = LoadGraph( "satpst.bmp" ) ;
image11 = LoadGraph( "nikai.bmp" ) ;
image12 = LoadGraph( "ikkai.bmp" ) ;
image13 = LoadGraph( "sibab.bmp" ) ;
image14 = LoadGraph( "oku2.png" ) ;
image15 = LoadGraph( "oko.png" ) ;
image16 = LoadGraph( "satoub.png" ) ; //char.pngのハンドルを代入
image17 = LoadGraph( "comsb.png" ) ;
image18 = LoadGraph( "aikon.png" ) ;
image19 = LoadGraph( "commb.png" ) ;
image20 = LoadGraph( "comtb.png" ) ;
image21 = LoadGraph( "ama.png" ) ;
img[0]= LoadGraph( "oku.bmp" ) ;
img[1] = LoadGraph( "sibab2.bmp" ) ;
img[2] = LoadGraph( "ulo.png" ) ;
img[3] = LoadGraph( "satov.bmp" ) ;
img[4] = LoadGraph( "poison.png" ) ;
img[5] = LoadGraph( "gin2.png" ) ;
img[6] = LoadGraph( "comdb.png" ) ;
img[7] = LoadGraph( "ekusu.png" ) ;
img[8] = LoadGraph( "iwa.png" ) ;
img[9] = LoadGraph( "tai.png" ) ;
img[10] = LoadGraph( "bisi.png" ) ;
img[11] = LoadGraph( "smo.png" ) ;
img[12] = LoadGraph( "cua.png" ) ;
img[13] = LoadGraph( "sh.png" ) ;
img[14] = LoadGraph( "gomi.png" ) ;
img[15] = LoadGraph( "fbs.png" ) ;
img[16] = LoadGraph( "kiri.png" ) ;
sound = LoadSoundMem( "machi.mp3" );



//描画先を裏画面に設定
int shyou=11; int st=0,st2=480;
int i,j,iz,com,aif=1,aix=0,aiy=0,ar=0,comf=0,tf=0,ma=0,hp=0,thp=0,masf=0,kt=0,fbsf=0; //ハンドルを受け取るためのint型変数を宣言

com=0;
double com4t=0,al=0,tdm=0,cdm=0,ta=0,hk=0,mp=0,mh=0,pf=0,cbz=0,mas=0,m=0,sf=0;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
///////////////////////////////////////////////////////////////////////////////////////////////////

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

Re: 処理落ちをしない書き方

#10

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

新しく貼られたソースコードにも原因となる部分は見当たりません。
なぜ、そこに問題があると判断したのかお聞きしたいのですが?

あとプレビューでちゃんと貼れているかチェックをお願いします。
ソースを[ code ]~[ /code ]で囲まないとちゃんと表示されませんでの。
↑コードにならないためにわざとスペース開けてるので、使わないでください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

wing
記事: 18
登録日時: 9年前

Re: 処理落ちをしない書き方

#11

投稿記事 by wing » 9年前

sb=0;
if(sb==1)
SetDrawScreen( DX_SCREEN_BACK ) ;

というのが気になるんですが、これでいいのでしょうか?

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

Re: 処理落ちをしない書き方

#12

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

wing さんが書きました:sb=0;
if(sb==1)
SetDrawScreen( DX_SCREEN_BACK ) ;

というのが気になるんですが、これでいいのでしょうか?
それだとバタつきそうですね。
もしかして、それでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

しらす

Re: 処理落ちをしない書き方

#13

投稿記事 by しらす » 9年前

ありがとうございました。
原因は
sb=0;
if(sb==1)
SetDrawScreen( DX_SCREEN_BACK ) ;
でした。

閉鎖

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