吃金币小游戏实现的功能有:每个不同颜色的金币所代表的数值不同,且下落速度也不相同,玩家通过重力感应来控制角色的左右移动来吃金币,一定时间内没有吃到足够的金币,则挑战游戏失败,游戏非常简单。下面是游戏的一些图,图片来自于互联网:
再说下开发过程中遇到的一些问题吧:
1.如何通过重力感应判断角色的移动方向
通过实现SensorEventListener接口,复写public void onSensorChanged(SensorEvent event)()函数判断当前的移动方向。部分代码如下:
mSensorMgr = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// 注册listener,第三个参数是检测的精确度
//SENSOR_DELAY_FASTEST 最灵敏 因为太快了没必要使用
//SENSOR_DELAY_GAME 游戏开发中使用
//SENSOR_DELAY_NORMAL 正常速度
//SENSOR_DELAY_UI 最慢的速度
mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
mGX = event.values[SensorManager.DATA_X];
mGY= event.values[SensorManager.DATA_Y];
mGZ = event.values[SensorManager.DATA_Z];
//System.out.println("x" + mGX +"y" + mGY);
number++;
m_time++;
if(m_time > 25)//每隔一段时间产生一些金币
{
m_time = 0;
makeMoney();
}
if(number > 2)
{
number = 0;
if( mGX > 0)//此时精灵方向要向左
{
int dir = sprite.getDir();
if(dir == DIR_LEFT)//上次方向是向左
{
sprite.dir = DIR_LEFT;
frames++;
if(frames > bmpLeft.length - 1)frames = 0;
}
else//上次的方向是向右
{
frames = 0;
sprite.dir = DIR_LEFT;
}
sprite.x -= speed;
if(sprite.x < 0)sprite.x = 0;
sprite.bmp = bmpLeft[frames];
}
else //此时精灵方向要向右
{
int dir = sprite.getDir();
if(dir == DIR_LEFT)
{
sprite.dir = DIR_RIGHT;
frames = 0;
}
else
{
frames++;
if(frames > bmpRight.length - 1)frames = 0;
}
sprite.x += speed;
if(sprite.x > screenWidth - sprite.bmp.getWidth())sprite.x = screenWidth - sprite.bmp.getWidth();
sprite.bmp = bmpRight[frames];
}
}
}
2.如何判断角色和金币发生碰撞
之前有买过一本名叫android游戏开发宝典的书,里面讲到了碰撞的检测。思路是,当不满足金币在角色的左侧、右侧,上面,下面这几种情况时,就说明发生了碰撞,否则就没有发生碰撞。部分代码如下:
public boolean checkCollusion(Money temp)
{
int x = temp.x;
int y = temp.y;
if(sprite.x > x && sprite.x > x + temp.bmp.getWidth())//精灵在右侧
{
return false;
}
else if(sprite.x < x && sprite.x + sprite.bmp.getWidth() < x)//精灵在左侧
{
return false;
}
else if(sprite.y > y && sprite.y > y + temp.bmp.getHeight())//精灵在下面
{
return false;
}
else if(sprite.y < y && sprite.y + sprite.bmp.getHeight() < y)//精灵在上面
{
return false;
}
else return true;
}
3,还要注意到的一点是,在注册了重力感应之后,游戏结束之后要记得注销重力感应,貌似不注册会很费电(这个是在谷歌百度上看到的),可以通过以下代码实现:
public void surfaceDestroyed(SurfaceHolder holder) {//推出时要记得取消重力感应,否则很费电
// TODO Auto-generated method stub
flag = false;
mSensorMgr.unregisterListener(this);
}
好了,暂时就讲这么多,以后有新的问题再进行补充。