使用当前版本的API,我对太空侵略者的评价不到175个LOC。 我的API中有很多“功能接口”,可以使用JavaFX 8(例如SpriteProvider和CollisionHandler)将其转换为Lambda表达式。 这将使代码更好,更短。 我可能还可以通过捆绑资源(例如TileSets)并创建更多工厂和构建器(SpriteBuilder)来减少行数。 但是我越来越接近我想要的……

package de.eppleton.fx2d.samples.spaceinvaders;import de.eppleton.fx2d.collision.*;
import de.eppleton.fx2d.*;
import de.eppleton.fx2d.action.*;
import de.eppleton.fx2d.tileengine.*;
import java.util.Collection;
import java.util.logging.*;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.canvas.*;
import javafx.scene.input.*;
import javafx.scene.media.*;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javax.xml.bind.JAXBException;
import org.openide.util.Lookup;
import org.openide.util.lookup.Lookups;public class SpaceInvaders extends Game {Points TEN = new Points(10);Points TWENTY = new Points(30);Points THIRTY = new Points(40);DoubleProperty invaderXVelocity = new SimpleDoubleProperty(0.3);AudioClip shootSound = new AudioClip(SpaceInvaders.class.getResource('/assets/sound/shoot.wav').toString());AudioClip invaderKilledSound = new AudioClip(SpaceInvaders.class.getResource('/assets/sound/invaderkilled.wav').toString());MediaPlayer mediaPlayer = new MediaPlayer(new Media(SpaceInvaders.class.getResource('/assets/sound/invader_loop1.mp3').toString()));int score = 0;String message;int[][] enemies = new int[][]{{30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30},{20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20},{20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20},{10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},{10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}};@Overrideprotected void initGame() {final GameCanvas canvas = getCanvas();try {TileSet invaders = TileMapReader.readSet('/assets/graphics/invaders1.tsx');TileSet playerTiles = TileMapReader.readSet('/assets/graphics/player.tsx');final TileSetAnimation animation30 = new TileSetAnimation(invaders, new int[]{0, 1}, 2);final TileSetAnimation animation10 = new TileSetAnimation(invaders, new int[]{4, 5}, 2);final TileSetAnimation animation20 = new TileSetAnimation(invaders, new int[]{2, 3}, 2);final TileSetAnimation playerAnimation = new TileSetAnimation(playerTiles, new int[]{0}, 100_000);for (int i = 0; i < enemies.length; i++) {int[] is = enemies[i];for (int j = 0; j < is.length; j++) {Points points = is[j] == 30 ? THIRTY : is[j] == 20 ? TWENTY : TEN;Sprite sprite = new Sprite(canvas, '' + ((j * 11) + i), 50 + (40 * j), 140 + (40 * i), 30, 20, Lookups.fixed(points));sprite.setAnimation(is[j] == 30 ? animation30 : is[j] == 20 ? animation20 : animation10);sprite.setVelocityXProperty(invaderXVelocity);}}Sprite player = new Sprite(canvas, playerAnimation, 'Player', 350, 620, 40, 30, Lookup.EMPTY);player.setAnimation(playerAnimation);player.addAction(KeyCode.LEFT, ActionFactory.createMoveAction(playerAnimation, 'left', -4, 0, 0, 0));player.addAction(KeyCode.RIGHT, ActionFactory.createMoveAction(playerAnimation, 'right', 4, 0, 0, 0));player.addAction(KeyCode.UP, new ShootAction(playerAnimation, 'fire', new BulletProvider(), new HitHandler(), shootSound));} catch (JAXBException ex) {Logger.getLogger(SpaceInvaders.class.getName()).log(Level.SEVERE, null, ex);}canvas.addLayer(new Background());canvas.addBehaviour(new MoveInvadersBehavior());mediaPlayer.setCycleCount(MediaPlayer.INDEFINITE);mediaPlayer.play();canvas.addLayer(new SpriteLayer());canvas.start();}@Overrideprotected double getViewPortWidth() {return 700;}@Overrideprotected double getViewPortHeight() {return 700;}public static void main(String[] args) {launch(args);}private class Points {int points;public Points(int points) {this.points = points;}public int getPoints() {return points;}}static class BulletProvider implements SpriteProvider {@Overridepublic Sprite getSprite(GameCanvas parent, double x, double y) {return new Sprite(parent, 'bullet', x, y + 10, 10, 20, Lookup.EMPTY);}}class HitHandler implements CollisionHandler {@Overridepublic void handleCollision(Collision collision) {Points points = collision.getSpriteTwo().getLookup().lookup(Points.class);if (points != null) {score += points.getPoints();invaderKilledSound.play();collision.getSpriteOne().remove();collision.getSpriteTwo().remove();}}}class MoveInvadersBehavior extends Behavior {@Overridepublic boolean perform(GameCanvas canvas, long nanos) {Collection<Sprite> sprites = canvas.getSprites();boolean stop = false;boolean win = true;for (Sprite sprite1 : sprites) {if (sprite1.getLookup().lookup(Points.class) != null) {win = false;if (sprite1.getX() > 650 || sprite1.getX() < 50) {invaderXVelocity.set(-invaderXVelocity.doubleValue() * (stop ? 0 : 1.3));if (sprite1.getY() >= 600) {message = 'Game Over!';stop = true;mediaPlayer.stop();}for (Sprite sprite2 : sprites) {if (sprite2.getLookup().lookup(Points.class) != null) {sprite2.setY(sprite2.getY() + (stop ? 0 : 20));}}break;}}}if (win) {message = 'You win!';canvas.stop();mediaPlayer.stop();}return true;}}class Background extends Layer {        @Overridepublic void draw(GraphicsContext graphicsContext, double x, double y, double width, double height) {graphicsContext.setFill(Color.BLACK);graphicsContext.fillRect(0, 0, width, height);graphicsContext.setFill(Color.WHITE);graphicsContext.setFont(Font.font('OCR A Std', 20));graphicsContext.fillText('SCORE<1>    HI-SCORE    SCORE<2>', 30, 30);graphicsContext.fillText('' + score + '            9990   ', 30, 60);graphicsContext.fillText(message, 300, 400);graphicsContext.fillText('' + 3 + '                   CREDIT ' + 1, 30, 680);graphicsContext.setFill(Color.GREEN);graphicsContext.fillRect(30, 650, 640, 4);}}
}

