マップ描画のちらつき?

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

マップ描画のちらつき?

#1

投稿記事 by 探検者 » 7年前

DXライブラリでゲームを作っています。コンパイラはVC++2008です。
現在ファイルを読みこんでマップを描画しているのですが、ときどきちらつき、というより黒い線がパシッと入り込むのです(入り込んだまま操作キャラを動かすまで消えないときもあります)。
よく言われる裏画面描画はしていると思うのですが、何が問題でしょうか?

コード:

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

			MapDraw();
			
	  
        			
  }
			

		

        DxLib_End(); // DXライブラリ終了処理
        return 0;




//MapDraw();
int MapDraw()
{	
static short riF=0;
static int haikei[16];
static short x=0,y=0,syuru=0;
MapRoad(mapnm);

if(riF==0){
LoadDivGraph( "EDGE.haikei.png" , 16 , 4 , 4 , 64 , 64 , haikei );//画像読み込み
riF=1;}

	


for( y = 0 ; y < Mapy ; y ++ )//マップ描画
{
		for( x = 0 ; x < Mapx ;x ++ )
		{if( x*Chip>=Seisu(rux)-400 && x*Chip<=Seisu(rux)+320 && y*Chip<=Seisu(ruy)+240 &&y*Chip>=Seisu(ruy)-330){ //マップ内かどうか

			/*if( map[ y ][ x ] == 1 )
			{
				DrawGraph(x*Chip-ruSx+320,y*Chip-ruSy+240,haikei[0],TRUE);	}
			else if( map[ y ][ x ] == 0)
			{//この中で画像をswitchできるようにする
			    DrawGraph(x*Chip-ruSx+320,y*Chip-ruSy+240,haikei[1],TRUE);	}*/
			switch(map[y][x])
			{																	
			case ' ': 
			syuru=0;
			break;

			case'1':
			case'2':
			case'3':
			case'4':
			case'5':
			case'6':
			case'7':
			case'8':
			case'9':
			syuru=MojiS(map[y][x]);
			break;

			}
			DrawGraph(x*Chip-rux+320,y*Chip-ruy+240,haikei[syuru],TRUE);



		}
		}
}//マップ描画  
return 0;
}


//MapRoad();
short MapRoad(short i)//テキストで見えない空白を入れると死にかねない。
{int FileHandle,F2;
 static short pi=1555;


char Fname[18]; 
 Mapy=0;
 Mapx=70;
 sprintf(Fname,"mapdate%d.txt",i);
FileHandle=FileRead_open(Fname);
if(FileHandle==0)
{printfDx("そんなファイルがあるか!");}
while( FileRead_eof( FileHandle ) == 0 )
{
	FileRead_gets(map[Mapy],300,FileHandle);
    if(Mapy==0)
	{Mapx=strlen(map[Mapy]);}
	Mapy++;
	/*for(short i=0;i<=Mapx;i++)
	{tori[i]=0;}*/
}
FileRead_close(FileHandle);





return 0;
}

明らかに関係ないところを消しているので、もしかすると{}の間違いがあるかもしれません。変数もおかしいかもしれません。元のコードではちゃんとしているはずなので、それは原因ではないと思ってください。
使っているパソコンはXPで古いものですが、7の高性能PCで試しても発生しました。 
また、先述の問題はマップをグローバル変数で作っていたころには見られませんでした。
なにか心当たりがあればよろしくお願いします。

nil
記事: 428
登録日時: 8年前

Re: マップ描画のちらつき?

#2

投稿記事 by nil » 7年前

インデントが乱れています。
バグの原因となるのでまずはそれを直しましょう。

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

Re: マップ描画のちらつき?

#3

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

描画処理でロードしている時点で、まともに動かないと思います。
あと初期化周りも見せて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: マップ描画のちらつき?

#4

投稿記事 by へにっくす » 7年前

掲示されたソースコードをちゃんと確認しましたか?
いきなりwhile文?
本当に動いたの?
「明らかに関係ないところを消しているので」と言ってますが、
そのために必要最低限のものまで消してしまっては意味がないのですよ。

softyaさんは初期化周りも見せてと言っていますが、上記のこともあり不安なので、
貴方が動かしていたソースを、あらためて全部掲示してください。
あ、涼雅さんの指摘も対処はしてくださいね。
インデントをそろえるのは基本ですよ。
written by へにっくす

探検者

Re: マップ描画のちらつき?

#5

投稿記事 by 探検者 » 7年前

コード:

//main.cpp
#include "DxLib.h" //キャラとの判定が完成
#include"Kansu.h"
#include"defines.h"
#include"kouzou.h"




int Pad;
int  Font02  = CreateFontToHandle( "MS ゴシック", 19, 6 , DX_FONTTYPE_NORMAL) ;
int iro=GetColor(140,70,70),cro=GetColor(70,50,50);
short joutai=0/*メニューかプレイか*/,oomot=0/**/,mapnm=0/*マップナンバー*/;	
short keyflag[28];

struct Teki zako[31];//敵

short Mapy,Mapx,Mapx2,Mapy2;
short ruseizon=1;
short num=1;
short hirosa;
char map[50+1][70+1];
char map2[50+1][70+1];

struct Dam Dod[DMAX+1];//攻撃判定
struct Ndam Nod[DMAX+1]; 
short ndnum,dnum,tnum;//攻撃判定などの番号




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


int Font;
int Sx=0 , Sy=0 , Cb=0 ;

	
	
	
Font=CreateFontToHandle( "MS ゴシック", 50,  9, DX_FONTTYPE_NORMAL );


        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		short don=0;
		Keytxt();
if(joutai==0){
		 
		 //printfDx("%d",Once(2));
		GetScreenState( &Sx , &Sy , &Cb ) ;
		DrawBox(0,0,1000,700,GetColor( 150,10,5 ), TRUE );
		DrawStringToHandle( 100 , 200 , "スタート" , GetColor( 2 , 2 , 20 ) , Font ) ;
		DrawFormatStringToHandle( 200 , 400 ,  GetColor( 200 , 0 , 255 ) ,Font,"%d,%d,%d",Sx , Sy , Cb  ) ;


			if(Pad&(1<<9)){
				joutai=1;
						  }    
              }//メニュー画面

   else if(joutai==1)
         {  
            //Ndsyoki();
            ndnum=0;//判定番号初期化
            tnum=0;
            //printfDx("%d",ruseizon);
   if(ruseizon==1){
			MapDraw();
			Syujou();
			Action();			
			Mitame();
			tAction(240,350,0,20);
			tMitame();
			Syudam();      
			Nredam();
			Ndcount();
	  
          }

  else if(ruseizon==0)
  {Shibou();}
}
			
			
	

                    
               
			
			
}
			

		

        DxLib_End(); // DXライブラリ終了処理
        return 0;

}
//dkan.cpp
#include "DxLib.h" 
#include"Kansu.h"
#include"defines.h" 
#include"kouzou.h"

 extern struct Dam Dod[DMAX];   //過去の遺物
 extern struct Ndam Nod[DMAX];
 extern struct Teki zako[30];
 extern short ndnum;
 extern short tnum;
 extern int cro;

 static short ndnow;


short Ndhan(short hited)
{short re=0;
for(short hit=0;hit<=ndnow;hit++){
if(Nod[hit].x>=zako[hited].x-24 && Nod[hit].x<=zako[hited].x+24 && Nod[hit].y>=zako[hited].y-32 && Nod[hit].y<=zako[hited].y+32 )
{ 
re=Nod[hit].iryok;
Nod[hit].nokori=0;
break;
} //当たってる          
}
return re;

}
	

short Nsyuhan(double ux,double uy)          //1フレームに一つ(最初)の判定しか処理できない!
{short re=0; 
 short hit;
 for(hit=0;hit<=ndnow;hit++){
 if(Nod[hit].x>=ux-24 && Nod[hit].x<=ux+24 && Nod[hit].y>=uy-32 && Nod[hit].y<=uy+32 )
 { 
 re=Nod[hit].iryok;
 Nod[hit].nokori=0;
 break;} //当たってるdamege  
 }        
  return re;


}
void Nredam()
{
for(short hit=0;hit<=ndnow;hit++)
{ Nod[hit].nokori--;
  if(Nod[hit].nokori<=0){
  Nod[hit].x=0;
  Nod[hit].y=0;
  Nod[hit].sx=0;
  Nod[hit].sy=0;
  Nod[hit].iryok=0;}
  else
  { 
   Nod[hit].x+=Nod[hit].sx; 
   Nod[hit].y+=Nod[hit].sy;
  }

}
  }




void Tsyoki() 
{ tnum=0;           
  for(short i=0;i<=30;i++)
  {if(zako[i].hp>0)
  {tnum++;}  
  else
  {break;}
    
}

}  
short Ndplus()
{ while(Nod[ndnum].nokori>=1 && ndnum<=DMAX-1)
  { 
	  ndnum++;
                }
return 0;

}

short Ndmake(double x,double y,double sx,double sy,short iryok,short nokori)
{short limit=0;
while(Nod[ndnum].nokori>=1)
{
if(ndnum<=DMAX-1)
 {ndnum++;}
else 
 {limit=1;
  break;
 }
}

if(limit==0)      //配列が限界でないときのみ
{Nod[ndnum].x=x;  //書き込み
 Nod[ndnum].y=y;
 Nod[ndnum].sx=sx;
 Nod[ndnum].sy=sy;
 Nod[ndnum].iryok=iryok;
 Nod[ndnum].nokori=nokori;
}
return limit;

}
short Ndcount()
{static short ndmax;
if(ndnum>=ndmax+1)
{
	ndmax=ndnum;
}

while(Nod[ndmax].nokori<=0 && ndmax>=1)
{ndmax--;}
 ndnow=ndmax;
 DrawFormatString(100,100,cro,"%d",ndnow);

return 0;
}
//syukan.cpp
#include"DxLib.h" //キャラとの判定が完成
#include <math.h>
#include"Kansu.h"
#include"defines.h"
#include"Kouzou.h"

 extern char map[50+1][70+1]; //少し多めに
 extern char map2[50+1][70+1];
 extern short keyflag[28];
 extern short joutai;
 extern struct Ndam Nod[DMAX];
 extern short ndnum;
 extern int  Font02;
 extern int iro,cro;
 int image[48];
 int imageb[48];
 int imagez[10];
 static int haikei[16];

		
		
    double rux=400;
    int ruSx,ruSy;
	double rugx,rugy;
	double ruy=200;
    short ruhp=20;
	short ruFlag;
	short ruimg;
	short rujou;
	short rubujou=0;
    short ruijou;
	double ruoldx;
	double ruoldy;
	short ruiFlag=1;
	extern short ruseizon;
	short afle;
    short bflag;

