tarek2's Forum Posts

  • when you use getDataMap(), the object that returns can be used to add change delete key value pairs.

    https://i.imgur.com/H1ZmcqO.png

    https://www.geeksforgeeks.org/map-get-javascript/

    ** and yeah you need to add a dictionary object to be able to reference it and call getDataMap()

    Awesome Thank you very much piranha305 all your examples have been incredibly helpful )))

  • Hi

    I couldn't see the code that you use to use the dictionary on scripting

    -Add key

    -Set key

    -Get key

    etc...

    Also, do we add the Dictionary as normal from the editor as we do for events or it works different and you have to create it by scripting?

    Tagged:

  • Try Construct 3

    Develop games in your browser. Powerful, performant & highly capable.

    Try Now Construct 3 users don't see these ads
  • I just noticed that the Mouse Bug that I mentioned yesterday it wasn't a bug, it was code running from the "Script.js" which I didn't see it yesterday ))

  • Thanks a lot chunchun really helpful

    DFORMS No worries mate, thanks for responding

  • Thanks very much for your time Ashley

    I see what you mean that we need to think differently and not on the c2 world thanks for the advice however every construct user is goona end up thinking in the same way, for this reason, could I recommend a few things? but obviously, if you think it's wrong you can ignore it, this is just my observation based on my very sort experience testing the scripting.

    If could recommend some "Scirra made" Very short Tutorials but targeted to C2 users that been using the engine for a while so you could correct them in how they not suppose to think as you did with me and this you could do it by adding a few quick very short temples or Tutorials to teach that they not suppose to do it that way:

    This will be my recommendation for Short Tutorials or Demos:

    Picking:

    1-How to pick an object by "Comparation" iterating through all the instances and pick the ones that match the condition

    2-Pick by UID or like you said the equivalent in JS to pick directly without iterating through all the instances and best practice to follow to get the best performance.

    3-Advance Picking: Pick an object which has stored on his Instance Variable some UIDs or as you explained the JS equivalent that Picks other objects directly as the UID does.

    Behaviours:

    Because now we know how to do basic Picking we can start manipulating their Behaviours

    1-How to manipulate the behaviours of the picked objects

    Variables:

    1-How to manipulate (Global, Local, Instance Variables, Booleans) etc...

    I think for starting this will be really good for people like me that they just wanted to quickly test the scripting and see how is working. Even these some random details are gonna be helpful because you can combine them with events whenever gets stuck, the point is to get started and then you can learn and improve as you go.

    This is the equivalent as when you start with construct that they show you in a tutorial for beginners to create a square object add the Platform behaviour and keyboard and you can start jumping and get excited already, so that gives you the motivation to learn more and put more effort instead of starting from the boring part of learning the whole Javascript syntax because you may get bored quickly but if you start already interacting with construct and the objects like make them move, Jump, etc.... it's more exciting and then the boring part it becomes less boring at least for me. So basically something that gets you started right away then you do after the whole JS study bit by bit.

    But this is just my view and it may be different for other people, so if you think its wrong or is not worth it you can just ignore it, it's all good.

    Lastly, I would like to add that the more you teach your user base how to use your engine and get best performance best practices and stuff, the more Good Games we will make.

    Thank you for your time.

  • in script you always have to iterate over all the instance, construct conditions are set based operations, any new condition pretty much filters out instances from the whole set. so you have multiple instances that match the condition, they will all be pick and then action should run on both. i am not sure how picking by uid is implemented internally in c3, do they iterate over all the instance and return the matching uid? or do they already have some data structure that is keeping track of the instances and they can just select the one with the uid?

    looking at c2runtime, it seems this is the approach they take,

    they have

    > this.objectsByUid = {}; // maps every in-use UID (as a string) to its instance
    

    and when new instances are created

    > this.objectsByUid[instance.uid.toString()] = instance;
    

    then when they look it up

    > Runtime.prototype.getObjectByUID = function (uid_)
    {
    ;
    var uidstr = uid_.toString();
    if (this.objectsByUid.hasOwnProperty(uidstr))
    return this.objectsByUid[uidstr];
    else
    return null;
    };
    

    i am not sure this is how it works in c3, since the runtime is different, they might have a way better way of doing it.

    Woow Awesome Thanks a lot that is Amazing def this it should be as a tutorial on how they do it with c3 as its really important I would say the most important thing to learn how to pick by UID as is the only way to get good performance at least on Mobile, I hope Ashley sees this and can confirm if it's done like this so we can use it Ashley

    do they iterate over all the instance and return the matching uid? or do they already have some data structure that is keeping track of the instances and they can just select the one with the uid?

    Def they store the (UID & IID) of the objects as its not the same as when you use pick by comparison as Pick, by comparison, it always loops through all the instance of that object and its the opposite for the (UID & IID) as they pick it directly, I can't remember how they store them exactly something like an Array or List something like that but def its much better to pick them directly especially when you big amount of instances

  • yeah, i would say if you need to access all your instances frequently, at the start of layout i would iterate over all of them, and store them in a map (dictionary) with uid as the key, then you should be able to reference them very easily objectMap[uid], you just have to remember to add new objects if they are created at runtime.

    Ho Grate Thanks

    Is the objectMap[uid] is how you reference the dictionary? or it's different unique just for JS

    Will be awesome if you had an example saving the UIDS on Dictionary and then Pick one UID directly from the objectMap[uid]

    This is the last thing I was looking for to start playing around and testing

  • I think there is a bug with the Mouse Plugin

    Event 1 the condition says on left-clicked but it doesn't work and it works only when you right-click on the object, if you deactivate all the events and leave only event 1 you will be able to reproduce it

  • so iterating over instances should be pretty fast. the optimization would be in caching, like the uid of instances don't really change so when you find it once, you can store it, and then access it for all other operation you need and those look ups would be a bit faster. since you don't have to iterate over all the instances again, but that's very negligible unless you have 1000+ instances

    Indeed that is what I was looking for to do, I see that you used on here:

    //we only have one text box, but lets pick it by it's uid (5)

    for(const input of textInputs){

    //we have picked the text box with uid 5

    if(input.uid === 5)

    so I suppose this the way to pick directly the UID without looping through all the instances if I already have saved the UID example on a variable or Dictionary?

  • i went a bit overboard with the iterating the text input, if you know you only have one instance of sometime you can simplify it by using something

    > 	const textInput = runtime.objects.TextInput.getAllInstances()[0];
    

    you don't really need the first for..of loop

    Ho cool no worries, Thanks for the update

    Lots of good info today hope I can learn some Js quick

  • Yes so there are essential 2 ways to go about it, you either let the conditions on the event sheet pick the object for you, or you iterate over all the objects and look for the uid your looking for

    here is a quick test project https://drive.google.com/open?id=1UExW5rLfhDLtEhr0nPaT7KlX-VjjMryT

    it show both ways of picking using a condition to guide your picking, and a purely picking in scripting (not sure if using the event system to pick has any optimizations as opposed to iterating over all the obejcts) but with that said you can merge both approaches pretty seamlessly, narrow down you instance list with a condition and then in JS, you can further narrow down and target the instances you want to deal, with, you can even abstract it out into a function that will return the specific set of IWorldInstances you want to deal with.

    Awesome!! Thanks so much for your help and for Commenting the whole process really helpful, I really appreciate it, I'm gonna play with it see how far I can go ))

    (not sure if using the event system to pick has any optimizations as opposed to iterating over all the obejcts)

    I see, good question I was looking for that Answer too lol, I hope Ashley can give us some hints, I was looking for how to Pick by UID because I thought that would be the most optimized method like when we pick with the Events & UID but it looks like with JS is all a bit different, there is a lot to learn jeje, will be nice to see some BenchMarks of at least the Picking which one is faster ) and different benchmarks also anything related to (JS Vs Events) I'm surprised no one has done it yet as it's been quite a while since the Scripting has been released

  • https://piranha305.itch.io/tanktrax has the c3p file for the tank game.

    Ho Woow Thanks very much that is gonna be really helpful :)

    Any chance that you know how to pick by UID?

    They have it here but it doesn't say how to use it

    https://www.construct.net/en/make-games/manuals/construct-3/scripting/scripting-reference/object-interfaces/iinstance

  • I currently have 2 games that demonstrate how to mix events and java script, they are not really tutorials but going through might help a bit. you can get the c3p files here

    https://www.patreon.com/posts/tank-trax-clone-28597133

    https://www.patreon.com/posts/word-finder-28761484

    with that said It would be nice to see some more official templates integrating the scripting feature

    I couldn't find any of the tutorials, have they been removed?

  • I agree with Doop

    will be nice to have more scripting Temples to study if possible:

    Example:

    I'm stuck how to pick by UID

    or

    How to filter the picking using scripting

    or

    How to check an instance Boolean if is true or Check instance Variable

    or

    How to set a boolean to false

    or

    How to check if an object is Solid because has the solid behaviour

    etc....

    Also, I think important info like this:

    Scripting has no concept of picking. That whole concept is unique to Construct's event system. However you can access the picked instances from script using the IObjectClass methods, e.g. the pickedInstances() iterator.

    It should be more accessible, for example here:

    construct.net/en/forum/construct-3/scripting-51/getting-started-javascript-144301

    That's is the first place I went to start with the scripting.

    And also I think anyone that comes from using C2 and picking, UID, etc... like me, he would like to know what is the alternative for

    "Scripting has no concept of picking"

    And stuff like that, because I spend many hours today looking how to pick by UID but still couldn't find it yet

    Thanks for scripting, by the way, it's really Awesome to have it and is gonna be really helpful to learn to code

  • I have resolved my issue.

    Hi DFORMS

    Do you mind sharing how did you do it?

    I can't find anywhere on the Manual or the C3 Examples

    I would like to know how to Pick an instance by UID From a dictionary Value or a variable or just how to pick by UID in general

    Ps: I'm new to Js so I have no clue at all I'm just learning

    Thanks