JavaFX 2 GameTutorial第4部分

介绍

这是与JavaFX 2游戏教程相关的六个部分系列的第四部分。 如果您错过了第1部分 , 第2部分或第3部分 ,我建议您在开始本教程之前仔细阅读它们。 回顾一下,在第3部分中,我为您提供了许多经典街机风格游戏和所使用的不同输入设备的历史记录。 然后,我向您展示了如何创建类似于著名街机“小行星”的简单游戏。 但是,控件(船的移动)与PC游戏“星际争霸”的控件更为相似。 在第3部分中,您应该对如何从键盘和鼠标接收输入有很好的了解。

图1 JavaFX 2游戏教程第4部分

本教程的内容是调整第2部分的游戏引擎,并更新第3部分中现有的“ Asteroids”风格的游戏以处理碰撞检测。 在本教程中,我将简要讨论精灵以及如何处理碰撞检测。 现在,飞船将具有产生力场的能力,以保护自己免受敌人和小行星的伤害。 这让人想起经典的街机“ 小行星豪华版 ”。 如果要运行演示,请向下滚动并单击下面的WebStart按钮。 在启动游戏之前,请先阅读要求。

什么是雪碧?

根据Wikipedia的说法,“ 子画面是整合到更大场景中的二维图像或动画。” 从Java游戏世界的角度来看,子画面是一个对象,其中包含图像帧和基于要动画化到场景区域上的演员的上下文的其他数据。 在沃尔特·迪斯尼 ( Walt Disney)时代 ,用铅笔和纸画漫画时,艺术家制作了许多图画,成为了动画。 这个例子指向了翻书的创建。 我确定您小时候就已经制作了翻书。 我知道我做到了 我曾经在笔记本的各个角落进行涂鸦和制作炫酷的动画。 在我们的Asteroid型游戏中,我创建了一个sprite对象,其中包含像翻书一样预先旋转的飞船的所有图像( ImageView )。 为了使船转弯具有动画效果,我使当前帧可见,而其余帧不可见。 与翻书类似,它似乎围绕其中心(枢轴)点旋转。 子画面还可以包含其他信息,例如速度或健康点。

碰撞检测

当演员或小精灵在整个场景中设置动画时,游戏引擎将检查每个小精灵是否与其他小精灵相互冲突,以确定它们是否相互碰撞。 此过程应该非常有效,尤其是当您在屏幕上移动大量精灵时。 在效率方面需要权衡。 因为游戏循环中的每个循环都会检查碰撞,所以更精确通常会降低性能。 许多游戏会使用图像的边界区域来确定两个精灵是否相互碰撞。 一些游戏使用矩形作为边界区域。 下面的图2中显示了两个精灵碰撞:

图2边界框为矩形碰撞区域。

我敢肯定,到现在为止,当围绕角色的像素是透明的时,游戏中的大多数角色(图像)都不会显示为矩形。 但是,即使像素是透明的,演员或图像的确是矩形的。

图3描绘了一个演员图像

那些使用矩形边界区域的游戏通常会在精灵图像中刻出边界框。 如图4下方所示,两个矩形边界区域(橙色和绿色)被刻在宇宙飞船图像中。

图4两个用作碰撞边界框的矩形。

我相信您会注意到船和机翼的鼻尖没有被任何一个边界盒覆盖。 这意味着,当小行星与子画面的无界区域重叠时,不会发生碰撞。 有些游戏使用这种策略。 您会注意到,子画面的矩形边界区域很小,并放置在子画面图像的关键区域中。 对于多边形和其他非矩形形状,使用更好的算法会发现更高的精度。 在此博客文章中,我基本上将圆形用作边界区域,而不是矩形。 我本可以使每个精灵包含一组碰撞形状,但我选择为每个精灵只设置一个碰撞区域。 每个碰撞区域在场景图上将为圆形。 对于宇宙飞船,我根据飞船的中心点划了一个圆圈,半径扩展到了飞船的驾驶舱。 下图5中显示了该船的有界圆形碰撞区域,用红色圆圈表示。

图5船舶的碰撞区域。

