説明が下手ですみません。このままだと球としか壁判定が取れないような気がして・・・。
OS:Window7
コンパイラ:Microsoft Visual Studio 2010
ライブラリ:Dxライブラリ
言語:C
#include "DxLib.h"
#define rad(angle) (angle * DX_PI_F / 180.0f)
#define ROTATE_SPEED rad(2.0f)
#define ZOOM_RATE (9.0f)
#define TargetPos VGet(0.0f, 10.0f, 0.0f)
int ModelHandle;
int Add, y;
VECTOR SpherePos;
MV1_COLL_RESULT_POLY_DIM HitPolyDim;
struct CameraStatus{
VECTOR Pos;
float RotV, RotH;
float Zoom;
} Camera = {VGet(0.0f, 0.0f, 0.0f), rad(-20.0f), 0.0f, 200.0f};
void F();
void RotateCamera();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE);
SetBackgroundColor(255,255,255);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
ModelHandle = MV1LoadModel("SimpleModel.mqo");
MV1SetPosition(ModelHandle, VGet(0.0f, 0.0f, 0.0f));
MV1SetupCollInfo(ModelHandle, -1);
Add = 1;
y = 0;
while(ProcessLoop() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)){
F();
RotateCamera();
DrawFormatString(0, 420, GetColor(0,0,0), "ESCキーで終了");
DrawFormatString(0, 440, GetColor(0,0,0), "カーソルキーで旋回");
DrawFormatString(0, 460, GetColor(0,0,0), "Q,Eキーでズームイン・アウト");
ScreenFlip();
}
DxLib_End();
return 0;
}
void F(){
y += Add;
if(y < -300 || y > 300){ Add = -Add; }
MV1DrawModel(ModelHandle);
SpherePos = VGet(-100.0f, (float)y, 0.0f);
HitPolyDim = MV1CollCheck_Sphere(ModelHandle, -1, SpherePos, 100.0f);
DrawSphere3D(SpherePos, 100.0f, 8, GetColor(255,255,0), GetColor(255,255,255), FALSE);
if(HitPolyDim.HitNum >= 1){
DrawFormatString(0, 0, GetColor(0,0,0), "Hit Poly Num %d", HitPolyDim.HitNum);
for(int i = 0; i < HitPolyDim.HitNum; i++){
DrawTriangle3D(HitPolyDim.Dim[i].Position[0], HitPolyDim.Dim[i].Position[1], HitPolyDim.Dim[i].Position[2], GetColor(0,255,255), FALSE);
DrawLine3D(SpherePos, HitPolyDim.Dim[i].Normal, GetColor(255,0,255));
}
}
MV1CollResultPolyDimTerminate(HitPolyDim);
}
void RotateCamera(){
if(CheckHitKey(KEY_INPUT_RIGHT)){
Camera.RotH += ROTATE_SPEED;
}
else if(CheckHitKey(KEY_INPUT_LEFT)){
Camera.RotH -= ROTATE_SPEED;
}
if(CheckHitKey(KEY_INPUT_DOWN) && Camera.RotV > rad(-45.0f)){
Camera.RotV -= ROTATE_SPEED;
}
else if(CheckHitKey(KEY_INPUT_UP) && Camera.RotV < rad(0.0f)){
Camera.RotV += ROTATE_SPEED;
}
if(CheckHitKey(KEY_INPUT_Q) && Camera.Zoom < 851.0f){
Camera.Zoom += ZOOM_RATE;
}
else if(CheckHitKey(KEY_INPUT_E) && Camera.Zoom > 0.0f){
Camera.Zoom -= ZOOM_RATE;
}
Camera.Pos = VAdd(VScale(VTransform(VGet(0.0f, 0.0f, 1.0f), MMult(MGetRotX(Camera.RotV), MGetRotY(Camera.RotH))), Camera.Zoom), TargetPos);
if(Camera.RotH > rad(360)){
Camera.RotH -= rad(360);
}
else if(Camera.RotH < 0.0f){
Camera.RotH += rad(360);
}
SetCameraPositionAndTarget_UpVecY(Camera.Pos, TargetPos);
}