無題
Posted: 2010年3月02日(火) 13:37
DXライブラリで一人称視点ゲームを作っているのですが、
カメラの向いている方向にカメラを移動させるやり方がよくわかりません。
サンプルの3Dアクション基本を見たのですがよくわかりませんでした。
環境はWindows7,VC++2008EE,DXライブラリ
プログラミング歴は4か月くらいです。
現在のプログラム
#include "DxLib.h"
#include <math.h>
//関数宣言
void CAM_Init();//カメラ初期化
void CAM_Proc();//カメラ処理
void Rend_Proc();//描画処理
void Input_Proc();//入力処理
void ST_Init();//ステージ初期化
void ST_Ter();//ステージ後始末
#define CAM_SPEED 0.1f//カメラ旋回速度
#define CAM_MSPEED 50.0f
//入力情報
struct KEYINPUT
{
int NInput;//現在
int EInput;//過去
};
KEYINPUT inp;//キー入力実態宣言
//カメラ情報構造体
struct CAM
{
float AH;//水平
float AV;//垂直
VECTOR Tt;//注視点
VECTOR ZA;//座標
};
CAM cam;//カメラ実体宣言
//-----------------------------------------------------------------------------------
void Input_Proc()//入力処理
{
int O;
O=inp.NInput;
inp.NInput=GetJoypadInputState(DX_INPUT_KEY_PAD1);
inp.EInput=inp.NInput&~O;
}
//-----------------------------------------------------------------------------------
struct ST//ステージ情報構造体
{
int MHandle;
};
ST st;
//-----------------------------------------------------------------------------------
void ST_Init()//ステージ初期化
{
st.MHandle=MV1LoadModel("s1.mqo");
MV1SetupCollInfo(st.MHandle,-1);
}
void ST_Ter()//ステージ後始末
{
MV1DeleteModel(st.MHandle);
}
//-----------------------------------------------------------------------------------
void CAM_Init()//カメラ初期化
{
cam.ZA.x=0.0f;
cam.ZA.y=0.0f;
cam.ZA.z=0.0f;
}
void CAM_Proc()//カメラ処理
{
int CS;
CS=1;//カメラ固定フラグ
int mpx,mpy;//マウス座標
float TR;
TR=0.0f;//ねじれ角度
float ms;//角度変更量
ms=0.01f;
float smx,smy,smz;//移動量
smx=0.0f;
smy=50.0f;
smz=50.0f;
float cx,cz;//
cx=0;
cz=50;
GetMousePoint(&mpx,&mpy);
//-------------------------------------
//-------------------------------------
if((GetMouseInput()&MOUSE_INPUT_RIGHT)!=0)
{
CS = 2;
}
//--------^^^^^^\\~~~~~~~~~~~~~~~~~~~~~~~
if(CS!= 2 && 200<mpy)//下----------
{
cam.AV+=ms;
}
if(CS!= 2 && 10<mpy)
{
cam.AV+=ms+0.02f;
}
if(CS!= 2 && 300>mpy)//上-----------
{
cam.AV-=ms;
}
if(CS!= 2 && 490>mpy)
{
cam.AV-=ms+0.02f;
}
if(CS!= 2 && 400<mpx)//右-----------
{
cam.AH+=ms;
}
if(CS!= 2 && 590<mpx)
{
cam.AH+=ms+0.02f;
}
if(CS!= 2 && 200>mpx)//左-----------
{
cam.AH-=ms;
}
if(CS!= 2 && 10>mpx)
{
cam.AH-=ms+0.02f;
}
//---------------------
if(CheckHitKey(KEY_INPUT_R))
{
TR+=1.57f;
}
//-----------------------
//---------------------------------
if(CheckHitKey(KEY_INPUT_W)==1)
{
cam.ZA.z+=smz;
cam.ZA.x+=smx;
}
if(CheckHitKey(KEY_INPUT_S)==1)
{
cam.ZA.z-=50.0f;
}
if(CheckHitKey(KEY_INPUT_A)==1)
{
cam.ZA.x-=50.0f;
}
if(CheckHitKey(KEY_INPUT_D)==1)
{
cam.ZA.x+=50.0f;
}
if(CheckHitKey(KEY_INPUT_SPACE)==1)
{
cam.ZA.y+=smy;
}
if(CheckHitKey(KEY_INPUT_F)==1)
{
cam.ZA.y-=smy;
}
SetCameraPositionAndAngle(VGet(cam.ZA.x,cam.ZA.y,cam.ZA.z),cam.AV,cam.AH,TR);
}
//-----------------------------------------------------------------------------------
void Rend_Proc()//描画処理
{
int x,y;
GetMousePoint(&x,&y);//照準
SetTransColor(255,255,255);//透明色
int AG;//照準
AG=LoadGraph("pred.bmp");
SetFogEnable(TRUE);//霧 オン オフ
SetFogColor(0,0,0);//霧カラー
SetFogStartEnd(0.0f,5000.0f);//霧 距離
//--------------------------------
float sms; //ステージ透明度
sms=1.0f;
if(CheckHitKey(KEY_INPUT_C)==1)//透視
{
sms-=0.8f;
}
MV1SetOpacityRate(st.MHandle,sms);//ステージ透明度
//-----------------------------
DrawBox(0,0,640,480,GetColor(0,0,0),TRUE);//背景とかの色 その他
MV1DrawModel(st.MHandle);
DrawGraph(x-24,y-24,AG,TRUE);
SetMouseDispFlag(FALSE);
}
//-----------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
ChangeWindowMode(TRUE);//ウインドウモード
if(DxLib_Init()<0)//ライブラリ初期化
return -1;
CAM_Init();//カメラ初期化
SetDrawScreen(DX_SCREEN_BACK);//描画先を裏
ST_Init();
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)//ESCキーかウインドウが閉じられるまでループ
{
ClearDrawScreen();//画面クリア
Input_Proc();//入力処理
CAM_Proc();//カメラ処理
Rend_Proc();//描画処理
ScreenFlip();//裏の内容を表に出す
}
ST_Ter();
DxLib_End();//ライブラリ後始末
return 0;//終了
}
これをどう変更したらカメラの向きに進めるかおしえてください。
カメラの向いている方向にカメラを移動させるやり方がよくわかりません。
サンプルの3Dアクション基本を見たのですがよくわかりませんでした。
環境はWindows7,VC++2008EE,DXライブラリ
プログラミング歴は4か月くらいです。
現在のプログラム
#include "DxLib.h"
#include <math.h>
//関数宣言
void CAM_Init();//カメラ初期化
void CAM_Proc();//カメラ処理
void Rend_Proc();//描画処理
void Input_Proc();//入力処理
void ST_Init();//ステージ初期化
void ST_Ter();//ステージ後始末
#define CAM_SPEED 0.1f//カメラ旋回速度
#define CAM_MSPEED 50.0f
//入力情報
struct KEYINPUT
{
int NInput;//現在
int EInput;//過去
};
KEYINPUT inp;//キー入力実態宣言
//カメラ情報構造体
struct CAM
{
float AH;//水平
float AV;//垂直
VECTOR Tt;//注視点
VECTOR ZA;//座標
};
CAM cam;//カメラ実体宣言
//-----------------------------------------------------------------------------------
void Input_Proc()//入力処理
{
int O;
O=inp.NInput;
inp.NInput=GetJoypadInputState(DX_INPUT_KEY_PAD1);
inp.EInput=inp.NInput&~O;
}
//-----------------------------------------------------------------------------------
struct ST//ステージ情報構造体
{
int MHandle;
};
ST st;
//-----------------------------------------------------------------------------------
void ST_Init()//ステージ初期化
{
st.MHandle=MV1LoadModel("s1.mqo");
MV1SetupCollInfo(st.MHandle,-1);
}
void ST_Ter()//ステージ後始末
{
MV1DeleteModel(st.MHandle);
}
//-----------------------------------------------------------------------------------
void CAM_Init()//カメラ初期化
{
cam.ZA.x=0.0f;
cam.ZA.y=0.0f;
cam.ZA.z=0.0f;
}
void CAM_Proc()//カメラ処理
{
int CS;
CS=1;//カメラ固定フラグ
int mpx,mpy;//マウス座標
float TR;
TR=0.0f;//ねじれ角度
float ms;//角度変更量
ms=0.01f;
float smx,smy,smz;//移動量
smx=0.0f;
smy=50.0f;
smz=50.0f;
float cx,cz;//
cx=0;
cz=50;
GetMousePoint(&mpx,&mpy);
//-------------------------------------
//-------------------------------------
if((GetMouseInput()&MOUSE_INPUT_RIGHT)!=0)
{
CS = 2;
}
//--------^^^^^^\\~~~~~~~~~~~~~~~~~~~~~~~
if(CS!= 2 && 200<mpy)//下----------
{
cam.AV+=ms;
}
if(CS!= 2 && 10<mpy)
{
cam.AV+=ms+0.02f;
}
if(CS!= 2 && 300>mpy)//上-----------
{
cam.AV-=ms;
}
if(CS!= 2 && 490>mpy)
{
cam.AV-=ms+0.02f;
}
if(CS!= 2 && 400<mpx)//右-----------
{
cam.AH+=ms;
}
if(CS!= 2 && 590<mpx)
{
cam.AH+=ms+0.02f;
}
if(CS!= 2 && 200>mpx)//左-----------
{
cam.AH-=ms;
}
if(CS!= 2 && 10>mpx)
{
cam.AH-=ms+0.02f;
}
//---------------------
if(CheckHitKey(KEY_INPUT_R))
{
TR+=1.57f;
}
//-----------------------
//---------------------------------
if(CheckHitKey(KEY_INPUT_W)==1)
{
cam.ZA.z+=smz;
cam.ZA.x+=smx;
}
if(CheckHitKey(KEY_INPUT_S)==1)
{
cam.ZA.z-=50.0f;
}
if(CheckHitKey(KEY_INPUT_A)==1)
{
cam.ZA.x-=50.0f;
}
if(CheckHitKey(KEY_INPUT_D)==1)
{
cam.ZA.x+=50.0f;
}
if(CheckHitKey(KEY_INPUT_SPACE)==1)
{
cam.ZA.y+=smy;
}
if(CheckHitKey(KEY_INPUT_F)==1)
{
cam.ZA.y-=smy;
}
SetCameraPositionAndAngle(VGet(cam.ZA.x,cam.ZA.y,cam.ZA.z),cam.AV,cam.AH,TR);
}
//-----------------------------------------------------------------------------------
void Rend_Proc()//描画処理
{
int x,y;
GetMousePoint(&x,&y);//照準
SetTransColor(255,255,255);//透明色
int AG;//照準
AG=LoadGraph("pred.bmp");
SetFogEnable(TRUE);//霧 オン オフ
SetFogColor(0,0,0);//霧カラー
SetFogStartEnd(0.0f,5000.0f);//霧 距離
//--------------------------------
float sms; //ステージ透明度
sms=1.0f;
if(CheckHitKey(KEY_INPUT_C)==1)//透視
{
sms-=0.8f;
}
MV1SetOpacityRate(st.MHandle,sms);//ステージ透明度
//-----------------------------
DrawBox(0,0,640,480,GetColor(0,0,0),TRUE);//背景とかの色 その他
MV1DrawModel(st.MHandle);
DrawGraph(x-24,y-24,AG,TRUE);
SetMouseDispFlag(FALSE);
}
//-----------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
ChangeWindowMode(TRUE);//ウインドウモード
if(DxLib_Init()<0)//ライブラリ初期化
return -1;
CAM_Init();//カメラ初期化
SetDrawScreen(DX_SCREEN_BACK);//描画先を裏
ST_Init();
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)//ESCキーかウインドウが閉じられるまでループ
{
ClearDrawScreen();//画面クリア
Input_Proc();//入力処理
CAM_Proc();//カメラ処理
Rend_Proc();//描画処理
ScreenFlip();//裏の内容を表に出す
}
ST_Ter();
DxLib_End();//ライブラリ後始末
return 0;//終了
}
これをどう変更したらカメラの向きに進めるかおしえてください。