程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言編寫簡單2D游戲

C語言編寫簡單2D游戲

編輯:關於C語言

星際迷航

摘要:本文分析了飛機在飛行過程中隨著鼠標移動的飛行軌跡,碰撞的物理顯現,運用游戲畫面繪制貼圖、游戲輸入消息處理、游戲動畫技巧、游戲物理現象設計原理以及人工智能技術,利用Microsoft Visual C++ 6.0開發了星際迷航這款游戲。實驗結果表明了簡單的2D游戲可以實現。 關鍵字: 繪制貼圖 消息處理 人工智能  VC++ 1.引言 2D游戲開發是游戲開發領域中一個不可或缺的重要分支,絕大多數休閒游戲與動漫游戲都是使用2D游戲技術開發實現的。2D游戲技術已經成為了手機及一系列小型設備游戲開發的主導技術。然而2D游戲計算機游戲程序員不僅要有程序設計技巧和軟件工程方法,更需要堅實的游戲專業領域知識,2D游戲開發是游戲開發的最基礎部分,為此我們提出了有效的2D游戲的設計與實現方法。通過該方法,我們設計並實現了一款2D游戲。

2.流程圖

 

2-1 流程圖

3.功能實現

3.1背景如何實現

首先將制作好的背景圖片”BackGround.bmp”)如圖3-1所示讀取到內存中並繪制到屏幕上。運行結果如圖3-1所示: 3-1 背景圖片 首先運用LoadImage()函數從文件中加載位圖。 BackGround=(HBITMAP)LoadImage(NULL,"BackGround.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE); 建立一個與窗口DC兼容的內存DC hdc = GetDC(hWnd);
    mdc = CreateCompatibleDC(hdc);
建立一個與窗口DC兼容的緩沖DC     bufdc = CreateCompatibleDC(hdc);
    bmp = CreateCompatibleBitmap(hdc,800,600);
內存DC使用位圖對象 SelectObject(bufdc,BackGround); 將內存DC的內容貼到窗口DC中完成畫面的顯示          BitBlt(mdc,0,0,800,w,bufdc,0,600-w,SRCCOPY);
                 BitBlt(mdc,0,w,800,600-w,bufdc,0,0,SRCCOPY);
運行結果如圖3-2:                                 圖3-2 背景貼圖

3.2星際迷航動畫

3.2.1星際迷航飛機角色動畫

為了實現游戲畫面的透明效果,首先加載游戲的背景位圖(” BackGround.bmp”)和飛機位圖(“Plane.bmp”) BackGround=(HBITMAP)LoadImage(NULL,"BackGround.bmp",IMAGE_BITMAP,800,600,LR_LOADFROMFILE);
         Plane=(HBITMAP)LoadImage(NULL,"Plane.bmp",IMAGE_BITMAP,70,140,LR_LOADFROMFILE);
其次前景位圖的屏蔽圖部分與背景圖作”AND”運算,加入下列代碼: SelectObject(bufdc,Plane);
BitBlt(mdc,nowX,nowY,70,70,bufdc,0,70,SRCAND);    
運行結果如圖3-3 3-3 飛機貼圖AND運算”AND”運算的結果與前景圖作”OR”運算,加入下列代碼: BitBlt(mdc,nowX,nowY,70,70,bufdc,0,0,SRCPAINT);
運行結果如圖3-4: 圖3-4 飛機貼圖or運算 為了實現鼠標控制飛機飛行,當鼠標一移動,獲取鼠標X的坐標,在消息處理函數中加入下列代碼: x = LOWORD(lParam);        
如果鼠標的X坐標大於窗口臨界值,則X等於臨界值,若鼠標的X坐標小於0,則將鼠標X設定為0,加入下列代碼: if(x > 730)        
x = 730;
                            else    
if(x < 0)
x = 0;
同理,獲取鼠標的Y坐標,加入如下代碼:    y = HIWORD(lParam);                            
                                             if(y > 480)
                                                                 y = 480;
                                             else if(y < 0)
                                                                 y = 0;                
判斷飛機的移動方向,使飛機的移動方向與鼠標的移動方向一致,即飛機跟隨著鼠標的移動而移動,並進行貼圖,加入代碼如下:        if(nowX < x)
                 {
                                     nowX += 20;
                                     if(nowX > x)
                                                        nowX = x;
                 }
                 else
                 {
                                     nowX -=20;
                                     if(nowX < x)
                                                        nowX = x;
                 }
if(nowY < y)
                 {
                                     nowY += 20;
                                     if(nowY > y)
                                                        nowY = y;
                 }
                 else
                 {
                                     nowY -= 20;
                                     if(nowY < y)
                                                        nowY = y;
                 }
                 SelectObject(bufdc,plane);
                 BitBlt(mdc,nowX,nowY,70,70,bufdc,0,70,SRCAND);
BitBlt(mdc,nowX,nowY,70,70,bufdc,0,0,SRCPAINT);
3.2.2計算機角色動畫 為了實現游戲畫面的透明效果,加載游戲的石頭位圖(”Stone.bmp”)          Stone=(HBITMAP)LoadImage(NULL,"Stone.bmp",IMAGE_BITMAP,100,200,LR_LOADFROMFILE);
其次前景位圖的屏蔽圖部分與背景圖作”AND”運算,加入下列代碼: SelectObject(bufdc,Stone);
BitBlt(mdc,Sx,Sy,100,100,bufdc,0,100,SRCAND);    
”AND”運算的結果與前景圖作”OR”運算,加入下列代碼: BitBlt(mdc,Sx,Sy,100,100,bufdc,0,0,SRCPAINT);
為了實現游戲石頭下落效果,定義一個速度VY,並計算Y軸坐標,並不停的往下貼,加入如下代碼: vy=15;
Sy += vy;
為了實現多個石頭下落效果,定義石頭坐標Sx1,Sx2,Sx3,Sy1,Sy2,Sy3,分別表示四個石頭下落的坐標值,通過如上代碼所示加載、實現透明並掉落。

3.2.3星際迷航背景動畫

    為了實現背景動畫的滾動效果,設定一個間隔時間tPre以及圖片寬度W代碼實現如下          BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);
                 tPre = GetTickCount();
                 w +=10;
                 if(w>=600)
                                     w = 0;