int Action()
{		
   ruoldx=rux;
   ruoldy=ruy;

int kiju=Sic*8+1;
int naju=Nac*8+1;

if(rubujou==0)//武器状態
{	switch(ruijou)//移動状態
	{
	case 0://とまり中
		 ruiFlag=0;
			
if(rugx>Kas)
		{rugx-=Kas;}
else if(rugx*(-1)>Kas)
		{rugx+=Kas;}//全て加速関係
else
		{rugx=0;}//xを減速

if(rugy>Kas)
		{rugy-=Kas;}
else if(rugy*(-1)>Kas)
		{rugy+=Kas;}
else
		{rugy=0;}

		break;

	
	case 1://動き中
		   ruiFlag=1;

	switch(ruFlag)//方向開始
			{ 
	case 0:
	rugy+=Kas;                                                                            
	if(keyflag[9]==0){

	if(rugy>Ri)
	{rugy=Ri;}
					 }

				else if(keyflag[9]==1){
					
				
if(rugy>Ri*Da)
					{rugy=Ri*Da;}
									  }
if(rugx<-Bkas)
{rugx+=Bkas;}
else if(rugx>Bkas)
{rugx-=Bkas;}
else{rugx=0;} 
				

					break;
			case 1:
				rugx-=Kas;
if(keyflag[9]==0){
				
if(rugx*(-1)>Ri)
{rugx=-Ri;}}
else{
					
				
if(rugx*(-1)>Ri*Da)
{rugx=-Ri*Da;}		}

if(rugy<-Bkas)
{rugy+=Bkas;}
else if(rugy>Bkas)
{rugy-=Bkas;}
else{rugy=0;}
				
				break;
			case 2:
				rugx+=Kas;
		if(keyflag[9]==0){ 
				
if(rugx>Ri)
{rugx=Ri;}
		}
		else{
					
				
if(rugx>Ri*Da)
{rugx=Ri*Da;}		
		    }

if(rugy<-Bkas)
{rugy+=Bkas;}
else if(rugy>Bkas)
{rugy-=Bkas;}
else{rugy=0;}
				break;
			case 3:
rugy-=Kas;
if(keyflag[9]==0){
				
if(rugy*(-1)>Ri)
{rugy=-Ri;}		 }
		else{
					
				
	if(rugy*(-1)>Ri*Da)
{rugy=-Ri*Da;}		}

if(rugx<-Bkas)
{rugx+=Bkas;}
else if(rugx>Bkas)
{rugx-=Bkas;}
else{rugx=0;}
		break;
			case 4:
rugy+=Kas*Nana;
rugx-=Kas*Nana;
				
if(keyflag[9]==0){
				

if(rugy>Ri*Nana)
{rugy=Ri*Nana; }
					
        

if(rugx*(-1)>Ri*Nana)
{
		rugx=-Ri*Nana;
}
        }
				
				
		else{
					
				
if(rugy>Ri*Nana*Da)
{if(rugy>Ri*Nana*Da+Kas*Nana*Da)
{rugy-=Kas*Nana*Da;}
else{rugy=Ri*Nana*Da;}
}
if(rugx*(-1)>Ri*Nana*Da)
{if(rugx*(-1)>Ri*Nana*Da+Kas*Nana*Da)
{rugx+=Kas*Nana*Da; }
else{rugx=-Ri*Nana*Da;}		}	}		break;


			case 6:
		rugy-=(Kas)*Nana;
		rugx-=(Kas)*Nana;
		if(keyflag[9]==0){
				
if(rugy*(-1)>Ri*Nana)
{	rugy=-(Ri)*Nana;
	 }	
if(rugx*(-1)>Ri*Nana)
{	rugx=-(Ri)*Nana; }		} 
		else{
					
				
if(rugy*(-1)>Ri*Nana*Da)
{	rugy=-(Ri)*Nana*Da;
	}	
if(rugx*(-1)>Ri*Nana*Da)
{	
	rugx=-Ri*Nana*Da; }	}				break;
			case 5:
		rugy+=(Kas)*Nana;
		rugx+=(Kas)*Nana;
		if(keyflag[9]==0){
				
	if(rugy>Ri*Nana)
	{		rugy=Ri*Nana;
			}
	if(rugx>Ri*Nana)
	{		rugx=Ri*Nana;
  }	}
		else{
					
				
if(rugy>Ri*Nana*Da)
	{		rugy=Ri*Nana*Da;
			}
if(rugx>Ri*Nana*Da)
	{		
			rugx=Ri*Nana*Da;}
		}				break;
			case 7:
		rugy-=(Kas)*Nana;
		rugx+=(Kas)*Nana;
		if(keyflag[9]==0){
				
if(rugy*(-1)>Ri*Nana)
	{	rugy=-Ri*Nana;
	}		
if(rugx>Ri*Nana)
	{		
		rugx=Ri*Nana;
    }		
	}
		else{
					
				
if(rugy*(-1)>Ri*Nana*Da)
	{		rugy=-Ri*Nana*Da;
			}	
if(rugx>Ri*Nana*Da)
	{		rugx=Ri*Nana*Da;
}	}		break;

}/*方向終わり*/  break; 







		
}  }


else if(rubujou==1)
{ switch(ruijou)//移動状態
	{   
	case 0://とまり中
		 ruiFlag=0;
			
if(rugx>Kas)
		{rugx-=0.5;}
else if(rugx*(-1)>Kas)
		{rugx+=0.5;}
else
		{rugx=0;}//xを減速

if(rugy>Kas)
		{rugy-=Kas;}
else if(rugy*(-1)>Kas)
		{rugy+=Kas;}
else
		{rugy=0;}

		break;

	
	case 1://動き中
		
      ruiFlag=1;


			switch(ruFlag)//方向開始
			{
			case 0:
				rugy+=Kas;
				
				

					if(rugy>Ri)
					{rugy=Ri;}
				

			
if(rugx<-Bkas)
{rugx+=Bkas;}
else if(rugx>Bkas)
{rugx-=Bkas;}
else{rugx=0;}
				

					break;
			case 1:
				rugx-=Kas;
				
				
if(rugx*(-1)>Ri)
{rugx=-Ri;}


if(rugy<-Bkas)
{rugy+=Bkas;}
else if(rugy>Bkas)
{rugy-=Bkas;}
else{rugy=0;}
				
				break;
			case 2:
				rugx+=Kas;
		 
				
if(rugx>Ri)
{rugx=Ri;}
		
		

if(rugy<-Bkas)
{rugy+=Bkas;}
else if(rugy>Bkas)
{rugy-=Bkas;}
else{rugy=0;}
				break;
			case 3:
				rugy-=Kas;
		
				
	if(rugy*(-1)>Ri)
{rugy=-Ri;}				
		

if(rugx<-Bkas)
{rugx+=Bkas;}
else if(rugx>Bkas)
{rugx-=Bkas;}
else{rugx=0;}
		break;
			case 4:
rugy+=Kas*Nana;
rugx-=Kas*Nana;
				
				
				

if(rugy>Ri*Nana)
{if(rugy>Ri*Nana+Kas*Nana){
rugy-=Ri*Nana;
                          }
else{rugy=Ri*Nana;} }

if(rugx*(-1)>Ri*Nana)
{if(rugx*(-1)>Ri*Nana+Kas*Nana)
{rugx+=Kas*Nana;}
else{rugx=-Ri*Nana;} }
				
				
				
					break;
			case 6:
rugy-=(Kas)*Nana;
rugx-=(Kas)*Nana;
				
				
if(rugy*(-1)>Ri*Nana)
{	rugy=-(Ri)*Nana;
	 }	
if(rugx*(-1)>Ri*Nana)
{	rugx=-(Ri)*Nana; }		
						break;
			case 5:
rugy+=(Kas)*Nana;
rugx+=(Kas)*Nana;
				
				
	if(rugy>Ri*Nana)
	{		rugy=Ri*Nana;
			}
	if(rugx>Ri*Nana)
	{		rugx=Ri*Nana;
	}	
						break;
			case 7:
rugy-=(Kas)*Nana;
rugx+=(Kas)*Nana;
				
				
if(rugy*(-1)>Ri*Nana)
	{		rugy=-Ri*Nana;
			}		
if(rugx>Ri*Nana)
	{		
		rugx=Ri*Nana;}		
				break;

}/*方向終わり*/  break; 

case 2:
  ruiFlag=1;
afle++;

    if(afle==Yari)
	{switch(ruFlag)
{	 case 0:
     Ndmake(rux,ruy+40,0,5+rugy,4,3);
		 break;
     case 1:
     Ndmake(rux-30,ruy,-5+rugx,0,4,3);
		 break;
	 case 2:
     Ndmake(rux+40,ruy, 5+rugx,0,4,3);
		 break;
	 case 3:
     Ndmake(rux,ruy-40,0,-5+rugy,4,3);
		 break;
	 case 4:
     Ndmake(rux-25,ruy+35,-3.5+rugx,3.5+rugy,4,3);
		 break;	
	 case 5:
		 Ndmake(rux+25,ruy-35,3.5+rugx,-3.5+rugy,4,3);
     break;
	 case 6:
     Ndmake(rux-25,ruy-35,-3.5+rugx,-3.5+rugy,4,3);
		 break;
	 case 7:
     Ndmake(rux-25,ruy-35,3.5+rugx,-3.5+rugy,4,3);
		 break;
	}

		 Nod[ndnum].iryok=4;
		 Nod[ndnum].nokori=2;
     
		 Ndplus();
		 
	}
else if(afle>=mia3 )
	{afle=0;}
   break;
	}//攻撃判定処理
	
}



if(MapGim(rux+rugx-15,ruy+rugy+30)-MapGim(rux-15,ruy+30)>=2)		//左下			
{ rugy=0;
   
  rugx=0;
	}
if(MapGim(rux+rugx+15,ruy+rugy+30)-MapGim(rux+15,ruy+30)>=2)		//右下			
{ rugy=0;
   
  rugx=0; 
                }
else if(MapGim(rux+rugx-15,ruy+rugy-5)-MapGim(rux-15,ruy-5)>=2)	//左上			
{ rugy=0;
   
  rugx=0;
                }						             
if(MapGim(rux+rugx+15,ruy+rugy-5)-MapGim(rux+15,ruy-5)>=2)		//右上		
{ rugy=0;
   
  rugx=0;
                }	


rux+=rugx;
ruy+=rugy;	
return 0;
}		//ここまでAction





