There is no media in this shooter, it uses bmax drawing commands and bmax OOP.
Copy paste and enjoy, the source should help you understand bmax a little better. If I have time I'll try to create a step by step creation. As of now I'm concerned on the best way to walk some one through making this. Would it be better to go line by line, concept by concept, type by type.. Not sure exactly.. But if you study the code you'll understand whats going on.
Strict SeedRnd MilliSecs() Global kills Global Player = 1 Global Enemy = 2 Global Lives Global Score Global PlayerList:TList = CreateList() Global PlayerBulletList:TList = CreateList() Global EnemyList:TList = CreateList() Global EnemyBulletList:TList = CreateList() Global explosionlist:TList = CreateList() Global BulletTimer Graphics 800,600,0 Type TGameObject Field x,y,xv,yv End Type Type TPlayer Extends TGameObject Field InvincibleTimer ' we want him to be invincible when he starts so we need a timer Function Spawn() Local Player:TPlayer = New TPlayer 'Create a new TPlayer Object Player.InvincibleTimer=MilliSecs()+3000 '3 Seconds Player.x = 400 'center Player.y = 590 'bottom 'Add the player with info above into the player list 'The list is there so we can grab the player at any time. PlayerList.AddLast(Player) End Function Function Update() 'This grabs the last object in the list, which happens to the the player object 'that was created. That's you! Local Player:TPlayer = TPlayer(PlayerList.Last()) 'Now we need to draw the object, but first lets find out if he's invincible. SetColor 255,255,255 'naturally the player will be white in color, 'if the player is invincible he'll flash different colors. If MilliSecs() < Player.InvincibleTimer ' then he's still invincible SetColor Rand(0,255),Rand(0,255),Rand(0,255) 'pick a random color End If If KeyDown(KEY_LEFT) Then Player.x:-5 If KeyDown(KEY_RIGHT) Then Player.x:+5 If KeyDown(KEY_SPACE) and MilliSecs() > BulletTimer TBullet.PlayerShoot(Player.x,Player.y-8) TBullet.PlayerShoot(Player.x-8,Player.y) TBullet.PlayerShoot(Player.x+8,Player.y) EndIf 'Now lets draw the player, a triangle DrawLine Player.x+16,Player.y,Player.x-16,Player.y DrawLine Player.x,Player.y-32,Player.x+16,Player.y DrawLine Player.x,Player.y-32,Player.x-16,Player.y End Function End Type Type TEnemy Extends TGameObject Field hitpoints Field wave Field startx Function Spawn() Local Enemy:TEnemy = New TEnemy Enemy.startx=Rand(20,780) Enemy.y= - 20 Enemy.hitpoints = 255 EnemyList.AddLast(Enemy) End Function Function Update() For Local Enemy:TEnemy = EachIn EnemyList Enemy.wave:+2 Enemy.y:+1 Enemy.x=Enemy.startx + Sin(Enemy.wave) * 20 If Rand(1,100) = 99 Then TBullet.EnemyShoot(Enemy.x,Enemy.y) SetColor 255,Enemy.hitpoints,Enemy.hitpoints DrawOval Enemy.x-32,Enemy.y-16,64,32 If Enemy.x < -70 Then Enemy.x = 864 If Enemy.x > 864 Then Enemy.x = -70 If Enemy.y > 660 Then Enemy.y = -60 If Enemy.hitpoints < 1 Then Enemy.explode Next End Function Method explode() kills:+1 For Local explosions = 1 To 10 TExplosion.Make(Self.x+Rand(-32,32),Self.y+Rand(-16,16),Rand(10,50)) EnemyList.Remove(Self) Next If CountList(EnemyList) < 6 TEnemy.Spawn() 'make two TEnemy.Spawn() EndIf End Method End Type Type TExplosion Extends TGameObject Field Radius Field MaxRadius Function Make (x,y,MaxRadius) Local Explosion:TExplosion = New TExplosion explosion.x = x explosion.y = y explosion.MaxRadius = MaxRadius explosionlist.AddLast (explosion) End Function Function Update() For Local explosion:TExplosion = EachIn explosionlist explosion.Radius:+1 If explosion.Radius = explosion.MaxRadius Then explosionlist.Remove(explosion) SetColor 255,255,0 DrawOval explosion.x-explosion.Radius/2,explosion.y-explosion.Radius/2,explosion.Radius,explosion.Radius Next End Function End Type Type TBullet Extends TGameObject Field Owner ' specify who shot the bullet Function PlayerShoot(x,y) Local Bullet:TBullet = New TBullet Bullet.x = x 'That's carried over from the function call, was player.x Bullet.y = y - 34 ' Also carried over, but adjusted to be above the player Bullet.Owner = Player 'The bullet collision detection will know whose is whose PlayerBulletList.AddLast(Bullet) BulletTimer = MilliSecs()+100 End Function Function EnemyShoot(x,y) Local Bullet:TBullet = New TBullet Bullet.x = x 'Carried over from the function call, which was enemy.x bullet.y = y 'Also carried over, but adjusted to be below the firing enemy Bullet.Owner = Enemy 'The bullet collision detection will know whose is whose EnemyBulletList.AddLast(Bullet) End Function Function Update() For Local Bullet:TBullet = EachIn PlayerBulletList SetColor 255,255,0 bullet.y:-14 DrawOval bullet.x,bullet.y,3,9 If bullet.y < -10 Then PlayerBulletList.Remove(Bullet) ' --------- CHECK COLLISIONS ----------- For Local Enemy:TEnemy = EachIn EnemyList If bullet.x > Enemy.x-32 and bullet.x < Enemy.x+32 and bullet.y > Enemy.y-16 and bullet.y < Enemy.y+16 Enemy.hitpoints:-20 PlayerBulletList.Remove(bullet) TExplosion.Make(bullet.x,bullet.y,10) EndIf Next Next For Local Bullet:TBullet = EachIn EnemyBulletList SetColor 255,0,0 bullet.y:+4 DrawOval bullet.x,bullet.y,9,9 If bullet.y > 610 Then EnemyBulletList.Remove(Bullet) Local Player:TPlayer = TPlayer(PlayerList.Last()) If MilliSecs() > Player.InvincibleTimer ' then he's not invincible If bullet.x > Player.x-16 and bullet.x < Player.x+16 and bullet.y > Player.y-16 and bullet.y < Player.y+16 EnemyBulletList.Remove(bullet) TExplosion.Make(Player.x,Player.y,100) PlayerList.Remove(Player) Lives:-1 TPlayer.Spawn() EndIf EndIf Next End Function End Type 'These two lines start the game.. TPlayer.Spawn() TEnemy.Spawn() Repeat ' This is the main loop!!!! Cls If Lives > 0 SetBlend LIGHTBLEND SetColor 0,255,255 DrawText "Lives:",1,1 DrawText Lives,50,1 DrawText "Kills:",1,20 DrawText kills,50,20 SetBlend ALPHABLEND TEnemy.Update() TBullet.Update() TPlayer.Update() TExplosion.Update() EndIf If Lives = 0 SetColor 255,Rand(0,255),255 DrawText "Highest kills:",10,10 DrawText kills,130,10 DrawText "Press 1 to play or ESC to quit",10,60 If KeyHit(key_1) Then Lives = 5; kills = 0 End If Flip Until KeyHit(KEY_ESCAPE)
Copy paste and enjoy, the source should help you understand bmax a little better. If I have time I'll try to create a step by step creation. As of now I'm concerned on the best way to walk some one through making this. Would it be better to go line by line, concept by concept, type by type.. Not sure exactly.. But if you study the code you'll understand whats going on.