ページ 11

DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 09:42
by メロンくん
DXライブラリでRPGを制作しようとしているのですが、キャラの歩行時に何故かマップが微妙に暗くなってしまいます。
それはキャラが移動していてマップがスクロールしている時だけで
かなり微妙にそうなるだけなので、そういう仕様だと言われればそうだと思える程なのですが
でも確実にごく僅かにでも暗くなっているのは間違いありません。
こういう現象はどういう原因で起こるのでしょうか?

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 10:16
by softya(ソフト屋)
こういう物は比較することで切り分けます。
プログラミングのデバッグの基本ですね。
例えばDXライブラリ製ではないRPGツクール製のものと比較してみてください。
RPGツクール製でも同じ現象が起これば、液晶モニタ(動くものに弱い)かPC本体(OS含む)が原因です。
DXライブラリだけで起こった場合は、他のDXライブラリ製のゲームと比較してみましょう。
※WolfRPGEditorもDXライブラリですので、こちら製のゲームと比較して見るとよいでしょう。
最終的に自分のものだけで起こっているなら、そこららはまた別の原因の追求が必要です。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 12:01
by メロンくん
やはり結構マップがチラつきますし、他のゲームでは問題ないと思いますので、コードが原因だと思います。

コード:

#include "DxLib.h"
typedef struct{
        int img,muki;
}ch_t;
#define MAP_SIZE	40			// マップチップ一つのドットサイズ
#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	15			// マップの縦長さ

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

// プレイヤーの位置
int PlayerX , PlayerY ;
// 移動しているかどうかのフラグ( 0:停止中  1:移動中 )
int Move ;
// 各方向に移動する量
int MoveX, MoveY ;
// 移動し始めてから何フレーム経過したかを保持する変数
int MoveCounter ;
// WinMain関数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	SetGraphMode( 800 , 600 , 32 ) ;
	char Key[256];
	int image[8],map,idouryou=4,hokou=0 ;
	int ScrollX, ScrollY ;
	ch_t ch;
    ch.muki=2;
	ChangeWindowMode( TRUE );
	DxLib_Init();
	// 描画先画面を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	LoadDivGraph( "画像/キャラ.png" , 8 , 2 , 4 , 40 , 41 , image ) ;
	map = LoadGraph( "map/map.png" );
	// プレイヤーの初期位置をセット 
	PlayerX = 1 ;
	PlayerY = 1 ;
	// 最初は停止中(0)にしておく
	Move = 0 ;
	
	// ループ
	 while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
	{
		// 画面を初期化
		ClearDrawScreen() ;
		if( Move == 0 )
		{
			// キー入力に応じてプレイヤーの座標を移動
			if( Key[ KEY_INPUT_LEFT ]  == 1)
			{
				Move = 1 ;
				MoveX = -1 ;
				MoveY = 0 ;
                ch.muki=1; 
			}
			if( Key[ KEY_INPUT_RIGHT]  == 1)
			{
				Move = 1 ;
				MoveX = 1 ;
				MoveY = 0 ;
                ch.muki=3;
			}
			if( Key[ KEY_INPUT_UP   ]==1 )
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = -1 ;
				ch.muki=0;
			}
			if( Key[ KEY_INPUT_DOWN ]  == 1)
			{
				Move = 1 ;
				MoveX = 0 ;
				MoveY = 1 ;
                ch.muki=2; 
			}
			// 進入不可能なマップだった場合は移動できない
			if( Move == 1 )
			{
				
				if( MapData[ PlayerY + MoveY ][ PlayerX + MoveX ] == 1 )
				{
					Move = 0 ;
				}
				else
				{
					MoveCounter = 0 ;
				}
			}
			// 停止中は画面のスクロールは行わない
			ScrollX = 0 ;
			ScrollY = 0 ;
		}

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

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

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

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

