mooc遊戲設計基礎(自學)7

2021-10-07 03:20:28 字數 3602 閱讀 5062

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...