■メタルスラッグのヘビィマシンガン風の弾の動かし方
#include"DxLib.h"
#include<math.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hP,LPSTR lpC,int nC)
{
ChangeWindowMode(TRUE); //ウィンドウモードで起動
SetGraphMode(320,240,16);
SetMainWindowText("HMGun"); //ウィンドウのタイトル
if(DxLib_Init() == -1) return (-1); //DXライブラリ初期化
srand(GetTickCount());
DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );
//乱数の初期化
srand((unsigned)GetTickCount());
SetDrawScreen(DX_SCREEN_BACK);
const int R=1;
const int L=2;
double TamaX[32]={0},TamaY[32]={0},TamaA[32]={0};
double TamaVX[32]={0},TamaVY[32]={0};
int TamaF[32]={0};
int muki=R;
double vx=5,vy=0;
int JikiX=160,JikiY=120;
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ProcessMessage();
ClsDrawScreen(); //画面を初期化
if(CheckHitKey(KEY_INPUT_RIGHT))
{
muki=R;
vx+=0.25;
}else if(CheckHitKey(KEY_INPUT_LEFT))
{
muki=L;
vx-=0.25;
}
if(CheckHitKey(KEY_INPUT_UP))
{
vy-=0.25;
}
else if(CheckHitKey(KEY_INPUT_DOWN))
{
vy+=0.25;
}
double l=sqrt(vx*vx+vy*vy+0.01);
vx/=l;
vy/=l;
if(CheckHitKey(KEY_INPUT_Z))
{
for(int i=0;i<32;i++)
{
if(TamaF[i]==0)
{
TamaX[i]=JikiX+8;
TamaY[i]=JikiY+16;
TamaF[i]=1;
TamaVX[i]=vx;
TamaVY[i]=vy;
break;
}
}
for(int i=0;i<32;i++)
{
if(TamaF[i]==1)
{
DrawLine(TamaX[i],TamaY[i],
TamaX[i]+TamaVX[i]*8,TamaY[i]+TamaVY[i]*8,
GetColor(255,255,255));
TamaX[i]+=TamaVX[i]*4;
TamaY[i]+=TamaVY[i]*4;
if(TamaX[i]<0 || TamaX[i]>320 || TamaY[i]<0 || TamaY[i]>240)
TamaF[i]=0;
}
}
}
DrawBox(JikiX,JikiY,JikiX+16,JikiY+32,GetColor(255,255,255),TRUE);
ScreenFlip() ;//フリップする
}
■int型整数で固定小数点を使ってsin,cos移動するプログラム。
#include"DXLIB.h"
#include<math.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hP,LPSTR lpC,int nC)
{
static int count=0;
double angle=0;
const double RAD=3.14159265/180;
const int RightShiftValue=3;
const int MulValue=pow(2.0,(double)RightShiftValue);
ChangeWindowMode(TRUE); //ウィンドウモードで起動
SetGraphMode(320,240,32);
SetMainWindowText("COS256,SIN256"); //ウィンドウのタイトル
if(DxLib_Init() == -1) return (-1); //DXライブラリ初期化
//データ読み込み中と表示する
DrawString( 0 , 0 , "データ読み込み中" , GetColor(255,255,255) );
//乱数の初期化
srand((unsigned)GetTickCount());
SetDrawScreen(DX_SCREEN_BACK);
int Xtable[7][2]
={
cos(0*RAD)*MulValue,RightShiftValue,cos(15*RAD)*MulValue,RightShiftValue,cos(30*RAD)*MulValue,RightShiftValue,
cos(45*RAD)*MulValue,RightShiftValue,cos(60*RAD)*MulValue,RightShiftValue,cos(75*RAD)*MulValue,RightShiftValue,cos(90*RAD)*MulValue,RightShiftValue
};//加算する値と除算(右シフト)する値を決める
int Ytable[7][2]
={
sin(0*RAD)*MulValue,RightShiftValue,sin(15*RAD)*MulValue,RightShiftValue,sin(30*RAD)*MulValue,RightShiftValue,
sin(45*RAD)*MulValue,RightShiftValue,sin(60*RAD)*MulValue,RightShiftValue,sin(75*RAD)*MulValue,RightShiftValue,sin(90*RAD)*MulValue,RightShiftValue
};//加算する値と除算(右シフト)する値を決める
int X=0,Y=0;
int A=0;
//メインループ
while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)
{
ProcessMessage();
ClsDrawScreen(); //画面を初期化
X+=Xtable[A][0];
Y+=Ytable[A][0];
if(((X>>3)+160)<0 || ((X>>3)+160)>320 || ((Y>>3)+120)<0 || ((Y>>3)+120)>240){
X=160;Y=120;A=(A+1)%7;
}
DrawCircle((X>>3)+160,(Y>>3)+120,3,GetColor(255,255,255));
ScreenFlip(); //フリップする
}
DxLib_End(); //DXライブラリ終了処理
return (0); //終了
}
■ベクトルを使ったホーミングミサイルのアルゴリズム
メインループだけですので、ご承知を
void mainloop()
{
static double JX=320,JY=240;
static double VecX=0.0f,VecY=0.0f;
static double MissileX=0.0f,MissileY=0.0f;
static double angle=0.0f;
if(CheckHitKey(KEY_INPUT_UP)) JY-=2;
if(CheckHitKey(KEY_INPUT_DOWN)) JY+=2;
if(CheckHitKey(KEY_INPUT_LEFT)) JX-=2;
if(CheckHitKey(KEY_INPUT_RIGHT)) JX+=2;
if(MissileX<JX) VecX+=(0.25/4);
if(MissileX>JX) VecX-=(0.25/4);
if(MissileY<JY) VecY+=(0.25/4);
if(MissileY>JY) VecY-=(0.25/4);
double L=sqrt(VecX*VecX+VecY*VecY)+0.01;
VecX/=L;
VecY/=L;
MissileX+=VecX*3;
MissileY+=VecY*3;
DrawBox(JX,JY,JX+16,JY+32,GetColor(255,0,0),TRUE);
angle=atan2(VecY,VecX);
DrawLine(MissileX,MissileY,MissileX+cos(angle)*8,MissileY+sin(angle)*8,GetColor(0,255,0));
}