DXライブラリで3Dゲームを作ろうと思います。

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

DXライブラリで3Dゲームを作ろうと思います。

#1

投稿記事 by アキト » 15年前

2Dのゲームがある程度作れるようになってきたので3Dに挑戦しようかと思っております。
しかし3Dは基礎中の基礎しか理解しておりません。
カメラがあったりライトを設定しなければならないということ程度です。

3Dゲームを作る際に参考になるURLを教えては頂けないでしょうか?
又、作ろうとしているゲームはアクションゲームです。

Ma

Re:DXライブラリで3Dゲームを作ろうと思います。

#2

投稿記事 by Ma » 15年前

あまり、お力にはなれないとおもいますが、ぱっと思いついたこと。
公式のサンプルにアクションゲームサンプルがあります。

まずはサンプルの理解からとか。

正直、私にはモーションとか綺麗なモデルを自作できないので、これ以上はあまり参考にならないと思います><

あといえることは、Blender (モデリング/アニメーション作成)とか、 メタセコイア (モデリング)は結構使える無料ツールだったりするらしいので、その講座サイト等をグーぐるで検索すると、役立つかも。

でも、これ始める前に、まずはサンプルから始めたほうがいいかも。

プログラミング面については、、、、行列とかベクトルとか数学です。
サイトの紹介はバトンタッチw 画像

アキト

Re:DXライブラリで3Dゲームを作ろうと思います。

#3

投稿記事 by アキト » 15年前

Ma様
ご回答ありがとうございます。
サイトのサンプルプログラムを見せて頂きました。

ただやはり少々理解できない点が御座いまして・・・
どこか宜しいサイトはないでしょうか?

たいちう

Re:DXライブラリで3Dゲームを作ろうと思います。

#4

投稿記事 by たいちう » 15年前

> ただやはり少々理解できない点が御座いまして・・・
> どこか宜しいサイトはないでしょうか?

どこが理解できないかを具体的に書かないと。
理解する気があるならば、ここで聞くこともできるんだし。
サンプルプログラムを上から順に全部作っていくだけでも
ずいぶん勉強になると思いますが。

アキト

Re:DXライブラリで3Dゲームを作ろうと思います。

#5

投稿記事 by アキト » 15年前

回答ありがとうございます。

例えばなのですが点Aから点Bに移動する時はどうすればよいのでしょうか?

(0,0,0)から(10,10,10)に向かって速度Cで移動する場合など

2Dの場合はそれぞれの点の角度を求めて
X軸はcos、Y軸はsinをかければ出たのですが3Dになるとこれだけでは出来ない気がします。

こういった場合はどうすればよいのでしょうか?

Playが点Aで初期化されているものとします。

それぞれの値はどの様に変化するのでしょうか?
Play.x =
Play.y =
Play.z =

たいちう

Re:DXライブラリで3Dゲームを作ろうと思います。

#6

投稿記事 by たいちう » 15年前

A(0,0,0)からB(10,20,30)に向かって速度Cで移動する場合とします。

ABの単位ベクトルは、AB(u, 2*u, 3*u)。
但し、u = 1 / sqrt(1*1 + 2*2 + 3*3)。

単位時間当たりの移動量をd(dx, dy, dz)とすると、
dx = u * C
dy = 2 * u * C
dz = 3 * u * C

単位時間ごとの移動の処理は
Play.x += u * C
Play.y += 2 * u * C
Play.z += 3 * u * C

t時間後の座標を直接求めるならば、
Play.x = u * C * t
Play.y = 2 * u * C * t
Play.z = 3 * u * C * t

こんな感じで理解できます?

アキト

Re:DXライブラリで3Dゲームを作ろうと思います。

#7

投稿記事 by アキト » 15年前

たいちう様
回答ありがとうございます。
すみません。理解できませんでした。
その単位ベクトルはどの様に求めるのでしょうか?

出来ればDXライブラリを使った場合の
A(0,0,0)からB(10,20,30)に向かって速度Cで移動する場合とします。
を書いては頂けないでしょうか?

お手数おかけして大変申し訳ないのですがどうかお願いします。

