gamemaker吧 关注:13,690贴子:95,883
  • 3回复贴,共1

关于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函数后一切正常,想要知道这是什么原因?


IP属地:日本1楼2020-05-19 16:36回复
    问题1:与joint无关,是变量作用域问题。var修饰的变量为局部变量,在这个例子中,当Create事件结束jointA变量就会消失,不能在按下P事件中访问。要声明实例变量,应去掉var,直接jointA=physics_...
    问题2:对于按下P的解释同问题1。对于“joint没生效”,考虑是不是给joint的长度设置为最大值之后,在测试时两物体距离并未达到该最大值,导致看起来没连接的假象。


    IP属地:上海来自Android客户端2楼2020-05-20 16:49
    收起回复
      2026-01-09 04:56:04
      广告
      不感兴趣
      开通SVIP免广告
      似乎之前接触过其他语言再用GML时,很多人都会以为声明临时变量的var是声明(固定)变量用的


      IP属地:北京3楼2020-05-21 11:42
      回复