マップチップと操作するプレイヤーの画像を置き換える方法

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

マップチップと操作するプレイヤーの画像を置き換える方法

#1

投稿記事 by ドンキーコング » 13年前

どうもこんばんは、初めまして。
昨日からDXライブラリ様のサイトで勉強させていただいてます。以後よろしくお願いします。
C言語の知識は構造体ぐらいまでは何となく分かる程度です。
自分は、2DRPGを作りたいと思い、DXライブラリの勉強を始めました。
そして、入門まで終わらせたのでちょっと試しに作ってみようと思いました。
そこで
http://homepage2.nifty.com/natupaji/DxL ... m.html#N13
を参考にしながら作ろうと思ったのですが、さっそくつまずいてしまいました。
上記のページのコードを実行すると、壁とプレイヤーが四角になっているのですが、
この壁とプレイヤーを別の画像に置き換えたいのですが、それがどうやってもできません・・・。
LoadDivGraph関数で画像を読み込んで、どうにかすればいいんだろうと思ったのですが、それがどうしても分かりません。
どうやったらこの画像を置き換えつつ、矢印キーを押してそれらの向きに対応した画像になるんでしょうか・・・
よろしくお願いします。

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

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#2

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

はじめまして。
この掲示板のあるサイトには「新・C言語 ~ゲームプログラミングの館」というページがありDXライブラリの入門記事があります。
http://dixq.net/g/
そちらにはキャラクタの歩かせ方もありますのでひと通り勉強されると良いと思います。
LoadDivGraph関数で読むという着想は間違いではなく、そのとおりなのですがキャラクタのイメージハンドル格納用としてint型の配列が必要になります。
LoadDivGraphで、どういう風にやるのかは「新・C言語 ~ゲームプログラミングの館」の下にある旧館の記事になります。
17. 画像を分割して読み込む
18. 構造体でキャラクタデータを作る
19. キャラをキー入力によって移動させる。
20. キャラを一区間単位で移動させる。
21. キャラを一区間歩かせる。
22. キャラを4方向に歩かせる。
23. 行けない所を作る。~1D~
24. 行けない所を作る。~2D~
あたりが参考になるでしょう。

あとリンク先はこっちの間違いだと思いますが違いますか?
http://homepage2.nifty.com/natupaji/DxL ... am.html#N4

私が書いたRPG講座もあるのですが、構造体までの理解だと難しすぎるかも知れません。
「簡単RPG講座 改め 超短いRPG講座」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ドンキーコング

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#3

投稿記事 by ドンキーコング » 13年前

返信の方、どうもありがとうございます。
旧館の方を参考にしながら、サンプルプログラムを改造してみました。
(すみません、リンク先はそちらの方が正しかったです。)
それで、プレイヤーの方は何とかそれっぽいところまでは行けたのですが、今度は歩いてくれなくなってしまいました。。
サンプルプログラムの移動方法と旧館の移動方法は何か違うようなのでそこら辺でごっちゃになっているのかもしれません。
ちなみに現在のその改造したコードは、

コード:


// マップスクロール基本
#include "DxLib.h"

#define MAP_SIZE	32			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	16			// マップの縦長さ

#define MOVE_FRAME	16			// 移動にかけるフレーム数

typedef struct{
        int x,y,img,muki,walking_flag;
}ch_t;

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

	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
	{ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
	{ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
	{ 0, 0, 0, 1, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 ,  1, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
} ;

// プレイヤーの位置
int PlayerX , PlayerY ;

// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;

// 各方向に移動する量
int MoveX, MoveY ;

// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;

// マップとプレイヤーの描画関数
void GraphDraw( int ScrollX, int ScrollY )
{
	int j , i ;
	int MapDrawPointX , MapDrawPointY ;		// 描画するマップ座標値
	int DrawMapChipNumX , DrawMapChipNumY ;	// 描画するマップチップの数


	// 描画するマップチップの数をセット
	DrawMapChipNumX = 640 / MAP_SIZE + 2 ;
	DrawMapChipNumY = 480 / MAP_SIZE + 2 ;

	// 画面左上に描画するマップ座標をセット
	MapDrawPointX = PlayerX - ( DrawMapChipNumX / 2 - 1 ) ;
	MapDrawPointY = PlayerY - ( DrawMapChipNumY / 2 - 1 ) ;

	// マップを描く
	for( i = -1 ; i < DrawMapChipNumY ; i ++ )
	{
		for( j = -1 ; j < DrawMapChipNumX ; j ++ )
		{
			// 画面からはみ出た位置なら描画しない
			if( j + MapDrawPointX < 0 || i + MapDrawPointY < 0 ||
				j + MapDrawPointX >= MAP_WIDTH || i + MapDrawPointY >= MAP_HEIGHT ) continue ;

			// マップデータが0だったら四角を描画する
			if( MapData[ i + MapDrawPointY ][ j + MapDrawPointX ] == 0 )
			{
				DrawBox(j * MAP_SIZE + ScrollX,			i * MAP_SIZE + ScrollY,
					j * MAP_SIZE + MAP_SIZE + ScrollX,	i * MAP_SIZE + MAP_SIZE + ScrollY,
					GetColor( 255 , 0 , 0 ) , TRUE ) ;
			}
		}
	}

	// プレイヤーの描画
}

// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	int ScrollX, ScrollY ;
	int image[16];
	ch_t ch;

	SetGraphMode( 640 , 480 , 16 ) ;
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK ||  DxLib_Init() == -1 )	// DXライブラリ初期化処理
	{
		 return -1;				// エラーが起きたら直ちに終了
	}

	ch.x    =320;
    ch.y    =222;
	ch.walking_flag=0;
	ch.muki =3;

	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	LoadDivGraph( "画像/キャラクタ10.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存


	// プレイヤーの初期位置をセット
	PlayerX = 1 ;
	PlayerY = 1 ;

	// 最初は停止中(0)にしておく
	Move = 0 ;

	// ループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面を初期化
		ClearDrawScreen() ;

		// 移動中ではない場合キー入力を受け付ける
		if( Move == 0 )
		{
			// キー入力を得る
			Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

			// キー入力に応じてプレイヤーの座標を移動
			if( Key & PAD_INPUT_LEFT )
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
				ch.muki=1;         //左向きフラグを立てる
			}
			if( Key & PAD_INPUT_RIGHT )
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
				ch.muki=3;         //右向きフラグを立てる
			}
			if( Key & PAD_INPUT_UP )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				ch.muki=0;         //上向きフラグを立てる
			}
			if( Key & PAD_INPUT_DOWN )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
				ch.muki=2;         //下向きフラグを立てる
			}

			
        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( Move == 1 )
			{
				if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] == 0 )
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}

			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
			ScrollY = 0 ;
		}

		// 移動中の場合は移動処理を行う
		if( Move == 1 )
		{
			MoveCounter ++ ;

			// 移動処理が終了したら停止中にする
			if( MoveCounter == MOVE_FRAME )
			{
				Move = 0 ;

				// プレイヤーの位置を変更する
				PlayerX += MoveX ;
				PlayerY += MoveY ;

				// 停止中は画面のスクロールは行わない
				ScrollX = 0 ;
				ScrollY = 0 ;
			}
			else
			{
				// 経過時間からスクロール量を算出する
				ScrollX = -( MoveX * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;
				ScrollY = -( MoveY * MAP_SIZE * MoveCounter / MOVE_FRAME ) ;
			}
		}

		ch.img=image[(ch.x%32+ch.y%32)/8 + ch.muki*4];
		DrawGraph( ch.x , ch.y , ch.img , TRUE ) ;//画像を描画

		// マップとプレイヤーを描画
		GraphDraw( ScrollX, ScrollY ) ;

		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;					// ソフトの終了
}

