`
xiefeifeihu
  • 浏览: 99327 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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)又能在范围内弹跳了。

分享到:
评论

相关推荐

    示例描述:本章介绍WPF中的依赖属性和事件路由特性

    示例描述:本章介绍WPF中的依赖属性和事件路由特性。 AttachedEvents 使用WPF的附加事件。 CaptureMouseDemo 捕捉鼠标示例。 CreateWPFDependencyProperty 创建WF中的依赖属性。 CustomRoutedEvent ...

    计算机二级C语言编程练习题含答案.zip

    以下是10道适合计算机二级C语言考试的编程题: ...示例输入:5 1 2 3 4 5 示例输出:3.00 斐波那契数列 编写一个程序,输入一个正整数n,输出斐波那契数列的前n项。 示例输入:5 示例输出:0 1 1 2 3

    零基础CMake入门:项目实战示例2:复杂项目,例源码

    零基础CMake入门:项目实战示例2:复杂项目,例源码

    Linux常用命令大全0.zip

    5. 压缩解压 6. 权限管理 7. 进程管理 8. 软件包管理 9. 其他常用命令 1. 文件操作 1.1 ls 功能:列出目录中的文件和子目录。 示例代码: ls /home/user 1.2 cd 功能:切换当前工作目录。 示例代码: cd ...

    示例机器人:DiscordSharpPlus库的示例机器人目录。 包含C#和VB.NET示例

    示例5 :演示具有Windows Forms UI的机器人。 提出了一种在不死锁整个应用程序的情况下运行机器人的方法,以及将事件正确分配到UI的方法。 示例6 :演示具有Windows Presentation Foundation(WPF)UI的机器人。 ...

    CT-UNIDRIVE-SP简易中文说明书.pdf[1].docx

    - 示例值:5V - **3.38 编码器类型** - 示例值:Ab差分编码器 - **3.40 编码器故障检测等级** - 示例值:1 - **3.41 编码器自适应** - 示例值:ON ##### 5. #4号菜单 - **4.01 输出电流(RO)** - **4.05 运行...

    ACM 题型

    - 示例题目:poj1753, poj2965 - **广度优先搜索(BFS)**:适用于寻找最短路径问题,特别是无权图。 - 示例题目:poj1328, poj2109, poj2586 2. **贪心算法** - 贪心策略是在每一步选择中都采取在当前状态下...

    《基于ACL的网络病毒过滤规则》毕业论文

    1.2.2 反病毒行动 5 2. ACL的发展,现状,将来 8 2.1 什么是ACL 8 2.1.1 ACL的工作流程及分类 8 2.1.2 ACL应用举例 10 2.2 当前的网络安全技术 10 2.3 ACL的未来 14 3. 基于ACL的网络病毒过滤的研究 16 ...

    cmd命令大全.txt

    - **示例用法:** `assoc .txt` ##### 2.2 AT **命令功能:** 安排在指定时间运行命令或程序。 - **示例用法:** `at 23:00 shutdown /s` ##### 2.3 ATTRIB **命令功能:** 查看、设置或清除文件属性。 - **示例...

    Linux常用命令大全01.md

    5. 压缩解压 6. 权限管理 7. 进程管理 8. 软件包管理 9. 其他常用命令 1. 文件操作 1.1 ls 功能:列出目录中的文件和子目录。 示例代码: ls /home/user 1.2 cd 功能:切换当前工作目录。 示例代码: cd ...

    字符串数组 matlab ,一些示例代码,解释放到代码注释里面

    示例 1: 创建一个字符串数组 示例 2: 使用下标访问字符串数组中的元素 示例 3: 使用循环操作字符串数组 示例 4: 字符串数组长度 示例 5: 更改字符串数组中的元素 ...示例 8: 使用函数处理字符串数组

    python 实现搜索插入位置

    # 给定一个排序数组和一个目标值,在数组中找到...# 输入: [1,3,5,6], 5 # 输出: 2 # 示例 2: # 输入: [1,3,5,6], 2 # 输出: 1 # 示例 3: # 输入: [1,3,5,6], 7 # 输出: 4 # 示例 4: # 输入: [1,3,5,6], 0 # 输出: 0

    python 入门示例.docx

    a = 5 b = 10 # 简单运算 sum = a + b difference = b - a product = a * b quotient = b / a # 注意:在 Python 3 中,除法结果总是浮点数 # 打印结果 print("Sum:", sum) print("Difference:", ...

    深入C#数据类型12个案例源码.zip

    示例5:使用OOP实现计算器 示例6:注册验证 示例7:创建和使用结构 示例8:值类型和引用类型区别 示例9:拆箱和装箱 示例10:投票增加人气值 示例11:使用结构投票增加人气值 示例12:完善DBHelper

    mplus 8 用户手册 Chapter8 采用纵向数据视图示例的混合建模.pdf

    第 8 章:采用纵向数据视图示例的混合建模 第 9 章:具有复杂调查数据视图示例的多层建模 第10章:多层次混合建模视图示例 第11章:缺少数据建模和贝叶斯估计视图示例 第12章:蒙特卡洛模拟研究查看示例 第13章...

    锐捷、华为、华三基础的交换机命令整理

    - 示例命令:`interface e 0/0/8` - 功能说明:允许用户进入指定的以太网端口进行详细配置。 4. **User-bindstaticip-address10.141.52.170mac-addressc85b-760c-0060**:配置IP和MAC地址绑定。 - 示例命令:`...

    常见请求和响应头-说明.doc

    2. Accept-Charset:客户端声明它可以处理的字符编码集,如ISO-8859-5或UTF-8。示例:Accept-Charset: iso-8859-5 3. Accept-Encoding:客户端告知服务器它支持的内容压缩编码类型,如gzip、compress。示例:Accept...

    MATLAB坐标设置

    - 示例代码:`set(gca,'Position',[.1 .1 .8 .74]);` - 作用:调整坐标轴在图像中的相对位置和大小。 3. **设置坐标轴和标签的字体大小**: - 示例代码:`set(get(gca,'XLabel'),'FontSize',8);` - 作用:统一...

Global site tag (gtag.js) - Google Analytics