i tryed string.match(s,"\(.*?)\]") for [/collection2/go] but it returns nil
i need /collection2/go
You should not use string manipulation on hash and URL objects as that doesn’t work in release builds.
Ok, but i use the monarch and when: menu->game and after game->menu->game, url of game changes and i can’t use object factory for spawn, couse i don’t know new adress
If you have an object with id game
in your scene it should always be reachable with the the URL /game
from inside the collection itself.
If game
is instead created by a factory then you should be able to capture the ID returned by create()
.
Yes, this is good, but i need have access to factory . And factory adress changes by monarch and i am don’t have new adress, what i need to do?
Do you want to send messages to a script that is in you game
collection?
One way to do this is by storing the urls with something like this https://gist.github.com/Jerakin/0ff51c5cd96e4daf5d933eecf86bf74a
local url = require "utils.url" -- Path to the gist
-- game.script | The script in the collection you want to send a message to
function init(self)
url.GAME = msg.url()
end
function on_message(self, message_id, message)
if message_id == hash("something_happend") then
-- do something
end
end
------------------------------------------------
-- other.script | In any script you want to send a message from
function init(self)
msg.post(url.GAME, "something_happend")
end
You need to explain in detail what it is you wish to do. I assume the following:
- You are using Monarch to load screens. You are using Collection Proxies to load the screens.
- In a loaded screen (ie collection) you have a game object containing a factory.
- You want to use the factory to spawn a game object
- You do not know how to address the factory in your call to factory.create()
Is this correct?
Yes, shure, and the adress that i pass to factory.create changes in ever i change a screen( and i don’t know how to bring new adress
No. If you are loading the screen using a collection proxy the URL will always be the same. If you have a collection with id foo
containing a game object boo
and a factory with id zoo
then the URL to the factory will always be foo://boo#zoo
.
If you are using a collection factory to create the screen then the URL will change every time.
after called it. The adress of game changes.
popup->game->menu->popup->game
and after it i can’t use my adresses. ;((
game changes collection2 → collection5
Can you please share the project? Either here or with me (bjorn@defold.com).
ok
I took a look at the project and you are in fact using collection factories for the screens and not collection proxies:
If you change from collection factory
to collection proxy
and change from screen_factory.script
to screen_proxy.script
you will always get the same URL to your screens.
Another thing to note is that you are using the absolute URL when posting the messages in question:
GAMESCREEN = "main:/collection2/go#gameMain"
msg.post(GAMESCREEN, "stopGame")
There is no need for this. The script that is posting the message (game.gui_script) is on the same game object as the receiver (gameMain.script). It is enough to change GAMESCREEN to:
GAMESCREEN = "go#gameMain"
msg.post(GAMESCREEN, "stopGame")
You can even write:
GAMESCREEN = "#gameMain"
msg.post(GAMESCREEN, "stopGame")
wow, your my hero
and one more moment. You said that i need more local functions. but i have problem with it. timer.delay can’t call local functions, it want’s only global.
Sure it can. You must make sure the function is declared before you pass it to the timer callback or invoke it from within your timer callback.
thank you