4.2.1 游戏中主线程
GameMain中继承了GameCanvas包和Runnable接口,从而导入了keyPressed()(接收按键方法)和keyReleased()(按键释放按键方法)。
run()中代码如下:
public void run() {
long time = 0;//定义时间变量
long time_elapsed = 0;//定义时间变量,时间差值
while (ran) {//ran为boolaen类型变量,当ran为true时运行while(), //为false时停止while()
time = System.currentTimeMillis();// 获得系统运行时间
time_elapsed = System.currentTimeMillis() - time;//获得时间差值
if (time_elapsed < FRAME_PER_SEC) {// FRAME_PER_SEC为固定值
base.input(iAction);
base.update();
base.render();
this.flushGraphics();// 刷新屏幕
try {
Thread.sleep(FRAME_PER_SEC - time_elapsed);//休眠方法,使得程
//暂停一段时间
} catch (InterruptedException e) {//错误捕捉
e.printStackTrace();
}
}
}
}
4.2.2 背景的画法
在GameMain类中,游戏中的背景共有4层,但只显示了三层,还有一层为碰撞层。如图4-2所示。在画背景时用到了LayerManager图层管理类中的方法。LayerManager的具体作用是根据准确的位置跟图层次序来渲染它管理下的各个图层,也就是说使用管理的方式来处理图层之间的层叠关系因,因此在图层变化过程中容易的对图层进行添加和删除操作。
图4-2 1至4层图层
例如:1、通过方法append(layer)来增加图层
LayerManager lay = new LayerManager();
lay.append(layer);
2、获取图层总数
lay.getSize();
3、移除一个图层
lay.remove(Layer layer);
4、在某处插入图层方法
lay.insert(Layer layer,int index);
5、渲染图层
lay.paint(Graphics g,int x,int y);
只需要执行一次paint方法,所有LayerManager管理的图层都会被渲染,而无需对每个图层进行绘画。
6、定位屏幕可视区域
Lay.setViewWindow(int x,int y,int viewX,int viewY)
其中参数x,y代表可视区域左上角顶点对应于整个背景图层左上角顶点的位置,viewX跟viewY代表了可视区域的宽度跟高度。实现图层的卷动只需要改变x跟y的大小即可,当x变小则向左移动效果,变大则向右移动;当y变大则想下卷动,变小则向上卷动。
4.2.3主角的画法
在Role主角类中,继承了Sprite精灵管理类。在用Sprite管理主角时主要步骤如下:
一、图像分割
在使用Sprite类时候,只需要准备一张图像就可以构造出生动的动画效果,将要制作的动画效果使用的图像按照顺序排列后制作成一张图片,在Sprite构造方法中设定图片源跟图片的分割frame数,Sprite就能自动根据frame数对图片进行分割。
Sprite常用构造方法为:public Sprite(Image i, int frameWidth, int frameHeight)。
需要注意的是,组成图片的各个帧宽度必须相同,且像素数需要跟图片对应,否则将出现IO异常。
二、图片frame设置
经过Sprite的分割后,图片将被分成不同的独立小图片,例如主角图片由12帧图片组成。如图4-3所示。图片共有6组动作,就需要定义7组数组去每组动作的帧。
图4-3主角动作
static final int[] STOP_SEQ = { 0 };// 停
static final int[] WALK_SEQ = { 0, 1, 2, 3 };// 走
static final int[] JUMP_SEQ = { 4, 5 };// 跳
static final int[] SQUAT_SEQ = { 6 };// 蹲
static final int[] STAGGER_SEQ = { 7, 8, 9, 10 };// 踉跄
static final int[] BEIDA_SEQ = { 0 };// 背
利用Sprite类的setFrame(int index)方法可以在游戏过程中任意指定显示哪一个frame;用setFrameSequence(STOP_SEQ)方法就可以播放停止的动作,其他动作同理;相应其他方法还有nextFrame()和prevFrame()取得前后帧图像等方法。
三、精灵定位与描绘
Sprite类利用setPosition()方法来指定精灵描绘的坐标点(固定点是图片的左上顶点坐标),从而定位了精灵在屏幕中的位置;在描绘精灵时,通常只需要把Graphics对象传递到Sprite中的paint方法中的参数就能将精灵显示。但主角加到LayerManager中,就可以用LayerManager中的paint()来画。
例如:lay.insert(man, 0);
lay.paint(GameMain.grap, 0, 0);
设置位置:setPosition(man_x, man_y);
四、精灵转动跟翻转
在游戏中经常需要使游戏对象有转动跟翻转的功能使得游戏更加生动逼真,在Sprite类中提供了方法void setTransform(int transform)来设定精灵的转动跟翻转效果,利用它我们就可以容易的让图片动起来。
参数transform预先设定了八种常量定义,这八种常量对应的效果如下:
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>