void Mitame()
{   static short reF=0;
	short kiju;
	short naju;
  short kiju1;
  short naju1;
  ruSx=Seisu(rux);
  ruSy=Seisu(ruy);
	
	 kiju=Sic*8+1;
     naju=Nac*8+1;
     kiju1=Sic*4+1;
     naju1=Nac*4+1;
	 Hgage();
	 if(reF==0){
	LoadDivGraph( "EDGE1.news.png" , 40 , 8 , 5 , 48 , 64 , image ); // 画像の分割読み込み
	LoadDivGraph( "EDGE1.zatuyou.png",3, 3 ,1, 64, 64, imagez);
	LoadDivGraph( "EDGE1.newsbuki.png" , 40 , 8 , 4 , 80 , 80 , imageb );
	 reF=1;}
	 switch(rubujou){
case 0: 

switch(ruijou)//移動状態
{
	case 0://sei
		
			if(ruFlag==0||ruFlag==1||ruFlag==2||ruFlag==3)
			{  rujou=ruFlag;		}
			else if(ruFlag==4||ruFlag==7)
			{  rujou=ruFlag+16;	}
			else if(ruFlag==5)
			{rujou=22;}
			else if(ruFlag==6)
			{rujou=21;}
			break;
	case 1://dou

   if(rugx==0 && rugy==0)
   {if(ruFlag==0||ruFlag==1||ruFlag==2||ruFlag==3)
			{  rujou=ruFlag;		}
			else if(ruFlag==4||ruFlag==7)
			{  rujou=ruFlag+16;	}
			else if(ruFlag==5)
			{rujou=22;}
			else if(ruFlag==6)
			{rujou=21;} }
   else{
switch(ruFlag)
{
			case 0:
				
				if(keyflag[9]==0){
				if(Sic<=ruSy%kiju1 && ruSy%kiju1<Sic*2){
					rujou=4;}//足伸びきり
				
				else if(Sic*3<=ruSy%kiju1 && ruSy%kiju1<Sic*4){
					rujou=5;}
				
				else{
					rujou=0;}

					if(rugy>Ri)
					{rugy=Ri;}
				}

				else if(keyflag[9]==1){
					
				if(Sic<=ruSy%kiju && ruSy%kiju<Sic*2){
					rujou=4;}
				
				else if(Sic*2<=ruSy%kiju && ruSy%kiju<Sic*3){
					rujou=12;}
				
				else if(Sic*3<=ruSy%kiju && ruSy%kiju<Sic*4){
					rujou=4;}
				
				else if((Sic*5<=ruSy%kiju && ruSy%kiju<Sic*6)||(Sic*7<=ruSy%kiju && ruSy%kiju<Sic*8)){
					rujou=5;}
				
				else if(Sic*6<=ruSy%kiju && ruSy%kiju<Sic*7){
					rujou=13;}
				else{
					rujou=0;}

				}				

					break;
			case 1:
				
if(keyflag[9]==0){
				if(Sic<=ruSx%kiju1 && ruSx%kiju1<Sic*2){
					rujou=7;}
				else if(Sic*3<=ruSx%kiju1 && ruSx%kiju1<Sic*4){
					rujou=6;}
				else{
					rujou=1;}
}
else{
					
				if((Sic<=ruSx%kiju && ruSx%kiju<Sic*2)||(Sic*3<=ruSx%kiju && ruSx%kiju<Sic*4)){
					rujou=7;}//歩き
				
				else if(Sic*2<=ruSx%kiju && ruSx%kiju<Sic*3){
					rujou=15;}
				
				
				else if((Sic*5<=ruSx%kiju && ruSx%kiju<Sic*6)||(Sic*7<=ruSx%kiju && ruSx%kiju<Sic*8)){
					rujou=6;}//歩き
				
				else if(Sic*6<=ruSx%kiju && ruSx%kiju<Sic*7){
					rujou=14;}
				else{
					rujou=1;}
}
				
				break;
			case 2:
				
		if(keyflag[9]==0){ 
				if(Sic<=ruSx%kiju1 && ruSx%kiju1<Sic*2){
					rujou=8;}
				else if(Sic*3<=ruSx%kiju1 && ruSx%kiju1<Sic*4){
					rujou=9;}
				else{
					rujou=2;}

		}
		else{
					
				if((Sic<=ruSx%kiju && ruSx%kiju<Sic*2)||(Sic*3<=ruSx%kiju && ruSx%kiju<Sic*4)){
					rujou=8;}//歩き
				
				else if(Sic*2<=ruSx%kiju && ruSx%kiju<Sic*3){
					rujou=18;}
				
				
				else if((Sic*5<=ruSx%kiju && ruSx%kiju<Sic*6)||(Sic*7<=ruSx%kiju && ruSx%kiju<Sic*8)){
					rujou=9;}//歩き
				
				else if(Sic*6<=ruSx%kiju && ruSx%kiju<Sic*7){
					rujou=19;}
				else{
					rujou=2;}
		}
				break;
			case 3:
				
		if(keyflag[9]==0){
				if(Sic<=ruSy%kiju1 && ruSy%kiju1<Sic*2){
									rujou=10;}
				else if(Sic*3<=ruSy%kiju1 && ruSy%kiju1<Sic*4){
									rujou=11;}
				else{
									rujou=3;}
				}
		else{
					
				if((Sic<=ruSy%kiju && ruSy%kiju<Sic*2)||(Sic*3<=ruSy%kiju && ruSy%kiju<Sic*4)){
					rujou=10;}//歩き
				
				else if(Sic*2<=ruSy%kiju && ruSy%kiju<Sic*3){
					rujou=16;}
				
				
				else if((Sic*5<=ruSy%kiju && ruSy%kiju<Sic*6)||(Sic*7<=ruSy%kiju && ruSy%kiju<Sic*8)){
					rujou=11;}//歩き
				
				else if(Sic*6<=ruSy%kiju && ruSy%kiju<Sic*7){
					rujou=17;}
				else{
					rujou=3;}
		}
		break;
			case 4:
				
				
		if(keyflag[9]==0){
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=31;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=30;}
				else{
					rujou=20;}

				
		}
				
				
		else{
					
				if((Nac<=ruSy%naju && ruSy%naju<Nac*2)||(Nac*3<=ruSy%naju && ruSy%naju<Nac*4)){
					rujou=30;}//歩き
				
				else if(Nac*2<=ruSy%naju && ruSy%naju<Nac*3){
					rujou=26;}
				
				
				else if((Nac*5<=ruSy%naju && ruSy%naju<Nac*6)||(Nac*7<=ruSy%naju && ruSy%naju<Nac*8)){
					rujou=31;}//歩き
				
				else if(Nac*6<=ruSy%naju && ruSy%naju<Nac*7){
					rujou=27;}
				else{
					rujou=20;}
		}		break;
			case 6:
				
		if(keyflag[9]==0){
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=24;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=25;}
				else{
									rujou=21;}
		}
		else{
					
				if((Nac<=ruSy%naju && ruSy%naju<Nac*2)||(Nac*3<=ruSy%naju && ruSy%naju<Nac*4)){
					rujou=24;}//歩き
				
				else if(Nac*2<=ruSy%naju && ruSy%naju<Nac*3){
					rujou=28;}
				
				
				else if((Nac*5<=ruSy%naju && ruSy%naju<Nac*6)||(Nac*7<=ruSy%naju && ruSy%naju<Nac*8)){
					rujou=25;}//歩き
				
				else if(Nac*6<=ruSy%naju && ruSy%naju<Nac*7){
					rujou=29;}
				else{
					rujou=21;}
		}				break;
	case 5:
				
		if(keyflag[9]==0){
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=32;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=33;}
				else{
									rujou=22;}
		}
		else{
					
				if((Nac<=ruSy%naju && ruSy%naju<Nac*2)||(Nac*3<=ruSy%naju && ruSy%naju<Nac*4)){
					rujou=32;}//歩き
				
				else if(Nac*2<=ruSy%naju && ruSy%naju<Nac*3){
					rujou=34;}
				
				
				else if((Nac*5<=ruSy%naju && ruSy%naju<Nac*6)||(Nac*7<=ruSy%naju && ruSy%naju<Nac*8)){
					rujou=33;}//歩き
				
				else if(Nac*6<=ruSy%naju && ruSy%naju<Nac*7){
					rujou=35;}
				else{
					rujou=22;}

		}				break;
case 7:
				
		if(keyflag[9]==0){
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=36;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=37;}
				else{
									rujou=23;}
		}
		else{
					
				if((Nac<=ruSy%naju && ruSy%naju<Nac*2)||(Nac*3<=ruSy%naju && ruSy%naju<Nac*4)){
					rujou=36;}//歩き
				
				else if(Nac*2<=ruSy%naju && ruSy%naju<Nac*3){
					rujou=38;}
				
				
				else if((Nac*5<=ruSy%naju && ruSy%naju<Nac*6)||(Nac*7<=ruSy%naju && ruSy%naju<Nac*8)){
					rujou=37;}//歩き
				
				else if(Nac*6<=ruSy%naju && ruSy%naju<Nac*7){
					rujou=39;}
				else{
					rujou=23;}
		}	break;		
}break;  }


	
		}
		break;



/*rubujou1*/

 case 1:
switch(ruijou)//移動状態
{
	case 0:
		
			if(ruFlag==0||ruFlag==1||ruFlag==2||ruFlag==3)
			{  rujou=ruFlag;		}
			else if(ruFlag==4||ruFlag==5||ruFlag==6||ruFlag==7)
			{  rujou=ruFlag+8;	}
			
			break;
	case 1:

switch(ruFlag)
			{
			case 0:
				
				
				if(Sic<=ruSy%kiju1 && ruSy%kiju1<Sic*2){
					rujou=4;}//足伸びきり
				
				else if(Sic*3<=ruSy%kiju1 && ruSy%kiju1<Sic*4){
					rujou=5;}
				
				else{
					rujou=0;}

					
							

					break;
			case 1:
				

				if(Sic<=ruSx%kiju1 && ruSx%kiju1<Sic*2){
					rujou=7;}
				else if(Sic*3<=ruSx%kiju1 && ruSx%kiju1<Sic*4){
					rujou=6;}
				else{
					rujou=1;}

        
				
				break;
			case 2:
				
	
				if(Sic<=ruSx%kiju1 && ruSx%kiju1<Sic*2){
					rujou=8;}
				else if(Sic*3<=ruSx%kiju1 && ruSx%kiju1<Sic*4){
					rujou=9;}
				else{
					rujou=2;}

		
		
				break;
			case 3:
				
		
				if(Sic<=ruSy%kiju1 && ruSy%kiju1<Sic*2){
									rujou=10;}
				else if(Sic*3<=ruSy%kiju1 && ruSy%kiju1<Sic*4){
									rujou=11;}
				else{
									rujou=3;}
				
		
		break;
			case 4:
				
				
		
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=17;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=16;}
				else{
					rujou=12;}

				
		
				
				
			break;
			case 6:
				
		
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=21;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=20;}
				else{
									rujou=14;}
		
					break;
	case 5:
				
		
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=19;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=18;}
				else{
									rujou=13;}
		
					break;
case 7:
				
		
				if(Nac<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*2){
									rujou=23;}
				else if(Nac*3<=ruSy%(Nac*4+1) && ruSy%(Nac*4+1)<Nac*4){
									rujou=22;}
				else{
									rujou=15;}
		
			break;
}



	
break;/*のハズ*/
case 2:	
   switch(ruFlag)
{	case 0:
   if(afle>=1 && afle<=mia1)
   {rujou=4;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=24;}
   else if(afle>mia2 && afle<=mia3)
   {rujou=4;}
	   	break;		
	case 1:			
   if(afle>=1 && afle<=mia1)
   {rujou=7;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=25;}
   else if(afle>mia2 && afle<=mia3)
   {rujou=7;}
	    break;
	case 2:
	if(afle>=1 && afle<=mia1)
   {rujou=8;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=26;}
   else if(afle>mia2 && afle<=mia3)
   {rujou=8;}
	break;
	case 3:
   if(afle>=1 && afle<=mia1)
   {rujou=11;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=27;}
   else if(afle>mia2 && afle<=mia3)
   {rujou=11;}
break;
	case 4:
if(afle>=1 && afle<=mia1)
   {rujou=17;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=28;}
else if(afle>mia2 && afle<=mia3)
{rujou=17;}
break;
	case 5:
if(afle>=1 && afle<=mia1)
   {rujou=19;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=29;}
else if(afle>mia2 && afle<=mia3)
{rujou=19;}
break;
	case 6:
if(afle>=1 && afle<=mia1)
   {rujou=20;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=30;}
else if(afle>mia2 && afle<=mia3)
{rujou=20;}
break;
	case 7:
if(afle>=1 && afle<=mia1)
   {rujou=22;}
   else if(afle>mia1 && afle<=mia2)
   {rujou=31;}
   else if(afle>mia2 && afle<=mia3)
   {rujou=22;}
break;




   }




	break;}//ruijou



	break;    }//rubujou 

	SetDrawBlendMode(DX_BLENDMODE_MULA,200);

		DrawGraph(320-32,240-30,imagez[0],TRUE);//影

SetDrawBlendMode(DX_BLENDMODE_NOBLEND,100);
	if(rubujou==0){
		DrawGraph( 320-24, 240-32, image[rujou] , TRUE );    }  // 操作キャラを表示		 
	else if(rubujou==1){
		DrawGraph( 320-40, 240-40, imageb[rujou] , TRUE ); 	}
  DrawBox(320-3,240-3,320+3,240+3,GetColor(250,250,250),TRUE); 
	
}//ここまでmitame

short Syudam()
{ 


if(Nsyuhan(rux,ruy)>0)
   {ruhp-=Nsyuhan(rux,ruy);   }
   return 0;


}		



short Syujou()
{ if(ruhp<=0)
{ruseizon=0;}

if(keyflag[1]==1)
			{if(keyflag[0]==1)
			{ruFlag=4;}
			else if(keyflag[3]==1)
			{ruFlag=6;}
			else
			{ruFlag=1;}	
							}

else if(keyflag[2]==1)
			{if(keyflag[0]==1)
			{ruFlag=5;}
			else if(keyflag[3]==1)
			{ruFlag=7;}
			else
			{ruFlag=2;}
							}
else if(keyflag[0]==1)
			{if(keyflag[1]==1)
			{ruFlag=4;}
			else if(keyflag[2]==1)
			{ruFlag=5;}
			else
			{ruFlag=0;} }

else if(keyflag[3]==1)
			{if(keyflag[1]==1)
			{ruFlag=6;}
			else if(keyflag[2]==1)
			{ruFlag=7;}
			else
			{ruFlag=3;} }

			

	switch(rubujou)//武器状態変化
	{  case 0:
       if(Once(6)==1)
	   {  bflag=1;  }
	   break;
	   case 1:
			if(Once(6)==1 && afle==0)
	   { bflag=0;}
			break;
			
	}
	if(bflag==0)
	{rubujou=0;}
	else if(bflag==1)
	{rubujou=1;}
		
		
	switch(ruijou)//移動状態変化
	{	case 0:
        
		if(keyflag[0]==1||keyflag[1]==1||keyflag[2]==1||keyflag[3]==1 )
		{ruijou=1;}

		if(Once(5)==1 && rubujou==1 || afle<0)
		{ruijou=2;}
		

break;
		

	    case 1:

		if(keyflag[0]==0 && keyflag[1]==0 && keyflag[2]==0 && keyflag[3]==0)
		{ruijou=0;}

		if(Once(5)==1 && rubujou==1)
		{ruijou=2;}
		
break;
		case 2:

        if(afle==0)
		{ruijou=0;}
	
break;	
	
	
	
	
	}

	//変化終わり
	
  return 0;
}
void Shibou()
{DrawFormatStringToHandle(20,50,iro,Font02,"ざんねん!わたしの ぼうけんは これで おわってしまった!");
 if(Once(9)==1)
 {ruseizon=1;
 ruhp=20;
 rux=300;
 ruy=200;
 rugx=0;
 rugy=0;
 
 }
else if(Once(4)==1)
 {joutai=0;}}
