更新日志DrDuck.txt 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. 这是一份更新项目进度后的必读文件。
  2. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  3. Commit中过多的内容请全体开发者在这里更新并留档。
  4. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  5. 2026/2/5
  6. 项目启动。
  7. 2026/2/13 DrDuck
  8. 1. 统一了所有的动画接口,完全弃用image_speed, 改用animation_spd
  9. 需要在所有create中手动定义,并在step中动画步骤位置image_index += animation_spd;
  10. 顺带更新了animation_end()函数,与新的动画系统适配,防止卡死
  11. 2. 新增set_sprite()函数,与名字一致,但会自动检测前后sprite是否一致
  12. 并决定是否将image_index归零,防止动画跳帧
  13. 3. 可以注意到gml的所有sprite都有独立的fps参数设置,之前设置为15.
  14. gml内部会计算image_index += sprite_fps / game_fps * image_speed等等公式进行适配
  15. 所以画面结果没有问题,但是不便于后续维护与统一性
  16. 所以将所有sprite统一为60fps, 新的aniation_spd定义为0.25
  17. 除攀墙/跳跃等手动状态判断单帧动画,直接将fps设置为0
  18. 4. 重定义了玩家碰撞箱反馈逻辑,与父对象统一性,太过繁杂不加具体解释
  19. 简单概括,把每种攻击给玩家的反馈都打包进hitbox/create中的hit_feedback(_owner){...}
  20. 5. 修正了玩家状态机的命名规范。现在所有可能被赋值给state的函数名字都以state_起始
  21. 所有按帧执行的检测/更新逻辑往往以player_check_起始
  22. 6. 优化了敌人状态机,不详细展开
  23. 7. 我发现点右上角最大化代码窗口显然是更拟人的工作方案,不用把一堆窗口拖来拖去
  24. 8. 优化敌人碰撞箱逻辑,封装enemy_create_hitbox(x, y, ...)函数,详见EnemyStates
  25. 另外player的碰撞箱被设计为几个自带sprite和参数(例如hit_feedback)的object, 拥有共同父对象
  26. 因为player的击中逻辑和碰撞箱形状太过复杂,无法通过简单逻辑变幻得到
  27. 而enemy目前的碰撞箱全部为矩形,可以通过2*2的sprite拉伸位移得到
  28. 所以enemy统一创建oEnemyHitbox再为其赋不同的属性
  29. 9. 新增了oEnemyDummy自动受击反击,方便测试闪避等
  30. 10. 你可以接着写
  31. 2026/2/14 DrDuck
  32. 1. 改进敌人碰撞箱逻辑,将persist改为hitbox_type, "COLLISION", "BLADE",...
  33. 可以更方便地检测下劈/拼刀等逻辑
  34. 2. 重构rTest方便测试手感,原rTest -> rTest_backup
  35. 3. 暂时禁用player_dodge()与相关函数,方便测试
  36. (dash,free,attacked处将调用注释掉)
  37. 4. 新增player_calc_gravity()函数,用于计算动态重力,增进手感
  38. 替代了原来的y_spd += global.g
  39. 此外将oInput的_jump_r改成_jump, 更适配现在的逻辑
  40. 5. 对玩家攻击状态机进行微调,使得攻击时可以转向
  41. 并销毁碰撞箱(这个还没写)
  42. 6. 在oGame中增加点击瞬移,方便调试
  43. 7. 需要优化check_hazard逻辑,现在会重复判定!(还没写)见2/15
  44. 8. 下劈落地需要回到state_free并销毁碰撞箱(还没写)见2/15
  45. 9. oEnemyHitbox的重心在center/middle, 导致玩家可能被向着错误方向击退
  46. (试试站在oEnemyDummy正前方一点的位置攻击,不要闪躲)(还没写)见2/21
  47. 10. 计划明天弄一下跨房间?见2/15
  48. 11. 有个写了一半的oEnemyFlying, 先不要动
  49. 2026/2/15 Dr.Duck
  50. 1. 优化check_hazard逻辑,功能实现没问题但不够优雅
  51. 而且极端情况可能会出问题,仍需优化
  52. 2. 统一了check_attacked与check_hazard逻辑
  53. 都通过status_update抓取当前碰撞物体,而非在check中定义临时变量
  54. 3. 下劈太简单可能是因为碰撞箱可视化
  55. 亲测把刺和刀全部改为美术资源将难一些
  56. 所以暂时不再改重力系数等参数
  57. 4. 上下劈使用一个碰撞箱导致了击退和玩家反馈错误(未修)
  58. 例如上劈会使玩家向上飞起
  59. 5. 当state_attack被强制打断(回身/冲刺取消后摇,下劈落地)时
  60. 需要及时销毁碰撞箱
  61. 用current_hb动态维护当前普通攻击碰撞箱
  62. 通过在status_update中检测state != state_attack及时销毁
  63. 6. 下劈落地回到state_free并销毁碰撞箱,已解决
  64. 7. 喜报!!!跨房间初步逻辑已完成!!
  65. 通过oDoor的target_room, door_id, target_door_id,与global的同名变量,
  66. 以及PlayerStates的check/enter/exit_room函数、内置enter room事件实现了逻辑链路闭环。
  67. 具体参见上述代码。
  68. oDoor用蓝色条形sprite指示。
  69. 8. 今日询问Gemini:
  70. 类银通常直接在房间编辑器中调试房间物品位置,鉴于可视化和精度等原因。
  71. 其他游戏通常采用的"oRoomManager"等obj在此类作品中仅用于管理维护某些特殊物品的存在性
  72. 例如一次性收集品,剧情boss等
  73. 其余物品/enemy直接在room editor中放置即可
  74. 若有obj根据房间需要特定初始参数,例如oDoor, 直接在editor中选中inst, 覆盖var def即可
  75. 9. 新开了一个rTest_2, 原测试房间更名为rTest_1
  76. 2026/2/16 DrDuck
  77. 1. 除夕快乐!
  78. 2. 今天召集了四位开发人员进行首次会议,宣布项目启动。
  79. 这太帅了
  80. 2026/2/17 DrDuck
  81. 1. 新增rTitle作为起始房间,初始inst为oMain
  82. 2. 新增oMain作为主要管理者,其生命周期贯穿整个游戏
  83. 并将oInput归入oMain
  84. 此外,将oGame更名为oInGameManager
  85. 3. 新增oParentInteractive作为所有可互动obj的父类
  86. 4. 新增oSavePoint并进行存档相关内容调试
  87. 5. 句柄优先级相关代码好像有些问题。明天解决。已解决&优化
  88. 6. 在名为SL的script中新增三个函数
  89. get_default_save_data() 负责抓取玩家初始参数
  90. save_game_to_disk() 负责存档
  91. load_game_from_disk() 负责读档
  92. 7. 新增一些global变量,举出几例
  93. global.save_data是存储待存档信息的多层结构体
  94. global.player是游戏内玩家inst_id
  95. 鉴于gml的obj和inst转换尚不明确,此变量和相似变量为快速找到指定关键inst而提出
  96. 稍后优化
  97. 8. 注意今日代码存档相关有巨量未完成部分,慎重运行修改!!明天解决!!见2/18
  98. 2025/2/18 DrDuck
  99. 1. 之后所有测试请用vk_escape在rTitle房间退出,与标准游戏流程相符。
  100. 特别是在做存读档相关测试时,一定不要用alt+f4/任务管理器/右上角等方式退出。
  101. 可以在rTitle房间看到更为详尽的操作指导。
  102. 2. 考虑加入音乐/粒子效果接口。先不做。
  103. 3. 状态机优化写到一半,先别动
  104. 4. 读存档大概搞定了
  105. 2025/2/19 DrDuck
  106. 1. 昨天日志没写完……
  107. 补充:加入了screen_shake(_mag)函数控制摄像机震动
  108. 2. 新增state_death与state_focus使玩家可以正确地回血、回蓝、死亡
  109. 3. 试图新增oInventory时因底层代码过于智障而不慎触发句柄连锁反应
  110. 已全部优化修复,可作为新学期授课范例,详见另一份日志~
  111. 4. 浅尝粒子效果,习得基本原理
  112. 击中敌人效果作为半成品留在代码中,后续优化
  113. 5. 新增sh_flash的shader实现击中敌人平滑闪白
  114. 2025/2/21 DrDuck
  115. 1. 由于铸币操作导致2/20版本掉进虚空,难以界定当前所在版本
  116. 同时丢失部分2/19日志
  117. 尝试按照记忆补救时间线中……
  118. 2. 将更新日志分为两个独立部分,方便整理阅读
  119. 3. 终于优化了敌人碰撞箱逻辑!(2/20丢失内容,补充完毕)
  120. 将全部敌人碰撞箱归类为middle/center, bottom/center, middle/left三类
  121. 本来写了详细说明的,懒得补了
  122. 4. 玩家死掉会掉落一定Credit和(蓝槽上限),需要收尸才能捡回(2/20丢失内容,补充完毕)
  123. 2025/2/23 DrDuck
  124. 1. 昨天鸽了一天……
  125. 2. 发现了一个超级好用的功能!选中一个函数/变量后ctrl + r可以全局替换
  126. 不知道对别的文本可不可行,好像必须是编译器能够识别的定义类文本
  127. 3. 补全oEnemyFlying代码
  128. 4. 新增oEnemyFlyingTrack敌人
  129. 5. 修改rTest_2, 加入单向门
  130. 注意单向门的get_hit()需要改善!!目前是测试版!
  131. 6. 优化玩家碰撞箱逻辑中……考虑改为鸭子类型逻辑
  132. 对所有oParentEntity定义get_hit()函数作为受击反馈(sound, pe, 变量例如血量扣除等)
  133. 在oPlayerHitbox中定义hit_feedback(_receiver)与feedback_activated作为玩家攻击反馈
  134. 具体优化过程极为复杂
  135. 7. 新增oParentEntity作为几乎所有可交互(实际上是具有受击反馈)对象的父类!
  136. 比如oParentSolid, oParentEnemy...
  137. 2025/2/24 drduck
  138. 1. 优化普适敌人ai
  139. 例如撞墙/撞刺预判
  140. 2. 考虑在3/6学校活动前完成第一版原型进行有奖试玩活动
  141. -基础粒子效果
  142. -简单音效、地图/boss曲各一首
  143. -基础物理引擎
  144. -可视化UI与交互
  145. -两张地图、一个小boss
  146. 2025/2/6 DrDuck
  147. 1. 这几天太忙没写日志,主要在为试玩活动做适配工作
  148. 2. oCredit有时会卡墙,或者进行无规则传送至墙上
  149. 甚至导致游戏卡死(while循环?)
  150. 通过攻击rTest_2上方的oEnemyHex得到大量样本可偶尔触发
  151. 修复中