グラフィックの奥、乗せ関係

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

グラフィックの奥、乗せ関係

#1

投稿記事 by ice » 16年前

こんにちは
以前よりお世話になっておりますiceです。

今DXライブラリで、RPG(2次元ドットタイプ)を制作しているのですが
PCとNPCが重なるときに
NPCより上に居るときはPCが隠れる
NPCより下に居るときはPCが見える
というふうにしたいのですが、どうすればいいでしょうか。

以下はPCの移動、NPCの描画で使用してるソースです。
void playercontrol1()
{

	DrawGraph( (int)pl[1].x , (int)pl[1].y , pl[1].img , TRUE ) ;//キャラの描画

	dash=1;

	if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_C )
	{
		dash=2;
	}

	if(pl[1].kou==0) 

	if(pl[1].kou>=0)
	{

		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT )
	        pl[1].kou=8;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT )
	        pl[1].kou=2;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT )
	        pl[1].kou=6;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT )
	        pl[1].kou=4;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
	        pl[1].kou=1;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
	        pl[1].kou=5;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 )
	        pl[1].kou=7;
		if( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0 && ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 )
	        pl[1].kou=3;
		if(( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_UP ) == 0	&&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_RIGHT ) == 0
			&&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_DOWN ) == 0 &&( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_LEFT ) == 0 )
	        pl[1].kou=0;
	}
}

void npc()
{
	DrawGraph( (int)en[1].x , (int)en[1].y , en[1].img , TRUE ) ;//NPCの描画

		if( pl[1].kou==1 )
	        en[1].y+=2.5*dash;
		if( pl[1].kou==2 )
	        en[1].y+=2.5*dash,en[1].x-=2.5*dash;
		if( pl[1].kou==3 )
	        en[1].x-=2.5*dash;
		if( pl[1].kou==4 )
	        en[1].y-=2.5*dash,en[1].x-=2.5*dash;
		if( pl[1].kou==5 )
	        en[1].y-=2.5*dash;
		if( pl[1].kou==6 )
	        en[1].y-=3*dash,en[1].x+=2.5*dash;
		if( pl[1].kou==7 )
	        en[1].x+=2.5*dash;
		if( pl[1].kou==8 )
	        en[1].y+=2.5*dash,en[1].x+=2.5*dash;
}
背景スクロールタイプなのでこのようなソースになってます。
簡略化できるところとかあれば加えてご教授お願いします。
またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。

以上よろしくお願いします。

fatens

Re:グラフィックの奥、乗せ関係

#2

投稿記事 by fatens » 16年前

ソースはプレタグを使ってください。

>簡略化できるところとかあれば加えてご教授お願いします。
PCの移動の際に何度もGetJoypadInputStateを呼ぶのは効率的ではありません。
playercontrol1関数の最初で

pad_input = GetJoypadInputState(DX_INPUT_KEY_PAD1)

などとしておき、if文ではこれを用いる方がいいと思います。

>またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。
配列にしているようなので、移動や描画の処理でfor文を使えばいいのでは?

本題でないことばかり書いてしまった...

Justy

Re:グラフィックの奥、乗せ関係

#3

投稿記事 by Justy » 16年前


>どうすればいいでしょうか

 各オブジェクトにプライオリティ(優先度)をつけてリストに追加します。
 そのリストを描画前にプライオリティでソートしてから、リストの順に表示すれば
描画順番はプライオリティに応じて入れ替わります。

ice

Re:グラフィックの奥、乗せ関係

#4

投稿記事 by ice » 16年前

fatens様
プレタグ了解しました。規約と注意事項にかかれてますね・・・
今回の修正しておきました、次回からきをつけます。

>PCの移動の際に何度もGetJoypadInputStateを呼ぶのは効率的ではありません。
>playercontrol1関数の最初で
>pad_input = GetJoypadInputState(DX_INPUT_KEY_PAD1)
やってみました。うまくいったようです。有難うございます。

>>またNPCを複数出したい際に同じソースを何度も書かなくて良いようにする方法はありますでしょうか。
>配列にしているようなので、移動や描画の処理でfor文を使えばいいのでは?
for(ループだったっけ?)についてよく理解していないのでこちらはわからないです。
もう少し詳しく教えていただけますでしょうか。


Justy様
>各オブジェクトにプライオリティ(優先度)をつけてリストに追加します。
>そのリストを描画前にプライオリティでソートしてから、リストの順に表示すれば
>描画順番はプライオリティに応じて入れ替わります。
イメージは理解できるのですが、具体的にはどのような方法で行えるのでしょうか。
参考になるものがあれば教えてください。

それとこのような記事を見つけたのですが近い類のものでしょうか。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1146

fatens

Re:グラフィックの奥、乗せ関係

#5

投稿記事 by fatens » 16年前

