JavaFX中的塔防

我想长时间使用我的游戏引擎来编写《塔防》游戏,但是由于另一个小组努力创建JavaFX《塔防》游戏,所以我认为我宁愿创建另一款游戏。 从邮件列表中,我了解到不再开发其他游戏。 因此,我决定尝试一下。

塔防是一款非常适合基于图块的方法的游戏,因此我开始寻找一些图块。 我在这里找到了一些东西 ,而艺术家Silviu Ploisteanu允许我在演示中使用它们。 塔防作为游戏与TileMap编辑器非常相似,因此我将能够重用我之前创建的编辑器中的许多代码:

首先要做的是将单个图形组合成图像进行平铺。 我对敌人,炮塔基地,大炮,地形进行了分组,还为背景创建了一个图块图块。 之后,我使用了TileMap编辑器( http://www.mapeditor.org/ )从这些图像创建TileSet。 我可能不得不再次做这部分,因为Gimp在此过程中更改了颜色,但是现在我对图像的外观不太在意。

然后,我从底部到顶部将5层添加到新地图:“背景”,“地形”,“炮塔基地”,“炮塔大炮”和“敌人”。 也将有一个“子弹和爆炸”层,但我稍后会手动添加。 到目前为止,还没有涉及任何编码,通过基于TileMap的方法,我们已经有了游戏的序列化格式。 因此,当用户编辑地图时,我们可以简单地将更改存储到TileMap中。 现在的地图如下所示:

Bildschirmfoto-2013-08-06-um-16.41.16

下一步是编码。 我只是用BorderPane创建了一个新的JavaFX Application。 在中心,我将有一个运动场,在右边,我将有一个带有大炮的调色板。

这是创建GameCanvas的方法:

tileMap = TileMapReader.readMap(fileURL);
canvas = new GameCanvas(tileMap.getTilewidth() * tileMap.getWidth(), tileMap.getHeight() * tileMap.getTileheight(), tileMap.getTilewidth() * tileMap.getWidth(), tileMap.getHeight() * tileMap.getTileheight());
// add all the layers
ArrayList layers = tileMap.getLayers();
for (TileMapLayer tileMapLayer : layers) {canvas.addLayer(tileMapLayer);
}

然后我获得带有大炮的TileSet并创建Palette。 我正在为调色板使用VBox,因为我还希望使地形可编辑,因此以后我可能会添加另一个TileSet:

TileSet turrets = tileMap.getTileSet("turrets");TileSetView turretView = new TileSetView(turrets);
VBox palette = new VBox();
palette.getChildren().addAll(turretView);

TileSetView仅显示基础图像,并允许您通过单击鼠标来选择一个Tile。 当我们从用户交互开始时,我可能会稍后再显示代码。 现在,这是我们在启动游戏后看到的内容:

Bildschirmfoto-2013-08-06-um-16.44.09

难看的红色区域是默认背景。 不幸的是,背景图像的尺寸不是平铺尺寸的倍数,因此稍后我将不得不定义一个不合理的尺寸。 现在,我将忽略它,它只是一个背景……

现在,我们希望用户能够放置炮塔。 目前,玩家拥有不限量的金钱,因此他可以根据需要放置任意数量的炮塔。 唯一的限制是,只有在平台上并且没有炮塔的情况下,他才能放置它们。 因此,我们为鼠标事件添加了一个EventHandler,该事件处理程序是从Palette中选择的炮塔,并将其添加到炮塔基础层。 为了简单起见,我现在将炮塔基座和炮塔组合成一个图像:

canvas.setOnMousePressed(new EventHandler() {
@Override
public void handle(MouseEvent t) {double x = t.getX();
double y = t.getY();int idx = (int) ((int) x / tileMap.getTilewidth() + (((int) y / tileMap.getTileheight()) * tileMap.getWidth()));
if (platformLayer.getGid(idx) != 0 && turretBaseLayer.getGid(idx)==0) {
turretBaseLayer.getData().setGid(idx, turretView.getSelectedGid());
}
}
});

结果,我们现在可以将转塔放置在没有平台但还没有转塔的地方:

我认为第一部分已经表明,该API非常适合创建simplegame,而无需编写大量代码。 在下一部分中,我们将添加生成点和目标,并使用A *计算敌人路径。

参考: Eppleton博客上的JCG合作伙伴 Toni Epple提供的JavaFX中的塔防功能 。

翻译自: https://www.javacodegeeks.com/2013/10/tower-defense-in-javafx.html

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

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

相关文章

CSS pointer-events属性的使用

楔子 在前端的开发中,我们都是直接与用户接触,应该尽量让用户感到操作畅快愉悦,获得类似native的感觉。其中动画是最常用的方法。 这里的需求是,弹层的设计,这个弹层希望可以像 native 上的弹层一样,点击…

深入理解JavaScript之Event Loop

前言 最近阅读《高性能JavaScript》时,第六章谈到“通过定时器将JavaScript执行代码的控制权先让给浏览器用于更新UI状态,然后再将控制权交回给JavaScript代码,这样就可以使得页面更为流畅”,就联想到了之前理解的事件循环。 这…

使用EasyPoi导出Excel

Excel模板来自自己写死的一个excel模板,相当于是用户查询数据,数据填充到一个模板的Excel里,再导出Excel /*创建模板*/String a request.getSession().getServletContext().getRealPath("/resource/河南能源化工集团安全监控系统联网系统…

Hazelcast入门

7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置并且可以互相通信。 这意味着可以通过编写很少的代码行在VM之间同步数据。 如果您…

android手机最低内存,原神手机端需要哪些配置 手机端最低配置要求介绍

原神是一款由米哈游自主研发的全新开放世界冒险游戏,游戏最近迎来了pc端的首次测试,而且在不久之后就会开启原神手机端的公测版本,那么手机端需要什么配置呢?小编带来了详细的介绍。移动端预下载:9月25日下午16&#x…

AnswerOpenCV一周佳作欣赏(0615-0622)

一、How to make auto-adjustments(brightness and contrast) for image Android Opencv Image Correctionim using OpenCV for Android. I would like to know,how to make image correction(auto adjustments of brightness/contrast) for image(bitmap) in android via Open…

所有其他指标均无用

对于队列,无论是实现为JMS ,数据库表(即Ruby的Delayed :: Job用于队列的什么),甚至是Amazon的SQS ,用于评估队列状态的最常见指标是其长度。 从本质上讲,可以基于在任何给定时间队列中驻留多少消…

类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...

随着智能手机日益发展,辅助智能手机的数据线配件也越来越多样。现在我们最常见的无非就是标准Micro usb口、正反随便插的Type-c接口、还有苹果Lightning数据线,那么除了这些类型数据线,你知道如今市面上还有哪些更方便好用的手机数据线吗&…

canvas入门实战--邀请卡生成与下载

1.前言 写了很多的javascript和css3的文章,是时候写一篇canvas的了。canvas是html5提供的一个新的功能!至于作用,就是一个画布。然后画笔就是javascript。canvas的用途非常的广,特别是html5游戏以及数据可视化这两个方面。现在can…

Apache ActiveMQ 5.9发布

Apache ActiveMQ团队刚刚发布了新的ActiveMQ 5.9版本 。 Apache ActiveMQ 5.9发布 自从先前的5.8版本以来,此版本是8个月的辛苦工作。 在此发行版中,我们将像往常一样对代理进行增强,并使用最新的协议(例如AMQP和MQTT&#xff…

android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

前言上次我写了一遍文章《Android 关于美颜/滤镜 从OpenGl录制视频的一种方案》,里面利用ImageReader来从获取Surface上获取数据,但是经过熊皮皮的提醒,我发现多PBO的确可以实现跟ImageReader一样的效果,并且版本要求仅为Android4…

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,它促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bean的映射器&#xff…

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能,在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…

送福利:ROKID 语音开发板免费送,开启你的物联网之旅

都让一让,我说个事情:掘金联合 Rokid 开发者社区给大家发福利啦! 掘金联合 Rokid 开发者社区为大家准备了一些福利,只要秀出你的 skill 和技术栈,就有可能获得 Rokid 全栈语音智能开发套件。 ? Rokid开箱试用活动 活…

如何使用JavaScript控制台改进工作流程

作为Web开发人员,很有必要了解如何调试代码。后台开发我们经常使用外部库来记录日志,并在某些情况下格式化显示日志,前端我们会使用断点和控制台,但是我们浏览器的控制台比我们想象的要强大得多。 当我们考虑控制台时&#xff0c…

select、poll、epoll之间的区别总结[整理]

原文:https://www.cnblogs.com/Anker/p/3265058.html 好文章收藏下,慢慢品味 select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者…

JPA(七):映射关联关系------映射双向多对一的关联关系

映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone;import java.util.Date; import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; impo…

如何优雅的绘制一棵省市区三级可选择的树?

开始 总结一下 开发过程中的思路想法 各位大佬们看看就好 首先你拥有的数据结构 所有省市区的信息列表 以及已经选中的信息 用的是element-ui的 el-tree const cityStorage {provinceList:[{id: 1, provinceId: "110000", name: "北京市"}],//所有省ci…

html click事件 参数,vue 实现click同时传入事件对象和自定义参数

这篇文章主要介绍了vue 实现click同时传入事件对象和自定义参数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧仅仅传入自定义参数HTMLdddddJS代码new Vue({el:#app,methods:{tm:function(e){console.log(e);}}})仅仅传入事件对象HTML…

Android学习(七)—— Android布局

Android布局 1、LinearLayout 线性布局,这种布局在平时的开发中用的最多,内部控件只能水平或竖直进行排列,在搭建较复杂的界面时会有点麻烦。 常用属性 android:orientation 控制控件排列方向,属性值为垂直(vertical…