我发现with的运行机制好难理解 而且教程里with的解释有误
gamemaker吧
全部回复
仅看楼主
level 8
anheimfb
楼主
实际情况是 room里的实例越多 移动的像素就越多 好像是8的倍数
2014年09月08日 00点09分
1
level 8
anheimfb
楼主
下面的代码也很难琢磨 好像和with的运行机制有关
with(b)
{
if keyboard_check_pressed(vk_left)&&time=0
time+=1
}
if time=1
{
hspeed-=5
time=0
}
执行结果是 最后一个实例hpeed=-5 其他的实例hspeed=-10
是不是很奇怪呢
2014年09月08日 00点09分
2
anheimfb
补充一下 就b一个对象 room你有几个b的实例
2014年09月08日 00点09分
level 8
anheimfb
楼主
如果把上面的代码 顺序改一下 结果又也很奇怪
if time=1
{
hspeed-=5
time=0
}
with(b)
{
if keyboard_check_pressed(vk_left)&&time=0
time+=1
}
这时结果是 第一个实例hspeed=-5,其他的实例hspeed=-10
2014年09月08日 01点09分
3
吧务
level 12
blovestorm
你这个with是在另一个object上写的?
2014年09月08日 03点09分
4
anheimfb
对象b里, 只有一个对象,很简单的程序,然后room里有几个b的实例
2014年09月08日 03点09分
吧务
level 12
blovestorm
with(b)
{
if keyboard_check_pressed(vk_left)&&time=0
time+=1
}
//with截止
if time=1
{
hspeed-=5
time=0
}
我才看出来,你with就只包含两行代码。那你这些代码也是放到对象b里面的?
2014年09月08日 03点09分
5
anheimfb
恩 这个代码其实没有with就能达到所有实例hspeed=-5的要求了, 我只是想了解一下with的运行机制 弄了这个用来测试的代码
2014年09月08日 03点09分
吧务
level 12
blovestorm
假设对象b有b1,b2,b3三个实例,id从小到大(执行顺序先后)为:b1,b2,b3。
我们按照顺序来分析下,从按下vk_left的第一帧起(vk_left只按下一帧)。
第一帧b1步事件:
b1的with代码,导致b1,b2,b3的time都为1。b1执行其他代码后,b1的time为0,hspeed为-5。
第一帧b2步事件:
b2的with代码,导致b1,b2,b3的time都为1。b2执行其他代码后,b2的time为0,hspeed为-5。
第一帧b3步事件:
b3的with代码,导致b2,b3的time都为1。注意!,b1不执行(原因其time为1)。b3执行其他代码后,b2的time为0,hspeed为-5。
以上第一帧结束。此时此刻,b1的time为1,b2的time为1,但b3的time为0!
第二帧(没有按下vk_left)b21步事件:
由于b1的time为1,所以执行了hspeed -= 5;b1最终time为0,hspeed为-10。
第二帧(没有按下vk_left)b2步事件:
由于b2的time为1,所以执行了hspeed -= 5;b2最终time为0,hspeed为-10。
第二帧(没有按下vk_left)b3步事件:
由于b3的time为0,所以什么都不执行;b3最终time为0,hspeed为-5。
以上结果是两帧后的结果。也就是说,当你在一帧里按下虚拟按键vk_left后,通过两帧才执行的结果。
你可以讲room_speed设置为1,然后按虚拟按键慢慢观察(最好通过draw_text看hspeed的实际数字)。你会发现b1与b2的hspeed先是-5,然后第二帧才变为-10。
2014年09月08日 04点09分
6
吧务
level 12
blovestorm
with事件是在哪里出现,就立刻执行相关对象的所有实例。
无论其id大小,无论对象先后,此时此刻,不会等到事件结束!
2014年09月08日 04点09分
7
blovestorm
再加上一条,无论本帧本事件内,是否执行过。
2014年09月08日 04点09分
anheimfb
恩 看懂了 写这么多谢谢啦 下面再做个表算总结
2014年09月08日 05点09分
吧务
level 12
blovestorm
如果没什么大的必要,少用一些嵌套执行,可读性太差。
时间长了,自己都会犯晕。
2014年09月08日 05点09分
10
anheimfb
恩 了解 with算彻底明白了这些知识没人告诉可能就一直迷迷糊糊的用with了 现在感觉前途一片光明
2014年09月08日 06点09分
醉在秋杀
回复 anheimfb :还没结束,比如在Script中使用with
2014年09月08日 14点09分
anheimfb
回复 醉在秋杀 :额 script和step有不同吗 我一直把script当step里可以拆卸的部分
2014年09月08日 17点09分
吧务
level 13
q糖豆p
LZ是在为了用with而用with嘛……何苦
一般来说,事件都会设置在总数比较少(最好是一个)的实例上,比如STG里运算擦弹时,由人物来判断是否擦到了弹幕,而不要由弹幕来判断是否擦到了人。但每一发弹幕只能被擦一次,这个变量肯定是存储在弹幕实例,而不是人实例上。在人的事件代码里怎样处理弹幕上的变量呢?
抱歉这里懒得想变量名了,先用中文代替一下……
如果直接去写 弹幕.擦=0,麻烦来了,所有弹幕的“擦”都会变成0。如果去写with(弹幕){擦=0;}很抱歉结果是一样的。这里要写with(other){擦=0;},因为other才表示碰撞事件中碰到的实例。
---
刚发现上面那些好像和LZ的问题没啥关系,好吧,懒得删了……给LZ下面这些建议吧:
物体的名字不要设置太简单以免和变量名弄错,即使是测试程序也要注意。一般来说精灵可以spr_开头,物体obj_开头,以免代码引用时引到计划外的东西。LZ的代码中,如果b物体有b变量,会很恶心吧。
尽量不要用with结构引用到多个X多个的物体。如果自身实例只有一个,用with引用到其他单个实例或一个物体类还好说,如果是多实例的物体用with操作多实例的物体,可能导致结构里的代码被执行多次X多次,这样查错可比二重循环要难查。
最好不要让多个实例响应控制动作,可以做一个ctrl物体,来控制多个实例,比如ctrl在收到“键盘右方向”的事件时执行with(obj_b){x=x+4;},而obj_b不响应键盘事件,但你按下右方向时仍然会发现所有的obj_b都在向右移动。这里要注意,如果不用with结构而写成obj_b.x=obj_b.x+4,执行的时候就会出错了。
2014年09月09日 07点09分
11
anheimfb
哦 那个other的用法不错 好像又学到一招 谢啦
2014年09月10日 03点09分
blovestorm
回复 anheimfb :var+with用法是很实用的。当然,前提你要充分理解var的意义。
2014年09月10日 14点09分
blovestorm
回复 anheimfb :你搞错了。糖豆写的with(other)并不是指关键字other,也怪糖豆了。other只能在碰撞时才可用!with(other)并不是指除了自身外,其他所有对象实例!with(other)其实什么都不会执行!
2014年09月10日 14点09分
anheimfb
回复 blovestorm :哦
2014年09月11日 02点09分
level 6
流离喵
with就是控制右边()里的实例执行{}内容,括号里可以是变量,可以是对象名、对象ID,可以是表达式返回的实例ID,他的作用不复杂,只是用法很多,用处很大而已。
2014年09月10日 06点09分
12
1