敵の位置の表示について

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

敵の位置の表示について

#1

投稿記事 by BLACK++ » 14年前

こんばんは。

今オンラインRPGゲームを作っているのですが、敵の位置が実際の位置とは違うところに行ってしまいます。

デバックしたファイルもアップロードしておきました。

一度やってみてください

http://ll.la/sP(u

パス kkk

お願いします

コード:

#include "DxLib.h"
#include "map_hantei.h"
#include "data.h"

int hantei[37][39] = {
		{ 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,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,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,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,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,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,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,1,1,1,1,1,1,1,1,1,1,1,1,2,2,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,2,2,2,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,2,2,2,2,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,2,1,1,1,1,2,2,2,0,2,2,2,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,2,2,2,1,1,2,2,2,0,2,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,2,2,1,2,2,2,0,2,2,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,2,2,2,2,0,2,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,0,0,0,2,2,0,0,0,0,0,0,0,0,2,2,2,0,0,1,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,2,2,0,0,2,0,0,0,0,0,0,0,0,2,2,0,0,0,2,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,2,2,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,2,0,0,0,0,2,2,2,1,1,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,2,0,0,0,1,0,2,1,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,2,2,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,2,0,0,2,2,0,0,2,0,0,0,2,2,2,0,2,1,0,2,2,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,2,2,2,0,0,0,2,0,2,2,1,0,2,2,2,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,0,2,2,0,2,2,0,0,2,0,0,0,0,0,0,2,2,0,2,2,2,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,0,0,0,0,0,2,2,0,2,2,0,2,2,2,2,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,2,2,2,2,0,2,0,0,2,2,1,1,1,1,1,1,1,1,1 },
        { 1,1,1,1,1,1,1,1,1,2,2,2,1,2,1,2,1,1,2,2,2,2,2,2,0,2,0,0,2,2,1,1,1,1,1,1,1,1,1 },
		{ 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,0,0,0,0,0,0,0,0,2,2,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,2,2,0,0,0,0,2,2,2,2,2,2,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,2,0,0,0,2,2,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,2,2,2,2,2,2,2,2,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,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,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,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,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,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,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,1 },
};
 
int IsAbleToGo(int x,int y,int muki){//進めるかを判定する
        if(muki==0)//上向きなら
                if(hantei[y/32-1][x/32]==1)//進めるか判定
                        return 1;//エラー
        if(muki==1)//左向きなら
                if(hantei[y/32][x/32-1]==1)
                        return 1;
        if(muki==2)//下向きなら
                if(hantei[y/32+1][x/32]==1)
                        return 1;
        if(muki==3)//右向きなら
                if(hantei[y/32][x/32+1]==1)
                        return 1;
        return 0;//正常
}

