GameMaker Studio 2

创建于:2017-04-19

创建人: dougen

192 信息 1091 成员
游戏开发工具 GameMaker Studio 2 的讨论小组

关于GMS2的Joint的若干问题求助

妹控的藤藤 2020-05-19

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

 
yellow 2020-05-20

第一个问题,你需要搞清楚变量的作用域。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有关系的,前提是你没在代码中设置这个比例。

 
妹控的藤藤 2020-05-22

yellow 受教了,非常感谢,我需要学习的还很多

 
yellow 2020-05-22

妹控的藤藤 不用客气,如果使用物理引擎,开发的时候有一个physics_world_draw_debug,去看文档就好了。

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册