【中字】Godot 3.2像素风ARPG制作教程(全集)
薰之君:
关于P7用control还是sprite的问题(来自原评论区和一些自己的看法):实际上在视频里的情况用哪个都差不多,但是control和node2d毕竟是不一样的节点,它们本身有很多不同,比如control的位置是以左上角为基准而node2d是以中心点,然后node2d有z-index属性,control节点可以自动布局。所以当你在使用它们的时候,应当考虑你自己的需求和它们的特点。如果混用,尤其是使用container的时候,用sprite作为它的子节点并不会正确自动布局。还有一条评论说:引擎可以批量处理同类节点,所以从性能的角度上来说,不推荐混用(这条是他推测的,不一定准确)。
【回复】回复 @a希爸 :视频说了,mas会反回一个计算后的向量,就是这个函数算出来的你应该slide的方向,如果你不在这个时候接受的话,在下一帧你的移动向量还是原来的向墙上移动的向量,如果你接收的话你的向量就是沿着障碍物移动的向量相,当于不会二次碰撞
【回复】回复 @哟吼吼吼吼吼Z :下一次循环velocity不会刷新吗[热词系列_知识盲区]
【回复】P3最后velocity = move_and_slide(velocity)是什么原理,为什么这样写就不会抖动了[怪我咯][热词系列_知识盲区]
C-BJ:
关于P2使用delta的讲解(视频讲错了)
_physics_process这一个回调函数是每一次物理帧时调用
说人话就是:固定每1/60秒调用一次(你打印delta会发现无论如何都是一样的,和帧率无关)
_process才像视频里说的那样做乘上delta
它时每一帧显示时调用(这一个才和帧率有关,你打印delta会发现它才是波动的)
(官网有介绍_physics_process和_process和_input区别)
把我顶上去,让更多人看到[打call]
【回复】我是不是可以这么理解:
_process是,每一帧执行一次行动,每n帧(每秒n帧)执行n次行动,而_physics_process是每秒(默认60帧)执行60次行动。
如果上述理解没问题的话,
_process下的代码乘以delta,而delta等于每帧的时长,相当于把一帧的动作拉长到一秒来做。
如果这个理解也没问题,
那么我可以事先声明一个常数【默认帧率】,然后将和帧对应的行为,乘以delta的同时再乘以这个常数,把动作的时长再压缩回去,类似统计数据时乘以100%,若【默认帧率】和【项目设置】里面的“默认帧率”相等,那连乘的结果应该和那个_physics_process一致。
【回复】回复 @灬Smalldy :看看官方文档吧[哦呼]
【回复】不过对于极低端设备,也可以保险起见乘delta
番薯吵地瓜:
本来是学像素画的,结果把编程学会了[妙啊]
【回复】我是学编程的,结果把像素画给学了
【回复】本来是来看乐子的,结果编程和像素画都学了
果粒橙家的兔子:
我发布了一篇笔记,快来看看吧
00:05 godot制作像素类游戏,应更改设置使其适应像素风格。 1、默认情况下,资源导入时godot会对资源使用滤镜,这就会造成模糊,对像素风不适...
https://www.bilibili.com/h5/note-app/view?cvid=13279533&pagefrom=comment
【回复】第一步ლ(′◉❥◉`ლ4.0版本,没有导入(import)-Filter取消勾选 完全找不到。。
【回复】回复 @岛屿小子啊 : 4.0版本要去project setting, Rendering, Textures, Filter改成Nearest Mipmap
Kimigaii:
没有条件,资源文件下载不下来的
可以用这个:https://pan.dog/#/s/lQeCk,提取码Wuyi
有能力的还是GitHub上下吧[OK]
相信一般都有这个能力
完了个笔:
关于P2和P3的函数的笔记
# move toward的参数基本是固定的, 但是随着velocity的值不断增加
# 第一次参数为1 x 100和 0.016 x 100, 步进1.6, 那么第一次得到的值就是1.667
# 第二次参数不变, 但是初始变了, 相当于从1.6667 到 100 , delta步进 1.6667,那么得到的值就为3.333
# 这样就能保证了这个向量值(速度),是规律的不断增大
# 这里有一个小知识点,就是move_toward的两个值(from和to)的差小于delta的时候,那么直接返回目的(to)的值
# 比如 var tv3 = move_toward(50, 100, 51) # 得到100
# 这样就使得这个函数再特定的时候可以有极限的值,也就是这里设定的最大速度
velocity = velocity.move_toward(input_vector * MAX_SPEED, ACCELERATION * delta)
另外关于lerp和move_toward的直接区别,lerp是按百分比取值(数值差乘以weight),move_toward是按delta进行加或者减操作(form加或者减delta)
【回复】回复 @请叫我咸先生 :速度为0不就停下来了,所以移动是加速度,停止用的是摩擦力,你松开摇杆,这个时候的速度是最大值,如果要向(0,0)靠近,通过摩擦力来逐步降低速度
【回复】还是不太明白。move_toward函数是可用于移动,也可以用于停止吗?
为什么状态IDLE可以写如下代码呢?move_toward函数如何让物体停下来
velocity = velocity.move_toward(Vector2.ZERO, Friction * delta)
二龙bot:
虽然隔了这么久,但是我还是要说,这个游戏上架steam了,叫《Wally and the FANTASTIC PREDATORS》,不过是GMS写的。之前打折三十几块钱入的。
【回复】回复 @vicharewang :亿亿点细节 [喜极而泣],超帅的说
【回复】相比这个教程,steam上的那个游戏稍微添加了一点细节
CSCO:
看完了P11,感觉这哥们没讲清楚,所以我说下我的理解。Process(下面用P)跟Physics Process(下面用PP)的区别主要是“绘制”跟“模拟”需要分开。在object比较少的小游戏里,无论如何都能跑满帧,所以两者区别不大。
但是在一个object超多的场景里,区别就出来了。在这种情况下,也许 P 每秒跑10帧(10次绘制)。但是如果以这种帧率去做物理模拟,就很容易出现精度问题,所以就有了PP。PP的整体的想法应该是只计算有判定的物体移动跟物理模拟,然后标记状态之后迅速结束执行。比如在PP中得到了一个物体移动到了某个位置需要触发动画,那么就应该标记这个动画需要执行,然后在P里面去开始执行。
因此完全可能因为绘制压力导致P只有每秒几帧的状况下,PP仍然保持每秒60次的调用。
不过现在的这种godot的程序组织方式,大量的判定都是通过signal跑的,所以往PP里放大量东西的可能性不大。
beefnoodles_cn:
9天了终于学完了这23P....感谢原作者,感谢搬运和翻译....
NU5E:
p15 4.0+ connect方法写法变成这种了,还有如果动画一直循环,记得把动画里的那个自动循环关掉就行
NU5E:
4.0+版本 p6 16:10设置不一样的,像我这样搞,启动游戏按按键就有方向动画了。先点击连接节点,把自动推进那个小图标打开,然后在从start连线到idle就可以了,箭头要是绿色的
【回复】感谢!终于解决问题了[tv_大哭]player一直颤原来是箭头给的不对
【回复】回复 @笑xox笑 :我的已经做好了,不过里面的有些小细节我不是很记得了,我也才学没多久,也教不好[笑哭],要项目文件的话,我可以发给你,你自己看看对照一下差不多就懂一些了
诗无心诗:
godot4这个bug困扰我好久了,一直不明白为什么出错,源码如下,有无大佬救救[委屈][委屈]
【回复】回复 @阿卡哎 : 括号里面东西删了后角色就移动不了了是什么情况[笑哭]
【回复】godot的这个函数改版了,velocity变内置属性了,slide也没有参数了,具体可以网上查一下
朔风北望:
4.0版本中预设没有2Dpixel,可以去【项目】-【常规】-【渲染】-【纹理】-【Canvas Textures】-【Default Texture Filter】
设置为"Nearest",这样就会让项目里的所有2d像素图都能正常渲染[脱单doge]
【回复】或者在Sprite2D节点的Texture里,把Filter属性从inherit(默认)改为Nearest,这样可以更改单个节点。
lotusloli:
Godot 4的一些变动和注意点:
1. position2D变成marker2d; > 在hitbox父级创建时注意;
2. 场景的实例化由instance()变成instantiate(); >在Grass中load(effect)后实例化时注意;
3. 如果发现marker2d无法旋转,可能是marker2d的更新模式是默认的连续而不是离散;
4. tilemap在4中变动很大,可以先看新tilemap的教程再看视频中的方法;
待续……
【回复】3. 如果发现marker2d无法旋转,可能是marker2d的更新模式是默认的连续而不是离散;
卡了我半个小时[大哭][大哭][大哭],原来答案在这呢
Jhougio:
关于P9有个弹幕说“如果提前把攻击动画的循环关掉,攻击函数就不会记忆速度,就不用让速度归零”这个是错误的
因为从移动函数转到攻击函数的过程中,velocity的值依然保留,实际表现就是,当你按住移动键至人物加速到最大速度后,保持按下移动的同时按下攻击键,就会发现攻击动画结束后,人物直接弹射起步,直接从最大速度开始运动而没有经过加速
对对对你说嘚都对:
问一下 为什么我p1照着写的extends KinematicBody2D
var velocity = Vector2.ZERO
func _physics_process(delta):
var input_vector = Vector2.ZERO
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
if input_vector != Vector2.ZERO:
velocity = input_vector
else:
velocity = Vector2.ZERO
move_and_collide(velocity)
运行之后玩家动不了
【回复】回复 @薰之君 :改了 还是一样的 动不了
【回复】最后一行位置不对 gdscript不用分号 一定要注意tab
哈哈-艾特-逗儿:
up能不能出一期这个bitmask的教程啊,这个教程里说的这个bitmask平铺,会用,但是不明白啊,本来懂一点看完就完全不明白了
【回复】这是有一个理论的,2x2的话需要16块。3x3需要512块,块数是由里面小方块点不点亮决定的,然后做出简化,所有方块中间都要点上,然后两个相邻顶点点上则它们所在的边也点上,最后只要47块,然后加上一块背景,就变成48块。算法是根据点亮的小方块对它们排序,然后通过各个方位的块与这个块接触的地方有没有点亮来计算用哪一块。实际操作中,就是把你的墙体按照它的简化条件点上就行
【回复】设置一个地皮后,根据周围8个方向上的地皮来决定自身显示的贴图
设置是那些红点就是所有的位置关系
【回复】我感觉就 不用记他的图样,首先把9块全部选红,然后找块上有黑边或黑点的地方,凡是有不同颜色的块,全部取消,就对了。