short Hgage(){
DrawBox(30,10,30+ruhp*20,40,cro,TRUE);
return 0;
} 
//tekikan.cpp
#include"DxLib.h" 
#include"Kansu.h"
#include"defines.h" 
#include"kouzou.h" 

 extern char map[50+1][70+1]; //少し多めに
 extern short keyflag[28];
 extern struct Ndam Nod[DMAX];
 extern struct Teki zako[30];
 extern short ndnum;
 extern short tnum;
 extern int cro;
  
 
 static int image[48];
 

 short tAction(double x,double y,short pat,short hp)
 {static short lr=0;
	 
	 
if(zako[tnum].shoki==0)
 {zako[tnum].x=x;
  zako[tnum].y=y;
  zako[tnum].hp=hp;
  zako[tnum].pat=pat;
  zako[tnum].shoki=1;}
 switch(zako[tnum].pat)
 {
 case 0:

 if(lr==0)
 {if(map[Seisu(zako[tnum].y)/Chip][Seisu(zako[tnum].x+24)/Chip]=='1')
 {lr=1;} }
 else if(lr==1)
 {if(map[Seisu(zako[tnum].y)/Chip][Seisu(zako[tnum].x-24)/Chip]=='1')
 {lr=0;} }

if(lr==0)
{zako[tnum].x+=2;
if(Seisu(zako[tnum].x)%20==0)
 {  Ndmake(zako[tnum].x-40,zako[tnum].y,-5,0,2,150);
 
 } }
else if(lr==1)
{zako[tnum].x-=2;
 
}
break;
 case 1:
break;
 }
if(Ndhan(tnum)>0)
{	zako[tnum].hp-=Ndhan(tnum);
	if(zako[tnum].hp<=0)
	{printfDx("てきはしんだ!");}
	 
}

return 0;

 }
 void tMitame()
 {static short reF=0;
  if(reF==0){
  LoadDivGraph( "EDGE1.news.png" , 40 , 8 , 5 , 48 , 64 , image ); // 画像の分割読み込み
  reF=1;    }
  Sdraw(zako[tnum].x-24,zako[tnum].y-32, image[1] , TRUE );
 }
 
 //zatukan.cpp
#include"DxLib.h"
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include"defines.h"
#include"Kansu.h"
extern int Pad;
extern short keyflag[28];
extern double rux,ruy;
extern short Mapy,Mapx,Mapy2,Mapx2;
extern short hirosa;
extern char map[50+1][70+1];
extern char map2[50+1][70+1];
extern short mapnm;

short Once(short i) //キーを押した瞬間のみ反応
{                                             
static short fle[28];
	

if(Pad&(1<<i)){
		{fle[i]++;	}
		
if(fle[i]>=10000)
{  fle[i]--; }
	          }

	else
{fle[i]=0;}
	return fle[i];

}

int Seisu(double i)
{int re;
re=(int)i;
return re;


}
void Sdraw(int x,int y,int Grhandle,int Transflag)
{  DrawGraph( x-rux+320, y-ruy+240, Grhandle, Transflag);
}

short MapRoad(short i)//テキストで見えない空白を入れると死にかねない。
{int FileHandle,F2;
 static short pi=1555;

if(i!=pi)
{char Fname[18]; 
Mapy=0;
Mapx=70;
sprintf(Fname,"mapdate%d.txt",i);
FileHandle=FileRead_open(Fname);
if(FileHandle==0)
{printfDx("そんなファイルがあるか!");}
while( FileRead_eof( FileHandle ) == 0 )
{
	FileRead_gets(map[Mapy],300,FileHandle);
    if(Mapy==0)
   {Mapx=strlen(map[Mapy]);}
	Mapy++;
}
FileRead_close(FileHandle);



char Fname2[18];
Mapy2=0;
Mapx2=70;
sprintf(Fname2,"mapgim%d.txt",i);
F2=FileRead_open(Fname2);
if(F2==0)
{printfDx("そんなファイルがあるか2!");}
while( FileRead_eof( F2 ) == 0 )
{
FileRead_gets(map2[Mapy2],300,F2);
Mapx2=strlen(map2[Mapy2]);
Mapy2++;
	
}
FileRead_close(F2);


pi=i;
printfDx("読み込み");}

return 0;
}



int MapDraw()
{	
static short riF=0;
static int haikei[16];
static short x=0,y=0,syuru=0;
Mapch();
MapRoad(mapnm);

if(riF==0){
LoadDivGraph( "EDGE.haikei.png" , 16 , 4 , 4 , 64 , 64 , haikei );//画像読み込み
riF=1;}

	


for( y = 0 ; y < Mapy ; y ++ )//マップ描画
{
		for( x = 0 ; x < Mapx ;x ++ )
		{if( x*Chip>=Seisu(rux)-400 && x*Chip<=Seisu(rux)+320 && y*Chip<=Seisu(ruy)+240 &&y*Chip>=Seisu(ruy)-330){ //マップ内かどうか

			switch(map[y][x])
			{																	
			case ' ': 
			syuru=0;
			break;

			case'1':
			case'2':
			case'3':
			case'4':
			case'5':
			case'6':
			case'7':
			case'8':
			case'9':
			syuru=MojiS(map[y][x]);
			break;

			}
			DrawGraph(x*Chip-rux+320,y*Chip-ruy+240,haikei[syuru],TRUE);



		}
		}
}//マップ描画  
return 0;
}

short MojiS(char moji)
{	
	int suuti;
	if (moji >= '0' && moji <= '9') {	/* 判定部分 */
		suuti = moji - '0';	/* 数値に変換 */
	} else {
		suuti = 0;
	}
	return suuti;
}

void Keytxt()
{for( int i=0; i<28; i++ ){ 
	keyflag[i]=0;
					if( Pad & (1<<i) ){             //ボタンiの入力フラグが立っていたら
                                DrawFormatString( 0, i*15, GetColor(255,255,255), "%dのキーが押されています", i );
								keyflag[i]=1;
					}
}
Pad = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;        //入力状態をPadに格納
}

short Mapch()
{
short cha=0;

switch(mapnm)
{
	 case 0:
	if(MapGim(rux,ruy)==1)
	{mapnm=1;
	rux=150;
	ruy=220;}
	break;
	 case 1:
	if(MapGim(rux,ruy)==1)
	{mapnm=0;
	rux=1440;
	ruy=340;}
	break;
}
   

cha=mapnm;
//printfDx("%d",cha);
return cha;
}
short MapGim(double x,double y)
{static short ret;
	switch(map2[Seisu(y)/Chip][Seisu(x)/Chip])
   {case '1':
	case '2':
	case '3':
	case '4':
	case '5':
    case '6':
	case '7':
	case '8':
	case '9':
			
ret=MojiS(map2[Seisu(y)/Chip][Seisu(x)/Chip]);
break;
	case ' ':
	ret=100;
break;
	case 'b':
	case 'c':
	case 'd':
	case 'f':
ret=100+(map2[Seisu(y)/Chip][Seisu(x)/Chip]-'a');
	}
return ret;
}
//defines.h
#ifndef DEF_defines_H //二重include防止

#define DEF_defines_H

#define Chip 64

#define mia1 4
#define mia2 10//mitame
#define mia3 16


#define Kas 0.7 //Action
#define Bkas 0.2//xのときのyの減速
#define Ri 3
#define Sic 15
#define Da 2
#define Nana 0.7
#define Nac 8

#define Yari 12

#define DMAX 100


#define Chip 64//Map

#endif 

//Kansu.h
#ifndef DEF_kansh_H //二重include防止

#define DEF_Kansu_H


int Action();
int MapDraw(); 
void Mitame();
short Syujou();
void Shibou();
short Hgage();

short tAction(double x,double y,short pat,short hp);
void tMitame();

short Once(short i);
int Seisu(double i);
void Sdraw(int x,int y,int Grhandle,int Transflag);
short MapRoad(short num);
short MojiS(char moji);
void Keytxt();
short Mapch();
short MapGim(double x,double y);
short ComA(char now,char next);

short Syudam();
short Ndhan(short hited);//キャラ、攻撃。単語が間違っているのはしらない。
short Nsyuhan(double rux,double ruy);


void Nredam();
void Ndsyoki();
void Tsyoki();
short Ndplus();
short Ndmake(double x,double y,double sx,double sy,short iryok,short nokori);
short Ndcount();




#endif
//Kouzou.h
#ifndef DEF_kouzou_H //二重include防止

#define DEF_kouzou_H

struct Dam
{
 double x;
 double y;
 short iryok;
 short nokori;

};

struct Ndam
{
 double x;//現れる場所
 double y;
 double sx;//移動スピード
 double sy;
 short iryok;//威力
 short nokori;//判定が残る時間

};





struct Teki
{
 double x;
 double y;
 short hp;
 short pat;//行動パターン
 short shoki;//初登場か
};
#endif 
ご指摘のとおり良くない書き方のコードで、使ってない変数もあるかもしれません。まだまだ不十分だとは思いますが、インデントもある程度直しました。
一応描画処理でのロードについては、前のフレームと違うマップにいるときだけ読み込むよう、MapRoad内で分岐を行っています。

nil
記事: 428
登録日時: 8年前

Re: マップ描画のちらつき?

#6

投稿記事 by nil » 7年前

直っていない部分が多すぎます。
現状とても見づらいです。

通常は描画処理の中にロード処理は組み込みません。

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

Re: マップ描画のちらつき?

#7

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

ちょっと全部を追いかけたくない感じなので、調べる場所を絞り込むために聞き取りを行いたいと思います。
どういう事をすると「、ときどきちらつき、というより黒い線がパシッと入り込むのです」が起き始めますか?
出来るだけ詳しくお願いします。

あと次のことを確認して下さい。
(1).起動したまま動かずにいても問題は再現しますか?
(2).画面で黒い線が入っている時にマップ画像のパーツはすべて表示されていますか?
(3).WinMainでMapDraw();以外の次の処理をコメントアウトしても問題は再現しますか?
※ ただし、最低限のマップスクロールなどはするものとします。必要な最低限の処理はAction()でしょうか?

コード:

				Syujou();
				Action();
				Mitame();
				tAction( 240, 350, 0, 20 );
				tMitame();
				Syudam();
				Nredam();
				Ndcount();
				Shibou();
【追記】
CreateFontToHandle()をグローバル変数定義時に行っているところがありますが、DxLib_Init()より先行してしまうので、うまく動かないはずです。


整形してコンパイルが通るようにして1つのファイルにまとめたものです。

コード:

//main.cpp
#include "DxLib.h" //キャラとの判定が完成
//#include"Kansu.h"
//#include"defines.h"
//#include"kouzou.h"


//defines.h
#ifndef DEF_defines_H //二重include防止

#define DEF_defines_H

#define Chip 64

#define mia1 4
#define mia2 10//mitame
#define mia3 16


#define Kas 0.7 //Action
#define Bkas 0.2//xのときのyの減速
#define Ri 3
#define Sic 15
#define Da 2
#define Nana 0.7
#define Nac 8

#define Yari 12

#define DMAX 100


#define Chip 64//Map

#endif

//Kansu.h
#ifndef DEF_kansh_H //二重include防止

#define DEF_Kansu_H


int Action();
int MapDraw();
void Mitame();
short Syujou();
void Shibou();
short Hgage();

