Can't I create Functions that apply to "picked"?

Get help using Construct 2

Post » Sun Jan 27, 2013 12:54 am


Hi all,

I want to create a Function that can be applied to different objects whenever it is called.

For instance, in pseudo code, here's something simple I can't seem to accomplish with Construct 2. First I would create a Condition->Action to call a Function using a specific object as a parameter:

On Mouse Clicked Object
\--> call Function "MyResizingFunction" (Mouse.clickedobject.UID)

The Function would be something on the lines of:
On [MyResizingFunction]
|--> System.PickObjectByUID(Param0)
\--> PickedObject.setsize = PickedObject.size*2

---------------\

So, I hope I explained it simply enough. Basically I want to click on any random object (Sprite) and have that object double size each time it is clicked on.

I was excited about the possibility of using Functions, but after trying some stuff, I can't really say I get the point, if I can't apply Functions to different objects (Sprites).

Please share any thoughts on this.

Thank you very much!!
B
10
S
2
G
3
Posts: 28
Reputation: 2,690

Post » Sun Jan 27, 2013 1:55 am

@gamekill - i made an example. i figure this could all be simplified using families but i don't (yet) have a license for C2 so this is another way to do it without using families. there are notes in the capx about families.

hope this helps!


https://www.dropbox.com/s/cw24j2xnngc24ub/sizeclicking.capx
B
14
S
6
G
2
Posts: 136
Reputation: 3,210

Post » Sun Jan 27, 2013 4:39 am


Wretchedshark, thank you for your reply, I really appreciate it and your time. The problem is, this solution is not really what I need..
You see, imagine I create a game with 125 different types of objects. It would be impractical to create one event condition for each one of them. What's worse, changing and adding objects to the project would be a pain.

I guess in this specific case (simple size changing), you could use Families (as you already mentioned) to simplify the process.

But my real problem lies with Functions.

I intended to use Functions for more complex stuff, say for an example:

If my character touches a magic statue, he temporarily gets a specific power, depending on the touched magic statue. Then, Every object in the world that he touches becomes the same color of the magic statue, and loses half the height of the previously touched object.

Etc etc.

This could all be achieved easily with traditional coding languages Functions.

Any insights on this, anyone?
B
10
S
2
G
3
Posts: 28
Reputation: 2,690

Post » Sun Jan 27, 2013 5:22 pm

@gamekill
You could do that with families easily. Or you could use little sprite trick where you store different objects in different animations. Here is a little demo I made to demonstrate.vee412013-01-27 17:22:59
B
24
S
8
G
7
Posts: 756
Reputation: 7,192

Post » Mon Jan 28, 2013 2:24 am

Here's an example project for you.

http://imgur.com/0FjIfaT

Example File
http://dl.dropbox.com/u/403350/functionExample.capx

Just like your pseudo code

You store the UID of the clicked object, and pass that as a parameter to your function. Then you "Pick" all instances that match the same UID as the parameter you passed (originally clicked on) and only apply the actions to that specific matching instance

B
50
S
21
G
8
Posts: 844
Reputation: 10,299

Post » Mon Jan 28, 2013 2:01 pm


@justifun

That's just about the exact of what I need, but I guess there's no way to accomplish it in a simple manner if I don't use Families, right? I was trying to avoid them because I teach Construct at a local University, and not all my students have access to Construct 2 Full.

Is there a way to reference "any Sprite"?
That way, I could create a local variable for the objects I want to be double-sized when clicked, say a variable called canDoubleSize. And I could check for that variable on my mouse-click then call the double-size function.

on mouse clicked on "any sprite whatsoever"
\--> AnySprite.canDoubleSize = 1
then do what your example does, but sending the UID to a global variable. Then the function searches for "any Sprite" with that UID and runs on it.

I hope I explained it clearly..




B
10
S
2
G
3
Posts: 28
Reputation: 2,690

Post » Mon Jan 28, 2013 2:12 pm

[QUOTE=gamekill]
@justifun

That's just about the exact of what I need, but I guess there's no way to accomplish it in a simple manner if I don't use Families, right? I was trying to avoid them because I teach Construct at a local University, and not all my students have access to Construct 2 Full.

Is there a way to reference "any Sprite"?
That way, I could create a local variable for the objects I want to be double-sized when clicked, say a variable called canDoubleSize. And I could check for that variable on my mouse-click then call the double-size function.

on mouse clicked on "any sprite whatsoever"
\--> AnySprite.canDoubleSize = 1
then do what your example does, but sending the UID to a global variable. Then the function searches for "any Sprite" with that UID and runs on it.

I hope I explained it clearly..




[/QUOTE]

Check the example I posted earlier, you could have all your sprites 'inside' same object to simulate families.

To me it seems you don't really need UID's, functions or anything like that. It could be as simple as having that canDoubleSize variable, then on certain conditions you execute something like this:

For each sprite
sprite.canDoubleSize = 1
      Do the doublesize

This is shown in the demo I posted as well.vee412013-01-28 14:15:37
B
24
S
8
G
7
Posts: 756
Reputation: 7,192

Post » Mon Jan 28, 2013 3:34 pm


@vee41 Yes, I guess you are right.
For the example I posted (double the size) we can do away without Functions etc.
And sorry, I forgot to comment on your earlier post. Your idea about several objects inside animations of a single object is a really useful thing to do.

But for complex actions I could use Functions. Like a function called "turn it into a nemesis" could double the object's size, restore it's HP, give it a powerful weapon and attach it to him, start showing it on the minimap, and point the player in its direction.

B
10
S
2
G
3
Posts: 28
Reputation: 2,690

Post » Mon Jan 28, 2013 4:19 pm

[QUOTE=gamekill]
But for complex actions I could use Functions. Like a function called "turn it into a nemesis" could double the object's size, restore it's HP, give it a powerful weapon and attach it to him, start showing it on the minimap, and point the player in its direction.

[/QUOTE]

Absolutely, that kind of stuff is where functions become useful. As for calling function with picked UID's you could do something like this:

text variable UIDs

pick sprites you need
for each picked sprite
     append sprite.uid & ";" to UIDs
call "Function" (with UIDs as function parameter)

"OnFunction"
for 0 to tokencount(function.param(0), ";")-1
pick sprite with UID tokenat(function.param(0), loopIndex ";")
    do your thing

What this basically should do, is save all selected UID's into text variable separated by ; symbol. Then inside the function you can parse the string again to pick them one by one.

I still think C2 offers much simpler ways to do stuff like this, it feels very 'coderish' way to do stuff! :) C2 allows for higher level of design and I really have to force myself out of the coder mold when using C2 to maximize it's potential.

You'll still have a problem if you can't use families, so you'll need to have all the sprites in single object. Hope this helps :)
B
24
S
8
G
7
Posts: 756
Reputation: 7,192

Post » Mon Jan 28, 2013 4:32 pm


Yes this does help, never thought about using Tokenat for a loop.
I guess I need to practice more on thinking differently on each new project, to come up with stuff like this.

Thanks
B
10
S
2
G
3
Posts: 28
Reputation: 2,690

Next

Return to How do I....?

Who is online

Users browsing this forum: Yahoo [Bot] and 26 guests