最近剛接觸了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)
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)
//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();
}
這是第一次寫部落格,有什麼不懂得可以問我
再說一句:這個遊戲最主要的時回調函數,隻有每隔多少秒重新整理一下,才能有效果,其實就是不停的重繪