8、示例5:TestPong

1.2 详细说明

// Initialize camera

cam.setFrustumPerspective(45.0f, (float) display.getWidth()

/ (float) display.getHeight(), 1f, 1000f);

cam.setLocation(new Vector3f(-150, 200, 80));

cam.lookAt(new Vector3f(-30, 0, 10), Vector3f.UNIT_Y);

cam.update();

首先初始化摄像头的角度,让我们从上到下看有一个很好的视角。如果不设置cam效果是怎样呢:

clip_image004

按w、a、s、d、q、z等按键调整一下角度再看:

clip_image006

要想调个好视角还得费一番功夫,上图的视角也很不理想。

后面一段分别定义了弹球及其速度、绿色弹板(player1和player2)、两边的围墙(wall、sideWalls)、和后墙(两个玩家的目标探测仪goal detector)。这里的wall绑定到sideWalls节点上。

下面来看看怎么让画面动起来。

我们需要重载simpleUpdate函数。因为在main函数中调用app.start()启动游戏,start函数里面有个while循环,一刻不停地更新状态。 update(-1.0f);这个update是在BaseSimpleGame类里实现的,它调用了simpleUpdate。所以要想小球动起来,只需要在simpleUpdate中修改它的位置坐标即可,让它产生一定规律的运动。

// Move ball according to velocity

ball.getLocalTranslation().addLocal(

ballVelocity.mult(timer.getTimePerFrame()));

这就让小球延一个方向跑过去。ballVelocity是个速度向量,它乘以一个标量仍然是个向量。如果要使用ball.getLocalTranslation().add,产生的新的向量并没有赋给ball的localTranslation,所以用add小球不动。

下面来看看碰撞检测的方法,用hasCollision函数即可:

if (ball.hasCollision(sideWalls, false)) {

System.out.println("撞上侧墙了");

}

撞上之后需要改变小球的运动方向(向量),可以参考光线反射原理:

if (ball.hasCollision(sideWalls, false)) {

ballVelocity.z *= -1f;

}

if (KeyBindingManager.getKeyBindingManager().isValidCommand(

"PLAYER1_MOVE_UP", true)) {

player1.getLocalTranslation().z -= player1Speed

* timer.getTimePerFrame();

}

这是移动挡板,只需修改位置向量即可。没有限制的话挡板就会移到围墙外面去。

player1.getLocalTranslation().z = FastMath.clamp(player1.getLocalTranslation().z, -38, 38);

就限制了z的移动范围。函数FastMath.clamp的源代码如下:

public static float clamp(float input, float min, float max) {

return (input max) ? max : input;

}

如果给定的input值小于min,则返回min;如果大于max,就返回max;如果在min和max之间就返回input自己。这样我们就把一个数组固定在某个范围之内了。

现在我们基本上把这个例子弄清楚了:要想使一个物体运动只需在重载函数simpleUpdate中修改位置向量即可。可以通过hasCollision函数检测两个物体是否发生碰撞。

我在调试的时候遇到一个问题:如果小球的速度向量设置不合理,有可能检测不到碰撞,这时小球会飞出界外。比如:ballVelocity = new Vector3f(100f, 0f, 50f);时就从后挡板飞出去了,ballVelocity = new Vector3f(50f, 0f, 50f);就能在围墙内自由弹跳。我想可能是jME时钟造成的,运动的两个位置跳跃过大使之检测不到碰撞。比如我把速率调小:ballVelocity.mult((float) 0.1)又能在范围内弹跳了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值