How do I Create a Finite State Machine

Get help using Construct 2

Post » Wed Apr 02, 2014 2:54 pm

Message: Soulmachine can only post plain text URLS until they have 500 rep. 1 URLS modified. Why?
Hello guys :)

How have you solved making a simple State Machine in Construct 2?
I'm not talking big advanced ones, only minor ones to create some AI-feeling.
All ideas you may have are appreciated. But please keep it simple :) So I learn.

I've experimented with this working with booleans, I'm wondering if there are other ways you could achieve this?
Right now I'm working on making a "Worker" kind of like in Empire Earth, that gather resources and then unload it in a town house. I've managed, so far, to make it work pretty nicely... However, I'm having problems when I have more than 1 worker active.

...So if I have a condition that this specific worker, identified with a unique id - triggers when overlapping this specific resource.
When I perform actions when these conditions are met - other workers also sometimes do the actions. :(

Have I missed something here, on how the mechanics work in Construct 2. On how conditions are met, and actions are performed. What have I been missing? Any suggestions on what may be in conflict would be very helpful.

How would you design a basic wandering enemy - that has some basic states, like "Roaming" - "Targeting" - "Attacking" - "Evading" ? Using states...

Ok - that's the question's.
I now will describe a bit more the problems I have, it can be a bit long to read :) - but it's not needed for you to read to answer my question, only if you want to.

-
---
My programming friends says they are using classes when they create State Machines
sometimes they do it with Switches. Mostly they work in C or Java.
Booleans or Switches are the only way I can think of right now of using to achieve this in Construct.
I don't wanna use families, cause I haven't afford to buy the full version of Construct yet.


There seems to be some conflict in separating the objects in Construct.
To explain...
Say you have a state "Found Resource"
then you want the worker to go to the resource. When he arrived You perhaps have a state like "At resource"
And later "Extracting Resource". Something kind a like that :)

