言語:C
ライブラリ:DXライブラリ
コンパイラ:Microsoft Visual Studio 2010
OS:Windows7 ←(書くの忘れてました。すみません。追記しました)
現状無理やりそれっぽくしてみたのですが、正しいやり方はどうやるのでしょうか?
#include "DxLib.h"
#include <math.h>
#define CAMERA_SPEED 10.0f
VECTOR PlayerPos = VGet(1000.0f, 0.0f, 1000.0f);
typedef struct{
VECTOR Pos;
float RotV, RotH;
}CameraStatus;
CameraStatus Camera = {VGet(1600.0f, 500.0f, 1600.0f), 30.0f*DX_PI_F/180.0f, -133.0f*DX_PI_F/180.0f};
void MoveCamera();
void DrawSp();
void Information();
int ProcessLoop(){
if(ProcessMessage() != 0){ return -1; }
if(ClearDrawScreen() != 0){ return -1; }
return 0;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE);
SetGraphMode(640, 480, 16);
SetBackgroundColor(255,255,255);
if(DxLib_Init() == -1 || SetDrawScreen(DX_SCREEN_BACK) != 0){ return -1; }
while(ProcessLoop() == 0 && !CheckHitKey(KEY_INPUT_ESCAPE)){
MoveCamera();
DrawSp();
Information();
DrawSphere3D(PlayerPos, 30, 8, GetColor(0,255,255), GetColor(255,255,255), TRUE);
ScreenFlip();
}
DxLib_End();
return 0;
}
void MoveCamera(){
VECTOR Move;
if(CheckHitKey(KEY_INPUT_W) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED);
Camera.Pos = VAdd(Camera.Pos, Move);
PlayerPos = VAdd(PlayerPos, Move);
}
if(CheckHitKey(KEY_INPUT_S) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,-1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED);
Camera.Pos = VAdd(Camera.Pos, Move);
PlayerPos = VAdd(PlayerPos, Move);
}
if(CheckHitKey(KEY_INPUT_D) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,-1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED);
Move = VCross(Move,VGet(0.0f,1.0f,0.0f));
Camera.Pos = VAdd(Camera.Pos, Move);
PlayerPos = VAdd(PlayerPos, Move);
}
if(CheckHitKey(KEY_INPUT_A) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED);
Move = VCross(Move,VGet(0.0f,1.0f,0.0f));
Camera.Pos = VAdd(Camera.Pos, Move);
PlayerPos = VAdd(PlayerPos, Move);
}
if(CheckHitKey(KEY_INPUT_LEFT) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED * 2);
Move = VCross(Move,VGet(0.0f,1.0f,0.0f));
Camera.Pos = VAdd(Camera.Pos, Move);
Camera.RotH += 1.5f * DX_PI_F / 180;
}
if(CheckHitKey(KEY_INPUT_RIGHT) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,-1.0f), MGetRotY(Camera.RotH)) ,CAMERA_SPEED * 2);
Move = VCross(Move,VGet(0.0f,1.0f,0.0f));
Camera.Pos = VAdd(Camera.Pos, Move);
Camera.RotH -= 1.5f * DX_PI_F / 180;
}
if(CheckHitKey(KEY_INPUT_UP) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,1.0f), MMult(MGetRotX(Camera.RotV - (90.0f * DX_PI_F / 180.0f)), MGetRotY(Camera.RotH))) ,CAMERA_SPEED * 2);
Camera.Pos = VAdd(Camera.Pos, Move);
Camera.RotV += 1.5f * DX_PI_F / 180;
}
if(CheckHitKey(KEY_INPUT_DOWN) != 0){
Move = VScale(VTransform(VGet(0.0f,0.0f,1.0f), MMult(MGetRotX(Camera.RotV + (90.0f * DX_PI_F / 180.0f)), MGetRotY(Camera.RotH))) ,CAMERA_SPEED * 2);
Camera.Pos = VAdd(Camera.Pos, Move);
Camera.RotV -= 1.5f * DX_PI_F / 180;
}
SetCameraPositionAndAngle(Camera.Pos, Camera.RotV , Camera.RotH, 0.0f);
}
void DrawSp(){
for(float x = 80.0f; x < 5000.0f; x += 80.0f){
DrawSphere3D(VGet(x,0,0), 30, 8, GetColor(255,0,0), GetColor(255,255,255), FALSE);
}
for(float y = 80.0f; y < 5000; y += 80.0f){
DrawSphere3D(VGet(0,y,0), 30, 8, GetColor(0,255,0), GetColor(255,255,255), FALSE);
}
for(float z = 80.0f; z < 5000; z += 80.0f){
DrawSphere3D(VGet(0,0,z), 30, 8, GetColor(0,0,255), GetColor(255,255,255), FALSE);
}
}
void Information(){
DrawFormatString(0, 0, GetColor(0,0,0), "WASDキーで移動");
DrawFormatString(0, 20, GetColor(0,0,0), "カーソルキーで旋回");
DrawFormatString(0, 420, GetColor(0,0,0), "水平角度:%f 垂直角度:%f", Camera.RotH / DX_PI_F * 180, Camera.RotV / DX_PI_F * 180);
DrawFormatString(0, 440, GetColor(0,0,0), "プレイヤー位置(X,Y,Z)=(%.0f,%.0f,%.0f)", PlayerPos.x, PlayerPos.y, PlayerPos.z);
DrawFormatString(0, 460, GetColor(0,0,0), "カメラ位置(X,Y,Z)=(%.0f,%.0f,%.0f)", Camera.Pos.x, Camera.Pos.y, Camera.Pos.z);
}
・一行目
×:引数 In1 と In2 を乗算した行列を結果の行列を戻り値として返す関数です
○:引数 In1 と In2 を乗算した結果の行列を戻り値として返す関数です
・三行目
×:例:拡大行列と平行移動行列と乗算した場合
○:例:拡大行列と平行移動行列を乗算した場合
じゃないでしょうか?
これ直して欲しいのですが、どこへ報告したらいいのでしょうか?