となっています。
どこかおかしいところがありましたら助言よろしくお願いします。

夕月

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#4

投稿記事 by 夕月 » 13年前

コード:

ch.walking_flag==1
移動してもここフラグ立ってないよ

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

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#5

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

夕月 さんが書きました:

コード:

ch.walking_flag==1
移動してもここフラグ立ってないよ
補足しておくとwalking_flagを参照してますが、値を設定している部分が無いと言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ドンキーコング

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#6

投稿記事 by ドンキーコング » 13年前

返信ありがとうございます。
すいません、昼からずっと考えて見ましたがもう限界です。
walking_flagの値を設定するというのは、ch.walking_flag=1;というのを入れればいいんでしょうか?
という訳でこれを入れることでフラグが立って歩いてくれると思ったのですが
実際に入れてみると、勝手に壁を無視して歩き出してしまったり、
壁に向かったときのみ壁を貫通して歩いたり、もう制御ができません。
フラグが立った後がおかしいのかと、if(ch.walking_flag==1)の後のch.y--;をMoveY = -1 ;にしてみると最初の状況に戻ってしまいます。
値を設定すると画像自体は歩く動きをするのですが、キーを押した瞬間に歩く動きをするというわけではなく
上記のようなときにのみ歩くということをします。
すいません、もう諦めます。
こんなこともできないのにこれから他にもNPCとか会話とかも作らないといけないと思うと多分ムリです。
ありがとうございました。

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

Re: マップチップと操作するプレイヤーの画像を置き換える方法

#7

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

ドンキーコング さんが書きました:返信ありがとうございます。
すいません、昼からずっと考えて見ましたがもう限界です。
walking_flagの値を設定するというのは、ch.walking_flag=1;というのを入れればいいんでしょうか?
という訳でこれを入れることでフラグが立って歩いてくれると思ったのですが
実際に入れてみると、勝手に壁を無視して歩き出してしまったり、
壁に向かったときのみ壁を貫通して歩いたり、もう制御ができません。
フラグが立った後がおかしいのかと、if(ch.walking_flag==1)の後のch.y--;をMoveY = -1 ;にしてみると最初の状況に戻ってしまいます。
値を設定すると画像自体は歩く動きをするのですが、キーを押した瞬間に歩く動きをするというわけではなく
上記のようなときにのみ歩くということをします。
すいません、もう諦めます。
こんなこともできないのにこれから他にもNPCとか会話とかも作らないといけないと思うと多分ムリです。
ありがとうございました。
こういう所が面白いというか、うまく思ったように制御出来た時の達成感が有るんですが楽しめないと辛いかも知れません。
たぶん、一度に機能を盛り込みすぎだと思います。ちょっとした機能から足していくことで目的を達成しないと訳がわからなくなります。
それとサンプルにも頼りすぎたのでしょう。サンプルはあくまで参考で自分なりに消化して自分のものとしてリファインできないとうまく使いこなせません。

もしプログラミングが辛いのでしたらプログラミングをしない「WOLF RPGエディター」などを使われたほうが良いと思います。
「WOLF RPGエディター公式サイト 【RPG作成フリーソフト】」
http://www.silversecond.com/WolfRPGEditor/
また、「WOLF RPGエディター」で物足りなくなったら戻プログラミングにってきてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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