Global Movement Entity??? [SOLVED]

For questions about using Classic.

Post » Wed Oct 12, 2011 9:03 pm

I am trying to make grid-movement sidescroller. Player and enemies all use grid mevement behavior but with diferent settings... Beside of that Player can change direction of gravity, so same input can have diferent actions (vertical or horizontal, +1 grid size or -1 grid size), and some enemies can walk on wals. I can make each of this movements separatly, but I wonder if I can make something like one Global Movement Entity function, so that this function can be called from each object who have grid movement with different settings that are then sent to this function.

If I include all moving entites in to family MovEnt, can I then do something like this:

for enemies something like -

Bad.X < Player.X --- set Bad.Value('Step') to 1
                 --- Call function "MoveHor"

Player -

Left Arrow is down --- set Player.Value('Step') to -1
                   --- Call function "MoveHor"

...and so on...

On fuction "MoveHor" --- MovEnt: Move MoveEnt.Value('Step') horizontaly

I cant access MoveEnt private variables in "move X steps horizontaly" field of MoveEnt grid movement behavior... Is there some other way to do something like this? (sorry for bad english)

podpathos2011-10-16 21:28:46
Posts: 96
Reputation: 1,583

Post » Wed Oct 12, 2011 10:47 pm

Solved - MovEnt.Value('Step')

I did not know that it can be entered manualy...
Posts: 96
Reputation: 1,583

Post » Thu Oct 13, 2011 1:11 am

interesting question
do your characters have the ability to jump?
And if they do, Is the jump based on grid movement?
If it is... Strange feeling

Anyway here is what I would do... I'm actually working on some changing gravity stuff too so I already figured out some stuff like how to unify code for all direction.

Basically I use some vector concept
like in the basic direction you have
Up : (0,-1)
Down : (0,1)
Left : (-1,0)
Right : (0,1)
as vector for each direction.

if you have a character on a wall facing right, his up, left, down and right vector would be something like (1,0), (0,-1), (-1,0) and (1,0)

So the idea is to have 9 variables for each character (enemy or player).
Only one is really important but the other are better for code readability
so these variables would be :
- direction (the most important one)
- xT and yT (for the top vector)
- xB and yB (for the bottom vector)
- xR and yR (for the right vector)
- xL and yL (for the left vector)

the direction variable can have a value form 0 to 3 representing the 4 possibilities :
- 0 on the ground
- 1 on a wall facing right
- 2 on the ceiling
- 3 on a wall facing left).

This way you can set each of your vector depending on this variable like this :

xT = round(sin('direction'*90))
yT = 0-round(cos('direction'*90))

xR = round(cos('direction'*90))
yR = 0-round(sin('direction'*90))

xB= 0-xT
yB= 0-yT

xL= 0-xR
yL= 0-yR

and then if you want to move a character to his right you just have to :

+ MouseKeyboard: On player 1 pressed "Move Right"
-> Character: Set X to 'xR' * 'speed' * TimeDelta
-> Character: Set Y to 'yR' * 'speed' * TimeDelta

Now for the grid movement :
You have to set the size of your grid cell in a global variable
I will name it global('cellSize')

you also need a variable that will carry the direction of your movement during the interpolation between one cell to the other
I propose 'xMove' and 'yMove' this way we will also use the aformentionned vector.
And to be accurate we will store the coordinate of the character before the interpolation in 'xStart' and 'yStart'

Then you wil have something like that :

+ MouseKeyboard: On player 1 pressed "Move Right"
-> Character: Set 'xStart' to .X
-> Character: Set 'yStart' to .Y
-> Character: Set 'xMove' to 'xR'
-> Character: Set 'yMove' to 'yR'

now 'xMove' and 'yMove' carries the direction of the interpolation.
while 'xStart' and 'yStart' keep the origin safe.

Now you just have to do :

+ Character: Value 'xMove' Greater than 0
+ System: Abs(Character('xStart')-Sprite.X) Lower than global('cellSize')
-> Character: set X to X+'speed'*'xMove'*Timedelta
+ else
-> Character: set X to 'xStart'+'xMove'*global('cellSize')
-> Character: set 'xMove' to 0

+ Character: Value 'yMove' Greater than 0
+ System: Abs(Character('yStart')-Sprite.Y) Lower than global('cellSize')
-> Character: set Y to Y+'speed'*'yMove'*Timedelta
+ else
-> Character: set Y to 'yStart'+'yMove'*global('cellSize')
-> Character: set 'yMove' to 0
And that should do.
So to sum up, you just have to put whatever direction you want in 'xMove' and 'yMove' to make your character moves

ah and the 'speed' variable is how many pixel/second you want it to move.Yann2011-10-13 01:19:44
Posts: 1,479
Reputation: 16,336

Post » Thu Oct 13, 2011 2:37 am

Man, this is beautifull!!!
Right from the start I gave up custom grid movement, because Im not so good constructor, but with this it's there. Then I try to figure out one function for all gravity directions for days and eventualy I gave up that too, and I do it manualy - I needed to see will the game concept work. Thanks again!

Yes characters can jump, and each of them use Grid Movement Behavior. They can jump up, lef or right. Jump Up - 2 cells up and different animation is playing, jump from place left/right 4 cels horizontaly, jump from sprint 8 cels horizontaly (they dont fall if there is no ground until movement is finished). Think of Prince of Persia or Flashback style of movement. Character can exist only at one of predefined positions at time and its predefined set of states, and cant change that state while curent state does something, or can again in some of predefined conditions.

If you are interested in some basic Flashback concept stuff you can find it here


podpathos2011-10-13 05:58:49
Posts: 96
Reputation: 1,583

Post » Sun Oct 16, 2011 12:20 am

I follow your way of creating grid movement but there is some problem with it. After one step is over and xMove is set to 0 again, sprite is back at the begining, or few pixels ahead. I cant find what is causing problem. Here is cappodpathos2011-10-16 00:20:49
Posts: 96
Reputation: 1,583

Post » Mon Aug 12, 2013 7:39 pm

Hey dude, did you figure this out, and is there any way of uploading it? Im new to making games and im trying to do the same thing but found nothing in the way of tutorials. Any help you can offer would be gratefully received.
Posts: 5
Reputation: 160

Return to Help & Support using Construct Classic

Who is online

Users browsing this forum: No registered users and 4 guests