続・DXLIBの自作のサンプルプログラム集2

記事
IT・テクノロジー

■メタルスラッグのヘビィマシンガン風の弾の動かし方
#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));
}


サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す