I make this work perfectly using only one instance of my Worker. The states on the worker seems to work good. But when I create a second Worker, or more, some actions are performed on all workers (this I don't wanna).
Even though I have a unique identification of each worker - to make construct separate different instances. Somehow sometimes, construct perform some actions on all the workers.
I don't know which mechanic that is in play here and that is the problem.

For example, if I have a boolean "ExtractWood"

And then I have a condition like "If worker is ExtractWood"
it should do certain actions.
The problem is that Construct perform actions to other workers, even though they are not "ExtractWood"

I may have other conditions as well, like sensing if the Worker are overlapping the correct resource, and so on...

So lets say my worker have targeted a resource - it is on its way there - then arrives.
Then a condition comes in to play when the worker are overlapping that specific resource.
What we have now is a specific worker (alone) overlapping a specific sprite (resource).

So if I have a condition that this specific worker, identified with a unique id - triggers when overlapping this specific resource.
When I perform actions when these conditions are met - other workers also sometimes do the actions. :(

Have I missed something here, on how the mechanics work in Construct 2. On how conditions are met, and actions are performed. What have I been missing? Any suggestions on what may be in conflict would be very helpful.


You can do so much designing a game without any programming at all. There are basic functions and methods to achieve stuff that is common regardless of programming language or editor. That's exactly what I'm interested in to know more about but with some practical examples that I can try in Construct.

This post is exactly what I'm talking about:
viewtopic.php?f=146&t=100032

...and right now I'm interested in creating a finite-state-machine, and later implement that in Construct 2.
And in the future start working on a Real Time Strategy game.

-
That's THE END of my little novel here :) Sorry if I've written too much.

Regards!
///Soulmachine!
Soulmachine @Soundcloud
B
14
S
2
G
1
Posts: 63
Reputation: 928

Post » Wed Apr 02, 2014 3:19 pm

For one, you can use 'For each', then check your condition. That forces C2 to look at each of your objects individually, rather than lumping them together. Second, a simple state machine typically uses an integer, which you set to constants. So have const: ROAMING=1, FOUND=2, etc. Then you just check each of these values to see what state you are in, and process accordingly. This is similar to the Switch concept.
ImageImageImage
B
71
S
21
G
220
Posts: 3,649
Reputation: 123,727

Post » Wed Apr 02, 2014 8:41 pm

It sounds like you (not uncommon) get a bit confused about how picking works in C2.

But the way you can look at picking of objects is like a sorting or reduction machine.

Imagine you have 100 workers with the following attributes.

100 Workers in total

20 Workers are wearing a red shirt.
40 Workers are wearing a blue shirt.
30 Workers are wearing a yellow shirt.
10 workers are not wearing a shirt.

30 Workers are between 40 and 50 years old.
50 Workers are between 20 and 30 years old,
20 Workers are between 60 and 80 years old (No pension for these poor bastards!)

Lets say you want all workers wearing blue shirts and that are above 60 year old to either go home or go to lunch.

So what happens is:
Pick all Workers : You pick all workers that match the condition that they are workers, in this case all are so its 100. (You don't really need this, its only for the explanation.)
Workers must have blue shirts : This will reduce the number to 40 workers.
Workers must be older than 60 : Depending on how many of those 40 workers matching this you will get a new number that further reduce or sort the amount of workers matching the former condition. Lets assume that its 15 workers.

Now we cant reduce the amount anymore and we have found all the workers that match all our conditions. And since we want them to either go home or to lunch, and don't care how many goes where. We can do the following.

For each Worker : This will go through each of the 15 remaining workers and tell each of them to either go home or to lunch.
Go home or Go to Lunch

So that's pretty much how it works whenever you pick objects, that you keep reducing or sorting them until those that remains fit whatever you want. And then if you want them to do different things you throw a "For each" at the end and then the options they have afterwards.
B
44
S
11
G
2
Posts: 1,182
Reputation: 6,828

Post » Sun Apr 06, 2014 12:34 pm

Thanks very much guys :) :)

Very interesting... it helps a lot with the explanation on the picking in C2. I will do some hands on work, to learn more about it.

Right now I'm researching finite state machine and I would really like to learn how I can create a simple one in construct. I want to learn the mechanics so perhaps in the future I would be able to make some sort of AI opponent in a small RealTimeStrategy-game.

I'm not a programmer, just a creative person that's been working in and around games, and game making. My main function is sound - but I'm interested in all aspects of creating games. :)

Any suggestions on websites that explains State Machine from the beginning are appreciated.
Soulmachine @Soundcloud
B
14
S
2
G
1
Posts: 63
Reputation: 928

Post » Sun Apr 06, 2014 4:26 pm

Don't know if there is a website that explain it, probably is. But basically a state machine is just a "Flag/Trigger" machine with behaviours, which you can make with Booleans.

Example:

Object: A Worker
Int Hungry = 100
Int Tired = 100
And what else you need.

Behaviours:
    Behaviour_Go_Eat = false
    Behaviour_Go_Sleep = false
    Behaviour_Go_Work = false
    Behaviour_Working = false
    Behaviour_Defend = false
    Behaviour_Guard = false
    Behaviour_Flee = false

Each behaviour is just true or false and control what behaviour the unit should do or are doing.

For each of them you make a function that you call whenever one of them are true.

You can do that by making a behaviour machine:

For each Worker
    If Behavior_Go_eat = true then Function("Go_Eat", Worker.UID)
    If Behavior_Go_Sleep = true then Function("Go_Sleep", Worker.UID)
    and so on.

To trigger the behaviours you just use the variables for the worker.

So could be that every 4 second you subtract 1 from Hungry.

And then you make events that activate the behaviours based on certain conditions:
If Worker.Hungry < than 30 Set Behaviour_Go_Eat = True
If Enemy is within 200 pixel of worker Set Behaviour_Flee = True

Then you ofc have to make it so if Worker is working and suddenly an enemy shows up, you set behaviour_working = false and Flee to true.

This is just a rough idea of how to do it. Then you can expand it, with priority system, so Eat will make the worker stop working, or a worker prefer to gather wood over mining and so forth.
B
44
S
11
G
2
Posts: 1,182
Reputation: 6,828

Post » Sat Apr 12, 2014 6:13 pm

Message: Soulmachine can only post plain text URLS until they have 500 rep. 1 URLS modified. Why?
Hi again Guys! :)