其中tPre獲取時間,圖片的隨著時間Y坐標不斷增加10,如果當整個圖片圖片大小為800*600>600的話,則將圖片重新滾動一遍。

4、物理現象

  為了實現整個游戲的碰撞效果的物理現象,首先加載游戲的石頭位圖 baozha0=(HBITMAP)LoadImage(NULL,"baozha0.bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
         baozha1=(HBITMAP)LoadImage(NULL,"baozha1.bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
         baozha2=(HBITMAP)LoadImage(NULL,"baozha2.bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
         baozha3=(HBITMAP)LoadImage(NULL,"baozha3.bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
對於碰撞效果,采取臨界值碰撞來實現,Sx1Sy1為石頭1的坐標,XY為鼠標的坐標,當飛機的坐標和石頭的坐標達到臨界值的時候,產生碰撞,相關代碼如下:   SelectObject(bufdc,baozha0);
                    {
                                        if(((Sx1<x)&&(Sx1+90>x))&&((Sy1<y)&&(Sy1+90>y)))
                                        {
                 BitBlt(mdc,Sx1-50,Sy1-70,316,316,bufdc,0,316,SRCAND);
        BitBlt(mdc,Sx1-50,Sy1-70,316,316,bufdc,0,0,SRCPAINT);
                                     DeleteDC(bufdc);
                                        }}

5、實驗結果及分析

本實驗實現了游戲畫面繪制貼圖、游戲輸入消息處理、游戲動畫技巧、游戲物理現象設計原理。優點:初步實現了游戲畫面繪制貼圖、游戲輸入消息處理、游戲動畫技巧、游戲物理現象設計基本功能。缺點:因時間及數據結構算法沒有學好所以未實現子彈與石頭碰撞效果,爆炸效果不逼真,貼圖效果不好。

6、結論

這個程序的架構仍顯笨拙,有很多不如意的地方,但是實現了游戲畫面繪制貼圖、游戲輸入消息處理、游戲動畫技巧、游戲物理現象設計原理。雖然整個游戲不能像紅白機一樣內容豐富,但是以後會把它設計得簡潔、優雅,以至於可以把它做成一個像《雷電》一樣精彩的飛行射擊游戲。  

本文出自 “托起大象狂奔” 博客,請務必保留此出處http://282761713.blog.51cto.com/1495050/334024

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved