自从写完了第二个android程序后,我就彻底迷上了android。于是我讲Snake作为我的第三个android程序,在第二个程序编写完后,我在第二周就基本看懂了Snake的全部源代码。之后我尝试改变一下,使贪吃蛇具备穿墙的功能。我主要改了以下两个个地方:
(1)加入onTouchEvent
目标:用onTouchEvent替代onKeyDown,因为现在的android手机大多没有方向键了。
算法:根据onTouchEvent中UP时得到的x,y值与Down的x,y值进行做差,同时比较根据δx与δy的绝对值的大小以及δx、δy的正负,判断用户的手势。
源代码如下:
//SnakeView.java
public boolean onTouchEvent(MotionEvent event){
float x = event.getX();
float y = event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
mX = x;
mY = y;
//update();
return true;
case MotionEvent.ACTION_UP:
float dx = x-mX;
float dy = y-mY;
if(Math.abs(dx)>=0 || Math.abs(dy)>=0)
{
if(Math.abs(dx) >= Math.abs(dy))
{
if(dx>0.0f)
{
if (mDirection != WEST)
{
mNextDirection = EAST;
}
return true;
}
else
{
if (mDirection != EAST)
{
mNextDirection = WEST;
}
return true;
}
}
else
{
if(dy<0.0f)
{
if (mMode == READY | mMode == LOSE)
{
/*
* At the beginning of the game, or the end of a previous one,
* we should start a new game.
*/
initNewGame();
setMode(RUNNING);
update();
return (true);
}
if (mMode == PAUSE)
{
/*
* If the game is merely paused, we should just continue where
* we left off.
*/
setMode(RUNNING);
update();
return (true);
}
if (mDirection != SOUTH)
{
mNextDirection = NORTH;
}
return true;
}//if(dy>0.0f)
else
{
if (mDirection != NORTH)
{
mNextDirection = SOUTH;
}
return true;
}
}//else
}//if(Math...
//return true;
}//switch
return (true);
}//onTouchEvent
(2)使贪吃蛇具备穿墙功能
Snake的源代码如下:
//SnakeView.java
if ((newHead.x < 1) || (newHead.y < 1) || (newHead.x > mXTileCount - 2)
|| (newHead.y > mYTileCount - 2)) {
setMode(LOSE);//失败
return;
}
穿墙算法:当贪吃蛇头部到达墙时,及时改变其头部的坐标。
源代码如下:
//SnakeView.java
if (newHead.x < 1) {
newHead.x = mXTileCount - 2;
//return;
}
else if(newHead.y < 1)
{
newHead.y = mYTileCount - 2;
//return;
}
else if(newHead.x > mXTileCount - 2)
{
newHead.x = 1;
//return;
}
else if(newHead.y > mYTileCount - 2)
{
newHead.y = 1;
//return;
}