从零开始的Godot游戏开发日记(一)

一年以来游玩跑团、桌游以及电子游戏的过程中,积累了不少跑团流程、桌游设计与游戏开发的琐碎灵感。许多灵感堪称天马行空,但也有一些存在孵化的可能性。作为一名非科班出身,并且对编程、美术、音乐等领域都涉猎有限的普通开发者,笔者更多地是出于学习和记录的目的写下这些开发日记。希望能与志同道合的朋友多多交流,也为条件类似的爱好者们提供一些思路。考虑到游戏体量且个人并非相关行业从业者,笔者最终选用了Godot而非Unity、UE等引擎作为开发工具。

笔者主要使用业余时间进行开发,且个人在游戏开发领域的经验约等于0,因此对开发计划有着非常现实的规划:

第一步,参照Godot开发文档,学习教学视频,开发出一款1:1还原的游戏Demo;

第二步,在第一步的Demo基础上加以改动,或利用第一步学习中学习的知识开发同样类型的游戏Demo;

第三步,在第二步的Demo基础上进行迭代,或根据第二步开发中掌握的技能开发自己确定的目标类型游戏Demo。

综上所述,笔者选择卡牌游戏作为第一款Demo的游戏类型。卡牌兼具跑团、桌游和游戏的灵魂,是我近一年各类idea的最大公约数。同时,卡牌游戏作为初学者选择的第一种游戏类型,相对易学易懂。开发过程基本参考Barry’s Godot 4 Card Game Tutorial,Chatgpt、Deepseek作为“导师”辅助引导教学。


第一天,完成了对卡牌游戏素材的导入和鼠标拖动卡牌逻辑的构建。添加鼠标移动限制,使卡牌被拖动时不会被拖出屏幕外。添加鼠标点击时的偏移量调整,使卡牌被拖动时碰撞体不会先移动到以鼠标为中心的位置再被拖动。

教学中采取以射线检测卡牌碰撞体的方式实现鼠标点击拖动、卡牌跟随移动。除此之外,还有一些更加简便的方法,例如使用Area2D节点的输入事件或Control节点的拖拽功能来实现。教学中代码的一些我并不熟悉的主要变量和表达式注释如下:

  • get_world_2d().direct_space_state # 获取当前 2D 世界的物理空间状态
  • PhysicsPointQueryParameters2D.new() # 创建一个新的 2D 点查询参数对象,用于配置如何进行点检测
  • parameters.position = get_global_mouse_position() # 设置检测点的位置为当前鼠标的全局坐标
  • parameters.collide_with_areas = true # 设置为 true 表示检测会与 Area2D 节点碰撞
  • parameters.collision_mask = 1 # 设置碰撞掩码为 1,表示只检测位于第 1 层碰撞层的物体

教学中没有详细解释的intersect_point() 返回的 result,实际上是一个字典数组。每个字典代表一个在检测点发现的碰撞体,包含以下信息:

  • collider: 碰撞的节点
  • collider_id: 碰撞节点的唯一ID
  • position: 碰撞点的位置
  • normal: 碰撞点的法线向量
  • shape: 碰撞的形状索引
  • rid: 碰撞的 RID (Resource ID)

这些信息涵盖了每张卡牌的独特信息,所以最终可以利用result检索父节点,从而检索到卡牌本体。

此外,参照教学实现的卡牌拖动效果有一点美中不足:在拖动卡牌时,如果鼠标没有正正好好点击卡牌中心位置,那么卡牌中心会先瞬间移动到鼠标位置,再随鼠标移动。对此,我添加了对每次鼠标点击时与卡牌碰撞体中心位置偏移量的检测,并将该偏移量加入clamp()表达式中。这样就可以增加卡牌拖动的流畅性。

最终改进结果如下。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