版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目八从雷霆战机项目走进界面编程Java面向对象程序设计项目引导案例雷霆战机游戏是一款经典的2D射击游戏,玩家控制一架飞机在屏幕上移动,躲避敌机和子弹,同时发射子弹消灭敌机。游戏需要一个直观的图形用户界面来展示飞机的移动、子弹的发射和敌机的生成。项目背景项目引导案例本项目通过JavaFX实现一个简化版的雷霆战机游戏,帮助学生理解界面编程的基本原理和JavaFX的应用。在完成项目的过程中,学生不仅可以了解用户界面编程的具体流程,还可以学会JavaFX图形用户界面工具包的使用与SceneBuilder的相关知识,为以后更高阶的用户界面编程打下良好的基础。SceneBuilderJavaFX任务一JavaFX基础搭建与应用
Java面向对象程序设计职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05能够使用JavaFX创建基本的图形用户界面;能够掌握JavaFX与SceneBuilder的关联;理解JavaFX布局管理在界面设计中的应用,设计符合用户需求的友好界面。掌握JavaFX的基本使用;掌握JavaFX与SceneBuilder的关联。职业能力目标01知识目标技能目标职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05使用JavaFX开发雷霆战机游戏的基础组件,重点创建基本的图形用户界面、处理用户输入并实现简单动画。该任务强调构建一个功能性的游戏原型,包括玩家控制的飞机和基本的子弹机制。任务描述任务要求创建一个带有游戏窗口的JavaFX应用程序;实现键盘控制来移动玩家的飞机;添加基本的子弹发射机制,通过按键(如空格键)触发。任务描述与要求02职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施0503知识储备1SceneBuilder简介2JavaFX简介1JavaFX配置与SceneBuilder关联31概述2定义与功能03JavaFX是Oracle公司推出的一款用于构建富客户端应用程序(RichClientApplications)的现代化平台,广泛应用于桌面、移动和嵌入式系统的图形用户界面(GUI)开发。作为Java标准库的一部分,JavaFX从JavaSE8开始独立发布,提供了一套强大的图形和媒体API,支持创建交互性强、视觉效果丰富的用户界面。它取代了早期的Swing和AWT框架,以更现代化的架构和更高的灵活性成为Java界面开发的首选工具。JavaFX的核心理念是“一次编写,到处运行”,通过Java虚拟机实现跨平台支持,适用于Windows、macOS、Linux等多种操作系统。03概述1概述2定义与功能0303定义与功能JavaFX是一个功能强大的GUI开发框架,允许开发者使用Java语言创建交互式、动态的应用程序界面。其主要功能包括:图形与动画支持:JavaFX提供丰富的2D和3D图形API,支持矢量图形、图像处理和动画效果(如Timeline和Transition类),适合开发视觉效果复杂的应用程序,如雷霆战机中的子弹移动和敌机动画。多媒体集成:支持音频和视频播放,可为游戏添加背景音乐或音效,增强用户体验。03定义与功能FXML与SceneBuilder:通过FXML文件和SceneBuilder工具,开发者可以可视化设计界面,分离界面与逻辑代码,提高开发效率。CSS样式支持:允许通过CSS自定义控件外观,如为雷霆战机HUD设计中国传统红色和金色配色,体现文化自信。事件驱动编程:支持键盘、鼠标等事件处理,用于实现玩家交互,如通过箭头键控制飞机移动。跨平台性:基于JVM的跨平台特性,确保游戏在不同操作系统上运行一致。模块化设计:从Java11开始,JavaFX支持模块化开发,与现代Java生态系统无缝集成。03知识储备1SceneBuilder简介2JavaFX简介1JavaFX配置与SceneBuilder关联31概述2界面构成033版本更新与特性SceneBuilder是Gluon公司开发的一款免费、开源的可视化工具,专为JavaFX应用程序的用户界面(UI)设计而创建。它允许开发者通过拖拽操作快速构建复杂的图形界面,而无需手动编写大量的代码。SceneBuilder的核心目的是简化JavaFX的UI开发流程,使开发者能够专注于应用程序的逻辑和功能实现,而不是纠结于布局细节。作为JavaFX生态系统的重要组成部分,SceneBuilder从JavaFX2.0时代开始发展,已成为构建富客户端应用程序的标准工具之一。在雷霆战机游戏项目中,SceneBuilder被用于设计游戏的HUD(抬头显示),包括得分显示、生命值标签和重启按钮等元素。通过可视化拖拽,学生可以轻松创建界面原型。SceneBuilder是一个独立的可视化编辑器,专注于JavaFX界面的设计。它生成FXML(FXMarkupLanguage)文件,这是一种基于XML的标记语言,用于描述UI结构和布局。FXML文件可以将界面设计与Java代码分离,实现模型-视图-控制器(MVC)模式,提高代码的可维护性和团队协作效率。03概述SceneBuilder的主要功能包括:(1)拖拽式界面设计(2)控件库支持(3)属性编辑(4)实时预览(5)FXML生成与导出(6)国际化支持(7)集成与扩展03概述1概述2界面构成033版本更新与特性03界面构成2SceneBuilder的界面结构清晰,由以下主要部分组成:库面板(LibraryPanel):左侧面板,包含所有可用控件和容器,按类别组织(如Controls、Shapes、Layouts)。用户可以搜索控件并拖拽到画布。文档面板(DocumentPanel):中央画布区域,用于显示当前布局。支持多视图模式,如Hierarchy(层次视图)和Content(内容视图),便于管理节点树。属性面板(InspectorPanel):右侧面板,分成Properties(基本属性)、Layout(布局设置)和Code(代码生成)等子面板。用于精细调整控件,如设置fx:id(用于Java绑定)、文本内容和事件处理程序。预览窗口:通过“Preview”菜单打开,支持全屏预览和不同设备模拟,帮助验证界面响应性。菜单栏与工具栏:顶部菜单提供文件操作(New、Open、Save)、视图切换和帮助文档。工具栏包含常用操作,如对齐、分组和撤销。1概述2界面构成033版本更新与特性03版本更新与特性SceneBuilder各版本以及特性更新如表所示:版本时间特性项目适配SceneBuilder1.x2012-初次发布,支持基本拖拽和FXML生成
-提供基础控件和布局容器
-集成初步预览功能不适用,早期版本与雷霆战机项目使用的JavaFX17不兼容SceneBuilder2.02014-与JavaFX8集成
-引入CSS支持,允许控件样式自定义
-支持3D视图,提升设计灵活性不适用,但CSS样式为雷霆战机HUD的红色、金色配色奠定基础GluonSceneBuilder8.x2018起-Oracle将SceneBuilder开源给Gluon
-支持JavaFX11+
-优化性能,改进FXML生成和控件绑定不直接使用,但为雷霆战机项目选用的SceneBuilder17提供了技术基础SceneBuilder172021-与JavaFX17兼容,提供长期支持(LTS)
-支持高分辨率显示和暗黑模式
-增强实时预览和错误检查雷霆战机项目使用SceneBuilder17,设计HUD(得分、生命值Label),确保稳定性和兼容性SceneBuilder21+2025及以后-引入AI辅助布局建议和新控件
-优化高并发场景性能
-增强多语言支持和自定义控件导入不使用,雷霆战机选择SceneBuilder17以保证教学稳定性,但可探索AI布局优化03知识储备1SceneBuilder简介2JavaFX简介1JavaFX配置与SceneBuilder关联31JavaFXSDK的安装与配置2SceneBuilder集成与配置03在IntelliJIDEA中配置JavaFX环境是开发雷霆战机游戏的前提。以下是详细配置步骤:03JavaFXSDK的安装与配置(1)下载JavaFXSDK雷霆战机项目使用JavaFX17SDK,确保与JDK17兼容。(2)配置IntelliJIDEA打开IntelliJIDEA,创建新JavaFX项目(File>New>Project>JavaFX)。在ProjectStructure>Libraries中,单击右侧区域“+”,添加JavaFXSDKLib目录03JavaFXSDK的安装与配置设置模块路径:在工具栏“Run”找到“EditConfiguration...”并单击,添加VM选项,如图所示:javaFX项目添加LibjavaFX项目运行配置输入以下VM选项,如图所示,替换路径为实际的JavaFXSDK路径:--module-path"D:\Application\javafx-sdk-17.0.16\lib"--add-modulesjavafx.controls,javafx.fxml。验证javaFX配置成功,单击上方绿色三角按钮运行demo程序,验证javaFX项目配置的结果如图所示:03JavaFXSDK的安装与配置javaFX配置VM选项javaFX项目配置验证1JavaFXSDK的安装与配置2SceneBuilder集成与配置03(1)下载SceneBuilder:03SceneBuilder集成与配置访问Gluon官网,下载SceneBuilder17(与JavaFX17兼容)。安装到本地目录(如D:\ProgramFiles\scenebuilder)。雷霆战机项目下载GluonSceneBuilder17,确保支持FXML导出。(2)集成到IntelliJIDEA:打开IDEA,单击工具栏“File”,下拉菜单中点击设置“Settings”按钮,然后展开“Languages&Frameworks”,在展开后的列表中选择“JavaFX”选项。如图所示:设置SceneBuilder可执行路径(如C:\SceneBuilder\SceneBuilder.exe)并且将fxml打开方式与SceneBuilder建立关联如图所示:03SceneBuilder集成与配置在项目中右键FXML文件,如图所示选择“OpeninAssociatedApplication”。sceneBuilder关联fxmlsceneBuilder打开fxml检查fxml是否被正常加载到SceneBuilder。SceneBuilder关联fxml验证成功如图所示:03SceneBuilder集成与配置SceneBuilder关联fxml验证职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05玩家飞机的实现204任务实施游戏窗口的创建1玩家操控逻辑3游戏窗口的创建04游戏窗口创建包括以下内容:(1)创建主舞台(Stage):在start()方法中,primaryStage就是我们应用程序的主窗口。(2)创建根布局(Pane):我们使用Pane作为场景的根布局。Pane允许我们精确控制其中子节点的位置,这在游戏开发中非常有用。(3)setPrefSize(WIDTH,HEIGHT):设置Pane的首选宽度和高度,这将决定Scene和Stage的默认大小。(4)setStyle("-fx-background-color:#..."):使用CSS样式设置Pane的背景颜色。Paneroot=newPane();root.setPrefSize(WIDTH,HEIGHT);//设置窗口的预设大小root.setStyle("-fx-background-color:#1a1a2e;");//设置深色背景,模拟太空游戏窗口的创建04(5)创建场景(Scene):将根布局添加到Scene中。Scenescene=newScene(root);(6)设置舞台属性并显示。primaryStage.setTitle("雷霆战机-第一步");//设置窗口标题primaryStage.setScene(scene);//将场景设置到舞台上primaryStage.setResizable(false);//禁止用户调整窗口大小,保持游戏区域固定primaryStage.show();//显示舞台玩家飞机的实现204任务实施游戏窗口的创建1玩家操控逻辑3玩家飞机的实现04(1)加载飞机图片(我们使用javafx.scene.image.Image类来加载图片资源)ImageplayerImage=newImage(“图片位置”);(2)创建图片视图(ImageView)ImageplayerImage=newImage("=PLANE",true);ImageViewplayer=newImageView(playerImage);player.setFitWidth(PLAYER_WIDTH);//设置显示宽度player.setFitHeight(PLAYER_HEIGHT);//设置显示高度player.setX((WIDTH-PLAYER_WIDTH)/2);//水平居中player.setY(HEIGHT-PLAYER_HEIGHT-20);//距离底部20像素root.getChildren().add(player);玩家飞机的实现204任务实施游戏窗口的创建1玩家操控逻辑3玩家操控逻辑04(1)跟踪按下的键(activeKeys):我们使用一个HashSet<KeyCode>来存储当前所有被按下的键盘按键。HashSet提供了快速的添加和移除操作,并且可以自动去重。privateSet<KeyCode>activeKeys=newHashSet<>();键盘事件监听:为Scene注册键盘按下和释放事件监听器。scene.setOnKeyPressed(event->{activeKeys.add(event.getCode());//按下时添加到集合});scene.setOnKeyReleased(event->{activeKeys.remove(event.getCode());//释放时从集合中移除});玩家操控逻辑04(2)游戏主循环(AnimationTimer):这是游戏的核心,handle方法会持续被调用,用于更新游戏状态。AnimationTimergameLoop=newAnimationTimer(){@Overridepublicvoidhandle(longnow){//向上移动
if(activeKeys.contains(KeyCode.UP)||activeKeys.contains(KeyCode.W)){player.setY(player.getY()-PLAYER_SPEED);}//向下移动
if(activeKeys.contains(KeyCode.DOWN)||activeKeys.contains(KeyCode.S)){player.setY(player.getY()+PLAYER_SPEED);}//向左移动、向右移动……//...(边界限制逻辑)}};gameLoop.start();//启动循环玩家操控逻辑04(3)边界检测(BoundaryChecking):为了防止飞机飞出游戏窗口,我们需要在每次更新位置后检查飞机的坐标,并将其限制在有效范围内。//限制玩家飞机在屏幕边界内if(player.getX()<0){player.setX(0);}if(player.getX()+player.getFitWidth()>WIDTH){player.setX(WIDTH-player.getFitWidth());}if(player.getY()<0){player.setY(0);}if(player.getY()+player.getFitHeight()>HEIGHT){player.setY(HEIGHT-player.getFitHeight());}职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05AI赋能任务实施05在雷霆战机项目中,正确配置JavaFX环境是开发的第一步。AI工具(如豆包)可以通过生成配置步骤、检查错误或提供模板,简化IntelliJIDEA和JavaFX的环境搭建。以下是AI赋能的具体步骤:(1)生成配置指南AI工具分析JDK17和JavaFX17的兼容性,生成VM选项模板:--module-path"C:\JavaFX\javafx-sdk-17\lib"--add-modulesjavafx.controls,javafx.fxml案例:为雷霆战机项目生成VM选项,确保javafx.controls(支持Label、Button)和javafx.fxml(支持HUD)正确加载。(2)验证配置AI工具可模拟运行环境,检查--module-path是否指向正确路径,或提示缺少模块(如javafx.graphics)。案例:运行雷霆战机Demo,若报“JavaFXruntimecomponentsaremissing”,AI建议检查JavaFXSDK路径或模块依赖。AI赋能任务实施05(3)自动化脚本AI生成IntelliJIDEA的项目配置文件(如.idea文件中的模块设置),自动添加JavaFX库。案例:为雷霆战机项目生成.iml文件,包含JavaFX17库路径,提升配置效率。谢谢大家学习项目八从雷霆战机项目走进界面编程Java面向对象程序设计任务二JavaFX开发进阶-雷霆战机游戏功能扩展
Java面向对象程序设计职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05深化JavaFX控件运用能力;掌握JavaFX高级事件处理与游戏循环逻辑;理解并实现JavaFX碰撞检测方法;熟练运用JavaFX数据绑定。掌握JavaFX控件;FXML基本使用。职业能力目标01知识目标技能目标职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05在前一任务基础上引入战斗与反馈机制。这包括实现玩家飞机的子弹发射功能、生成并控制简单敌机的下落,以及集成玩家子弹与敌机、玩家飞机与敌机之间的碰撞检测逻辑。此外,还要开发一个完善的得分系统,确保分数能够实时更新并显示在游戏界面上。任务描述任务要求实现战斗功能,包括子弹发射,敌机生成等;集成碰撞检测,包括子弹与敌机碰撞、敌机与玩家飞机的碰撞等;完善得分系统,如实时更新得分;优化动态对象管理,如子弹与敌机飞离界面时动态处理。任务描述与要求02职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施0503知识储备1FXML基础2JavaFX控件1数据绑定机制303JavaFX控件类别定义关键属性/类型应用场景(雷霆战机)节点(Node)场景图的基本构建块,构成树状结构,所有UI元素均为Node类或其子类的实例,支持层级关系。属性:位置(x,y,translateX,translateY)、旋转(rotate)、缩放(scaleX,scaleY)、不透明度(opacity)、可见性(visible)、效果(effect)事件:鼠标单击、键盘输入、拖拽等游戏中所有元素(如玩家飞机、子弹、HUD)均为场景图中的节点,使用Rectangle或ImageView表示飞机,体现精确控制与动态交互。形状(Shape)Node的抽象子类,用于绘制2D几何图形,提供多种预定义形状。子类:Rectangle、Circle、Line、Polygon、Path样式:填充颜色(setFill)、描边颜色(setStroke)、描边宽度(setStrokeWidth)玩家飞机和子弹使用Rectangle表示,红色填充(象征热情)简化早期版本视觉呈现,高效实现碰撞体功能。图像(Image)与图像视图(ImageView)-Image:加载图片数据(PNG/JPEG),不可直接显示。-ImageView:Node子类,显示Image对象,支持缩放和定位。Image加载:本地路径(file:path/to/image.png)或URL,建议后台加载ImageView:setFitWidth、setFitHeight,保持宽高比第二版中,玩家飞机和敌机升级为ImageView,加载飞机图片提升视觉真实感。UI控件(Control)Node的抽象子类,专为用户交互设计,具备预定义行为和外观。类型:Button(单击触发)、Label(显示文本)、TextField(输入文本)、ComboBox、CheckBox、RadioButton、TableViewLabel用于HUD显示实时得分,绑定IntegerProperty自动更新;Button用于“重新开始”,体现坚持奋斗的正向机制。布局容器(Pane/LayoutPanes)特殊Node,管理子节点位置和大小,支持响应式布局,适应不同窗口尺寸。类型:-Pane:自由定位-VBox:垂直堆叠-HBox:水平排列-BorderPane:五区域布局-GridPane:网格布局-StackPane:Z轴堆叠使用Pane作为游戏画布,精确控制飞机和子弹位置;HUD使用AnchorPane布局得分和生命值Label,确保响应式显示。03知识储备1FXML基础2JavaFX控件1数据绑定机制303FXML基础FXML是一种基于XML的标记语言,用于定义JavaFX应用程序的用户界面。它的主要目的是将UI的声明性设计与应用程序的业务逻辑分离,从而实现MVC(Model-View-Controller)模式中的View层。使用fxml构建应用程序可以:(1)分离设计与逻辑:FXML文件只描述界面元素的结构、属性和布局,而对应的Java控制器(Controller)类则处理用户交互和业务逻辑。这种分离使得UI设计师和开发人员可以更高效地协作,也提高了代码的可维护性。(2)可读性和可维护性:XML格式使得UI结构清晰易读,相较于纯Java代码构建UI,它更直观。这不仅方便开发人员理解界面结构,也便于非开发人员(如UI/UX设计师)通过SceneBuilder等工具直接进行界面的修改和迭代。03FXML基础(3)SceneBuilder集成:Oracle/Gluon提供的SceneBuilder工具是一个可视化编辑器,它可以直接打开FXML文件,通过拖拽、属性编辑等方式设计和布局界面,并实时预览效果。这是FXML最重要的优势之一,极大地提高了UI开发效率和精度。
(4)fx:controller属性:在FXML文件的根元素中,通过fx:controller="your.package.YourController"属性指定该FXML文件对应的Java控制器类。当FXMLLoader加载FXML文件时,它会自动实例化这个控制器并将其与FXML中的UI元素关联起来。(5)fx:id属性:FXML文件中的每个UI元素都可以通过fx:id="elementId"属性赋予一个唯一标识符。在控制器中,可以声明一个与fx:id相同名称的字段(通常标记为@FXML),FXMLLoader会自动将FXML中对应的UI元素注入到这个字段中,从而允许开发者在代码中操作这些UI元素。03FXML基础(6)事件处理:FXML也支持直接定义事件处理方法。例如,onAction="#handleButtonClick"可以将一个按钮的单击事件直接映射到控制器类中名为handleButtonClick的公共方法上。这种方式简化了事件监听器的注册。03知识储备1FXML基础2JavaFX控件1数据绑定机制303数据绑定机制数据绑定是JavaFX中一个非常强大的特性,它允许UI控件的属性与数据模型的属性之间建立自动同步的关系。当数据模型中的值发生变化时,UI控件的显示会自动更新,反之亦然(对于双向绑定)。这大大减少了手动更新UI的繁琐代码,提高了开发效率和应用程序的响应性。以下是几个核心概念和常见实现:(1)属性(Properties):JavaFX引入了专门的“属性”类(如IntegerProperty,DoubleProperty,StringProperty,BooleanProperty等)来封装普通数据类型。这些属性是可观察的,当它们的值发生变化时,会通知所有绑定到它们的监听器。03数据绑定机制(2)SimpleIntegerProperty:最常用的IntegerProperty实现。(3)SimpleStringProperty:最常用的StringProperty实现。(4)Property的优势:相较于传统的getter/setter方法,JavaFXProperties提供了额外的功能:它们是可观察的,可以添加监听器,并且可以参与数据绑定。(5)绑定(Binding):绑定是建立在属性之上的,它定义了属性之间的依赖关系。03数据绑定机制单向绑定(bind()):最常见的形式。一个属性(目标属性,例如UI控件的文本属性)的值会跟随另一个属性(源属性,例如数据模型中的得分属性)的值自动变化。源属性改变,目标属性更新。这是在“雷霆战机”得分系统中使用的类型。示例:targetProperty.bind(sourceProperty)。双向绑定(bindBidirectional()):较少在游戏状态中直接使用,但在表单输入等场景中非常有用(例如,TextField的文本属性与数据模型中的StringProperty绑定)。两个属性相互关联,任何一个改变,另一个都会同步更新。示例:propertyA.bindBidirectional(propertyB)。表达式绑定:允许开发者将一个或多个属性的值组合起来,通过一个表达式计算出一个新值,然后将这个新值绑定到UI控件的属性上。这使得数据转换和格式化变得非常灵活。例如,score.asString("得分:%d")就是一个表达式绑定,它将IntegerProperty转换为格式化的字符串。职业能力目标01任务描述与要求02知识储备03任务实施04AI赋能任务实施05敌机生成实现204任务实施子弹生成实现1碰撞检测功能实现3得分系统实现4游戏运行调试5子弹生成实现04(1)子弹的属性定义//子弹相关属性privatestaticfinaldoubleBULLET_WIDTH=5;//子弹宽度privatestaticfinaldoubleBULLET_HEIGHT=15;//子弹高度privatestaticfinaldoubleBULLET_SPEED=8;//子弹向上移动的速度//存储所有活跃子弹的列表privateList<Rectangle>playerBullets=newArrayList<>();//控制子弹发射频率的变量privatelonglastBulletTime=0;privatestaticfinallongBULLET_COOLDOWN=200_000_000;//0.2秒(纳秒),控制两次发射的最小间隔子弹生成实现04(2)子弹的生成(spawnBullet方法)privatevoidspawnBullet(Paneroot){//创建一个黄色的矩形来表示子弹Rectanglebullet=newRectangle(BULLET_WIDTH,BULLET_HEIGHT,Color.YELLOW);//计算子弹的初始位置:从玩家飞机顶部中心发射//player.getX()+player.getFitWidth()/2:玩家飞机的中心X坐标//-BULLET_WIDTH/2:将子弹的中心与飞机中心对齐bullet.setX(player.getX()+player.getFitWidth()/2-BULLET_WIDTH/2);//子弹Y坐标:从玩家飞机顶部再向上偏移一个子弹高度,使其从飞机前方发出bullet.setY(player.getY()-BULLET_HEIGHT);//将子弹添加到游戏场景的根Pane中,使其可见root.getChildren().add(bullet);//将子弹对象添加到管理列表中,以便在游戏循环中更新其位置playerBullets.add(bullet);}子弹生成实现04(3)子弹的更新与移除(updateBullets方法)privatevoidupdateBullets(Paneroot){//使用迭代器安全地遍历并移除元素//使用Iterator而不是普通的for循环来遍历和修改列表,//可以避免在迭代过程中修改列表导致ConcurrentModificationException错误。Iterator<Rectangle>iterator=playerBullets.iterator();while(iterator.hasNext()){//检查是否还有下一个子弹Rectanglebullet=iterator.next();//获取当前子弹bullet.setY(bullet.getY()-BULLET_SPEED);//子弹向上移动:Y坐标减小
//如果子弹的顶部已经完全飞出屏幕上方(Y坐标小于负的子弹高度),则移除if(bullet.getY()<-BULLET_HEIGHT){//从场景图(Pane)中移除子弹,使其不再显示root.getChildren().remove(bullet);//从列表中移除子弹对象,释放其内存iterator.remove();}}}子弹生成实现04(4)在游戏主循环中的集成AnimationTimergameLoop=newAnimationTimer(){@Overridepublicvoidhandle(longnow){//now参数是当前时间,单位纳秒//...(玩家飞机位置更新)...//玩家发射子弹逻辑://1.检查是否按下了空格键//2.检查是否达到了子弹发射冷却时间(now-lastBulletTime>BULLET_COOLDOWN)if(activeKeys.contains(KeyCode.SPACE)&&now-lastBulletTime>BULLET_COOLDOWN){spawnBullet(gamePane);//调用生成子弹的方法lastBulletTime=now;//更新上一次发射时间}//更新所有子弹的位置和状态(包括移除飞出屏幕的子弹)updateBullets(gamePane);//...(敌机生成和更新)...//...(碰撞检测)...}};敌机生成实现204任务实施子弹生成实现1碰撞检测功能实现3得分系统实现4游戏运行调试5敌机生成实现04(1)敌机的属性定义//敌机相关属性privatestaticfinaldoubleENEMY_WIDTH=50;//敌机宽度privatestaticfinaldoubleENEMY_HEIGHT=50;//敌机高度privatestaticfinaldoubleENEMY_SPEED=2;//敌机下落速度//存储所有活跃敌机的列表privateList<ImageView>enemies=newArrayList<>();//控制敌机生成频率的变量privatelonglastEnemySpawnTime=0;privatestaticfinallongENEMY_SPAWN_COOLDOWN=1_000_000_000;//1秒(纳秒),控制两次生成敌机的最小间隔privateRandomrandom=newRandom();//用于生成随机数,例如敌机的X坐标敌机生成实现04(2)敌机的生成(spawnEnemy方法)privatevoidspawnEnemy(Paneroot){//创建敌机图片,这里使用了一个红色矩形的占位符图片ImageenemyImage=newImage("ENEMY",true);ImageViewenemy=newImageView(enemyImage);//使用ImageView来显示敌机图片enemy.setFitWidth(ENEMY_WIDTH);//设置敌机显示宽度enemy.setFitHeight(ENEMY_HEIGHT);//设置敌机显示高度//随机生成敌机的X坐标,确保敌机完全在屏幕宽度内//random.nextDouble()返回一个0.0到1.0之间的随机数//(WIDTH-ENEMY_WIDTH)确保敌机右边缘不会超出屏幕宽度enemy.setX(random.nextDouble()*(WIDTH-ENEMY_WIDTH));enemy.setY(-ENEMY_HEIGHT);//Y坐标设置为负的敌机高度,使其初始时完全在屏幕上方root.getChildren().add(enemy);//将敌机对象添加到管理列表中,以便在游戏循环中更新其位置enemies.add(enemy);}敌机生成实现04(3)敌机的更新与移除(updateEnemies方法)privatevoidupdateEnemies(Paneroot){//使用迭代器安全地遍历并移除元素//与子弹更新类似,使用Iterator来避免ConcurrentModificationExceptionIterator<ImageView>iterator=enemies.iterator();while(iterator.hasNext()){//检查是否还有下一个敌机ImageViewenemy=iterator.next();//获取当前敌机enemy.setY(enemy.getY()+ENEMY_SPEED);//敌机向下移动:Y坐标增大//如果敌机的底部已经完全飞出屏幕下方(Y坐标大于屏幕高度),则移除if(enemy.getY()>HEIGHT){//从场景图(Pane)中移除敌机,使其不再显示root.getChildren().remove(enemy);//从列表中移除敌机对象,释放其内存iterator.remove();}}}敌机生成实现04(4)在游戏主循环中的集成AnimationTimergameLoop=newAnimationTimer(){@Overridepublicvoidhandle(longnow){//now参数是当前时间,单位纳秒//...(玩家飞机和子弹的更新)...//随机生成敌机逻辑://1.检查是否达到了敌机生成冷却时间(now-lastEnemySpawnTime>ENEMY_SPAWN_COOLDOWN)if(now-lastEnemySpawnTime>ENEMY_SPAWN_COOLDOWN){spawnEnemy(gamePane);//调用生成敌机的方法lastEnemySpawnTime=now;//更新上一次生成时间}//更新所有敌机的位置和状态(包括移除飞出屏幕的敌机)updateEnemies(gamePane);//...(碰撞检测)...}};敌机生成实现204任务实施子弹生成实现1碰撞检测功能实现3得分系统实现4游戏运行调试5碰撞检测功能实现04privatevoidcheckCollisions(Paneroot){//---1.子弹与敌机的碰撞检测---//使用迭代器安全地遍历玩家子弹列表Iterator<Rectangle>bulletIterator=playerBullets.iterator();while(bulletIterator.hasNext()){//遍历每一颗子弹Rectanglebullet=bulletIterator.next();//使用迭代器安全地遍历敌机列表(因为敌机可能被子弹移除)Iterator<ImageView>enemyIterator=enemies.iterator();//遍历每一个敌机}碰撞检测逻辑集中在checkCollisions方法中,该方法在游戏的AnimationTimer循环中每帧被调用。碰撞检测功能实现04while(enemyIterator.hasNext()){//遍历每一个敌机
ImageViewenemy=enemyIterator.next();//核心碰撞检测逻辑:if(bullet.getBoundsInParent().intersects(enemy.getBoundsInParent())){//碰撞发生:
//a.从场景图(Pane)中移除子弹和敌机,使其不再显示
root.getChildren().remove(bullet);root.getChildren().remove(enemy);//b.从管理列表中移除子弹和敌机对象,释放内存bulletIterator.remove();//从playerBullets列表中移除当前子弹
enemyIterator.remove();//从enemies列表中移除当前敌机
//c.更新得分
score.set(score.get()+10);//击中一个敌机增加10分
System.out.println("子弹击中敌机!当前得分:"+score.get());//一旦当前子弹击中敌机并处理完毕,没有必要再检查他敌机的碰撞
break;}}}碰撞检测功能实现04
//---玩家与敌机的碰撞检测---//再次遍历敌机列表,检查玩家是否与任何敌机发生碰撞
//同样使用迭代器,以防万一在多线程或复杂场景下列表被修改
enemyIterator=enemies.iterator();//重置迭代器,或重新获取一个新迭代器
while(enemyIterator.hasNext()){ImageViewenemy=enemyIterator.next();//核心碰撞检测逻辑:检查玩家飞机与当前敌机是否相交
if(player.getBoundsInParent().intersects(enemy.getBoundsInParent())){//玩家与敌机碰撞发生:
//TODO:在这里添加游戏结束逻辑
//目前仅打印信息,实际游戏中会触发游戏结束流程 System.out.println("玩家与敌机碰撞!游戏结束!当前得分:"+score.get());//在实际游戏中,这里通常会调用一个方法来停止游戏循环并显示游戏结束界面
//例如:gameLoop.stop();//停止AnimationTimerbreak;//玩家碰撞后通常游戏就结束了,无需检查其他敌机
}}碰撞检测功能实现04
//游戏主循环(AnimationTimer)AnimationTimergameLoop=newAnimationTimer(){
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁2026年注册会计师CPA《税法》真题练习卷
- 计算机应用基础试题汇编913
- 2026年贵港市烟草专卖局校园招聘考试备考试题及答案解析
- 2026福建漳州东山县人力资源和社会保障局招聘1人参考题库附答案详解典
- 5.2 必须长期坚持的指导思想-教案 2025-2026学年统编版道德与法治 九年级上册
- 2026年辅警考试群团常识题库附答案
- 2026年共青团入团团章冲刺考试题库含答案
- 2026年国家公务员考试(副省级)申论试卷与参考答案
- 2025年军队文职人员统一招聘笔试(艺术学)模拟题及答案
- 2026年项目管理协议商洽函(4篇)
- 2025年湖北建筑工程技术高、中级职务水平能力测试建筑工程题库含答案详解
- 兽药企业安全培训计划书课件
- ICU轮转护士工作总结
- 广东省初级注册安全工程师题库及答案解析
- 内镜全自动清洗机课件
- 2025秋初中信息技术八年级全一册教学计划
- 《诗经》诗经全文
- 初二下八升九-暑期不躺平初三一定赢-暑假前期末家长会课件
- 四川省甘孜州2024-2025学年七年级下学期期末检测英语试卷(含答案无听力原文及音频)
- 内蒙古自治区包头市2024-2025学年七年级下学期7月期末考试数学试卷(含详解)
- 2025年度食品厂安全应急演练计划
评论
0/150
提交评论