怎样做小游戏挖金子(VC,源码4)
?有人下載我的工程文件,“我很欣慰”,名字是“挖金子VC版源碼”,大家多討論。
上回講哪了?地圖加載了,物品能顯示了。該顯示畫(huà)面上方擺動(dòng)的叉子了。計(jì)算機(jī)圖形學(xué)的“圖形旋轉(zhuǎn)”,當(dāng)然,有一個(gè)WINDOWS API函數(shù)PlgBlt,可我沒(méi)有用。網(wǎng)上有很多介紹圖形旋轉(zhuǎn)的文章,我還是講解一下我這個(gè)函數(shù):
void?GAMECATCH::TcDrawAngleOff(HDC?hdc,int?*pv,float?a,int?num,int?x0,int?y0){
????int?pvdest[20]={0};
//????int?x0,y0;
????int?i;
????int?tempx,tempy;
????
????memcpy(pvdest,pv,sizeof(int)*num);
/*
????x0=pv[0];
????y0=pv[1];
????//move
????for(i=0;i<num;i+=2)
????{
????????pvdest[i]-=x0;
????????pvdest[i+1]-=y0;
????}
*/
????//rotate
????for(i=0;i<num;i+=2)
????{
????????tempx=pvdest[i];
????????tempy=pvdest[i+1];
????????pvdest[i]=tempx*cos(a)-tempy*sin(a);
????????pvdest[i+1]=tempx*sin(a)+tempy*cos(a);
????}
????//move,中心點(diǎn)坐標(biāo)是320?58
????for(i=0;i<num;i+=2)
????{
????????pvdest[i]+=x0;
????????pvdest[i+1]+=y0;
????}
????//繪制圖形
????Draw(hdc,pvdest);
}
為什么我沒(méi)有刪除注釋掉的代碼?有原因。一個(gè)圖形繞(x0,y0)旋轉(zhuǎn),總共分三步(耳熟):圖形移動(dòng)到坐標(biāo)原點(diǎn),旋轉(zhuǎn),再移動(dòng)回原有位置。而我這個(gè)叉子的圖形在哪里?就在原點(diǎn)。所以省略了第一步。叉子的圖形,是畫(huà)了幾個(gè)線段,各端點(diǎn)坐標(biāo)如下(x1,y1,x2,y2,...):
?//設(shè)置爪子各頂點(diǎn)坐標(biāo)
?int temp[12]={
?0,32,20,32,
?40,0,64,0,
?64,64,40,64
?};
再解釋一下公式:
??????pvdest[i]=tempx*cos(a)-tempy*sin(a);
????????pvdest[i+1]=tempx*sin(a)+tempy*cos(a);
屏幕坐標(biāo)軸x向右,y向下,這個(gè)公式將逆時(shí)針旋轉(zhuǎn)圖形。
有一個(gè)問(wèn)題,為什么不用一個(gè)位圖?位圖的顯示效果雖然好,但是計(jì)算cos,sin時(shí),會(huì)產(chǎn)生誤差。這將使圖像有一些變形,所以沒(méi)有用位圖。
繪制、擺動(dòng)的問(wèn)題解決了。下面是伸縮。
叉子的伸縮
關(guān)鍵是使用“狀態(tài)機(jī)”。三種狀態(tài):擺動(dòng),伸出,拉回。我沒(méi)有定義宏,應(yīng)該批評(píng)。用0 1 2 表示的。
再次聲明軟件的“可維護(hù)性”,這種狀態(tài)設(shè)置,也許瑣碎,但有好處。
擺動(dòng)狀態(tài):修改當(dāng)前角度,當(dāng)前擺動(dòng)方向;
伸出狀態(tài):改變坐標(biāo),如果達(dá)到伸出的最大長(zhǎng)度,則狀態(tài)遷移:拉回;
拉回狀態(tài):改變坐標(biāo),如果“伸出長(zhǎng)度”降為0,則狀態(tài)遷移:擺動(dòng)。
為了消除坐標(biāo)計(jì)算的誤差,伸出時(shí),直接將坐標(biāo)偏移值轉(zhuǎn)為整型存儲(chǔ),如下:
???xoff=10*cos(iAngle*10*1.57/90);
???yoff=10*sin(iAngle*10*1.57/90);
拉回的時(shí)候,也用相同的偏移值,只要再乘以一個(gè)系數(shù),就實(shí)現(xiàn)了拉回的快慢不同。
按鍵檢測(cè)
用戶按“下”,叉子伸出。用按鍵消息來(lái)檢測(cè),代碼為:
????????case?WM_KEYDOWN:????????????switch(iGameState)
????????????{
????????????case?GAME_STATE_MAIN:
????????????????gamecatch.KeyProc(wParam); void?GAMECATCH::KeyProc(int?iKey)
{
????switch(iKey)
????{
????case?VK_DOWN:
????????if(0==iState)
????????{
????????????//擺動(dòng)狀態(tài)下才能變成伸出狀態(tài)
????????????iState=1;
????????????xoff=10*cos(iAngle*10*1.57/90);
????????????yoff=10*sin(iAngle*10*1.57/90);
????????}
????????break;
目前,叉子能正常擺動(dòng),用戶按“下”,叉子伸出,然后拉回。緊接著就是核心問(wèn)題“抓到物品”,即“檢測(cè)碰撞”,下回接著說(shuō)。歡迎參考原工程“挖金子VC版源碼”(在CSDN下載頻道)。
總結(jié)
以上是生活随笔為你收集整理的怎样做小游戏挖金子(VC,源码4)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Silverlight 4 Tools
- 下一篇: jQuery lightbox插件(相册