javafx2_JavaFX 2 GameTutorial第4部分

javafx2

介绍

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

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

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

什么是雪碧?

根据Wikipedia的说法,“ 子画面是整合到更大场景中的二维图像或动画。” 从Java游戏世界的角度来看,子画面是一个对象,其中包含图像帧和基于要动画化到场景区域上的演员的上下文的其他数据。 在沃尔特·迪斯尼 ( Walt Disney)时代 ,用铅笔和纸画卡通时,艺术家制作了许多图画,成为了动画。 这个例子指向了翻书的创建。 我敢肯定,您小时候就已经创建了翻书。 我知道我做到了 我曾经在笔记本的各个角落进行涂鸦和制作炫酷的动画。 在我们的Asteroid型游戏中,我创建了一个精灵对象,其中包含像翻书一样预先旋转的飞船的所有图像( 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

小行星豪华版(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

javafx2

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

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

相关文章

vue项目 乐橙云 轻应用直播SDK imouplayer.js

官网案例&#xff1a;https://open.imoulife.com/book/light/sdk.html 文档&#xff1a; https://open.imou.com/developDoc/31 1&#xff0c;下载 对应的资源 https://open.imoulife.com/book/readme/upload.html 2&#xff0c;引入资源 2.1 把下载的资源(static&#xff0c…

jmx 复用 jmx_JMX:一些入门说明

jmx 复用 jmxJMX&#xff08;Java管理扩展&#xff09;是一种J2SE技术&#xff0c;可以管理和监视Java应用程序。 基本思想是实现一组管理对象&#xff0c;并将实现注册到平台服务器&#xff0c;在平台服务器上&#xff0c;可以使用一组连接器或适配器从本地或远程调用这些实现…

git 上下载的项目在本地安装依赖时报错 Could not resolve dependency

安装依赖时报错&#xff1a;无法安装依赖 看报错里面的提示&#xff1a;this command with --force, or --legacy-peer-deps –force 会无视冲突&#xff0c;并强制获取远端npm库资源&#xff0c;即使本地有资源也会覆盖掉&#xff1b;–legacy-peer-deps&#xff1a;安装时…

python_fullstack基础(十一)-常用模块

python常用模块 re模块 一、正则表达式 在线测试工具 http://tool.chinaz.com/regex/ 1、字符组 &#xff1a; [字符组] 在同一个位置可能出现的各种字符组成了一个字符组&#xff0c;在正则表达式中用[]表示 字符分为很多类&#xff0c;比如数字、字母、标点等等。 假如你现在…

npm 安装依赖遇到的问题

npm npm的服务器位于国外可能会影响安装 cnpm 淘宝团队做的国内镜像 // 安装 cnpm npm install cnpm -g --registryhttps://registry.npm.taobao.org // 查看版本 cnpm -v // 查 npm 的源 npm config get registry一、cnpm -v 在 cmd 中能识别&#xff0c;但是 VsCode 无法识别…

maven 父maven_Maven的鸟瞰图

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

mysql断网_断网的情况上如何访问本机的mysql

断网的情况下怎么访问本机的mysql我发现把网络断掉后mysql就不能访问了。使用phpmyadmin(http://localhost/phpmyadmin/index.php?)访问&#xff0c;输入用户名和密码后点击登陆&#xff0c;就会出现“#2002 Cannot log in to the MySQL server”错误。使用命令行登陆&#xf…

Py IO model

事件驱动模型 上节的问题&#xff1a; 协程&#xff1a;遇到IO操作就切换。 但什么时候切回去呢&#xff1f;怎么确定IO操作完了&#xff1f; 很多程序员可能会考虑使用“线程池”或“连接池”。“线程池”旨在减少创建和销毁线程的频率&#xff0c;其维持一定合理数量的线程&a…

Fiddler 扒取微信小程序的图片

安装 Fiddler http://www.downza.cn/soft/234727.html Tools-options配置 如果无法抓取到PC微信小程序 解决办法&#xff1a; 打开小程序&#xff0c;任务管理器找到小程序所在位置&#xff0c;删除文件内容 一般路径为\Tencent\WeChat\XPlugin\Plugins\WMPFRuntime 删除…

JLBH – Java延迟基准线束介绍

在这篇文章中&#xff1a; 什么是JLBH 我们为什么写JLBH JMH和JLBH之间的区别 快速入门指南 什么是JLBH&#xff1f; JLBH是可用于测量Java程序中的延迟的工具。 它具有以下功能&#xff1a; 旨在运行比微型基准测试更大的代码。 适用于使用异步活动&#xff08;如生产者…

mysql 5.7 mts_mysql5.7 中启用MTS后error log中大量Note日志分析

mysql5.7,启用基于logical_clock的多线程复制,发现error日志增长很快&#xff0c;查看日志发现大量关于多线程复制的Note级别日志。1234567891011121314152018-07-03T03:22:01.63837108:00 8941 [Note] Multi-threaded slave statistics for channel : seconds elapsed 298; e…

Nginx 怎么给一台服务器,配置两个域名?详细的解说+截图教程

一、 环境、条件准备 一台云服务器&#xff08;我的是腾讯的centos7&#xff09; 至少两个域名。&#xff08;我的是simuhunluo.xyz和simuhunluo.top。这两个域名之间没有任何关系&#xff0c;我是在阿里用两个账号分别注册的。&#xff09; 云服务器上面已经搭建了ngin…

extjs6 mvvm_ZK 6中的MVVM初探

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

多线程 调用 axis 报错_java笔记录(三、多线程)

1、进程和线程&#xff1a;进程&#xff1a;正在进行的程序。每一个进程执行都有一个执行顺序&#xff0c;该顺序是一个执行路径&#xff0c;或者叫一个控制单元。线程&#xff1a;进程内部的一条执行路径或者一个控制单元。两者的区别&#xff1a;一个进程至少有一个线程进程在…

使用PropertyPlaceholderConfigurer读取属性文件

1.简介 通常&#xff0c;当我们考虑将多个应用程序部署到生产环境之前在其中部署服务器时&#xff0c;可以在外部属性文件中配置特定于环境的参数 。 它可能是数据库详细信息&#xff0c;对于测试服务器和生产服务器而言&#xff0c;这是不同的。 因此最好选择将数据库配置文件…

第二天:Swift手势操控弹性按钮

参考链接:https://www.jianshu.com/p/f080ede0f3a8 1 import UIKit2 3 fileprivate let buttonH: CGFloat 2004 5 class ViewController: UIViewController, UIGestureRecognizerDelegate {6 7 IBOutlet weak var segmentControl: UISegmentedControl!8 var randomBtn…

ionic2 安装与cordova打包

1.安装&#xff1a; cnpm install -g cordova ionic ionic start name cd name cnpm install 2、环境配置&#xff1a; http://www.cnblogs.com/changyaoself/p/6544082.html 这里是具体配置。 测试环境&#xff1a; cordova platform list 如下才可以&#xff1a; 3、添加…

mysql vacuum_PostgreSQL DBA快速入门(四) - 体系架构

PostgreSQL在开源关系型数据库市场是最先进的数据库。他的第一个版本在1989年发布&#xff0c;从那时开始&#xff0c;他得到了很多扩展。根据db-enginers上的排名情况&#xff0c;PostgreSQL目前在数据库领域排名第四。 本篇博客&#xff0c;我们来讨论一下PostgreSQL的内部架…

总结mysql的基础语法_mysql 基础sql语法总结 (二)DML

二、DML(增、删、改)1)插入数据第一种写法&#xff1a;INSERT INTO 表名 (列名1&#xff0c;列名2&#xff0c;&#xff0c;......)VALUES(列值1&#xff0c;列值2&#xff0c;......)第二种写法&#xff1a;INSERT INTO 表名 VALUES(列值1&#xff0c;列值2&#xff0c;......…

提高团队协作效率

提高团队协作效率 分工合理&#xff0c;责任明确 团队是由个人组成的&#xff0c;团队中的个人往往经历不同、背景不同、性格有差异、水平有高低。在团队形成后、正式开工前&#xff0c;首先应该进行合理分工&#xff0c;要结合每个 人的特点和爱好&#xff0c;充分发挥出每个人…