2016-05-29 2 views
0

que je fais un jeu en utilisant ROBLOX sur le système de combat de chars de héros Dragon Quest Rocket Slime (mais pas à l'aide de l'interface graphique 100%)problèmes d'événements à distance

Comme je ne savais pas comment faire des munitions devenir verrouillé sur un chemin dans ROBLOX normal, je décide d'utiliser une interface utilisateur graphique pour montrer les munitions « tir »

pour ce faire, j'ai un événement à distance qui déclenche une fonction dans le script principal du système GUI lorsque des munitions est chargé

cannon.Touched:connect(function(v) 
    if fireable[v.Name] and v.Parent == workspace then 
     event:FireAllClients("Left",v.Name) 
     v:Destroy() 
    end 
end) 

Ensuite, l'interface graphique obtient l'image-objet correct pour les munitions chargé une nd le tire du bon réservoir (le premier argument dans la partie FireAllClients)

Ceci est l'une des deux instructions if pour tirer des munitions (l'autre est littéralement la même sauf que c'est pour le tank du côté droit)

local tank = tankFiring == "Left" and tank1 or tankFiring == "Right" and tank2 
if tank == tank1 then 
    print("yo!") 
    script.Fire:Play() 
    local ammoFrame = sp.Ammo:Clone() 
    ammoFrame.Parent = tank 
    ammoFrame.Visible = true 
    ammoFrame.Position = UDim2.new(0,120,0,68) 
    playAnimation("Cannon Fire",UDim2.new(0,120,0,68-25),tank.Frame) 
    ammoFrame.Image = ammoTypes[type]["img"] 
    ammoFrame.Size = ammoTypes[type]["Size"] 
    repeat 
     wait(.1) 
     ammoFrame.Rotation = ammoTypes[type]["Rotatable"] == true and ammoFrame.Rotation + 15 or 0 
     ammoFrame.Position = ammoFrame.Position + UDim2.new(0,1,0,0) 
    until 
    tank2:FindFirstChild("Ammo") and isTouching(ammoFrame,tank2:GetChildren()[3]) or isTouching(ammoFrame,tank2) or ammoFrame == nil 

    if tank2:FindFirstChild("Ammo") and isTouching(ammoFrame,tank2:GetChildren()[3]) then 
     script.Collision:Play() 
     local lastAmmoPos = ammoFrame.Position 
     playAnimation("Explosion",lastAmmoPos-UDim2.new(0,15,0,25),tank.Frame) 
     ammoFrame:Destroy() 
     tank2:GetChildren()[3]:Destroy() 
    end 
    if isTouching(ammoFrame,tank2) then 
     script.Collision:Play() 
     ammoFrame:Destroy() 
     workspace["Tank2"].Health.Value = workspace["Tank2"].Health.Value - ammoTypes[type]["dmg"] 
    end 
end 

le problème avec cela, est que si un joueur se joint APRÈS les munitions a été abattu, ils ne voient pas les munitions sur l'interface graphique

y at-il de toute façon de résoudre ce problème? Je ne peux plus me contenter de FireAllClients, car ça ne fera que tirer un autre morceau de munitions pour tous les joueurs.

Répondre

0

Avoir un service qui garde la trace de ce que des munitions est dans quel état. Ensuite, tous les clients demandent d'abord aux serveurs les états actuels des munitions lorsqu'ils se joignent, puis ils s'abonnent à d'autres changements.