项目复盘:TapTap聚光灯Gamejam

news2024/11/24 4:34:43

前言

        三周的开发终于落下帷幕,其实我个人还是对结果很满意的,虽然作品不及他人的万分之一,不过主要目的还是以熟悉Godot引擎本身为主。这次我做的事情其实主要还是把在Unity那边学到的东西Copy到Godot来,仅此而已,几乎没有进化。

        不过还是找不同找到了很多两个引擎之间的异同。很快我会罗列出来。

项目概览

项目名: 第九天 (DAYNINE)

类型:休闲,肉鸽

开发周期:3周(实际2周不能再多了)

游戏引擎:Godot4.3 Mono

美术风格:像素美术?

核心玩法:跑图,提升,生存,割草?

游戏链接:第九天PC/主机 - TapTapicon-default.png?t=O83Ahttps://www.taptap.cn/app/726174


项目框架

主流程管理

        我简单粗暴地以单个单例类作为主流程的管理类了,但是这个类完全不符合单一职责的原则,事实上,它不仅负责控制主流程,还涉及了一部分的资源加载和输入控制。所以整个游戏的主流程循环起来会有不少BUG。

        还有一部分的游戏数据写在该类中,其实我也不清楚到底一些全局数据应该写在哪里,于是就......。

生物类

        所谓的生物类,不过是带有生命值的东西,因为玩家和怪物都具有这些七七八八的东西,就作为基类了。

        我觉得这次GJ在设计继承关系的一个重大失误就是Override太多了,比如一个怪物1会一直跟着玩家,怪物2会徘徊追击,但是怪物1写好了很多重要的机制,怪物2也可以用到,理所当然地想到怪物2继承怪物1,但是只有一两种还好,怪物种类一旦多起来或者怪物机制一旦复杂就会出现很多BUG,比如经常性地把某个父类的重要函数Override掉了。

        于是我便想到一个曾经用于Unity的解决方案,基于“组合优于继承”的设想。简单来说就是将复杂的AI机制包裹成一个个类,每个怪物,或者说生物基类包含可以实现机制类的处理方法。

或者应该叫他们状态类,怪物们本质上还是一个状态机。

        这样或许能规避很多东西,就比如,我从Unity时期就养成的习惯就是一直把所有帧处理相关的函数直接塞到帧处理函数里(比如Unity的Update和Godot里的Process),这样确实是挺方便的,但是就像我方才说的那样,在继承等关系的影响下,执行过程是否还能保证准确无误,一段移动函数属于某个父类,而这段函数恰恰是最基础最简单的移动函数,我们理所应当不会想为每个其他类都写一边,于是就开始继承,继承完了后发现某个子类需要实现某个特殊的机制,需要对移动函数进行重载,然后长此以往便堆积出了很多冗杂代码,甚至逻辑错误。

        所以不妨按照自己的想法,把所有可能需要的机制(状态)先写出来,而不是为某个“怪物”写。换句话说,这个机制类是所有怪物共享的,可以有也可以没有,如果有就在帧处理函数中进行处理,比如一段普通的水平移动,我们封装成类,向怪物类注入该类的依赖(我觉得甚至可以不需要),以便怪物执,怪物类就是一个状态机,状态处理器,拿到什么状态就处理什么状态即可,至于状态之间的切换就还是得因地制宜了。

        虽然感觉复杂了一点,不过倒是实现了状态与怪物之间的解耦。

UI框架?

        我打问号是因为我完全没用到什么框架。老实说Godot的UI真的又好又坏,它没有像Unity那样多样的设计方案,甚至对有些UI需求的支持很弱。不过它的信号系统切实为UI设计加分。

        我们都知道做UI是很烦很累的,这倒也不是什么技术上的问题,而是UI逻辑十分的繁琐。如果有一个现成的框架会不会更好呢。以我的经验来看,做游戏的UI和网页差不多,都是响应式为核心,当然特殊需求除外。而Godot在这方面意外地提供了一种连连看方案,就是信号。

        我们可以为每个按钮或面板之间的通信以信号连接的形式处理,比如把一个按钮的pressed信号与某个面板的hide函数连接起来,甚至就算彼此的参数不一样,Godot还是可以通过信号设置实现通信,这样就大大降低了写UI时的繁琐代码量,其实这个过程也挺繁琐的,但我还是认为写一堆雷同代码更反人类。

        我目前对于UI的最大需求莫过于,能响应多种输入模式,至少是手柄加键鼠。还要能管理好FOCUS,就是不能在子面板FOCUS到父面板上的按钮吧。

        所以目前我对写一个Godot的UI框架持观望态度,倒不是因为它不重要,而是还没那么重要。