forは例えばこんな感じになるでしょうか。
#include "DxLib.h"

//キャラの構造体
struct {
	int x, y;		//座標
	int vx, vy;		//速度
} Chara[3];

int ImgChara;		//キャラの画像

//キャラの移動処理
void MoveChara()
{
	for (int i = 0; i < 3; i++) {
		Chara.x += Chara.vx;
		Chara.y += Chara.vy;
	}
}

//キャラの描画処理
void DrawChara()
{
	for (int i = 0; i < 3; i++)
		DrawGraph(Chara.x, Chara.y, ImgChara, TRUE);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);					//スクリーンモード

	if (DxLib_Init() == -1)					//DXライブラリの初期化
		return -1;

	SetDrawScreen(DX_SCREEN_BACK);			//裏画面を使用

	ImgChara = LoadGraph("Chara.bmp");		//画像をロード

	//速度を設定
	Chara[0].vx = 1;
	Chara[1].vx = 1;
	Chara[1].vy = 1;
	Chara[2].vy = 1;

	while (ProcessMessage() == 0) {
		ClearDrawScreen();					//描画をクリア
		MoveChara();						//移動処理
		DrawChara();						//描画処理
		ScreenFlip();						//裏画面を表画面に転送
	}

	DxLib_End();							//DXライブラリの終了

	return 0;
}


シューティングゲーム?のサンプルソースです。
画像さえあれば実行できるようになっています。
参考にならないかも知れませんが、for文の使い方を分かっていただけたら。

P.S
プレタグを使うと横長になりすぎましたね...

Justy

Re:グラフィックの奥、乗せ関係

#6

投稿記事 by Justy » 16年前


>具体的にはどのような方法で行えるのでしょうか

 やりかたはいろいろあるのですが、
簡単なサンプルですと、管理人さん作のこちらがわかりやすそうです。

C言語何でも質問掲示板
http://dixq.net/board/log/bbslog_81.html#25710




>それとこのような記事を見つけたのですが近い類のものでしょうか

 近い、というかそのものずばりです。

ice

Re:グラフィックの奥、乗せ関係

#7

投稿記事 by ice » 16年前

fatens様
for文なんとなく理解しました。
使ってみたところうまくいったようです。有難うございました。

Justy様
すごく難解ですね・・・
サンプル、test.cppを見ても
何処から何処までが私に必要なソースなのかがさっぱりでした。
弾の処理はおいといて、該当するプライオリティに必要なソースはどの当たりになるのでしょうか。

Justy

Re:グラフィックの奥、乗せ関係

#8

投稿記事 by Justy » 16年前


>必要なソースはどの当たりになるのでしょうか

 たかだが 150行程度のコードなので、がんばって読み解いてほしいところですが、
強いていうなら SortBullet関数ということになります。

 ただ、MyQsort()び中身についてはメンバ yの大小関係でソートして並び替えていることが
理解できれば十分です。

ice

Re:グラフィックの奥、乗せ関係

#9

投稿記事 by ice » 16年前

Justy様
ソースみてやってることはなんとなく理解できたのですが、
自分では書くことが出来そうになかったのでこういう発想をしてみました。

処理の最後の最後、表示のところなんですが・・・
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0)
	{
		RefreshTime = GetNowCount();		  //今の時間を取得
		ClearDrawScreen();		//裏画面のデータを全て削除

		if(pl[1].y < en[1].y)
			{
				playercontrol1();
				npc();
			}		

		else if(pl[1].y >= en[1].y)
			{
				npc();
				playercontrol1();
			}

		ScreenFlip();		  //裏画面データを表画面へ反映
		counter++;

		if(Key[KEY_INPUT_ESCAPE]==1)	break;  //Escapeが押されたら終了
		while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ
	}

一応、NPCより上に居るときはPCが隠れる、NPCより下に居るときはPCが見える
というのは満たしましたが、移動するごとに徐々にNPCがずれていきます。
こんなところで処理を行うのが問題でしょうか。

fatens

Re:グラフィックの奥、乗せ関係

#10

投稿記事 by fatens » 16年前

関数内で、描画処理と移動処理を両方行っているからです。
それぞれを別の関数に分ければ今の形でもいけます。
if文の外で移動処理、if文の中で描画処理という感じで。
それと、 else if(pl[1].y >= en[1].y) は else でいけると思います。

>こんなところで処理を行うのが問題でしょうか。
上で書いたようにするとできると思いますが、このまま進めていくとおそらくWinMain関数が長くなりすぎるので、
別の関数を作ってそこで処理を行うようにするといいかもしれません。

ice

Re:グラフィックの奥、乗せ関係

#11

投稿記事 by ice » 16年前

fatens様

遅くなりましたがヒント有難うございます。
解決できました。
また機会があればよろしくお願いしまっす。

閉鎖

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