HGEチュートリアル翻訳(7)


Tutorial 07–何千人もの野ウサギ
 
このチュートリアルでは、HGEが複数のブレンドモードをレンダリングする例を示します.
 
スプライトの作成
私たちはすべての技術の詳細をスキップして直接動作に来ました.まず、「game objects」とバックグラウンドのペアを作成して初期化します.バックグラウンドスプライトが、64 x 64ブロックから作成され、下部に色を塗る方法に注意してください.
 
HTEXTURE tex, bgtex;
     
hgeSprite *spr, *bgspr;
     

   
     
   
tex=hge->Texture_Load("zazaka.png");
     
spr=new hgeSprite(tex,0,0,64,64);
     
spr->SetHotSpot(32,32);
     

   
     
   
bgtex=hge->Texture_Load("bg2.png");
     
bgspr=new hgeSprite(bgtex,0,0,800,600);
     
bgspr->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND);
     
bgspr->SetColor(0xFF000000,0);
     
bgspr->SetColor(0xFF000000,1);
     
bgspr->SetColor(0xFF000040,2);
     
bgspr->SetColor(0xFF000040,3);
     

 
ゲームオブジェクト配列の初期化
配列を作成し、「game objects」のプロパティを保存し、任意の値で埋めます.
 
#define MAX_OBJECTS 2000
     

   
     
   
struct sprObject
     
{
     
  float x,y;
     
  float dx,dy;
     
  float scale,rot;
     
  float dscale,drot;
     
  DWORD color;
     
};
     

   
     
   
sprObject*  pObjects;
     
int         nObjects;
     

   
     
   
pObjects=new sprObject[MAX_OBJECTS];
     
nObjects=1000;
     

   
     
   
for(i=0; i<MAX_OBJECTS; i++)
     
{
     
  pObjects[i].x=hge->Random_Float(0,SCREEN_WIDTH);
     
  pObjects[i].y=hge->Random_Float(0,SCREEN_HEIGHT);
     
  pObjects[i].dx=hge->Random_Float(-200,200);
     
  pObjects[i].dy=hge->Random_Float(-200,200);
     
  pObjects[i].scale=hge->Random_Float(0.5f,2.0f);
     
  pObjects[i].dscale=hge->Random_Float(-1.0f,1.0f);
     
  pObjects[i].rot=hge->Random_Float(0,M_PI*2);
     
  pObjects[i].drot=hge->Random_Float(-1.0f,1.0f);
     
}

 
ブレンドモードの変更
SetBlend関数は、0から4のint変数を使用して、ゲームオブジェクト配列のブレンドモードを調整します.
 
void SetBlend(int blend)
     
{
     
  static int sprBlend[5]=
     
  {
     
    BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE,
     
    BLEND_COLORADD | BLEND_ALPHABLEND | BLEND_NOZWRITE,
     
    BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE,
     
    BLEND_COLORMUL | BLEND_ALPHAADD   | BLEND_NOZWRITE,
     
    BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE
     
  };
     

   
     
   
  static DWORD sprColors[5][5]=
     
  {
     
    {0xFFFFFFFF, 0xFFFFE080, 0xFF80A0FF, 0xFFA0FF80, 0xFFFF80A0},
     
    {0xFF000000, 0xFF303000, 0xFF000060, 0xFF006000, 0xFF600000},
     
    {0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0},
     
    {0x80FFFFFF, 0x80FFE080, 0x8080A0FF, 0x80A0FF80, 0x80FF80A0},
     
    {0x40202020, 0x40302010, 0x40102030, 0x40203010, 0x40102030}
     
  };
     

   
     
   
  if(blend>4) blend=0;
     
  nBlend=blend;
     

   
     
   
  spr->SetBlendMode(sprBlend[blend]);
     

   
     
   
  for(int i=0;i<MAX_OBJECTS;i++)
     
    { pObjects[i].color=sprColors[blend][hge->Random_Int(0,4)]; }
     
}
     

 
画面の更新
 
FrameFuncでは、ゲームオブジェクトの配列を巡り、新しい位置を計算します.
 
  for(i=0; i<nObjects; i++)
     
  {
     
    pObjects[i].x+=pObjects[i].dx*dt;
     
    if(pObjects[i].x>SCREEN_WIDTH || pObjects[i].x<0)
     
      { pObjects[i].dx=-pObjects[i].dx; }
     

   
     
   
    pObjects[i].y+=pObjects[i].dy*dt;
     
    if(pObjects[i].y>SCREEN_HEIGHT || pObjects[i].y<0)
     
      { pObjects[i].dy=-pObjects[i].dy; }
     

   
     
   
    pObjects[i].scale+=pObjects[i].dscale*dt;
     
    if(pObjects[i].scale>2 || pObjects[i].scale<0.5)
     
      { pObjects[i].dscale=-pObjects[i].dscale; }
     

   
     
   
    pObjects[i].rot+=pObjects[i].drot*dt;
     
  }
     

スクリーンをレンダリング
RenderFuncでは、ゲームオブジェクトの配列を巡り、それらをレンダリングします.
 
  hge->Gfx_BeginScene();
     
  bgspr->Render(0,0);
     
     
     
  for(i=0; i<nObjects; i++)
     
  {
     
    spr->SetColor(pObjects[i].color); 
     
    spr->RenderEx(pObjects[i].x, pObjects[i].y,
     
                  pObjects[i].rot, pObjects[i].scale);
     
  }
     

   
     
   
  hge->Gfx_EndScene();
     

 
UPとDOWNキーを使用してスプライトの数を調整し、スペースキーを使用してブレンドモードを変更し、ESCを終了します.