关于GMS2的Joint的若干问题求助
我在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函数后一切正常,想要知道这是什么原因?
第一个问题,你需要搞清楚变量的作用域。var修饰的变量只能作用于所在事件或者代码块,所以在按键事件中不能访问。
第二个问题,这就比较坑了,physics_joint_rope_create方法的maxLength单位是像数值,physics_joint_set_value方法的value单位是米。
第一个把var去掉完美修复,然后有时间研究一下变量作用域。第二个问题,用physics_joint_get_value打印一下你设置之后的phy_joint_max_length值,看看就知道了,他总是和你room的Room Physic设置中的Pixels To Meters有关系的,前提是你没在代码中设置这个比例。