DrawGraph( 380-MAP_SIZE * PlayerX+ScrollX , 280-MAP_SIZE * PlayerY+ScrollY, map , TRUE ) ;
if(MoveCounter==40 || MoveCounter<=19 )hokou=0;
else hokou=1;
		ch.img=image[hokou + ch.muki*2];

		DrawGraph( 380 , 280 , ch.img , TRUE ) ;//画像を描画
		// 裏画面の内容を表画面に映す
		ScreenFlip() ;
	}
	DxLib_End() ;				// DXライブラリ使用の終了処理
	return 0 ;					// ソフトの終了
}
DrawGraph(DrawGraph( 380-MAP_SIZE * PlayerX+ScrollX , 280-MAP_SIZE * PlayerY+ScrollY, map , TRUE ) ;でマップを描画している部分の
+ScrollXと+ScrollYを外すと1マスの移動の間が描画されないのでがカクカクとした動きになりますが、その場合はマップが暗くならないので、この辺りに問題があるのだと思っていますが、原因が全然わかりません。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 13:08
by softya(ソフト屋)
移動処理でかならずMoveが0になる瞬間があるのですが、その場合ScrollX,Yも0になります。チラツクのはそれが原因かなと思います。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 13:34
by Ketty
うーん。ご提示されたプログラムを動かしてみましたが、
私の環境では事象が再現しませんでした。
------------------------------------------
Win7 64bit
DXライブラリ ver3.12e
開発環境 VC++ 2010 Express Edition
ディスプレイ AMD Radeon HD 7470
ディスプレイのリフレッシュレート 60Hz
------------------------------------------

以下、どちらのケースでも、歩行中の色合いや輝度は同じに見えました。
ケース1

コード:

DrawGraph( 380-MAP_SIZE * PlayerX+ScrollX , 280-MAP_SIZE * PlayerY+ScrollY, map , TRUE ) ;
ケース2

コード:

DrawGraph( 380-MAP_SIZE * PlayerX , 280-MAP_SIZE * PlayerY, map , TRUE ) ;
一応両方のキャプチャを張っておきます。
使ったマップ画像はサイズ以外は適当です。透過pngを使っています。
1.png
ケース1
1.png (48.69 KiB) 閲覧数: 3816 回
2.png
ケース2
2.png (47.48 KiB) 閲覧数: 3816 回
あと、関係ないかもしれませんが、
ClearDrawScreen()が2回登場しています(58行目と61行目)。
どちらかを消された方がよいと思います。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 13:48
by softya(ソフト屋)
訂正です。連続で移動している限りはScrollX,Yが0になりませんでした。
ScrollX = -( MoveX * MoveCounter ) ;

PlayerX += MoveX ;
では移動量が違うので、これが原因かと思われます。
実際のマップデータがないので、これ以上の検証は手間が掛かり過ぎるのでマップデータを添付されたほうが良いと思います。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 14:52
by メロンくん
初期の頃のファイナルファンタジーではどうなっているのかと思って、さっきプレイステーション移植バージョンのファイナルファンタジー5をやってみたのですが
ファイナルファンタジー5でも実際そうなっていました。スクロールする時に街の家の屋根とかがかなり微妙に暗くなります。
これはもうプロの作品ですらそうなのだから、そういうものなのかと思いました。そうなる理由はわかりませんが。
たぶん気にしない人は全く気にしないというか、自分も実際に自分で作ろうとするまでそうなっている事に気付きもしませんでしたので
他人の作品だと全く気にならないけど自分で作ろうとすると神経質になってしまう部分なのかなと思いました。
softya(ソフト屋)さん。Kettyさん。丁寧な回答ありがとうございました。お騒がせしてすいませんでした。

Re: DXライブラリでキャラの歩行時にマップが微妙に暗くなってしまいます。

Posted: 2014年10月02日(木) 15:24
by softya(ソフト屋)
どちらかと言うと液晶モニタが原因だと思われます。
昔のブラウン管モニタやゲーミング用の高反応速度の液晶モニタなら問題はないかもしれません。
つまり、普通の人の使う液晶モニタでは少し暗なく成るのは避けれないって事ですかね。