戦略シミュレーションゲームで移動

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

戦略シミュレーションゲームで移動

#1

投稿記事 by プラム » 10年前

戦略シミュレーションゲームでユニット移動をさせることが出きませんコードは↓

コード:

 	
略
// 入力情報を一つ前のフレームの入力に代入する
		BackInput = NowInput ;
		if(unn=1){
		// 現在の入力を取得する
		NowInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;

		// 現在のフレームで初めて押されたボタンを算出する
		EdgeInput = NowInput & ~BackInput ;
	// 上が押されたら向いている方向に移動する
		if( CheckHitKey ( KEY_INPUT_UP ) == 1 )
		{Muki = 0 ;
		// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx = -1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz =  1 ; break ;		// Z軸マイナス方向
			case 2 : movx =  1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz = -1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			}
		}

		// 下が押されたら向いている方向と逆方向に移動する
		if( CheckHitKey ( KEY_INPUT_DOWN ) == 1 )
		{Muki = 0 ;
		// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx =  1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz = -1 ; break ;		// Z軸マイナス方向
			case 2 : movx = -1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz =  1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			}
			
		}

		// 左が押されていたら向いている方向を左に90度変更する
		if( CheckHitKey ( KEY_INPUT_RIGHT ) == 1 )
		{	
				Muki = 1;
		

			// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx = -1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz =  1 ; break ;		// Z軸マイナス方向
			case 2 : movx =  1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz = -1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			

			}
		}
		if( CheckHitKey ( KEY_INPUT_Z ) == 1 )
		{	
	


		}
		
		
		// 右が押されていたら向いている方向を右に90度変更する
		if( CheckHitKey(KEY_INPUT_LEFT ) == 1 )
		{
				Muki = 3 ;
			


			// 向きによって移動方向が変わる
			switch( Muki )
			{
			case 0 : movx =  1 ; movz =  0 ; break ;		// X軸プラス方向
			case 1 : movx =  0 ; movz =  1 ; break ;		// Z軸マイナス方向
			case 2 : movx = -1 ; movz =  0 ; break ;		// X軸マイナス方向
			case 3 : movx =  0 ; movz = -1 ; break ;		// Z軸プラス方向
			}

			// 移動先のマスが道だったら移動する
			if( Map[ z + movz ][ x + movx ] == 1 )
			{
				x += movx ;
				z += movz ;
			}
		}
		}
		// マップを描画する
		for( i = 0 ; i < MAP_Z ; i ++ )
		{
			for( j = 0 ; j < MAP_X ; j ++ )
			{
				// 道ではないところは描画しない
				if( Map[ i ][ j ] == 0 ) continue ;
				// マップを描画する
		for( i2 = 0 ; i2 < MAP_Z2 ; i2 ++ )
		{
			for( j2 = 0 ; j2 < MAP_X2 ; j2 ++ )
			{
				// 道ではないところは描画しない
				if( Map2[ i2 ][ j2 ] == 0 ) continue ;
			for( i3 = 0 ; i3 < MAP_Z3 ; i3 ++ )
		{
			for( j3 = 0 ; j3 < MAP_X3 ; j3 ++ )
			{
				// 道ではないところは描画しない
				if( Map3[ i3 ][ j3 ] == 0 ) continue ;
	

		MV1SetPosition( chara, VGet( j3 * BLOCK_SIZE, 0.0f, i3 * BLOCK_SIZE ) ) ; 
			

				// 壁モデルの座標を変更する
				MV1SetPosition( KabeModel, VGet( j * BLOCK_SIZE, 0.0f, i * BLOCK_SIZE ) ) ; 
                // 壁モデルの座標を変更する
				MV1SetPosition( Model01, VGet( j2 * BLOCK_SIZE, 0.0f, i2 * BLOCK_SIZE ) ) ; 

 	            // 割り出した番号のフレームを描画する
				MV1DrawFrame( Model01, FrameNo ) ;

				// 割り出した番号のフレームを描画する
				MV1DrawFrame( KabeModel, FrameNo ) ;
				// 割り出した番号のフレームを描画する
				MV1DrawFrame( chara, FrameNo ) ;
					// 割り出した番号のフレームを描画する
				MV1DrawFrame( Model, FrameNo ) ;
								if( Map3[ z + movz ][ x + movx ] == 1 )
			{ 
				
			}
			}
		}

			}
		}
			}
		}
	     //第一引数の視点から第二引数のターゲットを見る角度にカメラを設置
        SetCameraPositionAndTarget_UpVecY( VGet( x * BLOCK_SIZE+1080, CAMERA_Y, z * BLOCK_SIZE+1080 ), VGet( x * BLOCK_SIZE, 0, z * BLOCK_SIZE ) ) ;
        // 指定位置にモデルを配置
        MV1SetPosition( Model, VGet( x * BLOCK_SIZE, 0, z * BLOCK_SIZE ) ) ;
			

	     
