关于GMS2的Joint的若干问题求助
gamemaker吧
全部回复
仅看楼主
level 2
bbdan121ss 楼主
我在room中创建了一个控制object“obj_Control”,并建立了一个Create事件,代码如下
var instA = instance_create_layer(200, 150, "Instances", obj_Floor);
var instB = instance_create_layer(50, 200, "Instances", obj_Circle);
r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));
var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);
即在room中创建了实例A和实例B并通过Joint将两者连接在一起,这一步运作是正常的,运行后实例A和B被创建并被正确连接
之后我遇到两个问题
问题1:删除joint
如果我在Create时间结尾加入命令physics_joint_delete(joint)来删除Joint,即下方
var instA = instance_create_layer(200, 150, "Instances", obj_Floor);
var instB = instance_create_layer(50, 200, "Instances", obj_Circle);
r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));
var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);
physics_joint_delete(jointA);
房间在创建的同时joint会被删除,实例A、B不会相互连接
但如果我给obj_Control添加“按下P键事件”,并输入代码
physics_joint_delete(jointA);
在运行后会提示无法读取jointA的变量因此发生错误,我也无法实现“按下P后删除Joint”的目的
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Key Press Event for P-key Key
for object obj_Control:
Variable obj_Control.jointA(100009, -2147483648) not set before reading it.
at gml_Object_obj_Control_KeyPress_80 (line 8) - physics_joint_delete(jointA);
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Object_obj_Control_KeyPress_80 (line 8)
想要知道出现这种问题的原因是什么,我想要实现“按下P后删除Joint”的目标应该怎么做?
问题2 修改joint参数
与问题1类似,我无法通过在按下按键P事件中添加代码来操纵joint,而如果我在obj_Control的Create代码末尾增使用physics_joint_set_value函数修改joint参数的代码,比如修改Rope joint的最长长度,代码如下:
var instA = instance_create_layer(200, 150, "Instances", obj_Floor);
var instB = instance_create_layer(50, 200, "Instances", obj_Circle);
r = sqrt(power(instA.x-instB.x,2)+power(instA.y-instB.y,2));
var jointA = physics_joint_rope_create(instA, instB, instA.x, instA.y, instB.x, instB.y, r, true);
physics_joint_set_value(jointA, phy_joint_max_length, r+10);
在运行后会发现实例A和实例B没有成功被连接,删除physics_joint_set_value函数后一切正常,想要知道这是什么原因?
2020年05月19日 08点05分 1
level 15
问题1:与joint无关,是变量作用域问题。var修饰的变量为局部变量,在这个例子中,当Create事件结束jointA变量就会消失,不能在按下P事件中访问。要声明实例变量,应去掉var,直接jointA=physics_...
问题2:对于按下P的解释同问题1。对于“joint没生效”,考虑是不是给joint的长度设置为最大值之后,在测试时两物体距离并未达到该最大值,导致看起来没连接的假象。
2020年05月20日 08点05分 2
非常感谢,受教了
2020年05月20日 13点05分
吧务
level 13
似乎之前接触过其他语言再用GML时,很多人都会以为声明临时变量的var是声明(固定)变量用的
2020年05月21日 03点05分 3
1