这是游戏的视频:

参考: JavaFX:我们的JCG合作伙伴 Toni Epple在Eppleton博客上以不到175 LOC的价格入侵了太空 。

翻译自: https://www.javacodegeeks.com/2013/02/javafx-space-invaders-in-less-than-175-loc.html

JavaFX:太空侵略者在175 LOC以下相关推荐

  1. c#小游戏_C#小游戏—钢铁侠VS太空侵略者

    身为漫威迷,最近又把<钢铁侠>和<复仇者联盟>系列又重温了一遍,真的是印证了那句话:"读书百遍,其意自现".看电影一个道理,每看一遍,都有不懂的感受~ 不知 ...

  2. C#小游戏—钢铁侠VS太空侵略者

    身为漫威迷,最近又把<钢铁侠>和<复仇者联盟>系列又重温了一遍,真的是印证了那句话:"读书百遍,其意自现".看电影一个道理,每看一遍,都有不懂的感受~ 不知 ...

  3. Space Invaders 太空侵略者

    发售年份 1978 平台 街机 开发商 Taito 类型 射击 https://www.youtube.com/watch?v=MU4psw3ccUI 转载于:https://www.cnblogs. ...

  4. JavaFX 2 GameTutorial第3部分

    介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程. 如果您错过了第1部分和第2部分 ,建议您在开始本教程之前先进行阅读. 回顾第二部分,我讨论了游戏循环的内部工作原理,其中我们 ...

  5. Swift游戏开发实战教程(大学霸内部资料)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程详细讲解记忆配对 ...

  6. javafx2_JavaFX 2 GameTutorial第3部分

    javafx2 介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程. 如果您错过了第1部分和第2部分 ,我建议您在开始本教程之前仔细阅读它们. 回顾第2部分,我讨论了游戏循环的内 ...

  7. Swift游戏开发实战教程(霸内部信息大学)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程具体解说记忆配对 ...

  8. 7句话让Codex给我做了个小游戏,还是极简版塞尔达,一玩简直停不下来

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 什么,7 ...

  9. 妙啊,边玩游戏边学强化学习

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 桃良 发自 凹非寺 来自 | 量子位 学习的枯燥似乎有种魔力,让人无法提起干劲. 看着 ...

最新文章

  1. FCOS:全卷积一阶段Anchor Free物体检测器,多种视觉任务的统一框架
  2. 关于判断checkbox选中问题
  3. ACM模板--邻接矩阵 有向图
  4. 深度学习如何入门?怎么入门机器/深度学习?
  5. python虚拟环境搭建mac_mac搭建python virtualenv虚拟环境并使用 - 李金龙
  6. Codeforces 1138B Circus (构造方程+暴力)
  7. [PAT乙级]1006 换个格式输出整数
  8. Asp.Net中用javascript实现弹出窗口永远居中
  9. 用python玩转数据测试答案_大学慕课2020用Python玩转数据章节测试答案
  10. 入侵微博服务器刷流量,开发者获刑 5 年;马化腾重回中国首富;支持 M1 芯片,VS Code 1.54 发布 | 极客头条...
  11. Dapper学习 - Dapper.Rainbow(三) - Read
  12. 关于一名零基础蒟蒻ACM变强的路子
  13. EF中的Guid主键
  14. 第十六届—振兴杯计算机网络管理员决赛模拟题
  15. 开源一个 Python 中文数据结构和算法教程
  16. H3C路由器清空ARP表
  17. 论开展线上业务的纯粹度的重要性
  18. 【毕业答辩】毕业设计答辩的基本流程
  19. HTML5之内联框架和音视频标签
  20. (一)arcpy开发利用arcpy在arcgis中批量裁剪影像

热门文章

  1. 通过网页查看服务器算法,java分析html算法(java网页蜘蛛算法示例)
  2. 投票源码程序_[内附完整源码和文档] 基于JSP实现的影视创作论坛系统
  3. 转:SparkConf 配置的用法
  4. MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结
  5. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
  6. selenium自动化测试_Selenium测试可实现有效的测试自动化
  7. java登录界面命令_Java命令行界面(第11部分):CmdLn
  8. java ee编译器_Java EE 8 MVC:控制器的详细介绍
  9. Java中的观察者设计模式
  10. Spring与Rails的jQuery UJS