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...
But I am having trouble doing that in blitzmax, here is my header file with the enemy/bullet types...
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.
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.