ですみなさん教えてください

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

Re: 戦略シミュレーションゲームで移動

#2

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

これだけで遅くなるとは思えないので他に問題が有るんじゃないでしょうか。

【補足】
インデントを直してみたら超無駄な描画をしている気がします。
インデントはちゃんとしてくださいね。

ループが5重6重なので、凄い回数の描画をしています。
ループ条件を見なおしてみてください。同じループに閉じ込める必要のないループが閉じ込められています。

あとこれループの中に必要ないですよ。
// 割り出した番号のフレームを描画する
MV1DrawFrame( chara, FrameNo ) ;
// 割り出した番号のフレームを描画する
MV1DrawFrame( Model, FrameNo ) ;
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

Re: 戦略シミュレーションゲームで移動

#3

投稿記事 by プラム » 10年前

はいそして移動処理方法を教えてください

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

Re: 戦略シミュレーションゲームで移動

#4

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

ハルルン さんが書きました:はいそして移動処理方法を教えてください
これは何処かを参考にしたのですか? それなら参考サイトを記載して下さいね。
自分で考えたのなら分かるはずですが・・・。
あと遅いのは描画処理なので移動処理ではないですよ。

【補足】
一応解説しておくと
if( Map[ i ][ j ] == 0 ) continue ;

if( Map2[ i2 ][ j2 ] == 0 ) continue ;
は全く関連が無いので、同じループ内に有る必然性がありません。
つまり、1・2と3・4と5・6のループは関連性がないのに全体として1つの大きなループに成っています。
このため無駄に同じポリゴンモデルを何度も描画してしまっています。
これが遅い原因であろうと思われるわけです。

※ ここの規約で直したソースコードは貼るように定められていますので忘れないようにお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
プラム
記事: 164
登録日時: 10年前
住所: 東海地方

Re: 戦略シミュレーションゲームで移動

#5

投稿記事 by プラム » 10年前

あのー一番上にマップあるので意味がないことはありません。

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

Re: 戦略シミュレーションゲームで移動

#6

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

ハルルン さんが書きました:あのー一番上にマップあるので意味がないことはありません。
すでに書きましたが、規約ですのでソースコードをお願いしますね。

【補足】
コメントのないコードですので、変数名から判断しましたがプレイーヤー・キャラクタなどをマップ描画と同時に1フレームに何百回もする必要はないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 戦略シミュレーションゲームで移動

#7

投稿記事 by ISLe » 10年前

トピ主がソースコードを紛失しこのトピックは継続不可能とのことです。

詳しくはこちらのトピックを参照してください。
http://dixq.net/forum/viewtopic.php?f=3&t=14532


以下は個人的な意見です。
規約において変更したソースコードを貼ることが絶対の義務との表現にはなっていません。
しかし質問者がソースコードを提示しないことによって、検証するのにトピックの閲覧者側に手間を与え、過去ログとしての価値も失われます。
フォーラムルールの精神に則れば、それは規約違反よりも重い罪と言えるのではないでしょうか。

閉鎖

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