一个 uml 课程的大作业,项目要求设计并开发一款 2048 与某种游戏类型相结合的创新游戏。可以选择只建模或者既建模又实现,既然要做当然是选择实现啦(虽然没有接触过游戏...期末周的莽冲hhh,小组内我负责代码实现,用的是基于JavaFX的游戏开发框架FXGL

游戏介绍

游戏背景

因为这次大作业赶上期末复习周,我们游戏的名字就叫FinalWeek2048,融入了我们学校期末周的背景。以2048游戏元素为主,加入双人竞技碰撞放置的创新元素。

2048中从2-2048共11种方块,我们用C, C++, java, Python,数据库,数据结构,计算机组成原理,计算机网络,Web开发,HTML,UML共11中课程方块替代,分值上和2048中相对应。(计算机宇宙的尽头是UML建模设计哈哈哈

游戏玩法

玩家一和玩家二通过按键控制角色,随机释放不同的方块,所放置的方块具有重力属性,放置后自由下坠,触碰到其他不同的方块或游戏边界则停留,若与其他相同的方块相撞则合成一个更加高级的方块,并加上等级相应的分数。

游戏结束条件:堆积的方块触到玩家所站的平台或一方胜利

胜利条件:a. 率先得到2048分;b. 率先合成UML方块;c. 一方触顶,另一方胜利

游戏开发框架FXGL

以下是FXGL在Github上对自己的介绍和定位(直接谷歌生翻的

我选择使用FXGL,首先是考虑如果在这么短的时间去重新学习目前比较热门的游戏框架难度更大(自身也没打算往游戏方向发展,易上瘾不敢碰),然后之前已经学习了JavaFX正好FXGL是基于它的,学习成本会小很多,还能锻炼一下。

事实证明,我想多了,阻力比我想象的大,FXGL在国内外都比较冷门,在国内资料几乎没有,官方给的wiki不能满足我的需求,再配上官方的游戏demo,勉强做了下来。(感觉如果之前用过Unity或者Cocos这样的框架会好学很多,因为官方也提到了FXGL是参照热门的一些游戏框架开发的)

然后就是我过菜的英文水平!基本的就是应付官方文档和wiki,非常关键在于在社区找bug的解决方案的时候...翻译不通

还有一点,FXGL的API文档版本很旧,目前没有发布最新的但框架好像已经更到了17...

成果展示

1. 主菜单界面

主菜单是继承了MainMenu自己重新写了个,蓝色是糊掉了学校信息,还加上了与期末周格格不入的欢快背景音乐[doge]

还有个游戏结束时的子菜单,直接用了内置的SimpleGameMenu。

2. 游戏主界面

虽然有素材,但没有给两个玩家加上移动的动态动作,当时时间赶懒得分开写。背景是我们学校的一个塔,放这里还挺合适的。方块碰撞消除会有音效和粒子碰撞效果~

实现细节

以下是在实现过程中我觉得难度较大的部分,可以先跳过看源码了解整体的框架

  1. 在工厂中对方块实体的设置

    要使得实体间产生碰撞或者具有重力,则需要把它们加入物理世界并且设置参数。

    关于相同的方块碰撞加分,就是赋予了方块实体HealthIntComponent部件(一般在游戏中是血条),让它具有一个整型参数属性,应该还有更好的处理方法,然后为了方便布置关卡,我是在工厂写出了这11中方块实体从a-k。
    @Spawns("a")
public Entity newA(SpawnData data) {
// 这里就是设置方块的物理属性,设置密度,能在物理世界自由下坠
PhysicsComponent physics = new PhysicsComponent();
physics.setBodyType(BodyType.DYNAMIC);
physics.setFixtureDef(new FixtureDef().density(0.03f)); return entityBuilder(data)
.type(FinalWeekType.BOOKBLOCK)
.viewWithBBox(texture("bookblock_2.png", 80, 80))
.with(new HealthIntComponent(2))
.with(physics)
.collidable()
.build();
}
  1. 方块之间和方块与平台的碰撞处理

    不同方块直接堆叠,相同方块碰撞后移除游戏世界产生特效实体以及新的方块实体

    处理碰撞的计分归属,是在随机参数的方块加了IDComponent来识别是玩家一还是玩家二放置的。
@Override
protected void initPhysics() {
PhysicsWorld physicsWorld = getPhysicsWorld();
// 当两个相同的方块碰撞在一起后消失,并产生一个加倍的方块
physicsWorld.addCollisionHandler(new CollisionHandler(FinalWeekType.BOOKBLOCK, FinalWeekType.BOOKBLOCK) {
@Override
protected void onCollision(Entity playerBlock, Entity block) {
int num1 = playerBlock.getComponent(HealthIntComponent.class).getMaxValue();
int num2 = block.getComponent(HealthIntComponent.class).getMaxValue();
String curBlock = "";
if(playerBlock.isType(block.getType())) {
if(playerBlock.hasComponent(IDComponent.class)) {
curBlock = playerBlock.getComponent(IDComponent.class).getName();
}
if(num1 == num2) {
Point2D explosionSpawnPoint = playerBlock.getCenter().subtract(64, 64);
spawn("explosion", explosionSpawnPoint);
runOnce(()->play("combine.wav"), Duration.seconds(0.5));
double x = block.getCenter().getX() - 40, y = block.getCenter().getY() - 40;
playerBlock.removeFromWorld();
block.removeFromWorld();
int score = (int)(Math.log(num1) / Math.log(2));
char ch = (char) (score + 'a');
if(ch >= 'k') {
if(curBlock == "firstPlayerScore") showGameOver("玩家一");
else showGameOver("玩家二");
}
String str = "" + ch;
spawn(str, x, y);
if(curBlock != "") inc(curBlock, +num1);
}
}
}
});
// 处理方块与玩家所站的平台底部的碰撞
physicsWorld.addCollisionHandler(new CollisionHandler(FinalWeekType.BOOKBLOCK, FinalWeekType.PLATFORM) {
@Override
protected void onCollision(Entity block, Entity platform) {
if(block.getComponent(IDComponent.class).getName() == "firstPlayerScore") showGameOver("玩家二");
else showGameOver("玩家一");
}
});
}

源码分享

FinalWeek2048 源码

代码其实还没整理好,然后碰撞产生的连锁碰撞消除的计分还没有处理好,等之后空闲下来再来整理完善~

一个简单的小游戏,欢迎大佬们指教!

2048 双人创新小游戏【JavaFX-FXGL游戏框架】的更多相关文章

  1. FXGL游戏开发-JavaFX游戏框架

    FXGL 是一个JavaFX 游戏开发的框架,这个框架有两个版本,其中基于JDK1.8的版本已经不再维护,目前最新的是基于JDK11的版本,也就是Openjfx的版本. FXGL 提供了各种游戏范例: ...

  2. 微信小程序开发的游戏《拼图游戏》

    微信小程序开发的游戏<拼图游戏> 代码直接考进去就能用 pintu.js // pintu.js Page({ /** * 页面的初始数据 */ data: { }, initGame: ...

  3. 差分数组|小a的轰炸游戏-牛客317E

    小a的轰炸游戏 题目链接:https://ac.nowcoder.com/acm/contest/317/E 思路  这题考查的是对差分数组原理和前缀和的理解. 四个数组分别记录朝着四个方向下放的个数 ...

  4. [ZJOI2007] 小Q的矩阵游戏 (模板—Dinic)

    B. 矩阵游戏 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行 ...

  5. 开启云时代,银狐H5游戏云通迅框架解决方案出炉!

    没有时间开发服务器? 不懂服务器开发? 还在为WEB SOCKET烦恼?还在为网络卡,负载承受能力小烦恼? 银狐H5游戏云通迅框架,集成通讯SDK和开放API,1天即可完成 它也是开放平台,提供游戏需 ...

  6. 直接操作游戏对象C#游戏开发

    直接操作游戏对象C#游戏开发 2.2.3  直接操作游戏对象 在Inspector视图里通过设置属性而改变游戏场景中游戏对象的状态,太过抽象,毕竟数字并不够直观.其实,改变游戏对象的状态,完全有最最直 ...

  7. 2D游戏与3D游戏的区别 原文:https://zhidao.baidu.com/question/588490865.html

    2D和3D间有哪些不同点呢? 让我们来比较一下,共同找出它俩之间的不同点. 对玩家来说,2D技术和3D技术只是显示数据的方式而已,玩家都是通过二 维的平面显示器来观看它们.对制作者来说,二者的不同之处 ...

  8. 2d游戏和 3d游戏的区别

    2D游戏和3D游戏的主要区别 一.总结 一句话总结:2D中的单位就是贴图,3D中的单位还有高 1. 3D 和 2D 游戏的区别主要体现在呈现画面和文件体积上: 2. 借助 3D 引擎可以提升 2D 游 ...

  9. CASIO 5800P计算器游戏--猜数字游戏

    CASIO 5800P 计算器游戏--猜数字游戏原代码 我编的计算器小游戏--猜数字游戏 LbI I↙ "xxGUESS NUMBERxx xPROGRAMMER:JCHx -------- ...

随机推荐

  1. shell脚本统计多个CPU利用率

    本节主要内容:top命令统计CPU的利用率 一,问题分析 MySQL在Linux下是多线程的,而且只能将多个线程分布到一个CPU上.因此,使用小型服务器,或者PC SERVER,多个CPU利用率并不高 ...

  2. Mysql B-Tree和B+Tree索引

    Mysql B-Tree和B+树索引 Mysql加快数据查找使用B-Tree数据结构存储索引数据,InnoDB存储引擎实际使用B+Tree.下面首先介绍下B-Tree和B+Tree的区别: 一.B树和 ...

  3. JavaXML解析的四种方法(连载)

    1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml ...

  4. lnmp环境搭建的总结

    //centos安装php7: http://blog.csdn.net/21aspnet/article/details/47708763//nginx 更改网站根目录 http://blog.cs ...

  5. 如何在eclipse jee中检出项目并转换为Maven project

    如何在eclipse jee中检出项目并转换为Maven project,最后转换为Dynamic web project 注意:该文档只针对以下eclipse版本,如图 为了方便,我将我本地的压缩包 ...

  6. C# SAP Connector .NET Framework 4.5 版本下载

    公司对接 SAP 数据使用 SAP Connector 程序,主要是两个类库:sapnco.dll.sapnco_utils.dll 但是没想到它的版本如此混乱,.NET 2.0 和 .NET 4.0 ...

  7. 祭出“成本”列(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 今天开始成本. 张同学说,成本就是balabalabala-- 好吧,本妖向来不会背名词解释,不过有些公式还是需要背一下下 ...

  8. SQL获取当天0点0分0秒和23点59分59秒方法

    SELECT CONVERT(DATETIME,CONVERT(VARCHAR(10),GETDATE(),120)) select cast(convert(varchar(10),getdate( ...

  9. Linux(centos)安装es(elasticsearch)

    前提条件--需要安装jdk环境,不同版本的es所对应的jdk版本要求不同,es6的使用jdk1.8可以 1.下载elasticsearch压缩包 下载地址:https://www.elastic.co ...

  10. 【LeetCode】1423. 可获得的最大点数 Maximum Points You Can Obtain from Cards (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,递归,前缀和,preSum,刷题群 目录 题目描述 解题思路 递归 ...