short tAction( double x, double y, short pat, short hp );
void tMitame();

short Once( short i );
int Seisu( double i );
void Sdraw( int x, int y, int Grhandle, int Transflag );
short MapRoad( short num );
short MojiS( char moji );
void Keytxt();
short Mapch();
short MapGim( double x, double y );
short ComA( char now, char next );

short Syudam();
short Ndhan( short hited ); //キャラ、攻撃。単語が間違っているのはしらない。
short Nsyuhan( double rux, double ruy );


void Nredam();
void Ndsyoki();
void Tsyoki();
short Ndplus();
short Ndmake( double x, double y, double sx, double sy, short iryok, short nokori );
short Ndcount();




#endif
//Kouzou.h
#ifndef DEF_kouzou_H //二重include防止

#define DEF_kouzou_H

struct Dam {
	double x;
	double y;
	short iryok;
	short nokori;

};

struct Ndam {
	double x;//現れる場所
	double y;
	double sx;//移動スピード
	double sy;
	short iryok;//威力
	short nokori;//判定が残る時間

};





struct Teki {
	double x;
	double y;
	short hp;
	short pat;//行動パターン
	short shoki;//初登場か
};
#endif



int Pad;
int  Font02  = CreateFontToHandle( "MS ゴシック", 19, 6 , DX_FONTTYPE_NORMAL ) ;
int iro = GetColor( 140, 70, 70 ), cro = GetColor( 70, 50, 50 );
short joutai = 0/*メニューかプレイか*/, oomot = 0/**/, mapnm = 0/*マップナンバー*/;
short keyflag[28];

struct Teki zako[31];//敵

short Mapy, Mapx, Mapx2, Mapy2;
short ruseizon = 1;
short num = 1;
short hirosa;
char map[50 + 1][70 + 1];
char map2[50 + 1][70 + 1];

struct Dam Dod[DMAX + 1]; //攻撃判定
struct Ndam Nod[DMAX + 1];
short ndnum, dnum, tnum; //攻撃判定などの番号




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


	int Font;
	int Sx = 0 , Sy = 0 , Cb = 0 ;




	Font = CreateFontToHandle( "MS ゴシック", 50,  9, DX_FONTTYPE_NORMAL );


	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
	while( ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 ) {
		short don = 0;
		Keytxt();
		if( joutai == 0 ) {

			//printfDx("%d",Once(2));
			GetScreenState( &Sx , &Sy , &Cb ) ;
			DrawBox( 0, 0, 1000, 700, GetColor( 150, 10, 5 ), TRUE );
			DrawStringToHandle( 100 , 200 , "スタート" , GetColor( 2 , 2 , 20 ) , Font ) ;
			DrawFormatStringToHandle( 200 , 400 ,  GetColor( 200 , 0 , 255 ) , Font, "%d,%d,%d", Sx , Sy , Cb  ) ;


			if( Pad & ( 1 << 9 ) ) {
				joutai = 1;
			}
		}//メニュー画面

		else if( joutai == 1 ) {
			//Ndsyoki();
			ndnum = 0; //判定番号初期化
			tnum = 0;
			//printfDx("%d",ruseizon);
			if( ruseizon == 1 ) {
				MapDraw();
				Syujou();
				Action();
				Mitame();
				tAction( 240, 350, 0, 20 );
				tMitame();
				Syudam();
				Nredam();
				Ndcount();

			}

			else if( ruseizon == 0 ) {
				Shibou();
			}
		}








	}




	DxLib_End(); // DXライブラリ終了処理
	return 0;

}
//dkan.cpp
#include "DxLib.h"
//#include"Kansu.h"
//#include"defines.h"
//#include"kouzou.h"

//extern struct Dam Dod[DMAX];   //過去の遺物
//extern struct Ndam Nod[DMAX];
//extern struct Teki zako[30];
extern short ndnum;
extern short tnum;
extern int cro;

static short ndnow;


short Ndhan( short hited ) {
	short re = 0;
	for( short hit = 0; hit <= ndnow; hit++ ) {
		if( Nod[hit].x >= zako[hited].x - 24 && Nod[hit].x <= zako[hited].x + 24 && Nod[hit].y >= zako[hited].y - 32 && Nod[hit].y <= zako[hited].y + 32 ) {
			re = Nod[hit].iryok;
			Nod[hit].nokori = 0;
			break;
		} //当たってる
	}
	return re;

}


short Nsyuhan( double ux, double uy ) {     //1フレームに一つ(最初)の判定しか処理できない!
	short re = 0;
	short hit;
	for( hit = 0; hit <= ndnow; hit++ ) {
		if( Nod[hit].x >= ux - 24 && Nod[hit].x <= ux + 24 && Nod[hit].y >= uy - 32 && Nod[hit].y <= uy + 32 ) {
			re = Nod[hit].iryok;
			Nod[hit].nokori = 0;
			break;
		} //当たってるdamege
	}
	return re;


}
void Nredam() {
	for( short hit = 0; hit <= ndnow; hit++ ) {
		Nod[hit].nokori--;
		if( Nod[hit].nokori <= 0 ) {
			Nod[hit].x = 0;
			Nod[hit].y = 0;
			Nod[hit].sx = 0;
			Nod[hit].sy = 0;
			Nod[hit].iryok = 0;
		} else {
			Nod[hit].x += Nod[hit].sx;
			Nod[hit].y += Nod[hit].sy;
		}

	}
}




void Tsyoki() {
	tnum = 0;
	for( short i = 0; i <= 30; i++ ) {
		if( zako[i].hp > 0 ) {
			tnum++;
		} else {
			break;
		}

	}

}
short Ndplus() {
	while( Nod[ndnum].nokori >= 1 && ndnum <= DMAX - 1 ) {
		ndnum++;
	}
	return 0;

}

short Ndmake( double x, double y, double sx, double sy, short iryok, short nokori ) {
	short limit = 0;
	while( Nod[ndnum].nokori >= 1 ) {
		if( ndnum <= DMAX - 1 ) {
			ndnum++;
		} else {
			limit = 1;
			break;
		}
	}

	if( limit == 0 ) { //配列が限界でないときのみ
		Nod[ndnum].x = x; //書き込み
		Nod[ndnum].y = y;
		Nod[ndnum].sx = sx;
		Nod[ndnum].sy = sy;
		Nod[ndnum].iryok = iryok;
		Nod[ndnum].nokori = nokori;
	}
	return limit;

}
short Ndcount() {
	static short ndmax;
	if( ndnum >= ndmax + 1 ) {
		ndmax = ndnum;
	}

	while( Nod[ndmax].nokori <= 0 && ndmax >= 1 ) {
		ndmax--;
	}
	ndnow = ndmax;
	DrawFormatString( 100, 100, cro, "%d", ndnow );

	return 0;
}
//syukan.cpp
#include"DxLib.h" //キャラとの判定が完成
#include <math.h>
//#include"Kansu.h"
//#include"defines.h"
//#include"Kouzou.h"

extern char map[50 + 1][70 + 1]; //少し多めに
extern char map2[50 + 1][70 + 1];
extern short keyflag[28];
extern short joutai;
//extern struct Ndam Nod[DMAX];
extern short ndnum;
extern int  Font02;
extern int iro, cro;
int image[48];
int imageb[48];
int imagez[10];
static int haikei[16];



double rux = 400;
int ruSx, ruSy;
double rugx, rugy;
double ruy = 200;
short ruhp = 20;
short ruFlag;
short ruimg;
short rujou;
short rubujou = 0;
short ruijou;
double ruoldx;
double ruoldy;
short ruiFlag = 1;
extern short ruseizon;
short afle;
short bflag;

