何不试试将它们移植到手机上呢?通过前面的介绍,不难看出,这些经典的2D游戏都可以使用上面的几个类来概括:飞机、子弹、敌人都是Sprite,大海、天空、森林、沙漠都是TileLayer,我们所面临的难题,就是搜集和制作图片素材而已。
这里的实例是“是男人就下一百层”的手机翻版,下载地址:http://www.j2medev.com/Soft/src/game/200610/802.html,作者不详,反正不是我。下面是运行效果图:
使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱(2)
时间:2011-01-18 海边沫沫
首先,我们看一看程序的起点,也就是我们的MIDlet类,在这个程序的LRunner类的构在函数中,创建了一个gameCanv对象,如下:
public LRunner() {
dp=Display.getDisplay(this);
gc=new gameCanv();
dp.setCurrent(gc);
}
然后,在commandAction()函数中,这样启动游戏:
public void commandAction(Command c,Displayable d)
{
if(c==cmd_exit)
{
try
{
destroyApp(false);
}catch(Exception e){}
notifyDestroyed();
}
if((c==cmd_start)&(!gc.getIsOnGame()))
{
gc.reStart();
}
}
于是,游戏的主要逻辑全部交给gameCanv类了,这个类,就是我们前面讲到的GameCanvas类的子类,在这个类中,它实现了Runnable接口,并创建一个新的线程,以实现游戏的主循环,如下:
public void run() //主线程
{
isOnGame=true;
while(isOnGame)
{
gameCount++;
gameLevelUp(gameCount);
try
{
Thread.sleep(gameSpeed);
}catch(Exception e1){}
addGameObj();
for(int j=0;j
{
gfo=(gameFlatObj)objList.elementAt(j);
gfo.up();
if(gco==null)
{
gco=new gameCharObj(gfo.getX(),gfo.getY());
}
if(gfo.collidesWith(gco,false))
{
isOnFlat=true;
gfo.doOnChar(gco);
}
else
{
gfo.resetTime();
}
if(gfo.getProperties()>1)
{
gfo.nextFrame();
}
gfo.paint(g);
}
if(gfyo!=null)
{
if(gfyo.collidesWith(gco,false))
{
gfyo.doOnChar(gco);
gfyo=null;
}
else
{
gfyo.go();
gfyo.nextFrame();
gfyo.paint(g);
if(gfyo.getIsBottom())
{
gfyo=null;
}
}
}
keyPressed();
if(!isOnFlat)
{
gco.go();
}
isOnFlat=false;
//***************
if(gameBgCount<0)
{
gameBgCount++;
}
else
{
gameBgCount=-20;
}
//***************
gco.nextFrame();
gco.paint(g);
//***************
drawMenu(g);
//***************
g.drawImage(gameTeeth,0,20,0);
this.flushGraphics();
chkObjIsTop();
if(gco.isDead())
{
setOnGame(false);
}
}
this.flushGraphics();
}
使用NetBeans进行J2ME开发(五):揭开游戏开发的神秘面纱(3)
时间:2011-01-18 海边沫沫
从以上的代码中可以看出,这是一个典型的主循环,它通过调用addGameObj()来随机创建物体,而这些物体中,横板、翻板、传送带、钉板等物体作者将之称为gfo,对应的类为gameFlatObj,而从天而降的圆球称为gfyo,对应的类为gameFlyObj,而这几个类,当然是Sprite类的子类了。在这个主循环中,不难看到gfo.paint(g)和this.flushGraphics()这样的代码,正好和我们前面所说的GameCanvas类实现了双缓冲是对应的。
怎样轮询键盘输入呢?从上面的代码可以看出,作者将轮询键盘事件的代码放到了keyPressed()函数中,我们再来看看这个函数:
private void keyPressed()
{
int keyState=this.getKeyStates();
if((keyState&GameCanvas.LEFT_PRESSED)!=0)
{
if(gco!=null)
{
gco.setCharAct(0,isOnFlat);
gco.left(isOnFlat);
}
return;
}
if((keyState&GameCanvas.RIGHT_PRESSED)!=0)
{
if(gco!=null)
{
gco.setCharAct(1,isOnFlat);
gco.right(isOnFlat);
}
r
|