Predefined Animation While Controlling IMGMovement

Blitz3D Forums/Blitz3D Beginners Area/Predefined Animation While Controlling IMGMovement

fromonesource(Posted 2006) [#1]
I am trying to create a 2D shooter and I have created the images and movements seem to be working so far.

I have a monster that I want to move from side to side while a soldier can be controlled by the keyboard. The monster's movements will be predefined and disconnected from the soldier's movements.

I have no idea how to do this, I've tried a few different loops but nothing is working. Please help.


SheepOnMintSauce(Posted 2006) [#2]
Do you mean you want the monster to scroll left and right like an alien from space invaders?


Blitzplotter(Posted 2006) [#3]
Or will the monster be more adventurous and move like on the old arcade game Galaxians(up,down,left and right at speed.) If so you might want to consider the monster having four variables for movement, two for the x and y position and two for the rate of change in x and y positions.


fromonesource(Posted 2006) [#4]
Just left and right for now.

It's pretty simple in concept but the purpose of the assignment is collision detection. I haven't gotten to that part of it yet. I can't get two images to move simultaneously and independent of each other.


SheepOnMintSauce(Posted 2006) [#5]
If you are planning on using more than one monster you could use types to set up the monsters and use a For Each loop to go through the list of monsters to update their location on the screen for each loop of the program.

Something like this:

For monstername=Each monster
monster/x = monster/x+1
monster/y = monster/y+1
Next

Although you'll need to add the other bits yourself, like checking if the monster has hit the limit of how far along the x or y axis it can go or whatever.


Ho ho.. I was inspired.


fromonesource(Posted 2006) [#6]
Here is my code, I have commented the section where the problem lies...

Graphics 800,526
SetBuffer BackBuffer()

Const MoveLeft=203
Const MoveRight=205
Const MoveUp=200
Const MoveDown=208
Global monsterDead = False
Global soldierDead = False

AutoMidHandle True
Global monster=LoadAnimImage("images\monster.bmp", 72, 72, 0, 12)
Global xMonster=460
Global yMonster=99
Global monsterFrame=1
DrawImage monster, xMonster, yMonster, monsterFrame
MaskImage monster, 0, 0, 0

Global egg=LoadImage("images\egg.bmp")
Global xEgg=xMonster
Global yEgg=yMonster
DrawImage egg, xEgg, yEgg
MaskImage egg, 0, 0, 0

Global soldier=LoadAnimImage("images\soldier.bmp", 165, 165, 0, 4)
MidHandle soldier
Global xSoldier=300
Global ySoldier=400
Global frameSoldier=0
DrawImage soldier, xSoldier, ySoldier, frameSoldier
MaskImage soldier, 0, 0, 0

Global background = LoadImage("images\city-scene.bmp")

Function eggThrow()
Cls
DrawImage background, 400, 263
DrawImage monster, xMonster, yMonster, monsterFrame
DrawImage egg, xEgg, yEgg
xEgg = xEgg-30
yEgg = yEgg+45
Delay(30)
Flip
End Function

Function soldierUpdate()
Cls
DrawImage background, 400, 263
DrawImage soldier, xSoldier, ySoldier, frameSoldier
Delay(50)
Flip
End Function

Function monsterUpdate()
Cls
DrawImage background, 400, 263
DrawImage monster, xMonster, yMonster, monsterFrame
Delay(50)
Flip
End Function

Function monsterGrow()
monsterFrame=0
monsterUpdate()
monsterFrame=1
monsterUpdate()
monsterFrame=2
monsterUpdate()
End Function

Function monsterThrow()
monsterFrame=6
monsterUpdate()
monsterFrame=7
monsterUpdate()
monsterFrame=8
monsterUpdate()
For x = 1 To 10 Step 1
eggThrow()
Next
xEgg=xMonster
yEgg=yMonster
End Function

Function monsterDie()
monsterFrame=9
monsterUpdate()
monsterFrame=10
monsterUpdate()
monsterFrame=11
monsterUpdate()
End Function

monsterGrow()

While Not KeyDown(1)





;THE SOLDIER DOES NOT APPEAR UNLESS LEFT OR RIGHT KEY IS PRESSED
;MONSTER DISAPPEARS WHEN SOLDIER APPEARS

While soldierDead = False
If(KeyDown(MoveLeft))
xSoldier=xSoldier-5
frameSoldier=0
soldierUpdate()
xSoldier=xSoldier-5
frameSoldier=1
soldierUpdate()
Else If(KeyDown(MoveRight))
xSoldier=xSoldier+5
frameSoldier=2
soldierUpdate()
xSoldier=xSoldier+5
frameSoldier=3
soldierUpdate()
End If
Wend
If monsterDead = False
For x = 1 To 3 Step 1
xMonster=xMonster+5
monsterFrame=3
monsterUpdate()
xMonster=xMonster+5
monsterFrame=4
monsterUpdate()
xMonster=xMonster+5
monsterFrame=5
monsterUpdate()
Next
For y = 1 To 3 Step 1
xMonster=xMonster-5
monsterFrame=3
monsterUpdate()
xMonster=xMonster-5
monsterFrame=4
monsterUpdate()
xMonster=xMonster-5
monsterFrame=5
monsterUpdate()
Next
monsterThrow()
Else If monsterDead = True
monsterDie()
End If


Wend
End


SheepOnMintSauce(Posted 2006) [#7]
I think the problem is with calling the functions. Although, it's quite hard to read your code.

Here is one of the first programs, I have done. It's not perfect, but it does pretty much what I think you're after although it moves on both x, and y axis.




fromonesource(Posted 2006) [#8]
Thanks for your help, unfortunately that's not quite what I'm looking for.

If you run that code with some placeholder images in place of the ones i have defined in the code you will see the problem. The first moving character to be displayed (monster) disappears when the soldier image is introduced to the game.

This bugs the hell out of me and I don't know why it's happening. I just don't know how to keep the monster moving while the soldier is on the screen.

Thank you


Duckstab[o](Posted 2006) [#9]
A good way to manage this kind of approach would be


Function MonsterMove()
  If Mdir=0 then
    if Monsterx=>1 then 
          Monsterx=Monsterx-1
    elseif Monsterx=0 then
          Monsterx=Monsterx+1
          Mdir=1
          Return
    endif
  esleif Mdir=1 then
    if Monsterx=<760 then 
          Monsterx=Monsterx+1
    elseif Monsterx=760 then
          Monsterx=Monsterx-1
          Mdir=0
          Return
    endif
  endif
End Function


[EDIT]

this will cause the monster to move left to right


Duckstab[o](Posted 2006) [#10]
As for you code you need to change

Function soldierUpdate()
Cls
DrawImage background, 400, 263
DrawImage soldier, xSoldier, ySoldier, frameSoldier
Delay(50)
Flip
End Function

Function monsterUpdate()
Cls
DrawImage background, 400, 263
DrawImage monster, xMonster, yMonster, monsterFrame
Delay(50)
Flip
End Function



to

Function DrawingUpdate()
  DrawImage background, 400, 263
  DrawImage soldier, xSoldier, ySoldier, frameSoldier
  DrawImage monster,xMonster,yMonster,monsterFrame
  Delay(50)
  Flip
  cls
End Function



calls this instead of
soldierUpdate()
monsterUpdate()


Duckstab[o](Posted 2006) [#11]
Things to note about programming logic

1. The Screen
This is the output of the programme and is the final peace in game logic and is to be show once per game loop

2. Character ie zombie ,soldier
These are definded by a collection of variables which
and can be changed during the game loop

Now when setting the game up you need to do thing in order for the whole drawing process to work

The Main Loop

While not keyhit(1)
  UpdateZombie()
  UpdateSoldier()
  DrawLayout()
  DrawZombie()
  DrawSoldier()
  Delay(50)
  Flip
  Cls
Wend



So you alter all the possitons and frames of the creatures
Draw the background,layout
Draw the Characters
Flip
Cls

this should now draw correctly to the screen
Its always a good idea to drawout a diagram of your programme flow to help you with the early stages of coding