最近刚接触了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();

}  

这是第一次写博客,有什么不懂得可以问我

再说一句:这个游戏最主要的时回调函数,只有每隔多少秒刷新一下,才能有效果,其实就是不停的重绘