科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件J2ME手机游戏开发技巧(2)

J2ME手机游戏开发技巧(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它...

作者:佚名 来源:J2ME开发网 2007年9月1日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

首先定义一个boolean类型的stopFlag变量来记录调试标志。一开始它的值为false,进入testFun()函数后,值设为true。显示完str的内容后,因为stopFlag的值为true,所以while语句进入了死循环,程序停了下来。这时可以仔细地看清楚变量的值。然后当按下任意键时,keyPressed()函数捕捉到这一事件,将stopFlag设为false,死循环自动解开。使用此方法非常方便,只要在需要断点的地方放置testFun()语句即可,一个程序可以放置多个testFun()语句,在循环语句中也可以放置testFun()语句。程序运行到testFun()语句会自动停下显示变量值,按任意键程序又会自动运行,程序也不会受到意外的干扰。图1是调试时的截图。

还有一点需要说明,此方法的testFun()语句必须放在run()函数中或者run()函数运行时调用的函数中,否则就会因为while()占用了所有CPU时间而导致keyPressed()函数无法捕捉按键事件,最后导致死机。

此方法只要稍加修改,就可以用做游戏的暂停功能,而且比sleep()方法好,毕竟理论上sleep()方法不能无限期暂停下去。下面给出相应的代码:

public class BlocksCanvas extends Canvas implements Runnable

{private boolean stopFlag=false;//暂停标志

......public void run()

{......testFun();......}

private void testFun()

{ while(stopFlag){}}public void keyPressed(int keyCode)

{

int action = getGameAction(keyCode);

if(action== FIRE)stopFlag=!stopFlag;}

}

该程序段的功能为,当使用者按下FIRE键时,游戏暂停;再次按下FIRE键,游戏继续运行因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能...

编写自己的工具类

因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能。它用来记录游戏中被删去的方块集合,同时保证集合中没有相同元素。

/***

Description: Set类在J2ME上的实现

*Date:2003.2.28*Author:TomJava

*email:tomjava@sohu.com

*/

public class kSet

{//用单链表实现private kSetNode head;public kSet(){head=null;}

//将kSet清空

public void clear(){head=null;}

//向kSet中添加元素

public boolean add(int x,int y)

{kSetNode node=new kSetNode(x,y);return add(node);}

//向kSet中添加元素

public boolean add(kSetNode node)

{ if(!contains(node))

{ node.next=head;head=node;return true;}

else{return false;}}

//判断kSet是否为空

public boolean isEmpty()

{if(head==null)return true;elsereturn false;}

//摘下链表头元素并返回此元素

public kSetNode getFirst()

{ kSetNode p=head;head=p.next;return p;}

//遍历kSet,如果有相同元素返回true,否则返回

false

public boolean contains(kSetNode node)

{kSetNode p = head;while (p != null)

{if(p.equals(node))return true;p=p.next;

}return false;}

}

//kSet中的元素

public class kSetNode

{ public int x,y;public kSetNode next;

public kSetNode(int x,int y)

{this.x=x;this.y=y;next=null;}

public boolean equals(kSetNode node)

{if(node.x==x&&node.y==y)

return true;elsereturn false;

}

public int getX(){return x;

}

public int getY(){return y;}

kSetNode类负责记录被删除方块的坐标,它重载equals()方法用来判断两个方块是否是同一个方块。kSet类是由kSetNode对象组成的没有相同元素的集合,用单链表实现,并且提供了 getFirst()、add()、clear()、isEmpty()、contains()等方法供其它类调用。编写和使用一些这样的工具类,将大大加快编程的速度,也使程序变得更加清晰。

矫正屏幕坐标

GridOne这个游戏是专门为MotoT720开发的,也就是说游戏背景图片大小和MotoT720型手机的大小是相等的。如果它在那些屏幕比MotoT720大的手机上运行,游戏背景图片会显示在屏幕左上角而影响美观,这时就要用到屏幕矫正技术,使得游戏背景图片居中显示。矫正屏幕坐标代码如下:

public class BlocksCanvas extends Canvas implements Runnable{

private final int addX;//坐标矫正

private final int addY;

private final int SCREEN_X;//屏幕顶点

private final int SCREEN_Y;

private final int WAITBLOCK_X;//等待方块顶点

private final int WAITBLOCK_Y;

private final int SCORES_X;//分数顶点

private final int SCORES_Y;

private final int STAR_X;//五角星的顶点

private final int STAR_Y;

public BlocksCanvas()

{//取得当前手机屏幕的高度和宽度

height = getHeight();

width = getWidth();//坐标矫正量

addX = (width-120)/2;

addY = (height-142)/2;//初始化屏幕参数

SCREEN_X = addX + 48;//屏幕顶点

SCREEN_Y = addY + 10;

WAITBLOCK_X = addX + 19;//等待方块顶点

WAITBLOCK_Y = addY + 103;

SCORES_X = addX + 36;//分数顶点

SCORES_Y = addY + 34;

STAR_X=addX+4;//五角星的顶点

STAR_Y=addY+70;

}

}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章