Hi, just bought Blitzmax and I love it... however I am having some trouble getting used to how Blitz3d did types... I am at a point where I want to see if an enemy ship is hit by a bullet, in blitz3d you could do something like this...
for s.ship = each ship
for b.bullet = each bullet
;check for collisions
next
next
But I am having trouble doing that in blitzmax, here is my header file with the enemy/bullet types...
Type bullet
Field x#,y#
Field xDir#, yDir#
Field life
Global bulletList:TList 'list that holds the emitters
Method free()
bulletList.remove(Self)
End Method
Method update()
Local r = Rand(1,1)
If r = 1 And life > 0 Then
particle.create(x,y,0,155,255,0.1,60,0,0, 0, 5, -5)
'particle.create(x,y,0,155,255,0.1,70,0,0, 0, 5, -5)
'particle.create(x,y,155,0,255,0.01,70,0,0, 5, 0, -5)
EndIf
If Not life = 0 Then
x# = x# +xDir#*9
y# = y# +yDir#*-9
life = life - 1
EndIf
If life = 0 Then
free()
EndIf
'DrawOval x - playerX,y - playerY,10,10
End Method
Function updateAll()
If Not bulletList Then 'exit function if emitterList does not exist
Return
EndIf
For Local b:bullet = EachIn bulletList
b.update()
'If e.name$ = "blueRed" Then
'e.x = MouseX()
'e.y = MouseY()
'EndIf
Next
End Function
Function create(x,y,xDir#,yDir#)
Local b:bullet
b = New bullet
b.x = x
b.y = y
b.xDir# = xDir#
b.yDir# = yDir#
b.life = 600
If Not bulletList Then 'if the list isnt created then make it
bulletList = CreateList()
EndIf
ListAddLast(bulletList,b) 'add it to the list
End Function
End Type
Type enemy
Field x,y
Field life
Global enemyList:TList
Method update()
SetBlend MASKBLEND
SetScale .6,.6
DrawImage ship02,x- playerX,y- playerY
End Method
Method free()
enemyList.remove(Self)
End Method
Function isHit()
If Not bulletList Then 'exit function if emitterList does not exist
Return
EndIf
' For Local b:bullet = EachIn bulletList
'If ImagesCollide(spark:TImage,b.x,b.y,0,ship:TImage,e.x,e.y,0) Then
' enemy.free()
'EndIf
' Next
End Function
Function updateAll()
If Not enemyList Then 'exit function if emitterList does not exist
Return
EndIf
For Local e:enemy = EachIn enemyList
e.update()
Next
End Function
Function create(x,y)
Local e:enemy
e = New enemy
e.x = x
e.y = y
e.life = 6
If Not enemyList Then 'if the list isnt created then make it
enemyList = CreateList()
EndIf
ListAddLast(enemyList,e) 'add it to the list
End Function
End Type
As you can see in the enemy type I have a function called isHit, and I attempted to do what I would normally do in blitz, but when I uncomment that bullet eachIn loop I get an error "Foreach must be used with a string, array, or appropriate object" being a noob at OOP I was curious what the best way to implement this is, also is there anything in my code that can be change to make it more effecient?
Thanks, Brian.
|