int Action() {
	ruoldx = rux;
	ruoldy = ruy;

	int kiju = Sic * 8 + 1;
	int naju = Nac * 8 + 1;

	if( rubujou == 0 ) { //武器状態
		switch( ruijou ) { //移動状態
		case 0://とまり中
			ruiFlag = 0;

			if( rugx > Kas ) {
				rugx -= Kas;
			} else if( rugx * ( -1 ) > Kas ) {
				rugx += Kas;   //全て加速関係
			} else {
				rugx = 0;   //xを減速
			}

			if( rugy > Kas ) {
				rugy -= Kas;
			} else if( rugy * ( -1 ) > Kas ) {
				rugy += Kas;
			} else {
				rugy = 0;
			}

			break;


		case 1://動き中
			ruiFlag = 1;

			switch( ruFlag ) { //方向開始
			case 0:
				rugy += Kas;
				if( keyflag[9] == 0 ) {

					if( rugy > Ri ) {
						rugy = Ri;
					}
				}

				else if( keyflag[9] == 1 ) {


					if( rugy > Ri * Da ) {
						rugy = Ri * Da;
					}
				}
				if( rugx < -Bkas ) {
					rugx += Bkas;
				} else if( rugx > Bkas ) {
					rugx -= Bkas;
				} else {
					rugx = 0;
				}


				break;
			case 1:
				rugx -= Kas;
				if( keyflag[9] == 0 ) {

					if( rugx * ( -1 ) > Ri ) {
						rugx = -Ri;
					}
				} else {


					if( rugx * ( -1 ) > Ri * Da ) {
						rugx = -Ri * Da;
					}
				}

				if( rugy < -Bkas ) {
					rugy += Bkas;
				} else if( rugy > Bkas ) {
					rugy -= Bkas;
				} else {
					rugy = 0;
				}

				break;
			case 2:
				rugx += Kas;
				if( keyflag[9] == 0 ) {

					if( rugx > Ri ) {
						rugx = Ri;
					}
				} else {


					if( rugx > Ri * Da ) {
						rugx = Ri * Da;
					}
				}

				if( rugy < -Bkas ) {
					rugy += Bkas;
				} else if( rugy > Bkas ) {
					rugy -= Bkas;
				} else {
					rugy = 0;
				}
				break;
			case 3:
				rugy -= Kas;
				if( keyflag[9] == 0 ) {

					if( rugy * ( -1 ) > Ri ) {
						rugy = -Ri;
					}
				} else {


					if( rugy * ( -1 ) > Ri * Da ) {
						rugy = -Ri * Da;
					}
				}

				if( rugx < -Bkas ) {
					rugx += Bkas;
				} else if( rugx > Bkas ) {
					rugx -= Bkas;
				} else {
					rugx = 0;
				}
				break;
			case 4:
				rugy += Kas * Nana;
				rugx -= Kas * Nana;

				if( keyflag[9] == 0 ) {


					if( rugy > Ri * Nana ) {
						rugy = Ri * Nana;
					}



					if( rugx * ( -1 ) > Ri * Nana ) {
						rugx = -Ri * Nana;
					}
				}


				else {


					if( rugy > Ri * Nana * Da ) {
						if( rugy > Ri * Nana * Da + Kas * Nana * Da ) {
							rugy -= Kas * Nana * Da;
						} else {
							rugy = Ri * Nana * Da;
						}
					}
					if( rugx * ( -1 ) > Ri * Nana * Da ) {
						if( rugx * ( -1 ) > Ri * Nana * Da + Kas * Nana * Da ) {
							rugx += Kas * Nana * Da;
						} else {
							rugx = -Ri * Nana * Da;
						}
					}
				}
				break;


			case 6:
				rugy -= ( Kas ) * Nana;
				rugx -= ( Kas ) * Nana;
				if( keyflag[9] == 0 ) {

					if( rugy * ( -1 ) > Ri * Nana ) {
						rugy = -( Ri ) * Nana;
					}
					if( rugx * ( -1 ) > Ri * Nana ) {
						rugx = -( Ri ) * Nana;
					}
				} else {


					if( rugy * ( -1 ) > Ri * Nana * Da ) {
						rugy = -( Ri ) * Nana * Da;
					}
					if( rugx * ( -1 ) > Ri * Nana * Da ) {
						rugx = -Ri * Nana * Da;
					}
				}
				break;
			case 5:
				rugy += ( Kas ) * Nana;
				rugx += ( Kas ) * Nana;
				if( keyflag[9] == 0 ) {

					if( rugy > Ri * Nana ) {
						rugy = Ri * Nana;
					}
					if( rugx > Ri * Nana ) {
						rugx = Ri * Nana;
					}
				} else {


					if( rugy > Ri * Nana * Da ) {
						rugy = Ri * Nana * Da;
					}
					if( rugx > Ri * Nana * Da ) {
						rugx = Ri * Nana * Da;
					}
				}
				break;
			case 7:
				rugy -= ( Kas ) * Nana;
				rugx += ( Kas ) * Nana;
				if( keyflag[9] == 0 ) {

					if( rugy * ( -1 ) > Ri * Nana ) {
						rugy = -Ri * Nana;
					}
					if( rugx > Ri * Nana ) {
						rugx = Ri * Nana;
					}
				} else {


					if( rugy * ( -1 ) > Ri * Nana * Da ) {
						rugy = -Ri * Nana * Da;
					}
					if( rugx > Ri * Nana * Da ) {
						rugx = Ri * Nana * Da;
					}
				}
				break;

			}/*方向終わり*/  break;








		}
	}


	else if( rubujou == 1 ) {
		switch( ruijou ) { //移動状態
		case 0://とまり中
			ruiFlag = 0;

			if( rugx > Kas ) {
				rugx -= 0.5;
			} else if( rugx * ( -1 ) > Kas ) {
				rugx += 0.5;
			} else {
				rugx = 0;   //xを減速
			}

			if( rugy > Kas ) {
				rugy -= Kas;
			} else if( rugy * ( -1 ) > Kas ) {
				rugy += Kas;
			} else {
				rugy = 0;
			}

			break;


		case 1://動き中

			ruiFlag = 1;


			switch( ruFlag ) { //方向開始
			case 0:
				rugy += Kas;



				if( rugy > Ri ) {
					rugy = Ri;
				}



				if( rugx < -Bkas ) {
					rugx += Bkas;
				} else if( rugx > Bkas ) {
					rugx -= Bkas;
				} else {
					rugx = 0;
				}


				break;
			case 1:
				rugx -= Kas;


				if( rugx * ( -1 ) > Ri ) {
					rugx = -Ri;
				}


				if( rugy < -Bkas ) {
					rugy += Bkas;
				} else if( rugy > Bkas ) {
					rugy -= Bkas;
				} else {
					rugy = 0;
				}

				break;
			case 2:
				rugx += Kas;


				if( rugx > Ri ) {
					rugx = Ri;
				}



				if( rugy < -Bkas ) {
					rugy += Bkas;
				} else if( rugy > Bkas ) {
					rugy -= Bkas;
				} else {
					rugy = 0;
				}
				break;
			case 3:
				rugy -= Kas;


				if( rugy * ( -1 ) > Ri ) {
					rugy = -Ri;
				}


				if( rugx < -Bkas ) {
					rugx += Bkas;
				} else if( rugx > Bkas ) {
					rugx -= Bkas;
				} else {
					rugx = 0;
				}
				break;
			case 4:
				rugy += Kas * Nana;
				rugx -= Kas * Nana;




				if( rugy > Ri * Nana ) {
					if( rugy > Ri * Nana + Kas * Nana ) {
						rugy -= Ri * Nana;
					} else {
						rugy = Ri * Nana;
					}
				}

				if( rugx * ( -1 ) > Ri * Nana ) {
					if( rugx * ( -1 ) > Ri * Nana + Kas * Nana ) {
						rugx += Kas * Nana;
					} else {
						rugx = -Ri * Nana;
					}
				}



				break;
			case 6:
				rugy -= ( Kas ) * Nana;
				rugx -= ( Kas ) * Nana;


				if( rugy * ( -1 ) > Ri * Nana ) {
					rugy = -( Ri ) * Nana;
				}
				if( rugx * ( -1 ) > Ri * Nana ) {
					rugx = -( Ri ) * Nana;
				}
				break;
			case 5:
				rugy += ( Kas ) * Nana;
				rugx += ( Kas ) * Nana;


				if( rugy > Ri * Nana ) {
					rugy = Ri * Nana;
				}
				if( rugx > Ri * Nana ) {
					rugx = Ri * Nana;
				}
				break;
			case 7:
				rugy -= ( Kas ) * Nana;
				rugx += ( Kas ) * Nana;


				if( rugy * ( -1 ) > Ri * Nana ) {
					rugy = -Ri * Nana;
				}
				if( rugx > Ri * Nana ) {
					rugx = Ri * Nana;
				}
				break;

			}/*方向終わり*/  break;

		case 2:
			ruiFlag = 1;
			afle++;

			if( afle == Yari ) {
				switch( ruFlag ) {
				case 0:
					Ndmake( rux, ruy + 40, 0, 5 + rugy, 4, 3 );
					break;
				case 1:
					Ndmake( rux - 30, ruy, -5 + rugx, 0, 4, 3 );
					break;
				case 2:
					Ndmake( rux + 40, ruy, 5 + rugx, 0, 4, 3 );
					break;
				case 3:
					Ndmake( rux, ruy - 40, 0, -5 + rugy, 4, 3 );
					break;
				case 4:
					Ndmake( rux - 25, ruy + 35, -3.5 + rugx, 3.5 + rugy, 4, 3 );
					break;
				case 5:
					Ndmake( rux + 25, ruy - 35, 3.5 + rugx, -3.5 + rugy, 4, 3 );
					break;
				case 6:
					Ndmake( rux - 25, ruy - 35, -3.5 + rugx, -3.5 + rugy, 4, 3 );
					break;
				case 7:
					Ndmake( rux - 25, ruy - 35, 3.5 + rugx, -3.5 + rugy, 4, 3 );
					break;
				}

				Nod[ndnum].iryok = 4;
				Nod[ndnum].nokori = 2;

				Ndplus();

			} else if( afle >= mia3 ) {
				afle = 0;
			}
			break;
		}//攻撃判定処理

	}



	if( MapGim( rux + rugx - 15, ruy + rugy + 30 ) - MapGim( rux - 15, ruy + 30 ) >= 2 ) { //左下
		rugy = 0;

		rugx = 0;
	}
	if( MapGim( rux + rugx + 15, ruy + rugy + 30 ) - MapGim( rux + 15, ruy + 30 ) >= 2 ) { //右下
		rugy = 0;

		rugx = 0;
	} else if( MapGim( rux + rugx - 15, ruy + rugy - 5 ) - MapGim( rux - 15, ruy - 5 ) >= 2 ) { //左上
		rugy = 0;

		rugx = 0;
	}
	if( MapGim( rux + rugx + 15, ruy + rugy - 5 ) - MapGim( rux + 15, ruy - 5 ) >= 2 ) { //右上
		rugy = 0;

		rugx = 0;
	}


	rux += rugx;
	ruy += rugy;
	return 0;
}       //ここまでAction





