ページ 11

DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 21:30
by ヒューガ
ボタンとか

コード:

#include"variable.h"
int Key[256];


int GHK(){
        char tmpKey[256]; 
        GetHitKeyStateAll( tmpKey ); 
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ 
                        Key[i]++;     
                } else {              
                        Key[i] = 0;   
                }
        }
        return 0;
}

int GHP(){
	if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_UP ) == 0 ){
		botan.up=0;
	}
	else{
		botan.up=1;
	}
	if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_DOWN ) == 0 ){
		botan.down=0;
	}
	else{
		botan.down=1;
	}
	if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_RIGHT ) == 0 ){
		botan.right=0;
	}
	else{
		botan.right=1;
	}
	if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_LEFT ) == 0 ){
		botan.left=0;
	}
	else{
		botan.left=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_1 ) == 0 ){
		botan.b[1]=0;
	}
	else{
		botan.b[1]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_2 ) == 0 ){
		botan.b[2]=0;
	}
	else{
		botan.b[2]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_3 ) == 0 ){
		botan.b[3]=0;
	}
	else{
		botan.b[3]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_4 ) == 0 ){
		botan.b[4]=0;
	}
	else{
		botan.b[4]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_5 ) == 0 ){
		botan.b[5]=0;
	}
	else{
		botan.b[5]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_6 ) == 0 ){
		botan.b[6]=0;
	}
	else{
		botan.b[6]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_7 ) == 0 ){
		botan.b[7]=0;
	}
	else{
		botan.b[7]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_8 ) == 0 ){
		botan.b[8]=0;
	}
	else{
		botan.b[8]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_9 ) == 0 ){
		botan.b[9]=0;
	}
	else{
		botan.b[9]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_10 ) == 0 ){
		botan.b[10]=0;
	}
	else{
		botan.b[10]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_11 ) == 0 ){
		botan.b[11]=0;
	}
	else{
		botan.b[11]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_12 ) == 0 ){
		botan.b[12]=0;
	}
	else{
		botan.b[12]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_13 ) == 0 ){
		botan.b[13]=0;
	}
	else{
		botan.b[13]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_14 ) == 0 ){
		botan.b[14]=0;
	}
	else{
		botan.b[14]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_15 ) == 0 ){
		botan.b[15]=0;
	}
	else{
		botan.b[15]=1;
	}
if( ( GetJoypadInputState( DX_INPUT_PAD1 ) & PAD_INPUT_16 ) == 0 ){
		botan.b[16]=0;
	}
	else{
		botan.b[16]=1;
	}
    return 0;
}

int comand(){
	if(Key[KEY_INPUT_UP]>0||botan.up>0){
		key.up++;
		key.up_n=0;
	}
	else{
		key.up=0;
		key.up_n++;
	}
	if(Key[KEY_INPUT_DOWN]>0||botan.down>0){
		key.down++;
		key.down_n=0;
	}
	else{
		key.down=0;
		key.down_n++;
	}
	if(Key[KEY_INPUT_RIGHT]>0||botan.right>0){
		key.right++;
		key.right_n=0;
	}
	else{
		key.right=0;
		key.right_n++;
	}
	if(Key[KEY_INPUT_LEFT]>0||botan.left>0){
		key.left++;
		key.left_n=0;
	}
	else{
		key.left=0;
		key.left_n++;
	}
	if(Key[KEY_INPUT_Z]>0||botan.b[2]>0){
		key.shot++;
		key.shot_n=0;
	}
	else{
		key.shot=0;
		key.shot_n++;
	}
	if(Key[KEY_INPUT_X]>0||botan.b[3]>0){
		key.missile++;
		key.missile_n=0;
	}
	else{
		key.missile=0;
		key.missile_n++;
	}
	if(Key[KEY_INPUT_C]>0){
		key.seek++;
		key.seek_n=0;
	}
	else{
		key.seek=0;
		key.seek_n++;
	}

	if(Key[KEY_INPUT_LSHIFT]>0||Key[KEY_INPUT_RSHIFT]>0||botan.b[8]>0){
		key.slow++;
		key.slow_n=0;
	}
	else{
		key.slow=0;
		key.slow_n++;
	}
	return 0;
}
モデルの動き

コード:

#include"variable.h"
void move_my(){
	if(key.up%5==0)my.xyz.y+=10.0f,my.p++;
	if(key.down%5==0)my.xyz.y-=10.0f,my.p--;
	if(key.right%5==0)my.xyz.x+=10.0f;
	if(key.left%5==0)my.xyz.x-=10.0f;
}
void my_main(){
	move_my();
}
描画とか

