HGE教程翻譯(7)

來源:互聯網
上載者:User

 

Tutorial 07 –
成千上萬的野兔

 

這篇教程示範HGE渲染多種混合模式。

 

建立精靈

我們跳過所有的技術細節直接來到動作。首先建立並初始化一對精靈,用於"game objects"和背景。注意背景精靈是如何從小的64x64圖塊建立並在底部上色。

 

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();

 

使用UPDOWN鍵調整精靈的數量,空格鍵改變混合模式,ESC退出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.