我选择一个圆作为边界区域是因为相对容易根据距离公式 ( 勾股定理 )确定两个对象的碰撞,该距离公式仅需要每个子图形的边界区域的中心点及其半径。 在基于两个中心点计算距离之后,您将比较结果以查看它是否小于或等于两个半径的总和。 如果结果确实小于或等于两个半径的总和,则发生了碰撞。 图6描述了距离公式如何与圆形边界区域的两个中心点相关。

图6两个中心点之间的距离公式。

以下代码从GameWorld类创建主游戏循环:

@Overridepublic void handle(javafx.event.ActionEvent event) {// update actorsupdateSprites();// check for collisioncheckCollisions();// removed dead thingscleanupSprites();}

下面的代码从GameWorld类创建checkCollision()方法:

protected void checkCollisions() {// check other sprite's collisionsspriteManager.resetCollisionsToCheck();// check each sprite against other sprite objects.for (Sprite spriteA : spriteManager.getCollisionsToCheck()) {for (Sprite spriteB : spriteManager.getAllSprites()) {if (handleCollision(spriteA, spriteB)) {// The break helps optimize the collisions//  The break statement means one object only hits another// object as opposed to one hitting many objects.// To be more accurate comment out the break statement.break;}}}}

派生的Game World( TheExpanse )类对其handleCollision()方法的实现:

/*** How to handle the collision of two sprite objects.** @param spriteA Sprite from the first list.* @param spriteB Sprite from the second list.* @return boolean returns a true if the two sprites have collided otherwise false.*/@Overrideprotected boolean handleCollision(Sprite spriteA, Sprite spriteB) {if (spriteA != spriteB) {if (spriteA.collide(spriteB)) {if (spriteA != myShip) {spriteA.handleDeath(this);}if (spriteB != myShip) {spriteB.handleDeath(this);}}}return false;}

Sprite类使用距离公式的collide()方法的默认实现:

public boolean collide(Sprite other) {if (collisionBounds == null || other.collisionBounds == null) {return false;}// determine it's sizeCircle otherSphere = other.collisionBounds;Circle thisSphere = collisionBounds;Point2D otherCenter = otherSphere.localToScene(otherSphere.getCenterX(), otherSphere.getCenterY());Point2D thisCenter = thisSphere.localToScene(thisSphere.getCenterX(), thisSphere.getCenterY());double dx = otherCenter.getX() - thisCenter.getX();double dy = otherCenter.getY() - thisCenter.getY();double distance = Math.sqrt(dx * dx + dy * dy);double minDist = otherSphere.getRadius() + thisSphere.getRadius();return (distance < minDist);}

Sprite类的handleDeath()方法的默认实现:

public void handleDeath(GameWorld gameWorld) {gameWorld.getSpriteManager().addSpritesToBeRemoved(this);}

Atom (小行星或导弹)类将覆盖handleDeath()方法:

public void handleDeath(GameWorld gameWorld) {implode(gameWorld);super.handleDeath(gameWorld);}

JavaFX 2 Sprite和碰撞演示

这个简单的演示游戏将是星际争霸和小行星之间的混合体。 使用鼠标导航飞船时,您会注意到控件类似于StarCraft的Battle Cruiser 。 目的是在武器撞击您的飞船或其他因撞击而爆炸的球体之前向它们发射武器。 由于这是一个简单的教程,甚至是处于开发初期的游戏,因此该游戏无法跟踪得分。 我鼓励您去GitHub下载代码并增强游戏。 为了简洁起见,我不会显示所有代码更改,但是我相信您会在这里访问GitHub: https : //github.com/carldea/JFXGen,以获取所有演示和源代码。

要求

  • Java 7或更高版本
  • JavaFX 2.1或更高版本
  • Windows XP或更高版本(应该很快可用于Linux / MacOS)

一个简单的小行星类型游戏,名为“ The Expanse”。

说明:

  • 右键单击(在Windows上)以飞船。
  • 单击鼠标左键(在Windows鼠标上单击鼠标左键)即可射击武器。
  • 按键'2? 变成大型导弹。 (蓝色圆形弹丸)
  • 其他按键默认为较小的导弹。 (红色圆形弹丸)
  • 按下空格键将切换力场,以保护飞船免受敌人和小行星的伤害。

单击下面的启动按钮以启动演示: 教程演示

继续本教程的第5部分 。

相关文章

Sprite的定义: http : //en.wikipedia.org/wiki/Sprite_%28computer_graphics%29

沃尔特·迪斯尼(Walt Disney): http : //en.wikipedia.org/wiki/Walt_Disney

如何制作翻书: http : //www.bitrebels.com/design/how-to-create-a-flip-book/

JavaFX的ImageView: http : //docs.oracle.com/javafx/2/api/javafx/scene/image/ImageView.html

碰撞检测:http: //zetcode.com/tutorials/javagamestutorial/collision/

Java中的AABB碰撞检测: http : //www.youtube.com/watch?v = JIxV-LXqa1g

勾股定理: http : //en.wikipedia.org/wiki/Pythagorean_theorem

距离公式: http : //en.wikipedia.org/wiki/Distance

严肃的Asteroids Deluxe游戏(Youtube): http : //www.youtube.com/watch?v= 6DG-GJENHgg

参考:来自我们的JCG合作伙伴 Carl Dea的JavaFX 2 GameTutorial第4部分 ,位于Carl's FX Blog博客上。


翻译自: https://www.javacodegeeks.com/2012/06/javafx-2-gametutorial-part-4.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java构造函数_JAVA的构造函数是怎么写的。万分感谢。路过的请不要嘲笑%_%

展开全部JAVA的构造函数是&#xff1a;SetLocal EnableDelayedExpansionset classpath.for %%c in (lib\*.jar) do set classpath!32313133353236313431303231363533e59b9ee7ad9431333431363030classpath!;%%cset classpath%classpath%;./classes;java com.ham.server.Server。…

C# 中winform的一些属性设置

1 窗体的大小固定住&#xff0c;不能调整其大小 窗体FormBorderStyle 属性设置为 FixedSingle; MaximizeBox 属性设置为false; MinimizeBox 属性设置为 false; 2. 在状态栏中无图标显示 设置为fase即可。 3. 设置窗体的启动位置 方法1&#xff0c; 用代码控制 this.Location …

LiveBos---按钮成下拉

转载于:https://www.cnblogs.com/luhanzhen/p/6802779.html

Solr:创建拼写检查器

在上一篇文章中&#xff0c;我谈到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些测试结果。 现在&#xff0c;我们将看到另一种拼写检查方法。 与其他方法一样&#xff0c;此方法使用两步过程。 相当快速的“候选单词”选择&#xff0c;然后对这些单词…

Django 和 html

下面是对应的形式&#xff0c;自定义的forms 转载于:https://www.cnblogs.com/kilen/p/6804047.html

【Java大系】Java快速教程

感谢原作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei Java是面向对象语言。这门语言其实相当年轻&#xff0c;于1995年才出现&#xff0c;由Sun公司出品。James Gosling领导了Java的项目小组。该项目的最初只想为家电设计一门容易移植的语言。然而&am…

[dpdk] 读官方文档(3)

续前节&#xff0c; 测试小程序 1. 想编译测试程序首先需要设置两个环境变量&#xff0c;为什么呢&#xff0c;因为测试程序的Makefile里用了。。。 rpm装了打包好的devel包&#xff0c;这个rpm也会自带这两个环境变量。就是说写第三方程序的时候&#xff0c;习惯上&#xff0c…

逻辑表达式——黑纸白纸

一、问题描述 有A、B、C、D、E五个人&#xff0c;每人额头上都贴了一张黑色或白色的纸条。五人对坐&#xff0c;每人都可以看到其他人额头上的纸的颜色&#xff0c;但都不知道自己额头上的纸的颜色。五人互相观察后&#xff0c; A说&#xff1a;“我看见有三个人额头上贴的是白…

java 1.6u29 下载_jdk1.6 64位下载|JDK 6(Java SE Development Kit)下载6u43 64位官方版_java运行环境 IT猫扑网...

jdk1.6 64位适用于x64的系统安装的java运行环境&#xff0c;Java SE Development Kit6是java开发人员必备的产品&#xff0c;也叫做jdk6&#xff0c;欢迎下载使用。官方介绍适用于您的计算机(windows)的 Java 软件&#xff0c;即 Java Runtime Environment&#xff0c;也称为 J…

ZK 6中的MVVM初探

MVVM与MVC 在上一篇文章中&#xff0c;我们已经看到Ajax框架ZK如何采用CSS选择器启发的Controller来在View中连接UI组件并监听它们的事件。 在此ZK MVC模式下&#xff0c; View中的UI组件无需绑定到任何Controller方法或数据对象。 使用选择器模式作为将View状态和事件映射到Co…

消失循环的2023?你都做了什么? | 2023 年度总结

2023年度总结 -- 今年都做了什么事&#xff1f; 前言心态关键词感悟 记录申请软著独立游戏技术成长 共勉 前言 又到了一年一次年度总结的时候了。我们常常感叹时间飞逝&#xff0c;却又没办法让它放慢的脚步。那就将2023写下来&#xff0c;让它在时间的长河中留下一丝记忆。 心…

java语言基本语法_Java语言基本语法

Java语言基本语法一、标识符和关键字标识符在java语言中&#xff0c;用来标志类名、对象名、变量名、方法名、类型名、数组名、包名的有效字符序列&#xff0c;称为“标识符”&#xff1b;标识符由字母、数字、下划线、美元符号组成&#xff0c;且第一个字符不能是数字&#xf…

Maven的鸟瞰图

我们每天要做的一件事是使用Maven通过发出诸如mvn install之类的构建命令来构建我们的项目。 然后&#xff0c;Maven查看我们项目的配置文件&#xff08;亲切地称为POM&#xff09;&#xff0c;神奇地找出要执行的操作&#xff0c;并且&#xff0c;嘿&#xff0c;您的构建已完成…

node源码详解(五)

本作品采用知识共享署名 4.0 国际许可协议进行许可。转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource5 本博客同步在https://cnodejs.org/topic/56ed6735b705742136388fa6 本博客同步在http://www.cnblogs.com/papertree/p/5295344.html 在上一篇博客&#xff…

51Nod - 1381 硬币游戏

51Nod - 1381 硬币游戏 有一个简单但是很有趣的游戏。在这个游戏中有一个硬币还有一张桌子&#xff0c;这张桌子上有很多平行线&#xff08;如下图所示&#xff09;。两条相邻平行线之间的距离是1&#xff0c;硬币的半径是R&#xff0c;然后我们来抛硬币到桌子上&#xff0c;抛…

javascript 相关小的知识点集合

本文主要是列出一些javascript 相关的&#xff0c;不限于javascript的&#xff0c;容易记错或者遗忘的小知识&#xff0c;小技巧。 1、javascript中的false 在 JavaScript&#xff0c;常见的 false 值&#xff1a; 0, 0, 0, -0, false, ,null,undefined,NaN 要注意空数组([])和…

AOS – 另外一个独特的页面滚动动画库(CSS3)

AOS 是一个用于在页面滚动的时候呈现元素动画的工具库&#xff0c;你可能会觉得它和 WOWJS 一样&#xff0c;的确他们效果是类似的。但是AOS是 CSS3 动画驱动的库&#xff0c;当你滚动页面的时候能让元素动起来&#xff0c;当页面滚回顶部的时候&#xff0c;元素能够回到前一个…

JavaFX 2.0 Hello World

在讨论示例本身之前&#xff0c;我想向您展示如何在NetBeans中创建JavaFX应用程序。 &#xff08;如果尚未安装JavaFX和NetBeans&#xff0c;请参阅我以前的文章《 安装JavaFX 2.0和NetBeans 7.7.1》 &#xff09;单击“文件”菜单中的“新建项目”以打开项目向导。 然后选择“…

java 线程强制停止线程_java多线程之停止线程

在多线程开发中停止线程是非常重要的技术点。停止线程在Java语言中并不像break语句那样干脆。须要一些技巧性的处理。一、 异常法採用异常法来停止一个线程。首先我们须要了解一下两个方法的使用方法&#xff1a;1、interrupt()方法public class MyThread extends Thread{Over…

双系统Ubuntu分区扩容过程记录

本人电脑上安装了Win10 Ubuntu 12.04双系统。前段时间因为在Ubuntu上做项目要安装一个比较大的软件&#xff0c;导致Ubuntu根分区的空间不够了。于是&#xff0c;从硬盘又分出来一部分空间&#xff0c;分给Ubuntu。于是有了这篇Ubuntu扩容过程记录&#xff0c;也可以当作是一篇…