大触们帮忙啊!
gamemaker吧
全部回复
仅看楼主
level 10
灾难之后
楼主
正在做联机,正在设置一个怪物同步的问题,但是用的函数是
obj_zombie.x=mplay_data_read(5)
obj_zombie.y=mplay_data_read(4)
发现,这是把所有怪物的X,Y都定在一起,那么。。
样子就是一大坨东西在一个地方呆着。。。
怎么办?是不是这个是设置了全局?
有懂联机函数的大触吗,能教小弟吗?
2014年11月16日 10点11分
1
level 10
灾难之后
楼主
555555555,没人知道联机吗
2014年11月16日 10点11分
2
吧务
level 13
q糖豆p
这就不是联机的问题
obj_zombie.x这个变量
在等号左侧时,表示“所有obj_zombie的x变量”;
在等号右侧时,表示“第一个obj_zombie的x变量”;
2014年11月16日 11点11分
3
灾难之后
额 obj_zombie.y =mplay_data_read(4) 这样?第一个obj_zombie的x变量是什么意思能详细说一下吗?谢谢!
2014年11月16日 11点11分
吧务
level 13
q糖豆p
obj_zombie.x=mplay_data_read(5)
obj_zombie.y=mplay_data_read(4)
翻译成简体中文:
把所有僵尸的X坐标改为5号共享数据
把所有僵尸的Y坐标改为4号共享数据
这样写当然会重合,理所当然的。因为“object名 点 变量名”在等号左侧进行赋值运算时将对所有object进行赋值。GML的说明里针对这个情况有说明的,LZ没好好看吧。其实在生成僵尸,也就是instance_create动作发生时是可以记录实例ID的,针对ID的操作则不会影响到其他同名的实例。
作为测试,LZ可以考虑建立obj_a和obj_b,其中obj_b没有任何事件和动作,obj_a在房间里只放一个
obj_a的创建:i=self;
obj_a的全局鼠标左键按下:i=instance_create(mouse_x,mouse_y,obj_b)
obj_a的全局鼠标右键按下:i.vspeed=-1;
其中,最后一个i.vspeed如果改为obj_b.speed,运行结果是不一样的。
至于这个怎么应用到LZ做的联机里……嗯,LZ测试完应该会明白的
2014年11月16日 15点11分
5
灾难之后
明白了,谢谢
2014年11月17日 01点11分
灾难之后
i=instance_create(mouse_x,mouse_y,obj_b)是什么意思?
2014年11月17日 02点11分
q糖豆p
回复 灾难之后 :在鼠标指向处生成一个obj_b,并将生成实例的ID存在变量i里。
2014年11月17日 05点11分
灾难之后
回复 q糖豆p :其实还是有点不明白,是不是可以翻译成这样? i=自己; i=创建b实例在鼠标的位置 实例bvspeed=-1 ??
2014年11月17日 06点11分
吧务
level 12
blovestorm
没研究过联机,纯帮顶!
2014年11月16日 15点11分
6
level 3
汗乾
你能够将游戏联机进行?!好厉害!
2014年11月17日 06点11分
7
灾难之后
自带函数里面研究了就可以联机了,但是其他比如数据同步还是比较麻烦的
http://wenku.baidu.com/link?url=BcjZ663YC2r8ffmy-GdGajH5EUtVcU7xDgC_f6qLz3THA31sRy6PBR_JLdzJ_OE2JXnk9cQ0Ti28pm28JsfVx5Ac8EHb2SB73T4w6j3nBE7
2014年11月17日 06点11分
汗乾
回复 灾难之后 :那就是说不用写服务器了咯?
2014年11月17日 08点11分
灾难之后
回复 汗乾 :差不多吧,但是有函数是创建服务器(必须)
2014年11月17日 08点11分
汗乾
回复 灾难之后 :我看了一遍,一点也不简单
2014年11月17日 08点11分
吧务
level 13
q糖豆p
obj_a在房间里只放一个
obj_a的创建:i=self;
obj_a的全局鼠标左键按下:i=instance_create(mouse_x,mouse_y,obj_b)
obj_a的全局鼠标右键按下:i.vspeed=-1;
其中,最后一个i.vspeed如果改为obj_b.speed,运行结果是不一样的。
==============================
解释一下上边这些
obj_a只放一个,因为obj_a是控制系统,放多个会导致很多麻烦事
i=self; //只是为了防止某些BUG,给i设置一下初始值,如果测试时不会上来就按右键的话可以忽略这一步;
然后,这3行对应3个不同事件,不是连续发生的。
最后,右键的i.vspeed=-1,vspeed是GM的内置变量,表示竖直速度,改变这个值可以直接改变实例的运动情况。i.vspeed表示物体i(此时i存储的是一个ID,所以只会引用一个物体)的数值速度,而obj_b.vspeed表示所有obj_b的数值速度,对这两者操作是有区别的。
LZ做好程序以后,先乱点几下左键创建几个obj_b,然后按右键的时候会只有最后一个向上跑,但如果把代码的i.vspeed改成obj_b.speed则会发现所有的obj_b都会向上跑(除了在那之后建立的)
感觉这样写没歧义啊,LZ你该不会没做测试程序就回来问的吧??
2014年11月17日 08点11分
8
灾难之后
做过测试的,但是之前也没做过关于ID的东西,所以真的不能理解,现在就差不多了 谢谢
2014年11月17日 09点11分
CNZI231
层主看楼下,谢谢
2014年11月17日 10点11分
level 8
CNZI231
8楼,层主我是楼主,现在知道我的问题了。
正在做一个联机游戏,但是僵尸(obj)这个实例需要同步,(在objzombie的step里写)所以用了
mplay_data_write(5,x)
mplay_data_write(4,y)
,但是等在player(玩家)里面写(在step):
obj_zombie.y=mplay_data_read(4)
obj_zombie.x=mplay_data_read(5)
读取zombiexy的数据(其实我也不知道有没有其他方式来设置,因为objzombie这个是个整体的数据),但是这样做了以后,那些怪物就到处闪现,因为是在step里面写的
obj_zombie.y=mplay_data_read(4)
obj_zombie.x=mplay_data_read(5),这个的意思也就是僵尸(整体)读取4 5 的x和y数据,那么问题就来了,obj_zombie.x=mplay_data_read(5)该怎么表达才能表达单独的zombie
2014年11月17日 10点11分
9
CNZI231
@q糖豆p
2014年11月17日 10点11分
吧务
level 13
q糖豆p
改成针对ID操作,而不是针对僵尸(整体)操作是非常必要的,问题是这个ID的获取方法。本着“能事先挖坑就不事后追踪”的原则:
使用instance_create生成的实例,直接取其返回值(即类似i=inst....的方式)获取ID;
直接在房间设定中摆放的实例,通过鼠标指向时屏幕提示来得知ID;
如果LZ某些图片替换时不是替换的sprite而是object……删号重练吧。
2014年11月18日 04点11分
10
灾难之后
谢谢
2014年11月18日 06点11分
level 13
cies
必须获取ID,但是和你想的不同哦,你要知道一点,两个窗口创建的实例,ID几乎不可能一样,如何来获取ID的问题还不如换成自己创建一个联机专用ID。
在你游戏主机创建僵尸对象的同时,告知客户端并创建这个僵尸,并且同时发送一个标示符过去,当你主机对此僵尸控制的时候,你客户端只需要对照标示符是否相等,来控制对应的僵尸就好~。
打个比方:
服务器端
obj_server CREATE EVENT:
createEnemy = 1
idZombie=10001
mplay_data_write(1,createEnemy ) //1代表创建怪物,服务器端创建一个怪物后,发送信息给客户端让他也发送一个
objZombie = instance_create(x,y,obj_Zombie)
objZombie.Uid = idZombie
mplay_data_write(2,idZombie) //1将这个怪物的id发送给客户端
客户端
obj_client step EVENT:
clientEvent = mplay_data_read(1)
if clientEvent = 1//如果服务器叫他创建怪物,他就得创建!
{
objZombie = instance_create(x,y,obj_Zombie)
idZombie = mplay_data_read(2)
objZombie.Uid = idZombie
}
这样就把ID传送过去啦,然后每次传送你的坐标x,y的时候,只需要对照一下UID是否为10001的僵尸,才对他进行操作
with obj_zombie
if Uid = 10001
{
y=mplay_data_read(4)
x=mplay_data_read(5)
}
详细步骤自己写。
2014年11月18日 08点11分
11
灾难之后
T大!!!!!!!!!!!!!!我去试试看,谢谢T大! PS:T大我是你的脑残粉
!
2014年11月18日 08点11分
灾难之后
T大,那id是不是要一个个自己写?
2014年11月18日 08点11分
cies
回复 灾难之后 :当然不是啦那得多麻烦。。简单的办法就是服务器端生成怪物的时候id用一个全局变量递增就行了。
2014年11月18日 08点11分
灾难之后
回复 tifaices :idzombie=+1 ???这样吗??
2014年11月18日 09点11分
level 13
cies
首先咱只是给你写的创建程序的位置哦,有很多细节需要你来自己来完善,比如这个问题你有多种解决办法,提前read 1和2,如果2的UID游戏里已经存在,则不再创建这个实例,其次我推荐你使用send_message系列来制作,数据更有严谨性,最后额外提醒你一下,gm自带的网络函数穿透力并不强,所以你用来和别人联机的时候,如果不是公网ip或者同一LAN口ip,极大可能连接不上~
2014年11月18日 10点11分
12
1