
-----------------------------------
Nigrev
Tue Dec 05, 2006 9:38 pm

[n00b]Character/enemy movement synchronization
-----------------------------------
It's pretty hard to find a specific question using the surtshenjin.  So I resort to posting.

I'm at a predicament, which most of you pros probably have been through when the almighty said " :evil: PROCESSES ARE THE DEVIL h4xx0rz :evil: !!!11".

You will see here, with incomplete comments:

%==================
%Movement test program 001
%By:Nigrev
%==================
%importing external modules/setscreen/odd var declaration
import ("BSprite.tu") %external Bacchus Sprites module.  Thnx to Bacchus of Compsci!!!
setscreen ("graphics:800;600, nobuttonbar, offscreenonly,title:movetest")
var background, speedboots, sbhave, sbx, sby, num : int
background := Pic.FileNew ("grass.bmp")
Pic.Draw (background, 1, 1, picMerge)
%================================%
%Creation of the type sprite (Sprt) and composite data of sprite
type Sprt :
    record
        pic, x, y, rlmovesp1, rlmovesp2, udmovesp, movesp : int
    end record
%=================================%
%Creation of paladin
var paladin : Sprt
paladin.x := 100 %intitialize x position at 100
paladin.y := 100 %intitialize y position at 100
paladin.pic := BSprite.New (paladin.x, paladin.y, "pally1.bmp") %initialize sprite picture
paladin.rlmovesp1 := 10 %\
paladin.rlmovesp2 := 5 % > movement speed modifications
paladin.udmovesp := 15 %/
%=================================%
%Creation of the extra sprites
var enemy1 : Sprt
enemy1.x := 500
enemy1.y := 100
enemy1.pic := BSprite.New (enemy1.x, enemy1.y, "summoner2.bmp")
enemy1.movesp := 30
%=================================%
var chars : array char of boolean
sbx := 500
sby := 400
sbhave := 0
speedboots := BSprite.New (sbx, sby, "speedboots.bmp")
View.Update
procedure pallymove
    Input.KeyDown (chars)
    if chars (KEY_UP_ARROW) then
        BSprite.Change ("pally6.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
        end for
        BSprite.Change ("pally6-2.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
        end for
    elsif chars (KEY_DOWN_ARROW) then
        BSprite.Change ("pally5.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
        end for
        BSprite.Change ("pally5-2.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
        end for
    elsif chars (KEY_RIGHT_ARROW) then
        BSprite.Change ("pally3-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
        end for
        BSprite.Change ("pally7-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
        end for
        BSprite.Change ("pally2-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
        end for
        BSprite.Change ("pally7-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
        end for
        BSprite.Change ("pally1-2.bmp", paladin.pic)
        View.Update
    elsif chars (KEY_LEFT_ARROW) then
        BSprite.Change ("pally3.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
        end for
        BSprite.Change ("pally7.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
        end for
        BSprite.Change ("pally2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
        end for
        BSprite.Change ("pally7.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
        end for
        BSprite.Change ("pally1.bmp", paladin.pic)
        View.Update
    end if
    if paladin.x = sbx and paladin.y = sby then
        sbhave := 1
        BSprite.Change ("emptysprite.bmp", speedboots)
    end if
    if sbhave = 1 then
        paladin.udmovesp := 3
        paladin.rlmovesp1 := 2
        paladin.rlmovesp2 := 3
    end if
end pallymove
procedure enemymove1
    if num = 1 then
        for i : 1 .. 20
            enemy1.x += 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        end for
    end if
    if num = 2 then
        for i : 1 .. 20
            enemy1.x -= 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        end for
    end if
    if num = 3 then
        for i : 1 .. 20
            enemy1.y += 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        end for
    end if
    if num = 4 then
        for i : 1 .. 20
            enemy1.y -= 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        end for
    end if
end enemymove1

loop
    randint (num, 1, 4)
    enemymove1
    pallymove
    if paladin.x >= maxx then
        paladin.x := 0
    elsif paladin.x = maxy then
        paladin.y := 0
    elsif paladin.y  movement speed modifications
paladin.udmovesp := 15  %/
%=================================%
%Creation of the extra sprites
var enemy1 : Sprt
enemy1.x := 500
enemy1.y := 300
enemy1.pic := BSprite.New (enemy1.x, enemy1.y, "summoner2.bmp")
enemy1.movesp := 30
%=================================%
var chars : array char of boolean
sbx := 500
sby := 400
sbhave := 0
speedboots := BSprite.New (sbx, sby, "speedboots.bmp")
View.Update
procedure pallymove
    Input.KeyDown (chars)
    if chars (KEY_UP_ARROW) then
        moving (1):= true
        BSprite.Change ("pally6.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally6-2.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
            movement (1) += 1
        end for
    elsif chars (KEY_DOWN_ARROW) then
        moving (1):= true
        BSprite.Change ("pally5.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally5-2.bmp", paladin.pic)
        for i : 1 .. 10
            paladin.y := paladin.y - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.udmovesp)
            View.Update
            movement (1) += 1
        end for
    elsif chars (KEY_RIGHT_ARROW) then
        moving (1):= true
        BSprite.Change ("pally3-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally7-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally2-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally7-2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x + 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally1-2.bmp", paladin.pic)
        View.Update
    elsif chars (KEY_LEFT_ARROW) then
        moving (1):= true
        BSprite.Change ("pally3.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally7.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally2.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp1)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally7.bmp", paladin.pic)
        for i : 1 .. 5
            paladin.x := paladin.x - 1
            BSprite.Move (paladin.x, paladin.y, paladin.pic)
            Time.Delay (paladin.rlmovesp2)
            View.Update
            movement (1) += 1
        end for
        BSprite.Change ("pally1.bmp", paladin.pic)
        View.Update
    end if
    moving := false
    if paladin.x = sbx and paladin.y = sby then
        sbhave := 1
        BSprite.Change ("emptysprite.bmp", speedboots)
    end if
    if sbhave = 1 then
        paladin.udmovesp := 3
        paladin.rlmovesp1 := 2
        paladin.rlmovesp2 := 3
    end if
end pallymove
procedure enemymove1
    if num = 1 then
    moving (2):=true    
    for i : 1 .. 20
            enemy1.x += 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        movement (2) += 1
            end for
    end if
    if num = 2 then
        moving (2):=true
    for i : 1 .. 20
            enemy1.x -= 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
        movement (2) += 1
            end for
    end if
    if num = 3 then
        moving (2):=true
    for i : 1 .. 20
            enemy1.y += 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
            movement (2) += 1
        end for
    end if
    if num = 4 then
        moving (2):=true
    for i : 1 .. 20
            enemy1.y -= 1
            BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
            Time.Delay (enemy1.movesp)
            View.Update
            movement (2) += 1
        end for
    end if
end enemymove1

loop
    randint (num, 1, 4)
    enemymove1
    pallymove
    if paladin.x >= maxx then
        paladin.x := 0
    elsif paladin.x = maxy then
        paladin.y := 0
    elsif paladin.y  10 and paladin.movement < 16 then
            BSprite.Change ("pally2-2.bmp", paladin.pic)
        elsif paladin.movement > 15 and paladin.movement < 21 then
            BSprite.Change ("pally7-2.bmp", paladin.pic)
        end if
        paladin.x += paladin.movesp
        BSprite.Move (paladin.x, paladin.y, paladin.pic)
        View.Update
        paladin.movement += paladin.movesp
    elsif paladin.left = true then
        if paladin.movement  5 and paladin.movement  10 and paladin.movement  15 and paladin.movement = 20 then
        disable_controls (1) := false
        paladin.movement := 0
    end if
end pallymove
procedure enemymove1
    if num = 1 and disable_controls (2) = false then
        enemy1.x += enemy1.movesp
        BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
        View.Update
        enemy1.movement += enemy1.movesp
    elsif num = 2 and disable_controls (2) = false then
        enemy1.x -= enemy1.movesp
        BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
        View.Update
        enemy1.movement += enemy1.movesp
    elsif num = 3 and disable_controls (2) = false then
        enemy1.y += 1
        BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
        View.Update
        enemy1.movement += 1
    elsif num = 4 and disable_controls (2) = false then
        enemy1.y -= enemy1.movesp
        BSprite.Move (enemy1.x, enemy1.y, enemy1.pic)
        View.Update
        enemy1.movement += enemy1.movesp
    end if
    if enemy1.movement >= 20 then
        disable_controls (2) := true
        enemy1.movement := 0
    end if
    if enemy1.movement = 0 then
        randint (num, 1, 4)
    end if
end enemymove1

loop
    disable_controls (1) := false
    disable_controls (2) := false
    enemymove1
    pallymove
    if paladin.x >= maxx then
        paladin.x := 0
    elsif paladin.x = maxy then
        paladin.y := 0
    elsif paladin.y  (sbx - 20) and paladin.x < (sbx + 20) and paladin.y > (sby - 20) and paladin.y < (sby + 20) then
        sbhave := 1
        BSprite.Change ("emptysprite.bmp", speedboots)
    end if
    if sbhave = 1 then
        paladin.movesp := 2
    end if
end loop


but now if the controllable character is at a standstill, the other sprites move faster than wanted.  do i have to put an extra piece of coding in on the players part to give an extra delay when not moving?

-----------------------------------
ericfourfour
Sat Dec 09, 2006 7:07 pm


-----------------------------------
Just one suggestion before you continue. Make it so you only have 1 View.Update, 1 cls (or Draw.FillBox over the screen), and one delay in the program. Make sure those go in the main loop.

The order I always use is:
update variables
draw everything
View.Update
Time.Delay (1000 / fps)
cls

About the characters going faster. With the above implemented into your code all your characters will need is a speed variable which is how many pixels they move per frame.

If you get that implemented then you may want to make the characters speed a real number. That way they can move at a more precise speed. You would need to use the round () function though (it rounds a real number to an integer number).

-----------------------------------
Nigrev
Sun Dec 10, 2006 5:55 pm


-----------------------------------
i don't use cls, hehe