With a mix of your help, the internet and some friends I managed to make something close to a FSM.
You guys pointed me to the right direction to find more info and search for the right things. THANKS! :) :)
Also the FOR EACH is a big solution, and I've figured out a way to separate objects even though they are the same sprite but just different instances.

Nimos100
I kind of used a similar way that you describe and I have used functions.

Here is what I've managed to accomplish so far: http://www.lindsjael.se/soulgames/BrainOfAnts_v0.4/


I have divided the way construct should check the states of my "Ants" and what to do if they should transition to another state.
What I did was to make a function I named "FSM"
That function gets called every tick

Inside FSM I have a condition-CHECK that with the help of a For Each, checks different conditions and if one are met, sets a "state" for the Ant.
for example: If Ant has a distance lower than 10 pixels to Leaf - the state "goHome" will be set.

next inside FSM
I have another For Each that checks the "states" of all ants and then call a Function.
...like If Ant are "goHome" then call Function (goHome)

This way I have kind of a CHECK - DO combination.
First there is the CHECK for conditions, and after that comes the DO.

A downside are that there will be alot of events used pretty fast but on the plus-side are a code that is reasonable easy to manage, understand and modify.

When a function for a "state" gets called I pass along a parameter... and that is the Ant.UID... This way the function knows WHICH ant to be affected.
However in the function I always need a "Pick by comparison" -event. ...so the amount of events get pretty large after a while.

But it works so far. I will work more on this, try different approaches and to see if I can make the events even more cleanly.
Right now I'm trying to figure out how I could make a "Stack-based" FSM.
A way to store a state the Ant were in before the active state. So it can go back to that state just by popping the topmost state on the stack.
like... if the ant are "goHome" but then the ant-eater comes near and the ant need to "runAway"
when the ant-eater are not a threat no more, the ant needs to get back to the last state it was doing "goHome"
If I can do this, I don't have to have a condition check for that - the ant could just pop (remove) the active state on the stack, and go back to the "goHome"

I'm gonna use an Array for this - but I haven't figured out exactly yet where I should put it
It's easy if you just have only one instance of an object to work with. But when I have a For Each and lots of instances there are a bit more tricky :)

In my example game there are still some bugs. It's because I ran out of events. I'm at exactly 100 events :) So I could not fix the last bugs.
But it works most of the time, and if it is bugging just reload the site.

I will continue to work on this now. If you like I can post some links that has been useful to me to understand the FSM mechanics.
However almost ALL refer to the C programming language and working with classes. It's a bit confusing for a non-programmer like me, even though I've made some C# programming in the past. But I'm far away from any programmer :) I'm just creative.
If anyone are interested in the CAPX i will upload that one too.
Soulmachine @Soundcloud
B
14
S
2
G
1
Posts: 63
Reputation: 928

Post » Tue Apr 15, 2014 1:59 am

Message: Soulmachine can only post plain text URLS until they have 500 rep. 1 URLS modified. Why?
This version is better :
http://www.lindsjael.se/soulgames/BrainOfAnts_v0.6/

That version has a stack based FSM and I fixed several bugs. :)

-
I managed to figure out how to make a stack with the states and it really helps. The transitions gets much better.
There's just 1 bug left, it's when the ant that GROWS gets destroyed too soon after it has finished growing. Some variables that should be reset at the moment the ant finishes grow, DONT get time to reset, for some reason...

What I have found out so far - most of the mechanics works now.
At least the normal states: FindLeaf, GoHome and RunAway works great...
...It didn't bug with over 200 instances of ants, :) :) coool.
Soulmachine @Soundcloud
B
14
S
2
G
1
Posts: 63
Reputation: 928


Return to How do I....?

Who is online

Users browsing this forum: blissfulwizard, DevinMurray, wizdigitech and 15 guests