コード:

#include"variable.h"
void render_my(){
	MV1SetPosition(my.model,my.xyz) ;
	MV1DrawModel(my.model);
}
void render_main(){
	render_my();
	DrawFormatString(100,50,GetColor(255,255,255),"%f,%f,%f,%d,%d",my.xyz.x,my.xyz.y,my.xyz.z,my.p,key.missile);
}
構造体

コード:

typedef struct{
	int up,down,right,left,b[16];
}botan_t;
typedef struct{
	int up,down,right,left,shot,missile,slow,seek;
	int up_n,down_n,right_n,left_n,shot_n,missile_n,slow_n,seek_n;
}key_t;
typedef struct{
	int model,p;
	VECTOR xyz;
}my_t;
このようなソースコードですが、
↑キー押すと上に動き↓キー押すと下に動き・・・としたいのですが
逆向きに動いてしまいます。
上のmy.pの増減も逆になってしまいます。
どうしてなのでしょうか?

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 21:39
by softya(ソフト屋)
極端な関数名(GHK()等)の省略は、後々自分でも意味不明になるので避けたほうが良いと思いますよ。
それと3Dにおいて上下左右のプラス方向はカメラの向き次第なので、カメラも含めて考えないと意味がありません。

【補足】
GHP()はテーブル処理、comand()は条件処理を関数化するとすごくスッキリするとおもいます。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 21:58
by ヒューガ
えーと
my.xyz.xなどの座標の数値も上下左右逆に動くのですが
これはカメラに関係するのでしょうか?

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 22:05
by softya(ソフト屋)
よく分からなければ、原点(0,0,0)からプラス方向に矢印代わりのDrawCone3Dで3軸色を変えて円錐を描いてみて下さい。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 22:32
by ヒューガ
DrawCone3D( VGet(200.0f,0.0f,0.0f), VGet(0.0f,0.0f,0.0f),50.0f,8,GetColor(255,0,0),GetColor(255,0,0), TRUE);
は右を向き
DrawCone3D( VGet(0.0f,200.0f,0.0f), VGet(0.0f,0.0f,0.0f),50.0f,8,GetColor(0,255,0),GetColor(0,255,0), TRUE);
は上を向き
DrawCone3D( VGet(0.0f,0.0f,200.0f), VGet(0.0f,0.0f,0.0f),50.0f,8,GetColor(0,0,255),GetColor(0,0,255), TRUE);
は奥を向いています。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 22:38
by softya(ソフト屋)
x,y,zのそれぞれのプラス方向は円錐の先端が指す方向ってことですね。
なのでxをプラスすると右に移動するはずです。yは上、zは奥です。
これだと左右は2Dと同じはずなんですが・・・。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 22:53
by ヒューガ
一番最初に書いたコードは右キーを押すとモデルが左に動くのですが・・・

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 23:00
by softya(ソフト屋)
円錐も同じプログラム上で表示したんでしょうか?
それならプラス方向は一致するはずですが。

これももう一つの奴と同じでコード全体を見ないと何とも言えません。
あっちのトピックも放置しないでくださいね。あっちのほうが問題が大きのと、こっちとも関係するかも知れません。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月12日(木) 23:27
by ヒューガ
http://www1.axfc.net/uploader/N/so/156398
一応あげときます。
プロジェクト一式です

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月13日(金) 00:50
by ISLe
softya(ソフト屋) さんが書きました:あっちのトピックも放置しないでくださいね。あっちのほうが問題が大きのと、こっちとも関係するかも知れません。
botan_tの配列メンバbの要素数が16で、添字の1~16に代入してますね。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月13日(金) 01:18
by ISLe
move_my関数の条件式は、
・押していない方向に常に動く
・押している方向に5フレームに付き1フレーム動く
ようになってますね。

なので、押したのと逆方向に5フレームに付き4フレーム動くことになります。

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月13日(金) 07:50
by ヒューガ

コード:

void move_my(){
	if(key.up%5==0)my.xyz.y+=10.0f,my.p++;
	if(key.down%5==0)my.xyz.y-=10.0f,my.p--;
	if(key.right%5==0)my.xyz.x+=10.0f;
	if(key.left%5==0)my.xyz.x-=10.0f;
}
どこでずっと動いてるということになるのでしょうか?

Re: DXライブラリで3Dゲーム(また不明な点が)

Posted: 2012年7月13日(金) 09:29
by ヒューガ
解決しました
%5=0じゃずっとですねwww
お騒がせしました。