brew小遊戲

最近剛接觸了brew這個平臺,學習做了一個簡單的小遊戲,現在將自己的體會寫一下,也順便整理一下思路。在做這個小遊戲的過程中,我發現了自己很多的缺點:

1.在做東西時不能考慮全局,沒有認真的把這個小項目思考一下便開始,這樣造成了很多時間的浪費,所以,以後在做項目時,需要把握全局,劃分模塊,仔細瞭解每個模塊之間的練習,這樣纔能有個清晰的思路。

2.害怕麻煩,在用一種方法解決問題時,遇到困難,就放棄,換另一種方法,這樣雖然換了很多種,但是實際上並沒有解決問題。

3.缺乏耐性,在調試的過程中,每次都沒有耐性,導致有些很簡單的錯誤,自己也沒有發現。

4.缺乏獨立思考的能力,在面對問題時,容易煩躁,這樣就造成很容易發現的錯誤卻找不到。

現在我把自己的思路寫一下,並且貼上有關代碼

整體思路:

我把這個遊戲分爲兩部分:小木塊的移動和小球的移動

球有三種狀態:

1)不操作時保持靜止

2)左方鍵按一下向左(逆時針轉動)滾動一格

3)右方鍵按一下向右(順時針轉動)

4穿越,遇到紅色方塊,紅色方塊被壓下,球與紅色方塊同時向下掉落,掉落過程中可以左右滾動(依託於紅色方塊)。

5)下落,遇到無支撐物時即下落。模仿重力加速度。

6)彈起,向下掉落時遇到土塊,則按照硬地面彈起規則,對重力加速度進行彈起,被空氣阻力(1/2重力)緩衝,反覆彈起、掉落,直到速度爲0

判定:

(1) 左滾到邊界即從右邊界中滾入;

(2) 右滾到邊界即從左邊界滾入

(3) 遇到障礙物,撞擊三次,障礙物消失

(4) 越過屏幕下邊界遊戲界面滾屏,進入下一張隨機地圖

生成地圖:定義一個二維數組,把小球的三種狀態分別用0,1,2表示,用隨機數生成數組,數組存放的是狀態,然後根據數組下標貼圖

我只判斷小球下面當前行,當前列是否爲空,如爲空就直接下落,不管下面的下面等等的情況,若爲紅色方塊,這時就不用管紅色方塊,因爲紅色方塊也是一個整體,不用管理,這時下面爲空,小球依然下落,如遇到黃色方塊就彈起。小球運動到屏幕的1/3時,小球就不再移動,地圖上移

地圖上移:每判斷一次,我們就把數組下面的值賦給上面,然後隨機填充最後一行的值

紅木塊類似與小球,如果下面爲空的話就下落,如下面紅色方塊,就循環判斷紅色方塊下面有多少紅色方塊,然後判斷最後一個紅色方塊下面是否爲空,若爲空,則方塊依次下移。

代碼:我只粘貼主要代碼

//隨機數組生成地圖


int getRandNumber(int nRange)

{

if (nRange==0)

{

return 0;

}

static int nRandomSeed = 0 ;

if ( nRandomSeed == 0 )

{

nRandomSeed = ISHELL_GetTimeMS(m_pIShell);

}

nRandomSeed = nRandomSeed * 1103515245L + 12345;

return((unsigned) (nRandomSeed / 65536L) % nRange);

}


int getRandNumberFromTo( int nBegin,int nEnd )

{

int nRange = nEnd - nBegin;

return (nBegin+getRandNumber(nRange));

}

void menu::Randmap(int map[20][20])

{


for(int i = 0; i< numh;i++)

{

for (int j = 0; j< numw;j++)

{

map[i][j] = getRandNumberFromTo( 0,4);//第一張地圖

}

}


for(int i = 0; i< numh;i+=2)

{

for (int j = 0; j< numw;j++)

{

map[i][j] = 0;//第一張地圖

}

}



//紅色方塊的移動

//小球的位置是固定的,判斷小球所在行下面的紅色方塊。然後根據最後一個紅色方塊,下移

void menu::MoveMap()

{

if (map1[readrow][m_ballmoveh] == 1)

{


while(map1[readrow ][m_ballmoveh] == 1)

{

++readrow;

}

rednum = readrow;//+1;

if (map1[rednum][m_ballmoveh] == 0)

{

int i = rednum;

for(;rednum > m_ballmovew;--rednum)

{

map1[rednum][m_ballmoveh] = map1[rednum -1][m_ballmoveh];

map1[rednum -1][m_ballmoveh] = 0;

}

}

}

}


for(int i = 0; i < numh; i++)

{

int j = getRandNumberFromTo(0,numw);

map[i][j] = 0;

}


for(int i = 0;i<20;i++)

{

for (int j = numw;j<20;j++)

{

map1[i][j]=55;

}

}

}


小球彈起及下落

void menu::Movenum()

{


double tball = 0;//小球下落的時間

int g =10;

double m = 1;//假設的小球的質量

double f = 0.1 *m *g;//假設的阻力


if (map1[m_ballmovew][m_ballmoveh] == 0)

{

bDown=TRUE;

m_ballmovew++;

numball++;


maxHeight+=m_pich;

hball =m_pich;

h1 = hball;

{

//小球下落過程

t1=sqrt((2*m*(m*g*h1-f*h1))*1.0/pow((m*g-f),2));

v1=(m*g-f)*t1;

for(double i=1;i<t1+1;i+=1)

{

t=i<=t1?i:t1;

hight=(0.5/m)*t*t*(m*g-f)+(hball-h1);

}

}

//小球在超過1/3的位置時不再移動

if (m_bally >= pApp->lcdH/3)

{

hight = 0;

m_ballmovew--;

//數組上移,並把下個數組的值付給它

for (int i = 0; i < numh-1;i++)

{

for (int j = 0; j < numw;j++)

{

map1[i][j] = map1[i+1][j];

}

}

for(int j = 0;j< numw;j++)

{

map1[numh-1][j] = map2[k][j];

}

k++;

if (k == numh-1)

{

Randmap(map2);

k = 0;

}

}

m_bally += hight;

}

//小球彈跳

if (bUp==FALSE && bDown==TRUE)

{

if ( map1[m_ballmovew ][m_ballmoveh] == 2 || map1[m_ballmovew ][m_ballmoveh] == 3)

{

bDown=FALSE;

bUp=TRUE;

}

}

else if (bUp==TRUE)

{

if(h1 > 2)

{

v1=v1/3;

//小球上升過程.h1爲上升的最大高度

h1=(m*v1*v1*0.1)/(2*(m*g+f));

t1=(m*v1*1.0)/(m*g+f);

for(double i=0;i<t1+1;i+=1)

{

t=i<=t1?i:t1;

//hight爲t時刻小球所在高度

hight=v1*t-0.5*((m*g+f)*1.0/m)*t*t;

}

h1 = hight;

m_bally -=hight;

m_bally +=hight;

}

else

{

bUp=FALSE;

m_bally+= hight;

v1=0;

t1=0;

h1=0;

hight=0;

t=0;

numball = 0;

mapmove = 0;

}

}

readrow = m_ballmovew;

MoveMap();

}  

這是第一次寫博客,有什麼不懂得可以問我

再說一句:這個遊戲最主要的時回調函數,只有每隔多少秒刷新一下,纔能有效果,其實就是不停的重繪








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章