这段代码首先创建了背景和玩家脑袋图像,然后开始创建精灵。并且每个精灵都被设置到屏幕的指定位置。虽然我们能够用游戏屏幕和精灵的宽度和高度来列出一个通用的精灵位置的方程式,但是这样通过硬性编码来确定位置还是更加的容易和准确。位置定下来以后,球员精灵的速度需要我们来设置,这样他们就能按照我们所设置的速度来行进了。 内容来自www.paper51.com 由于游戏中有相当多的图形对象,HCanvas类的draw()方法就比较简单。就拿绘制足球场背景为例,通过下面的代码就能实现: paper51.com
g.drawImage(background,(0-70), 0, Graphics.TOP | Graphics.LEFT); 内容来自论文无忧网 www.paper51.com
对于玩家精灵和足球精灵的绘制,也就是游戏中最重要的图形对象。代码如下: paper51.com
PlayerSprite.paint(g); copyright paper51.com BallSprite.paint(g); paper51.com 球员精灵的绘制,只需要把paint()方法的调用放入到循环中,就可以绘制完每辆汽车。代码如下: paper51.com for(int i = 0; i < 4; i++) http://www.paper51.com
npcSprite[i].paint(g); 内容来自www.paper51.com 4.2.2. 玩家按键移动的设置 内容来自www.paper51.com
Update()方法还负责处理用户输入和根据游戏屏幕移动玩家。按键来移动玩家和足球的代码如下: paper51.com
if(++inputDelay > 2) { copyright paper51.com
int keyState =getKeyStates(); 内容来自www.paper51.com
if ((keyState& LEFT_PRESSED) != 0) 内容来自www.paper51.com { 内容来自论文无忧网 www.paper51.com PlayerSprite.move(-6, 0); http://www.paper51.com PlayerSprite.nextFrame(); 内容来自www.paper51.com BallSprite.move(-6, 0); 内容来自论文无忧网 www.paper51.com BallSprite.nextFrame(); http://www.paper51.com } http://www.paper51.com
else if((keyState & RIGHT_PRESSED) != 0) { paper51.com PlayerSprite.move(6, 0); 内容来自www.paper51.com
PlayerSprite.nextFrame(); http://www.paper51.com BallSprite.move(6, 0); 内容来自www.paper51.com
BallSprite.nextFrame(); 内容来自www.paper51.com } copyright paper51.com if ((keyState& UP_PRESSED) != 0) { paper51.com PlayerSprite.move(0, -6); copyright paper51.com
PlayerSprite.nextFrame(); paper51.com
BallSprite.move(0, -6); paper51.com BallSprite.nextFrame(); copyright paper51.com } 内容来自论文无忧网 www.paper51.com else if((keyState & DOWN_PRESSED) != 0) { 内容来自www.paper51.com PlayerSprite.move(0, 6); http://www.paper51.com
PlayerSprite.nextFrame(); http://www.paper51.com BallSprite.move(0, 6); copyright paper51.com BallSprite.nextFrame(); copyright paper51.com
} 内容来自www.paper51.com else if((keyState & FIRE_PRESSED) != 0) { 内容来自www.paper51.com
BallSprite.move(BallXSpeed, BallYSpeed); copyright paper51.com BallXSpeed = 6; 内容来自论文无忧网 www.paper51.com BallYSpeed = 6; http://www.paper51.com } paper51.com
checkBounds(PlayerSprite, false); 内容来自论文无忧网 www.paper51.com
checkBounds(BallSprite,false); 内容来自www.paper51.com
// Reset theinput delay http://www.paper51.com inputDelay = 0; 内容来自www.paper51.com } paper51.com
它在每次游戏循环的时候都要递增,而每3次游戏循环就允许一次按键发生。也就是说,按键的响应速度减小为游戏循环速度的三分之一,这就限制了玩家的移动速度,使得这个简单的游戏更好玩、更具有挑战性。当按键被检测到,代码就将玩家精灵和足球精灵移动一定的位置,然后调用nextFrame()来改变它的帧图像。CheckBounds()的调用,它用来确保玩家还在游戏屏幕的边界之内。它允许玩家折返精灵或者是把精灵限制在屏幕边界内移动。第二个参数决定了它会采取哪种行为,true便是精灵折返,而false表示防止精灵移动超出屏幕边界。 paper51.com
在游戏中加入了足球精灵,游戏开始的时候玩家精灵和足球精灵能同时控制,但是当玩家按fire键时,足球就会踢出去,并且此时玩家精灵的移动不能控制足球精灵的移动。只有当玩家精灵在此和足球精灵发生冲突的时候,玩家精灵的移动才能在此控制到足球精灵的移动。代码如下: paper51.com if(BallSprite.collidesWith(PlayerSprite, true)) { copyright paper51.com
if(++inputDelay > 2) { 内容来自www.paper51.com int keyState =getKeyStates(); 内容来自论文无忧网 www.paper51.com ……. http://www.paper51.com
} copyright paper51.com } 内容来自www.paper51.com
对于碰撞的实现,在Wireless Toolkit中的MIDP 2.0的game包中所包含的collidesWith中有碰撞检测,但是由于该游戏主要的事件响应基本上于冲突有关,有关冲突的实现将在本章最后进行讲解。 paper51.com |