void Map(){

	SaveData_t Data ;
	Enemy_t Enemy ;

	int image[12],image2[7],i,j,map_img,White,flg,flg2;
	int map_x,map_y;
	int my_kiten_x,my_kiten_y;
	int No;
    char Key[256];
    ch_t ch;
	//Data.Exp = 0;

	flg = 0;

	if(flg == 0){
		FILE *fp = fopen( "save_data.dat", "rb" ); // ファイルを開く
		fread( &Data, sizeof(Data), 1, fp );
		FILE *wp = fopen( "heiya/save_data.dat", "rb" ); // ファイルを開く
		fread( &Enemy, sizeof(Enemy), 1, wp );
	}

	Enemy.en_x = 320;
	Enemy.en_y = 416;
	//Enemy.Exp = 0;
	map_x = -1 * (Data.my_x - 320);
	map_y = -1 * (Data.my_y - 224);
	my_kiten_x = 320;
	my_kiten_y = 224;
    ch.walking_flag=0;
    ch.muki=3;
	ch.muki2 = 3;
	//Data.my_y=224;
	//Data.my_x=320;
	ch.x    =Data.my_x;
	ch.y    =Data.my_y;
	White   = GetColor( 255 , 255 , 255 ) ;
 
    SetDrawScreen( DX_SCREEN_BACK ) ;                                                 //描画先を裏画面に設定
    LoadDivGraph( "char2.png" , 12 , 3 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存
	LoadDivGraph( "TileA.png" , 7 , 7 , 1 , 32 , 32 , image2 ) ;

	FILE *fp = fopen( "save_data.dat", "wb" );
	fwrite( &Data, sizeof(Data), 1, fp ); // ファイルにmoneyの値を出力する
	fclose( fp );
	FILE *wp = fopen( "heiya/save_data.dat", "wb" );
	fwrite( &Enemy, sizeof(Enemy), 1, wp ); // ファイルにmoneyの値を出力する
	fclose( wp );
 
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
            //↑メッセージ処理        ↑画面をクリア         ↑キーボード入力状態取得       ↑ESCが押されると終了

		if(flg == 0){
			FILE *fp = fopen( "save_data.dat", "rb" ); // ファイルを開く
			fread( &Data, sizeof(Data), 1, fp );
			FILE *wp = fopen( "heiya/save_data.dat", "rb" ); // ファイルを開く
			fread( &Enemy, sizeof(Enemy), 1, wp );
			flg = 1;
		}
                /*白い壁を描画*/

		for(i=0;i<37;i++){
			for(j=0;j<39;j++){
				map_img = 0;
				if(hantei[i][j]==0){ map_img = image2[0]; }
				if(hantei[i][j]==1){ map_img = image2[5]; }
				if(hantei[i][j]==2){ map_img = image2[6]; }
				DrawGraph(  j * 32 + map_x, i * 32 + map_y , map_img , TRUE ) ;
			}
		}
 
                if(ch.x%32==0 && ch.y%32==0){         //座標が32で割り切れたら入力可能
            ch.walking_flag=1;         //歩くフラグを立てる。
			if     ( Key[ KEY_INPUT_UP   ]  == 1 ){  //上ボタンが押されたら
                    ch.muki=0;         //上向きフラグを立てる
					if(hantei[ch.y/32-1][ch.x/32]==1 || hantei[ch.y/32-1][ch.x/32]==2)
						ch.walking_flag=0;
					else{
						Data.Exp++;
						Data.my_y-=32;
						flg2 = rand() % 4;
					}
			}
			else if( Key[ KEY_INPUT_LEFT ]  == 1 ){  //左ボタンが押されたら
                    ch.muki=1;         //左向きフラグを立てる
					if(hantei[ch.y/32][ch.x/32-1]==1 || hantei[ch.y/32][ch.x/32-1]==2)
						ch.walking_flag=0;
					else{
						Data.Exp++;
						Data.my_x-=32;
						flg2 = rand() % 4;
					}
			}
			else if( Key[ KEY_INPUT_DOWN ]  == 1 ){  //下ボタンが押されたら
                    ch.muki=2;         //下向きフラグを立てる
					if(hantei[ch.y/32+1][ch.x/32]==1 || hantei[ch.y/32+1][ch.x/32]==2)
						ch.walking_flag=0;
					else{
						Data.Exp++;
						Data.my_y+=32;
						flg2 = rand() % 4;
					}
			}
			else if( Key[ KEY_INPUT_RIGHT]  == 1 ){  //右ボタンが押されたら
                    ch.muki=3;         //右向きフラグを立てる
					if(hantei[ch.y/32][ch.x/32+1]==1 || hantei[ch.y/32][ch.x/32+1]==2)
						ch.walking_flag=0;
					else{
						Data.Exp++;
						Data.my_x+=32;
						flg2 = rand() % 4;
					}
			}
			else{                                    //何のボタンも押されてなかったら
                    ch.walking_flag=0; //歩かないフラグを立てる
					flg2 = 5;
			}
        }
 
        if(ch.walking_flag==1){        //歩くフラグが立っていたら
			if     (ch.muki==0){        //上向きならch.y座標を減らす
                    ch.y--;
					map_y++;
			}
			else if(ch.muki==1){        //左向きならch.x座標を減らす
                    ch.x--;
					map_x++;
			}
			else if(ch.muki==2){        //下向きならch.y座標を増やす
                    ch.y++;
					map_y--;
			}
			else if(ch.muki==3){        //右向きならch.x座標を増やす
                    ch.x++;
					map_x--;
			}
        }

		if(flg2 == 0){
			if(hantei[Enemy.en_y/32][Enemy.en_x/32+1]==1 || hantei[Enemy.en_y/32][Enemy.en_x/32+1]==2){
			Enemy.en_x++;
			ch.muki2 = 3;
			}
		}
		else if(flg2 == 1){
			if(hantei[Enemy.en_y/32][Enemy.en_x/32-1]==1 || hantei[Enemy.en_y/32][Enemy.en_x/32-1]==2){
			Enemy.en_x--;
			ch.muki2 = 1;
			}
		}
		else if(flg2 == 2){
			if(hantei[Enemy.en_y/32-1][Enemy.en_x/32]==1 || hantei[Enemy.en_y/32-1][Enemy.en_x/32]==2){
			Enemy.en_y--;
			ch.muki2 = 0;
			}
		}
		else if(flg2 == 3){
			if(hantei[Enemy.en_y/32+1][Enemy.en_x/32]==1 || hantei[Enemy.en_y/32+1][Enemy.en_x/32]==2){
			Enemy.en_y++;
			ch.muki2 = 2;
			}
		}

 
        ch.img=image[(ch.x%32+ch.y%32)/12 + ch.muki*3];            //画像をセット
        DrawGraph( my_kiten_x , my_kiten_y , ch.img , TRUE ) ;//画像を描画
		ch.img2=image[(Enemy.en_x%32+Enemy.en_y%32)/12 + ch.muki2*3];
		DrawGraph( Enemy.en_x - ch.x + 320 , Enemy.en_y - ch.y + 224 , ch.img2 , TRUE ) ;//敵の場所

		DrawFormatString(  0,  0, White , "総移動距離%d"   , Data.Exp  );
		DrawFormatString(  0,  20, White , "X軸%d"   , ch.x  );
		DrawFormatString(  0,  40, White , "Y軸%d"   , ch.y  );
		DrawFormatString(  0,  60, White , "データX軸%d"   , Data.my_x  );
		DrawFormatString(  0,  80, White , "データY軸%d"   , Data.my_y  );
		DrawFormatString(  0,  100, White , "敵X軸%d"   , Enemy.en_x  );
		DrawFormatString(  0,  120, White , "敵Y軸%d"   , Enemy.en_y  );


		FILE *fp = fopen( "save_data.dat", "wb" );
		fwrite( &Data, sizeof(Data), 1, fp ); 
		fclose( fp );
		FILE *wp = fopen( "heiya/save_data.dat", "wb" );
		fwrite( &Enemy, sizeof(Enemy), 1, wp ); // ファイルにmoneyの値を出力する
		fclose( wp );
 
        ScreenFlip();
    }

}

BLACK++

Re: 敵の位置の表示について

#2

投稿記事 by BLACK++ » 14年前

http://www1.axfc.net/uploader/He/so/345014
パス kkk

アドレスを再設定しました。

こちらでお願いします

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

Re: 敵の位置の表示について

#3

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

とりあえず、下記を読んでみてください。

「スクロールの考え方 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9309
「あたり判定のスクロール • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9507
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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