マップチップを使った、RPGのようなマップの斜め移動について

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

マップチップを使った、RPGのようなマップの斜め移動について

#1

投稿記事 by ゴンマサ » 10年前

以前もこちらで質問させていただきました。宜しくお願いいたします。

マップチップを使ってRPGのようなマップを製作しています。
マップチップの種類は、通行可、通行不可、斜めに通行する、の三種類です。
通行可、通行不可のマップチップは作成できたのですが、斜め移動の通行だけできません。
座標がマップチップ内に入ると、ただ通るだけになってしまいます。

以下のコードは、どこかで見つけたコードを元に改良したものです。
マップチップ3にプレイヤーが上から下に向けて進入していった時だけ斜め移動するように記述したつもりです。

また、最終的にマップチップごとの画像は準備せず、一枚絵を用意してマップチップごとの作用に対応させるようにするつもりです。


自分なりの考えとしては、坂として扱いたい座標からはみ出た分だけ動かせばいいと思いました。
下記のコードでは、上からマップチップ3に進入した場合、右へ4回に分けて移動させれば、結果として斜めに移動しているように見えると思い記述したものです。

しかし結果としては右に移動したのは左端から進入したときだけで、あとはまっすぐ下に通り抜けてしまいます。

何が足りないのか見当がつかなくなったため、質問させていただきました。
宜しくお願いいたします。


コード:

 
#include "DxLib.h"

#define GAME_WINDOW_WIDTH 320
#define GAME_WINDOW_HEIGHT 256
#define MAP_HEIGHT 10
#define MAP_WIDTH 13
#define MAPCHIP_SIZE 32

int kakunin;
int Umi;
int Kusa;
int Ana;
int Naname;

int player = LoadGraph("player.jpg");
int x,y;
int yoko,tate;//プレイヤーの座標
int idou;

//マップチップ
int MapData[MAP_HEIGHT][MAP_WIDTH]=
{
	{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,0},
	{0,1,1,2,1,  1,1,1,1,1, 0,1,0},
	{0,1,1,1,1,  1,1,1,1,1, 1,1,0},

	{0,1,1,1,1,  1,1,1,1,1, 1,1,0},
	{0,3,1,1,1,  1,1,1,1,1, 1,1,0},
	{0,0,3,1,1,  1,1,1,1,1, 1,1,0},
	{0,0,0,0,0,  0,0,0,0,0, 0,0,0},

};
//右マップを増やした結果、スクロールはされないものの判定はある


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{


SetGraphMode( GAME_WINDOW_WIDTH,GAME_WINDOW_HEIGHT, 16);
if( DxLib_Init() == -1 )
{
return -1;
}


SetDrawScreen( DX_SCREEN_BACK );

yoko = 32 * 4;
tate = 32 * 3;
idou = 8;

//メインループ
while(CheckHitKey(KEY_INPUT_ESCAPE) == 0){

ClearDrawScreen();
		

kakunin = LoadGraph("背景.png");
Naname = LoadGraph("斜め.png");
/*
Umi = LoadGraph("海.png");
Kusa = LoadGraph("草.png");
Ana = LoadGraph("穴.png");
*/

DrawGraph(0,0,kakunin,TRUE);


//マップチップを使った背景の描画
for( x = 0;x < MAP_HEIGHT; x++ )
{
	for( y = 0; y < MAP_WIDTH; y++ )
	{
		if(MapData[y][x] == 0 )
		{
			DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE , Umi, TRUE);
		}
		else if(MapData[y][x]==1)
		{
			DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE,  Kusa, TRUE);
		}
		else if(MapData[y][x]==2)
		{
			DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE, Ana , TRUE);
		}
		else if(MapData[y][x]==3)
		{
			DrawGraph( x * MAPCHIP_SIZE , y * MAPCHIP_SIZE, Naname , TRUE);
		}
	}
}

//キャラクターの移動

//左への移動
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
   {
   if(MapData[tate/32][(yoko - idou)/32] != 0 && MapData[(tate + 31)/32][(yoko - idou)/32] != 0)
      {
      if(MapData[tate/32][(yoko - idou)/32] != 2 && MapData[(tate + 31)/32][(yoko - idou)/32] != 2)
         {
                     yoko -= idou;
         }
      }
   }


//右への移動
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
   {
   if(MapData[tate/32][(yoko + 31 + idou)/32] != 0 && MapData[(tate + 31)/32][(yoko +31+ idou)/32] != 0)
      {
      if(MapData[tate/32][(yoko + 31 + idou)/32] != 2 && MapData[(tate + 31)/32][(yoko +31+ idou)/32] != 2)
         {
                yoko += idou;
         }
      }
   }



//上への移動
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
   {
   if(MapData[(tate - idou)/32][yoko/32] != 0 && MapData[(tate - idou)/32][(yoko + 31)/32] != 0)
      {
      if(MapData[(tate - idou)/32][yoko/32] != 2 && MapData[(tate - idou)/32][(yoko + 31)/32] != 2)
         {
                tate -= idou;
         }
      }
   }


//下への移動
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
   {
   if(MapData[(tate + 31 + idou)/32][yoko/32] !=0 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] != 0)
      {
      if(MapData[(tate + 31 + idou)/32][yoko/32] !=2 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] != 2)
         {
                  tate += idou;
         }
      }
   }

//右下へ斜め移動するマップチップとの衝突判定

if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
   {
   if(MapData[(tate + 31 + idou)/32][yoko/32] ==3 && MapData[(tate + 31 + idou)/32][(yoko + 31)/32] == 3)
      {
      tate += idou;

      if((tate % 32) - (yoko % 32) == idou )
         {
                    yoko += idou;
         }
      }
   }


		LoadGraphScreen( yoko,tate,"player.png",TRUE );
		ScreenFlip();
		WaitTimer(20);


       }

		DxLib_End();
	        return 0;
}



アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: マップチップを使った、RPGのようなマップの斜め移動について

#2

投稿記事 by usao » 10年前

3とかいうチップがある座標に存在するときに,
斜め移動という結果になって欲しい(tate,yoko)の座標範囲と,
現コードの155行目の条件が満たされる(tate,yoko)の座標範囲というのが
それぞれどうなるのかを絵でも描いて比較してみればわかるのではないでしょうか.

ゴンマサ

Re: マップチップを使った、RPGのようなマップの斜め移動について

#3

投稿記事 by ゴンマサ » 10年前

返信ありがとうございます。
早速計算しなおしてみます。

閉鎖

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