たいちう

Re:DXライブラリで3Dゲームを作ろうと思います。

#8

投稿記事 by たいちう » 15年前

> すみません。理解できませんでした。
> その単位ベクトルはどの様に求めるのでしょうか?

ベクトルについての基本的な知識はお持ちですか?
それを1から教えるのはここでは無理なので、
高校の数学の教科書でも参考にしてください。

A(0, 0, 0)、B(10, 20, 30)としたときの、
ベクトルABは判りますか?
また、その長さは?


> 出来ればDXライブラリを使った場合の
> A(0,0,0)からB(10,20,30)に向かって速度Cで移動する場合とします。
> を書いては頂けないでしょうか?

当面DXライブラリを使うつもりはありませんので書けません。

Ma

Re:DXライブラリで3Dゲームを作ろうと思います。

#9

投稿記事 by Ma » 15年前

模擬コードです。


VECTOR velocity = VGet(1,2,3);
VECTOR position = VGet(0,0,0);

while(/*メインループ条件*/){
position = VAdd(position,velocity);
//10フレーム後には、10,20,30にいる。
}


2Dでも3Dでの世界でも、物理が重要になってきます。
加速度ベクトルが積み重なっていくことで、移動ベクトルができ、
移動ベクトルが積み重なることで、位置ベクトルができる。

これが、理解できていないようならば、難しいです。
とはいっても、難しいことはいっていません。速度と位置の関係を理解すればいいだけのことです。
(もし分からないならば、質問してください。)

ちなみに、ベクトルを理解できていないならば、ちょっと3Dゲームプログラミングは難しいと思います。
できなくはないですがね。。。

手元の数学IIの教科書か参考書で、ベクトルの基礎を理解しておくといいかも。

たいちう

Re:DXライブラリで3Dゲームを作ろうと思います。

#10

投稿記事 by たいちう » 15年前

> 加速度ベクトルが積み重なっていくことで、移動ベクトルができ、
> 移動ベクトルが積み重なることで、位置ベクトルができる。

一応物理専攻の私としては、加速度→速度→位置であり、
「移動ベクトル」という言葉には馴染みがないですね。
速度ベクトルに単位時間をかけることで、
単位時間当たりの移動ベクトルというものが計算できます。

物理的な意味を忘れないように必ず単位も意識します。
速度(m/s)×単位時間(s)→単位時間当たりの移動量(m)というように。
単位時間は秒ではなくフレームでも良いでしょうし、
長さの単位はピクセルかもしれませんが。

プログラムを作る上では移動ベクトルが重要かもしれませんが、
物理的に重要なのは加速度・速度・位置の方なので、
こっちを理解していた方が色々応用が利くでしょう。

# 他の人はこのようなアプローチをしてないのだろうか?

Ma

Re:DXライブラリで3Dゲームを作ろうと思います。

#11

投稿記事 by Ma » 15年前

>移動ベクトル

すいません、正しい言葉を使っていませんでした。

ベロシティ(Velocity)ベクトル といいたかったんですが、日本では使わないですよね、、、。
速度 といってしまうと、スカラー量になってしまうため、避けた結果 移動(moving)ベクトルのような表現になってしまいました。

考えてみると速度ベクトルといえば、OKでしたね。

たいちう

Re:DXライブラリで3Dゲームを作ろうと思います。

#12

投稿記事 by たいちう » 15年前

> 速度 といってしまうと、スカラー量になってしまうため

これも違います。スカラー量は速さです。
速さ = |速度| です。あくまでも物理用語としてはですけど。
英語だと、speed = 速さ、velocity = 速度、ですね。

Ma

Re:DXライブラリで3Dゲームを作ろうと思います。

#13

投稿記事 by Ma » 15年前

おぉ、そうでしたね。
変に覚えていたみたいです。お恥ずかしい><

speed = 速度、velocity = 速度

↑いままでの自分の頭の中。表記してみるとすごいおかしい事に気づきましたw

たいちうさん、ご指摘ありがとうございました。 ^^

