最近刚接触了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();
}
这是第一次写博客,有什么不懂得可以问我
再说一句:这个游戏最主要的时回调函数,只有每隔多少秒刷新一下,才能有效果,其实就是不停的重绘
转载于:https://blog.51cto.com/09876/1272927