输入管理

        这次敲代码我似乎遗忘了一个很重要的点,那就是输入控制应带由单个类承担,以至于我很多在类中写了一些处理输入的函数,比如我最喜欢把用于控制玩家的输入写在玩家类里边,这确实挺方便的,但是如果把处理UI输入的函数写在UI中就不可避免的会有一些冲突。

        最大的问题应该是Godot没有所谓的Disable或Enable,只有隐藏和显示,虽然加上设置处理模式可以实现类似效果,但是不免有一些烦琐。有的时候虽然UI被隐藏了,但是背地里还在处理,所以经常会有一些BUG。

        我能想到的最优解就只能是把所有的输入单独用一个管理类处理,它同时还负责记录输入模式,切换输入状态等职责。

音频

        作为可怜的独狼开发,这个游戏完全没有任何声音,因为实在来不及了,随着开发经验的积累我越发觉得音效的重要性如此之大,哪怕只是魔性洗脑的点击音效都能让人感觉游戏质量完全不一样了。

结语

        多说无益,因为我一时半会也想不到什么重要议题,于是就草草结束吧,具体的实践成果肯定是要等到真正的代码搓出来了才会展示。

        下一次开发多半是月末的吉比特GJ了。

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

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

相关文章

WPF自定义日历控件Calendar 的方法

推荐下载地址 https://www.haolizi.net/example/view_2107.html <UserControl.Resources><local1:DayConverter x:Key"DayConverter"/><!--导入转换器--><Style x:Key"CalendarStyle1"TargetType"{x:Type Calendar}">&…

《ToDesk云电脑vs青椒云性能测试,谁更能实现游戏自由?》

ToDesk云电脑vs青椒云性能测试 【前言】【使用云电脑的意义】【实测软件】【性能参数对比】1. 硬件配置2.游戏兼容性3. 延迟、流畅度与画面清晰度4. 用户体验5. 价格对比6. 附加功能 【游戏性能测试】《游戏一 黑悟空》《游戏二 赛博朋克 2077》《游戏三 CS反恐精英》 【本文小…

ctfshow文件包含web78~81

目录 web78 方法一&#xff1a;filter伪协议 方法二&#xff1a;input协议 方法三&#xff1a;data协议 web79 方法一:input协议 方法二&#xff1a;data协议 web80 方法一&#xff1a;input协议 方法二&#xff1a;日志包含getshell web81 web78 if(isset($_GET[file]…

动态IP是什么?

随着互联网成为人们生活的重要组成部分&#xff0c;以信息传递为主导的时代种&#xff0c;网络连接质量对我们的工作效率、学习进度以及娱乐体验等方面都有很大影响。 动态IP&#xff0c;作为网络连接中的一种重要IP代理形式&#xff0c;越来越受到用户的欢迎。本文将深入解析…

vue下载安装

目录 vue工具前置要求&#xff1a;安装node.js并配置好国内镜像源下载安装 vue 工具 系统&#xff1a;Windows 11 前置要求&#xff1a;安装node.js并配置好国内镜像源 参考&#xff1a;本人写的《node.js下载、安装、设置国内镜像源&#xff08;永久&#xff09;&#xff…

在JAVA中使用Paho MQTT客户端

1.在maven里面配置好依赖 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.2</version> </dependency> 2.创建APP类 package com.leo;import org.e…

Django+websocket实现一个简单聊天

WebSocket是一种在单个TCP连接上进行全双工通信的协议。它由IETF在2011年定为标准RFC 6455&#xff0c;并由RFC7936补充规范&#xff0c;同时WebSocket API也被W3C定为标准。 1、定义与原理 WebSocket是独立的、创建在TCP上的协议&#xff0c;它使用HTTP/1.1协议的101状态码进…

MATLAB实现人类学习优化算法HLO

1.算法简介 人类学习优化算法&#xff08;Human Learning-based Optimization&#xff0c;HLO&#xff09;是一种基于人类学习过程开发的启发式算法。HLO算法的设计灵感来源于人类的智慧和经验&#xff0c;特别是人类在学习和调整过程中展现出的适应性、学习能力和创新思维。该…

【果蔬识别】Python+卷积神经网络算法+深度学习+人工智能+机器学习+TensorFlow+计算机课设项目+算法模型

