第三章:四处移动

本章内容源自于:Move it Around

移动控制


是的,如果屏幕上没有东西会动,那么没人会说这是个游戏的。我们甚至都没有办法控制我们的星际战舰。至少,我们应该能通过按键让它左右移动。我将告诉你如何通过控制鼠标左右移动来实现这个功能。听起来不错,不是吗?

代码如下。如果想弄明白监听器的详情用法,请看初级教程5-Hello Input System

输入控制系统

(你会发现,在update()中我们使用了ship.stream().findFirst()方法,这是因为)我们可能会有多个飞船,因此我们选择拿第一个。本案例中,我们只有一个飞船。但有可能以后我们会有三个飞船:一个是我们当前可以操控的飞船,另外两个稍微小一点放在屏幕左上角代表玩家还有几条命。下面的代码片段展示了如何通过过滤名称组件获取特定的飞船实体:

代码片段

过滤器会先排除掉不含有模型组件或位置组件的实体,然后从剩下的实体中找到名为SpaceShip的那个实体。或者我们可以事先写一个没有任何属性的组件作为飞船的组件,然后通过查询拥有这个组件的实体获取飞船。这种组件被称为标记组件,这也是一种常用的方法。

在AnalogListener中我们可以拿到鼠标的x坐标,然后可以以此计算出飞船的x位置坐标。我的这种算法比较简陋,你可以写一个更符合物理学的算法。这个position还没有与飞船关联起来,因此还不会影响飞船位置。关联到飞船的代码在更新循环中:

更新循环

每次更新都会找到飞船然后把最新的position设置到它的位置组件中。注意每次是创建新组件而不是修改组件中的属性值。

在主类中注册输入控制系统:

修改主类构造方法

现在我们的飞船可以移动了吗?真的?真的。在显示系统的帮助下,你可以看到飞船移动。我们没有修改任何现有逻辑,只是添加了一个输入控制系统就可以让飞船动起来。当然,如果我们要给飞船添加新的组件,就可能要修改原有代码了。如果你坚持使用面向对象的设计方法来做这个游戏的话,我想你现在肯定已经是弄得一团糟。实体系统不是通过继承实现功能的,而是数据驱动的,不要搞混了。至少不要把这两个概念搞混了。

飞舞的入侵者


星际战舰现在由我们的鼠标控制着,可以移动。但是画面还是没什么动感。为了让入侵者动起来,我将写一个非常简单的AI系统出来:

入侵者AI系统

不要忘了在主类中注册它:

修改主类构造方法

入侵者现在会上下左右按照队列飘来飘去了。是时候给你看实体系统的精妙之处了。不过你应该已经能体会到了游戏逻辑是如何清晰地分离独立的了。

让我们给显示系统新增加些更酷的功能。我们要让入侵者沿着y轴旋转。于是我打算给位置组件新增加一个旋转属性。当然你也可以把旋转独立为一个新的实体组件,但这样做你得修改原先的代码。用下列代码替换原来的位置组件类:

位置组件类

现在我们不得不改动显示系统,使它支持模型旋转。我们稍微改动updateModelSpatial()方法,代码如下:

代码片段

也许有更优雅的书写方式,但我就知道这一种。现在显示系统支持旋转更新了。为了让入侵者旋转起来我们需要修改入侵者AI系统。用下列代码替换掉wabbeling()方法:

代码片段

实际上只有这部分变动了:

代码片段

所有的入侵者将每秒沿y轴旋转90°。我添加了一些限制确保旋转角度始终不超过360°。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容

  • 伴随着太阳的升起,一缕晨光撒下,照亮了整个世界,也照亮了觅仙宗-这个世界上唯一的修真门派。 相传,太古时期...
    卿佳温玉阅读 202评论 0 0
  • “黑天鹅”事件,谁都说不准,或许是一次能源枯竭导致经济瘫痪。也许,它会是一场瘟疫,夺去千百万人的生命,或者是一次电...
    白马笑北风阅读 734评论 0 0
  • 关于今天早上听逻辑思维,关于更好和更方便的问题,好的判定是在一定技艺上的精湛,方便的判定是在应用广泛,通用的整体基...
    戈壁黄沙阅读 394评论 0 0
  • 并集
    孔李聃丘阅读 132评论 0 0
  • 1.今晚9:30坐在车里等儿子的时候,接到儿子的电话问我“在哪里”,心里想儿子会问了,这是对事情处理的很到位,不盲...
    雨过天晴june阅读 148评论 0 0