mooc自學**:
源自中國傳媒大學韓紅雷老師的課程)
第七章學習的小遊戲是「彈彈球」,小球會始終在邊框中心產生,並根據與其他小球和邊界的碰撞發生運動變化。其中用到了很多有趣的知識點,包括實事更新達到動畫效果、建立後備緩衝交換機制防止閃爍和擦除、視窗的變化機制(邊界會根據視窗的大小變化而變化)、小球的運動碰撞等等。
(1)新建立乙個桌面應用程式專案,命名為「bumpballs」(彈跳球)。
(2)新建全域性變數和常量:
#define balls_num 64
//小球的最大數量
#define max_v 4
//球速的最大值
int ballsx[balls_num]
,ballsy[balls_num]
;//小球的x、y座標
int ballsvx[balls_num]
,ballsvy[balls_num]
;//小球x、y速度
colorref ballsc[balls_num]
;//小球的顏色
int nballs=0;
//當前球的數量
int radius=20;
//球的半徑
int timestep=20;
//每幀時間間隔(毫秒)
int wndwidth=0;
//邊框寬度
int wndheight=0;
//邊框高度
(3)函式功能主要包括隨機生成乙個小球的位置,小球的繪製,兩小球碰撞時產生的變化,時刻更新小球運動狀態。
int
generateball
(int
*n)//生成小球的函式
void
drawballs
(hdc hdc,
int n,
int r,
int x,
int y[
],colorref c)
//繪製小球
int
response
(int v1[2]
,int v2[2]
,int u[2]
)//兩小球碰撞後產生的反應
void
updateballs
(int n,
int r,
int x,
int y,
int vx,
int vy,
int elapsetime)
//實時更新小球的狀態}}
}for
(int i=
0;i)//設定觸碰邊界後的變化
for(
int i=
0;i)//每個小球的位置都根據上一幀的位置加上速度乘以時間得到(更新小球的位置)
}
(4)新增預設值:
srand
(time
(null))
;//隨機種子
generateball
(&nballs)
;//生成乙個小球(要保證該條指令在確定了隨機位置之後,因此放在主訊息迴圈前面)
(5)新增互動:
case wm_create:
//該條目下的指令發生在視窗建立之後,顯示之前
settimer
(hwnd,
1,timestep,
null);
//api函式中的乙個,表示每隔一段時間做一件同樣的事(這裡就是設定乙個編號為1的計時器,每隔timestep產生一次)
break
;case wm_timer:
//定時器函式,每當定時器值為1的時候,就觸發更新
if(wparam==1)
break
;case wm_size:
//改變視窗大小的函式,返回變數為iparam,該變數的高位為視窗的寬度,低位為視窗的高度
wndwidth=
loword
(iparam)
;//取低位位元組
wndheight=
hiword
(iparam)
;//取高位位元組
break
;case wm_keydown:
if(wparam==
' ')
//當按下空格鍵的時候生成新的小球
break
;case wm_erasebkgnd:
//取消擦除,避免閃爍
break
;
hdc memhdc=
createcompatibledc
(hdc)
;//建立乙個與指定裝置相容的記憶體裝置上下文環境
rect rectclient;
//定義乙個矩形區域物件
getclientrect
(hwnd,
&rectclient)
;//該函式獲取視窗客戶區的大小
hbitmap bmpbuff =
createcompatiblebitmap
(hdc, wndwidth, wndheight)
;//建立與指定的裝置環境相關的裝置相容的點陣圖
hbitmap poldbmp =
(hbitmap)
selectobject
(memhdc, bmpbuff)
;//將位圖放到指定的後備環境中
patblt
(memhdc,0,
0, wndwidth, wndheight, whiteness)
;//用當前選入指定裝置環境中的刷子繪製給定的矩形區域。
drawballs
(memhdc, nballs, radius, ballsx, ballsy, ballsc)
;//繪製出後背環境的小球情況
bool tt =
bitblt
(hdc, rectclient.left, rectclient.top, wndwidth, wndheight, memhdc, rectclient.left, rectclient.top, srccopy)
;// 將後背環境中的引數拷貝到前端頁面上(目標的hdc,拷貝的尺寸,後背的hdc和尺寸,拷貝方式為完全拷貝)
selectobject
(memhdc, poldbmp)
;//將後背快取和點陣圖進行**
deleteobject
(bmpbuff)
;deletedc
(memhdc)
;
(7)課後拓展:
mooc遊戲設計基礎(自學)3
mooc自學 第三個小遊戲是 小型計算器 即根據使用者輸入進行簡單的四則運算。1 還是先建立乙個新的桌面應用程式專案,命名為 expression 2 定義需要用到的全域性變數,包括兩個數字 字元計數器 操作符 臨時儲存區 計算結果 是否有結果判斷 顯示輸出的字串。float x 0,y 0 int...
mooc遊戲設計基礎(自學)5
mooc自學 第五個小遊戲是製作博德曼分形集合,根據博德曼公式進行迭代,然後將收斂區域部分繪製成黑色,發散區域繪製成白色。分形指的就是一些看似雜亂無章,但其實是用一些函式迭代而成的圖形,曼德博集合屬於其中的逃逸時間分形 1 先建立乙個新的桌面應用程式,取名為 loop 2 設定全域性常量 const...
mooc遊戲設計基礎(自學)6
mooc自學 第六章中的小遊戲是 移動方塊 玩家需要將方塊移動到隨機出現的方塊位置上面,每完成一次加一分。類似於貪吃蛇 1 先建立乙個新的桌面應用專案,取名為 brick 磚塊 2 分析一下遊戲需要的函式功能 隨機位置 建立磚塊 判斷重疊,然後在函式前向宣告下對這三個函式進行建立 int randp...