これにて解決にさせて ∵(´ε(○=(・∀・*)
私じゃなかった。

筑前煮

ShellExecuteについて

#14

投稿記事 by 筑前煮 » 15年前

こんにちは。
ここのページを利用させてもらっている者です。

ゲームプログラミングの館の33.選択画面の作り方を参考に(ほとんどコピーですが・・・)NewGameを選択すればメモ帳を起動するプログラムを作りました。

ここで、メモ帳ではなく龍神録プログラミングの館のプロジェクトにある「RyuJin.exe」を起動したいのですが、その方法が分かりません。

試しにnotepad.exeをRyuJin.exeに変えてみたところ、何も表示されずに終了しました。
以下は現在のプログラムです。
#include "DxLib.h"
 
int GetHitKeyStateAll_2(int KeyStateBuf[/url]){
        char GetHitKeyStateAll_Key[256];
        GetHitKeyStateAll( GetHitKeyStateAll_Key );
        for(int i=0;i<256;i++){
                if(GetHitKeyStateAll_Key==1) KeyStateBuf++;
                else                            KeyStateBuf=0;
        }
        return 0;
}
 
void char_disp(int White,int y){
        DrawString( 490 , y   , "■"            , White );
        DrawString( 510 , 400 , "NEW GAME"  , White );
        DrawString( 510 , 420 , "EXIT"   , White );
}
 
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        
    int Key[256];
    int White , y=400;                                       //色とy座標の宣言
 
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    White = GetColor( 255 , 255 , 255 ) ;                    //色の取得
 
 
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
          //↑メッセージ処理         ↑画面をクリア         ↑入力状態を保存       ↑ESCが押されていない
 
        char_disp(White,y);                              // 文字を描画
 
        if( Key[KEY_INPUT_DOWN]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_DOWN]>30)){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            y+=20;                                           
            if(y==440)                            // y座標が260なら(選択が一番下なら)
                y=400;                        // 選択座標を一番上に
        }
  if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_DOWN]%5==0 && Key[KEY_INPUT_UP]>30)){
        // たった今押したか、30カウンター以上押しっぱなしかつ5回に一度
            y-=20;                                           
            if(y==380)                            // y座標が380なら(選択が一番上なら)
                y=420;                        // 選択座標を一番下に
        }
  if(Key[KEY_INPUT_Z]==1){ 
 //zキーで選択     
      if(y==400){//NewGameの場合
      DrawString(  0,  0, "NewGame起動" , White);            //文字列表示
    ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL);
            break;
      }
 
   if(y==420){//Exitの場合
      DrawString(  0,  0, "GAME END" , White);            //文字列表示
      break;
      }  
  
  }
        ScreenFlip();//裏画面反映
    }
 
    DxLib_End();
    return 0;
}
画像

たいちう

Re:ShellExecuteについて

#15

投稿記事 by たいちう » 15年前

> 試しにnotepad.exeを RyuJin.exeに変えてみたところ、何も表示されずに終了しました。

フルパスで指定してみては?

筑前煮

Re:ShellExecuteについて

#16

投稿記事 by 筑前煮 » 15年前

たいちうさん>
返信ありがとうございます。
フルパスで指定してみたところ、RyuJin.exeを指定したときと同じ結果でした。

たいちう

Re:ShellExecuteについて

#17

投稿記事 by たいちう » 15年前

筑前煮さんのスキルレベルが判らないので、まずは単純な見落としを疑っています。

・指定したパスは正しいですか?
・エクスプローラからRyuJin.exeを起動することはできますか?
・フルパス指定のエスケープはしていますか?
・ShellExecuteの直前にMessageBoxを追加すると、メッセージボックスが表示されますか?
(ShellExecuteが呼ばれていることと、
編集中のソースコードと試しているexeファイルが対応していることの確認です)
・コマンドプロンプトからRyuJin.exeを起動させることはできますか?

筑前煮

Re:ShellExecuteについて

#18

投稿記事 by 筑前煮 » 15年前

フルパス、ってファイルパスのことですよね?
指定したフルパスをファイル名を指定して実行に入れて実行したら起動したので正しいと思います。
エクスプローラからの起動は出来ました。
メッセージボックスは表示されました。

エスケープは出来てないとおもいます。
というか、恥ずかしながらエスケープの意味がわかってません。
言い訳になりますが、あまりスキルレベルは高くないのでShellexecuteの使い方もあまりよく分かっていません・・・
使い方について調べてきます。

コマンドプロンプトからの起動はできませんでした。

たいちう

Re:ShellExecuteについて

#19

投稿記事 by たいちう » 15年前

> というか、恥ずかしながらエスケープの意味がわかってません。

↓このように書きましたか?ということです。

ShellExecute(NULL,"open","c:¥¥test¥¥RyuJin.exe",NULL,NULL,SW_SHOWNORMAL);
(掲示板上での文字化けを避けるために¥を全角で書いています。)

cf. http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-1-2


> コマンドプロンプトからの起動はできませんでした。

起動の仕方がわからないのか何か問題があるのか。
コマンドプロンプトからnotepad.exeを起動させることはできますか?

筑前煮

Re:ShellExecuteについて

#20

投稿記事 by 筑前煮 » 15年前

返信ありがとうございます!
そのように書けています。

コマンドプロンプトですが、notepadの起動は出来ました。
RyuJin.exeについてはいろいろな方法を試しましたが、いずれも起動できませんでした。

メモ帳以外に試しに電卓やワードパッドを以下のように書いたら両方起動しました。
ShellExecute(NULL,"open","calc.exe",NULL,NULL,SW_SHOWNORMAL);
ShellExecute(NULL,"open","wordpad.exe",NULL,NULL,SW_SHOWNORMAL);
とりあえずnotepadと同じフォルダにRyuJin.exeを入れて試そうかな、と思いましたが、重要そうなフォルダに入っていたので編集するのを止めました。

ShellExecute以外にファイルへアクセスする方法はありますか?

たいちう

Re:ShellExecuteについて

#21

投稿記事 by たいちう » 15年前

ShellExecuteよりも望ましいのはCreateProcessかな。
しかしコマンドプロンプトで成功させる方が先だと思います。
コマンドプロンプトでもフルパスで指定しましたか?
(この場合はエスケープなし)

コマンドcdでRyuJin.exeのあるフォルダに移動して、
ファイル名のみで試しましたか?

筑前煮

Re:ShellExecuteについて

#22

投稿記事 by 筑前煮 » 15年前

コマンドプロンプトで起動できました!
たいちうさん、ありがとうございます。

では、CreateProcessをつかう場合どのようにすればいいですか? 画像

たいちう

Re:ShellExecuteについて

#23

投稿記事 by たいちう » 15年前

コマンドプロンプトで成功してShellExecuteではできない、というのは考えにくいです。
さっき起動できずに今は起動できたという、その差は何だったのでしょうか?
どうしたら成功したのですか?


> では、CreateProcessをつかう場合どのようにすればいいですか?

CreateProcessの使い方を調べます。

筑前煮

Re:ShellExecuteについて

#24

投稿記事 by 筑前煮 » 15年前

さっきはパスをを直接キーボードで入力して、とりあえずコマンドプロンプトのウィンドウにRyuJin.exeをドラッグして、エンターを押しました。
タイプミスですかね・・・。一応パスはチェックしたんですが・・・すいません。

ShellExecuteでとりあえずもう一度パスを入力してみます。

tom

Re:ShellExecuteについて

#25

投稿記事 by tom » 15年前

手当たりしだいやってみるのも当然ありだと思いますが
まずはShellExecuteからの戻り値を確認する方が先だと思います。
http://msdn.microsoft.com/ja-jp/library/cc422072.aspx
に戻り値が書いてあるので確認してみてはいかがでしょうか?

筑前煮

Re:ShellExecuteについて

#26

投稿記事 by 筑前煮 » 15年前

tomさん>
よく見てみたらビルドのときに
warning C4129: ''っていうのがでてました。
ちょっと調べてきます・・・

エスケープシーケンスのエラーみたいですね。
たいちうさん、すいません。 画像

閉鎖

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