一、介绍 果蔬识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;通过收集了12种常见的水果和蔬菜&#xff08;‘土豆’, ‘圣女果’, ‘大白菜’, ‘大葱’, ‘梨’, ‘胡萝卜’, ‘芒果’, ‘苹果’, ‘西红柿’, ‘韭菜’, ‘香蕉’, ‘黄瓜’&#xff09;…

Android 策略设计模式的使用:使用设计模式,减少烂代码,让项目更好维护

目录 大家好呀~&#xff0c;我是前期后期&#xff0c;在网上冲浪的一名程序员&#xff0c;分享一些自己学到的知识&#xff0c;希望对大家有所帮助 前言&#xff1a;为什么要使用设计模式 在项目开发过程中&#xff0c;我们会对接很多种支付&#xff1a;国内&#xff08;微信…

uniapp和vite项目配置多环境编译,增加测试环境变量配置--mode test

如果你的项目是使用vite和uniapp配置开发的&#xff0c;就可以在代码里面获取到这些变量&#xff0c;但是开发&#xff0c;测试和发布是不同的请求地址&#xff0c;所以需要配置。Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量&#xff1a; .env …

动态规划 - 编辑距离

115. 不同的子序列 困难 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 10^9 7 取模。 算法思想&#xff1a;利用动态规划&#xff0c;分s[i - 1] 与 t[j - 1]相等&#xff0c;s[i - 1] 与 t[j - 1] 不相等两种情况具…

sudo apt install jupyter-notebook安装notebook失败E: Aborting install.

问题&#xff1a; sudo apt install jupyter-notebook安装notebook失败E: Aborting install. ~/jie/mywork/PointNetCFD$ sudo apt install jupyter-notebook --fix-missing Reading package lists... Done Building dependency tree Reading state information... Do…

第16课 核心函数(方法)

掌握常用的内置函数及其用法。 数学类函数&#xff1a;abs、divmod、max、min、pow、round、sum。 类型转换函数&#xff1a;bool、int、float、str、ord、chr、bin、hex、tuple、list、dict、set、enumerate、range、object。 序列操作函数&#xff1a;all、any、filter、m…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第2天,启动项目

24.11.01 下面讲一下如何通过USB连接手机然后启动app实现真机测试&#xff0c;还是有一些坑的。 调整电脑的驱动程序&#xff0c;完成USB的连接 在启动项目的第一步我就遇见了问题&#xff0c;那就是插入usb线以后没有检测到设备。想要完成连接需要2个步骤&#xff0c;第一步…

使用Mac如何才能提高OCR与翻译的效率

OCR与截图大家都不陌生&#xff0c;或许有的朋友对于这两项功能用到的不多&#xff0c;但是如果经常会用到的话&#xff0c;那你就该看看了 iOCR&#xff0c;快捷键唤出翻译窗口&#xff0c;不论是截图翻译、划词翻译、输入翻译、剪切板翻译&#xff0c;统统快捷键完成&#x…

Etsy又被封号了!这次我终于搞懂了原因...

你是否真的了解在Etsy开店有哪些红线不能踩&#xff1f;你是否真的知道Etsy被封号后如何解决&#xff1f;本文我将探讨Etsy账号被封的常见原因&#xff0c;以及卖家可以采取的应对策略&#xff0c;以期减轻对跨境业务的伤害程度&#xff0c;感兴趣的商家速速码住&#xff0c;不…

MySQL — 事务 (o゚▽゚)o

文本目录&#xff1a; ❄️一、什么是事务&#xff1a; ❄️二、ACID特性&#xff1a; ❄️三、使用事务&#xff1a; ▶1、查看支持事务的存储引擎&#xff1a; ▶2、语法&#xff1a; ▶3、开启并且回滚&#xff1a; ▶4、开启并且提交&#xff1a; ▶ 5、保存点&#xff…

DOS时代软件遗憾落幕,国产编程新势力接过火炬

在计算机发展史上&#xff0c;DOS时代是一个不可磨灭的篇章。那个时期&#xff0c;虽然操作系统的图形界面尚未普及&#xff0c;但一款款经典软件却为我们打开了通往数字世界的大门&#xff0c;让我们在那个相对简单却充满魅力的时代中&#xff0c;感受到科技的魅力与创新的力量…

Qt的信号槽机制学习一

一、Qt理论知识简记 &#xff08;一&#xff09;信号与槽[1] 信号与槽是Qt编程的基础&#xff0c;其使得处理界面上各个组件的交互操作变得比较直观和简单&#xff0c;GUI&#xff08;Graphical User Interface&#xff09;程序设计的主要工作就是对界面上各组件的信号进行相应…