void Mitame() {
	static short reF = 0;
	short kiju;
	short naju;
	short kiju1;
	short naju1;
	ruSx = Seisu( rux );
	ruSy = Seisu( ruy );

	kiju = Sic * 8 + 1;
	naju = Nac * 8 + 1;
	kiju1 = Sic * 4 + 1;
	naju1 = Nac * 4 + 1;
	Hgage();
	if( reF == 0 ) {
		LoadDivGraph( "EDGE1.news.png" , 40 , 8 , 5 , 48 , 64 , image ); // 画像の分割読み込み
		LoadDivGraph( "EDGE1.zatuyou.png", 3, 3 , 1, 64, 64, imagez );
		LoadDivGraph( "EDGE1.newsbuki.png" , 40 , 8 , 4 , 80 , 80 , imageb );
		reF = 1;
	}
	switch( rubujou ) {
	case 0:

		switch( ruijou ) { //移動状態
		case 0://sei

			if( ruFlag == 0 || ruFlag == 1 || ruFlag == 2 || ruFlag == 3 ) {
				rujou = ruFlag;
			} else if( ruFlag == 4 || ruFlag == 7 ) {
				rujou = ruFlag + 16;
			} else if( ruFlag == 5 ) {
				rujou = 22;
			} else if( ruFlag == 6 ) {
				rujou = 21;
			}
			break;
		case 1://dou

			if( rugx == 0 && rugy == 0 ) {
				if( ruFlag == 0 || ruFlag == 1 || ruFlag == 2 || ruFlag == 3 ) {
					rujou = ruFlag;
				} else if( ruFlag == 4 || ruFlag == 7 ) {
					rujou = ruFlag + 16;
				} else if( ruFlag == 5 ) {
					rujou = 22;
				} else if( ruFlag == 6 ) {
					rujou = 21;
				}
			} else {
				switch( ruFlag ) {
				case 0:

					if( keyflag[9] == 0 ) {
						if( Sic <= ruSy % kiju1 && ruSy % kiju1 < Sic * 2 ) {
							rujou = 4;
						}//足伸びきり

						else if( Sic * 3 <= ruSy % kiju1 && ruSy % kiju1 < Sic * 4 ) {
							rujou = 5;
						}

						else {
							rujou = 0;
						}

						if( rugy > Ri ) {
							rugy = Ri;
						}
					}

					else if( keyflag[9] == 1 ) {

						if( Sic <= ruSy % kiju && ruSy % kiju < Sic * 2 ) {
							rujou = 4;
						}

						else if( Sic * 2 <= ruSy % kiju && ruSy % kiju < Sic * 3 ) {
							rujou = 12;
						}

						else if( Sic * 3 <= ruSy % kiju && ruSy % kiju < Sic * 4 ) {
							rujou = 4;
						}

						else if( ( Sic * 5 <= ruSy % kiju && ruSy % kiju < Sic * 6 ) || ( Sic * 7 <= ruSy % kiju && ruSy % kiju < Sic * 8 ) ) {
							rujou = 5;
						}

						else if( Sic * 6 <= ruSy % kiju && ruSy % kiju < Sic * 7 ) {
							rujou = 13;
						} else {
							rujou = 0;
						}

					}

					break;
				case 1:

					if( keyflag[9] == 0 ) {
						if( Sic <= ruSx % kiju1 && ruSx % kiju1 < Sic * 2 ) {
							rujou = 7;
						} else if( Sic * 3 <= ruSx % kiju1 && ruSx % kiju1 < Sic * 4 ) {
							rujou = 6;
						} else {
							rujou = 1;
						}
					} else {

						if( ( Sic <= ruSx % kiju && ruSx % kiju < Sic * 2 ) || ( Sic * 3 <= ruSx % kiju && ruSx % kiju < Sic * 4 ) ) {
							rujou = 7;
						}//歩き

						else if( Sic * 2 <= ruSx % kiju && ruSx % kiju < Sic * 3 ) {
							rujou = 15;
						}


						else if( ( Sic * 5 <= ruSx % kiju && ruSx % kiju < Sic * 6 ) || ( Sic * 7 <= ruSx % kiju && ruSx % kiju < Sic * 8 ) ) {
							rujou = 6;
						}//歩き

						else if( Sic * 6 <= ruSx % kiju && ruSx % kiju < Sic * 7 ) {
							rujou = 14;
						} else {
							rujou = 1;
						}
					}

					break;
				case 2:

					if( keyflag[9] == 0 ) {
						if( Sic <= ruSx % kiju1 && ruSx % kiju1 < Sic * 2 ) {
							rujou = 8;
						} else if( Sic * 3 <= ruSx % kiju1 && ruSx % kiju1 < Sic * 4 ) {
							rujou = 9;
						} else {
							rujou = 2;
						}

					} else {

						if( ( Sic <= ruSx % kiju && ruSx % kiju < Sic * 2 ) || ( Sic * 3 <= ruSx % kiju && ruSx % kiju < Sic * 4 ) ) {
							rujou = 8;
						}//歩き

						else if( Sic * 2 <= ruSx % kiju && ruSx % kiju < Sic * 3 ) {
							rujou = 18;
						}


						else if( ( Sic * 5 <= ruSx % kiju && ruSx % kiju < Sic * 6 ) || ( Sic * 7 <= ruSx % kiju && ruSx % kiju < Sic * 8 ) ) {
							rujou = 9;
						}//歩き

						else if( Sic * 6 <= ruSx % kiju && ruSx % kiju < Sic * 7 ) {
							rujou = 19;
						} else {
							rujou = 2;
						}
					}
					break;
				case 3:

					if( keyflag[9] == 0 ) {
						if( Sic <= ruSy % kiju1 && ruSy % kiju1 < Sic * 2 ) {
							rujou = 10;
						} else if( Sic * 3 <= ruSy % kiju1 && ruSy % kiju1 < Sic * 4 ) {
							rujou = 11;
						} else {
							rujou = 3;
						}
					} else {

						if( ( Sic <= ruSy % kiju && ruSy % kiju < Sic * 2 ) || ( Sic * 3 <= ruSy % kiju && ruSy % kiju < Sic * 4 ) ) {
							rujou = 10;
						}//歩き

						else if( Sic * 2 <= ruSy % kiju && ruSy % kiju < Sic * 3 ) {
							rujou = 16;
						}


						else if( ( Sic * 5 <= ruSy % kiju && ruSy % kiju < Sic * 6 ) || ( Sic * 7 <= ruSy % kiju && ruSy % kiju < Sic * 8 ) ) {
							rujou = 11;
						}//歩き

						else if( Sic * 6 <= ruSy % kiju && ruSy % kiju < Sic * 7 ) {
							rujou = 17;
						} else {
							rujou = 3;
						}
					}
					break;
				case 4:


					if( keyflag[9] == 0 ) {
						if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
							rujou = 31;
						} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
							rujou = 30;
						} else {
							rujou = 20;
						}


					}


					else {

						if( ( Nac <= ruSy % naju && ruSy % naju < Nac * 2 ) || ( Nac * 3 <= ruSy % naju && ruSy % naju < Nac * 4 ) ) {
							rujou = 30;
						}//歩き

						else if( Nac * 2 <= ruSy % naju && ruSy % naju < Nac * 3 ) {
							rujou = 26;
						}


						else if( ( Nac * 5 <= ruSy % naju && ruSy % naju < Nac * 6 ) || ( Nac * 7 <= ruSy % naju && ruSy % naju < Nac * 8 ) ) {
							rujou = 31;
						}//歩き

						else if( Nac * 6 <= ruSy % naju && ruSy % naju < Nac * 7 ) {
							rujou = 27;
						} else {
							rujou = 20;
						}
					}
					break;
				case 6:

					if( keyflag[9] == 0 ) {
						if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
							rujou = 24;
						} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
							rujou = 25;
						} else {
							rujou = 21;
						}
					} else {

						if( ( Nac <= ruSy % naju && ruSy % naju < Nac * 2 ) || ( Nac * 3 <= ruSy % naju && ruSy % naju < Nac * 4 ) ) {
							rujou = 24;
						}//歩き

						else if( Nac * 2 <= ruSy % naju && ruSy % naju < Nac * 3 ) {
							rujou = 28;
						}


						else if( ( Nac * 5 <= ruSy % naju && ruSy % naju < Nac * 6 ) || ( Nac * 7 <= ruSy % naju && ruSy % naju < Nac * 8 ) ) {
							rujou = 25;
						}//歩き

						else if( Nac * 6 <= ruSy % naju && ruSy % naju < Nac * 7 ) {
							rujou = 29;
						} else {
							rujou = 21;
						}
					}
					break;
				case 5:

					if( keyflag[9] == 0 ) {
						if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
							rujou = 32;
						} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
							rujou = 33;
						} else {
							rujou = 22;
						}
					} else {

						if( ( Nac <= ruSy % naju && ruSy % naju < Nac * 2 ) || ( Nac * 3 <= ruSy % naju && ruSy % naju < Nac * 4 ) ) {
							rujou = 32;
						}//歩き

						else if( Nac * 2 <= ruSy % naju && ruSy % naju < Nac * 3 ) {
							rujou = 34;
						}


						else if( ( Nac * 5 <= ruSy % naju && ruSy % naju < Nac * 6 ) || ( Nac * 7 <= ruSy % naju && ruSy % naju < Nac * 8 ) ) {
							rujou = 33;
						}//歩き

						else if( Nac * 6 <= ruSy % naju && ruSy % naju < Nac * 7 ) {
							rujou = 35;
						} else {
							rujou = 22;
						}

					}
					break;
				case 7:

					if( keyflag[9] == 0 ) {
						if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
							rujou = 36;
						} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
							rujou = 37;
						} else {
							rujou = 23;
						}
					} else {

						if( ( Nac <= ruSy % naju && ruSy % naju < Nac * 2 ) || ( Nac * 3 <= ruSy % naju && ruSy % naju < Nac * 4 ) ) {
							rujou = 36;
						}//歩き

						else if( Nac * 2 <= ruSy % naju && ruSy % naju < Nac * 3 ) {
							rujou = 38;
						}


						else if( ( Nac * 5 <= ruSy % naju && ruSy % naju < Nac * 6 ) || ( Nac * 7 <= ruSy % naju && ruSy % naju < Nac * 8 ) ) {
							rujou = 37;
						}//歩き

						else if( Nac * 6 <= ruSy % naju && ruSy % naju < Nac * 7 ) {
							rujou = 39;
						} else {
							rujou = 23;
						}
					}
					break;
				}
				break;
			}



		}
		break;



		/*rubujou1*/

	case 1:
		switch( ruijou ) { //移動状態
		case 0:

			if( ruFlag == 0 || ruFlag == 1 || ruFlag == 2 || ruFlag == 3 ) {
				rujou = ruFlag;
			} else if( ruFlag == 4 || ruFlag == 5 || ruFlag == 6 || ruFlag == 7 ) {
				rujou = ruFlag + 8;
			}

			break;
		case 1:

			switch( ruFlag ) {
			case 0:


				if( Sic <= ruSy % kiju1 && ruSy % kiju1 < Sic * 2 ) {
					rujou = 4;
				}//足伸びきり

				else if( Sic * 3 <= ruSy % kiju1 && ruSy % kiju1 < Sic * 4 ) {
					rujou = 5;
				}

				else {
					rujou = 0;
				}




				break;
			case 1:


				if( Sic <= ruSx % kiju1 && ruSx % kiju1 < Sic * 2 ) {
					rujou = 7;
				} else if( Sic * 3 <= ruSx % kiju1 && ruSx % kiju1 < Sic * 4 ) {
					rujou = 6;
				} else {
					rujou = 1;
				}



				break;
			case 2:


				if( Sic <= ruSx % kiju1 && ruSx % kiju1 < Sic * 2 ) {
					rujou = 8;
				} else if( Sic * 3 <= ruSx % kiju1 && ruSx % kiju1 < Sic * 4 ) {
					rujou = 9;
				} else {
					rujou = 2;
				}



				break;
			case 3:


				if( Sic <= ruSy % kiju1 && ruSy % kiju1 < Sic * 2 ) {
					rujou = 10;
				} else if( Sic * 3 <= ruSy % kiju1 && ruSy % kiju1 < Sic * 4 ) {
					rujou = 11;
				} else {
					rujou = 3;
				}


				break;
			case 4:



				if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
					rujou = 17;
				} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
					rujou = 16;
				} else {
					rujou = 12;
				}





				break;
			case 6:


				if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
					rujou = 21;
				} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
					rujou = 20;
				} else {
					rujou = 14;
				}

				break;
			case 5:


				if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
					rujou = 19;
				} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
					rujou = 18;
				} else {
					rujou = 13;
				}

				break;
			case 7:


				if( Nac <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 2 ) {
					rujou = 23;
				} else if( Nac * 3 <= ruSy % ( Nac * 4 + 1 ) && ruSy % ( Nac * 4 + 1 ) < Nac * 4 ) {
					rujou = 22;
				} else {
					rujou = 15;
				}

				break;
			}




			break;/*のハズ*/
		case 2:
			switch( ruFlag ) {
			case 0:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 4;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 24;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 4;
				}
				break;
			case 1:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 7;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 25;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 7;
				}
				break;
			case 2:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 8;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 26;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 8;
				}
				break;
			case 3:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 11;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 27;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 11;
				}
				break;
			case 4:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 17;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 28;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 17;
				}
				break;
			case 5:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 19;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 29;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 19;
				}
				break;
			case 6:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 20;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 30;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 20;
				}
				break;
			case 7:
				if( afle >= 1 && afle <= mia1 ) {
					rujou = 22;
				} else if( afle > mia1 && afle <= mia2 ) {
					rujou = 31;
				} else if( afle > mia2 && afle <= mia3 ) {
					rujou = 22;
				}
				break;




			}




			break;
		}//ruijou



		break;
	}//rubujou

	SetDrawBlendMode( DX_BLENDMODE_MULA, 200 );

	DrawGraph( 320 - 32, 240 - 30, imagez[0], TRUE ); //影

	SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 100 );
	if( rubujou == 0 ) {
		DrawGraph( 320 - 24, 240 - 32, image[rujou] , TRUE );
	}  // 操作キャラを表示
	else if( rubujou == 1 ) {
		DrawGraph( 320 - 40, 240 - 40, imageb[rujou] , TRUE );
	}
	DrawBox( 320 - 3, 240 - 3, 320 + 3, 240 + 3, GetColor( 250, 250, 250 ), TRUE );

}//ここまでmitame

short Syudam() {


	if( Nsyuhan( rux, ruy ) > 0 ) {
		ruhp -= Nsyuhan( rux, ruy );
	}
	return 0;


}



short Syujou() {
	if( ruhp <= 0 ) {
		ruseizon = 0;
	}

	if( keyflag[1] == 1 ) {
		if( keyflag[0] == 1 ) {
			ruFlag = 4;
		} else if( keyflag[3] == 1 ) {
			ruFlag = 6;
		} else {
			ruFlag = 1;
		}
	}

	else if( keyflag[2] == 1 ) {
		if( keyflag[0] == 1 ) {
			ruFlag = 5;
		} else if( keyflag[3] == 1 ) {
			ruFlag = 7;
		} else {
			ruFlag = 2;
		}
	} else if( keyflag[0] == 1 ) {
		if( keyflag[1] == 1 ) {
			ruFlag = 4;
		} else if( keyflag[2] == 1 ) {
			ruFlag = 5;
		} else {
			ruFlag = 0;
		}
	}

	else if( keyflag[3] == 1 ) {
		if( keyflag[1] == 1 ) {
			ruFlag = 6;
		} else if( keyflag[2] == 1 ) {
			ruFlag = 7;
		} else {
			ruFlag = 3;
		}
	}



	switch( rubujou ) { //武器状態変化
	case 0:
		if( Once( 6 ) == 1 ) {
			bflag = 1;
		}
		break;
	case 1:
		if( Once( 6 ) == 1 && afle == 0 ) {
			bflag = 0;
		}
		break;

	}
	if( bflag == 0 ) {
		rubujou = 0;
	} else if( bflag == 1 ) {
		rubujou = 1;
	}


	switch( ruijou ) { //移動状態変化
	case 0:

		if( keyflag[0] == 1 || keyflag[1] == 1 || keyflag[2] == 1 || keyflag[3] == 1 ) {
			ruijou = 1;
		}

		if( Once( 5 ) == 1 && rubujou == 1 || afle < 0 ) {
			ruijou = 2;
		}


		break;


	case 1:

		if( keyflag[0] == 0 && keyflag[1] == 0 && keyflag[2] == 0 && keyflag[3] == 0 ) {
			ruijou = 0;
		}

		if( Once( 5 ) == 1 && rubujou == 1 ) {
			ruijou = 2;
		}

		break;
	case 2:

		if( afle == 0 ) {
			ruijou = 0;
		}

		break;




	}

	//変化終わり

	return 0;
}
void Shibou() {
	DrawFormatStringToHandle( 20, 50, iro, Font02, "ざんねん!わたしの ぼうけんは これで おわってしまった!" );
	if( Once( 9 ) == 1 ) {
		ruseizon = 1;
		ruhp = 20;
		rux = 300;
		ruy = 200;
		rugx = 0;
		rugy = 0;

	} else if( Once( 4 ) == 1 ) {
		joutai = 0;
	}
}
short Hgage() {
	DrawBox( 30, 10, 30 + ruhp * 20, 40, cro, TRUE );
	return 0;
}
//tekikan.cpp
#include"DxLib.h"
//#include"Kansu.h"
//#include"defines.h"
//#include"kouzou.h"

extern char map[50 + 1][70 + 1]; //少し多めに
extern short keyflag[28];
//extern struct Ndam Nod[DMAX];
//extern struct Teki zako[30];
extern short ndnum;
extern short tnum;
extern int cro;


static int image2[48];


short tAction( double x, double y, short pat, short hp ) {
	static short lr = 0;


	if( zako[tnum].shoki == 0 ) {
		zako[tnum].x = x;
		zako[tnum].y = y;
		zako[tnum].hp = hp;
		zako[tnum].pat = pat;
		zako[tnum].shoki = 1;
	}
	switch( zako[tnum].pat ) {
	case 0:

		if( lr == 0 ) {
			if( map[Seisu( zako[tnum].y ) / Chip][Seisu( zako[tnum].x + 24 ) / Chip] == '1' ) {
				lr = 1;
			}
		} else if( lr == 1 ) {
			if( map[Seisu( zako[tnum].y ) / Chip][Seisu( zako[tnum].x - 24 ) / Chip] == '1' ) {
				lr = 0;
			}
		}

		if( lr == 0 ) {
			zako[tnum].x += 2;
			if( Seisu( zako[tnum].x ) % 20 == 0 ) {
				Ndmake( zako[tnum].x - 40, zako[tnum].y, -5, 0, 2, 150 );

			}
		} else if( lr == 1 ) {
			zako[tnum].x -= 2;

		}
		break;
	case 1:
		break;
	}
	if( Ndhan( tnum ) > 0 ) {
		zako[tnum].hp -= Ndhan( tnum );
		if( zako[tnum].hp <= 0 ) {
			printfDx( "てきはしんだ!" );
		}

	}

	return 0;

}
void tMitame() {
	static short reF = 0;
	if( reF == 0 ) {
		LoadDivGraph( "EDGE1.news.png" , 40 , 8 , 5 , 48 , 64 , image2 ); // 画像の分割読み込み
		reF = 1;
	}
	Sdraw( zako[tnum].x - 24, zako[tnum].y - 32, image2[1] , TRUE );
}

//zatukan.cpp
#include"DxLib.h"
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
//#include"defines.h"
//#include"Kansu.h"
extern int Pad;
extern short keyflag[28];
extern double rux, ruy;
extern short Mapy, Mapx, Mapy2, Mapx2;
extern short hirosa;
extern char map[50 + 1][70 + 1];
extern char map2[50 + 1][70 + 1];
extern short mapnm;

short Once( short i ) { //キーを押した瞬間のみ反応
	static short fle[28];


	if( Pad & ( 1 << i ) ) {
		{
			fle[i]++;
		}

		if( fle[i] >= 10000 ) {
			fle[i]--;
		}
	}

	else {
		fle[i] = 0;
	}
	return fle[i];

}

int Seisu( double i ) {
	int re;
	re = ( int )i;
	return re;


}
void Sdraw( int x, int y, int Grhandle, int Transflag ) {
	DrawGraph( x - rux + 320, y - ruy + 240, Grhandle, Transflag );
}

short MapRoad( short i ) { //テキストで見えない空白を入れると死にかねない。
	int FileHandle, F2;
	static short pi = 1555;

	if( i != pi ) {
		char Fname[18];
		Mapy = 0;
		Mapx = 70;
		sprintf( Fname, "mapdate%d.txt", i );
		FileHandle = FileRead_open( Fname );
		if( FileHandle == 0 ) {
			printfDx( "そんなファイルがあるか!" );
		}
		while( FileRead_eof( FileHandle ) == 0 ) {
			FileRead_gets( map[Mapy], 300, FileHandle );
			if( Mapy == 0 ) {
				Mapx = strlen( map[Mapy] );
			}
			Mapy++;
		}
		FileRead_close( FileHandle );



		char Fname2[18];
		Mapy2 = 0;
		Mapx2 = 70;
		sprintf( Fname2, "mapgim%d.txt", i );
		F2 = FileRead_open( Fname2 );
		if( F2 == 0 ) {
			printfDx( "そんなファイルがあるか2!" );
		}
		while( FileRead_eof( F2 ) == 0 ) {
			FileRead_gets( map2[Mapy2], 300, F2 );
			Mapx2 = strlen( map2[Mapy2] );
			Mapy2++;

		}
		FileRead_close( F2 );


		pi = i;
		printfDx( "読み込み" );
	}

	return 0;
}



int MapDraw() {
	static short riF = 0;
	static int haikei[16];
	static short x = 0, y = 0, syuru = 0;
	Mapch();
	MapRoad( mapnm );

	if( riF == 0 ) {
		LoadDivGraph( "EDGE.haikei.png" , 16 , 4 , 4 , 64 , 64 , haikei );//画像読み込み
		riF = 1;
	}




	for( y = 0 ; y < Mapy ; y ++ ) { //マップ描画
		for( x = 0 ; x < Mapx ; x ++ ) {
			if( x*Chip >= Seisu( rux ) - 400 && x*Chip <= Seisu( rux ) + 320 && y*Chip <= Seisu( ruy ) + 240 && y*Chip >= Seisu( ruy ) - 330 ) {
				//マップ内かどうか

				switch( map[y][x] ) {
				case ' ':
					syuru = 0;
					break;

				case'1':
				case'2':
				case'3':
				case'4':
				case'5':
				case'6':
				case'7':
				case'8':
				case'9':
					syuru = MojiS( map[y][x] );
					break;

				}
				DrawGraph( x * Chip - rux + 320, y * Chip - ruy + 240, haikei[syuru], TRUE );



			}
		}
	}//マップ描画
	return 0;
}

short MojiS( char moji ) {
	int suuti;
	if ( moji >= '0' && moji <= '9' ) { /* 判定部分 */
		suuti = moji - '0'; /* 数値に変換 */
	} else {
		suuti = 0;
	}
	return suuti;
}

void Keytxt() {
	for( int i = 0; i < 28; i++ ) {
		keyflag[i] = 0;
		if( Pad & ( 1 << i ) ) {        //ボタンiの入力フラグが立っていたら
			DrawFormatString( 0, i * 15, GetColor( 255, 255, 255 ), "%dのキーが押されています", i );
			keyflag[i] = 1;
		}
	}
	Pad = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;        //入力状態をPadに格納
}

short Mapch() {
	short cha = 0;

	switch( mapnm ) {
	case 0:
		if( MapGim( rux, ruy ) == 1 ) {
			mapnm = 1;
			rux = 150;
			ruy = 220;
		}
		break;
	case 1:
		if( MapGim( rux, ruy ) == 1 ) {
			mapnm = 0;
			rux = 1440;
			ruy = 340;
		}
		break;
	}


	cha = mapnm;
//printfDx("%d",cha);
	return cha;
}
short MapGim( double x, double y ) {
	static short ret;
	switch( map2[Seisu( y ) / Chip][Seisu( x ) / Chip] ) {
	case '1':
	case '2':
	case '3':
	case '4':
	case '5':
	case '6':
	case '7':
	case '8':
	case '9':

		ret = MojiS( map2[Seisu( y ) / Chip][Seisu( x ) / Chip] );
		break;
	case ' ':
		ret = 100;
		break;
	case 'b':
	case 'c':
	case 'd':
	case 'f':
		ret = 100 + ( map2[Seisu( y ) / Chip][Seisu( x ) / Chip] - 'a' );
	}
	return ret;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

探検者

Re: マップ描画のちらつき?

#8

投稿記事 by 探検者 » 7年前

ただキャラを動かしているだけでおきます。おそらく移動すると起きて、また移動すると消えます。起きたまま止まるとそのままだと思います。起こりやすい場所はあるかもしれませんが、気のせいかもしれません。
また、ときどきと書きましたが、今テストしていて出たら やった出た! と思うぐらい稀です。
縦向きのときも横向きのときもあります。移動方向と直角に発生していると思います。(移動が斜めのときはどちらでも)
その時、引き返すと、横移動ならxが同じ場所、縦移動ならyが同じ場所でまた発生するときもあります。それも何回かやっていると出なくなります。多分。(斜めのときも再現可。ずれずに斜めに引き返せるコマンドを取り入れて確認しました。)
(1)起こりません。
(2)全て表示されています。黒い線以外は何も問題ありません。
(3)起こります。MapDraw();//マップ描画
Syujou();//とまる、歩くなど操作キャラの状態遷移
Action();//座標をいじる
を動かしました。
マップデータはメモ帳のテキストファイルです。おかしなことになっていますが、メモ帳に貼るとまともになるはずです
mapdate0.txt//描画
1111111111111111111111111
11 1 1
1 1 1
1 1
11111 11
1 1
1 11
1111111111111111111111111
mapgim0.txt//マップ切り替え、当たり判定
ccccccccccccccccccccccccc
cc c c
c c c
c c
ccccc cc
c 1c
c cc
ccccccccccccccccccccccccc

mapdate0.txtでいうと、貼ったとき左から5、上から4あたりの狭い空間で上下移動しているとき起こりやすいかもしれません。止まる回数が多くて認識しやすいだけかもしれませんが。

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

Re: マップ描画のちらつき?

#9

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

移動しないと出ないのですね。だとすると移動に関係する処理が犯人の可能性が高いです。
画像やマップデータなど再現に必要なものを頂いた方が良いかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

探検者
記事: 2
登録日時: 7年前

Re: マップ描画のちらつき?

#10

投稿記事 by 探検者 » 7年前

マップの移動先にmapdate1,gim1もありますが、移動しなければすむし、これ以上添付できないので付けていません。
また問題があれば書いてください。
添付ファイル
mapgim0.txt
壁、マップ遷移判定
(214 バイト) ダウンロード数: 11 回
EDGE.haikei.png
背景画像
EDGE.haikei.png (3.7 KiB) 閲覧数: 725 回
mapdate0.txt
描画
(214 バイト) ダウンロード数: 10 回

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: マップ描画のちらつき?

#11

投稿記事 by へにっくす » 7年前

掲示されたソースは一つのCODEタグでかこってますが、
コメントをみる限り
main.cpp、dkan.cpp、syukan.cpp、tekikan.cpp、zatukan.cpp、defines.h、Kansu.h、Kouzou.h
8ファイルをまとめて掲示してるようです。
ちゃんと一つのファイルごとにCODEタグで囲ってください。
まさか1ファイルとしてコンパイルしてるわけじゃないよね?

(すでにsoftyaさんが一つのファイルにしてしまってますが、それを採用している場合は
この投稿は無視してよいです)
written by へにっくす

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

Re: マップ描画のちらつき?

#12

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

へにっくす さんが書きました:掲示されたソースは一つのCODEタグでかこってますが、
コメントをみる限り
main.cpp、dkan.cpp、syukan.cpp、tekikan.cpp、zatukan.cpp、defines.h、Kansu.h、Kouzou.h
8ファイルをまとめて掲示してるようです。
ちゃんと一つのファイルごとにCODEタグで囲ってください。
まさか1ファイルとしてコンパイルしてるわけじゃないよね?

(すでにsoftyaさんが一つのファイルにしてしまってますが、それを採用している場合は
この投稿は無視してよいです)
ソースがほしい人はzipにまとめてもらったほうが良い様に思います。
ちなみに私の所で現象は再現しておりますが、原因はつかめておりません。
カペルスキー様の調子が悪く、なんかCPU100%になるので動かせないのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: マップ描画のちらつき?

#13

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

たぶん、原因が分かりました。
doubleとintで型の混合演算を行っているため、まれに誤差で「y * Chip - ruy + 240」の演算結果にズレが生じている様です。
ずれた結果、パーツとパーツの隙間が生じています。ループ前にruyを整数化して変数を代わりに使うようにすれば直ると思われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

探検者
記事: 2
登録日時: 7年前

Re: マップ描画のちらつき?

#14

投稿記事 by 探検者 » 7年前

そのとおりだったようです。要点の分かりにくい質問にも真面目にお付き合いいただきありがとうございました。
後、txtデータは返信入力画面ではきちんとコピーできても、ウェブサイトの画面ではうまくいかないのですね。確認不足でした。

閉鎖

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