This module is part of the original MMBasic library. It is reproduced here with kind permission of Hugh Buckle and Geoff Graham. Be aware it may reference functionality which has changed or is deprecated in the latest versions of MMBasic.¶
Note: The required file(s) are available in the attachments tab (top right).
Colour Maximite V4.0 Demos from Fabrice Muller, France
Lander:
Well, here we go back to 1969 and try to Land on the Moon. Take care of your fuel or you will crash :) You will see how to make a random moon surface, use music module as audio effects, sprites and buttons to be able to land you ship.
Lander.bas:
'Lunar Lander for Colour Maximite v4.0
'
Option Base 1
Clear
'Array declaration
Dim Tevel(MM.HRes)
Dim BoosterSpr(2)
Dim ExplodeSpr(5)
Dim PlatformLSpr(5)
Dim PlatformRSpr(5)
Dim FootPix(2)
'Set 240 x 216 8 colours resolution
Mode 4
'We get the Sprites from file
Drive "b:"
Sprite Load "Lunar.spr"
'Sprite declaration
LanderSpr = 1
BoosterSpr(1) = 2 : BoosterSpr(2) = 3
For a = 1 To 5
ExplodeSpr(a) = a + 3
PlatformLSpr(a) = a + 8
PlatformRSpr(a) = a + 13
Next a
FootPix(1) = 0 : FootPix(2) = 0
'1st animated Sprite per type
PlatFormSprNum = 1
ExplodeSprNum = 1
BoosterSprNum = 1
'Set the Joystick pin's
'PIN 11 = UP (Booster)
SetPin 11,2
'PIN 13 = LEFT
SetPin 13,2
'PIN 14 = RIGHT
SetPin 14,2
'Set some variables
Booster = 0
LemSpeed = 0.1
SpeedX = 0.0
Fuel = 25.0
Gravity = 1.63
GoRight = 0 : GoUp = 0 : GoLeft = 0
Score = 0
PixLeft = 0
PixRight = 0
GMx = MM.HRes - 1
GMy = MM.VRes - 1
Print @(70,100) "Press a key to Start"
Do While (Inkey$ = "") And (Pin(11) = 1) And (Pin(13) = 1) And (Pin(14) = 1)
Loop
Cls
Randomize Timer
'Landing platform position
Platformx = Int(Rnd * (GMx -60)) + 20
Platformy = Int(Rnd * 80) + (GMy - 80)
'Here we draw the terrain and the Landing platform
Sprite On PlatformLSpr(PlatFormSprNum) , Platformx , Platformy
Sprite On PlatformRSpr(PlatFormSprNum) , Platformx + 16, Platformy
'Terrain at Left from the platform
py = Platformy + (Rnd * 7) - 3
For a = Platformx - 1 To 0 Step - 1
py = py + (Rnd * 7) - 3
Line (a,GMy) - (a,py),3
Tevel(a) = py
Next a
'Terrain at Right from the platform
py = Platformy + (Rnd * 7) - 3
For a = Platformx + 33 To GMx
py = py + (Rnd * 7) - 3
Line (a,GMy) - (a,py),3
Tevel(a) = py
Next a
'Terrain under the platform
For a = Platformx To Platformx + 32
Line (a,GMy) - (a,Platformy + 6),3
Next a
'LEM position at start
LemX = Rnd * (GMx - 60) + 20
LemY = Rnd * 50 + 25
'Show the LEM
Sprite On LanderSpr , LemX , LemY
BoosterWas1 = 0
'Initialise the platform sprite counter
PlatformCount = 0
'Next load's will be from drive "a:"
Drive "a:"
Mod_is_playing = 0
Timer = 0
'Main program loop
Do While 1
'Read the buttons
keypressed$ = Inkey$
If (Pin(11) = 0) Or (Asc(keypressed$) = 128) Then GoUP = 1
If (Pin(14) = 0) Or (Asc(keypressed$) = 131) Then GoRight = 1
If (Pin(13) = 0) Or (Asc(keypressed$) = 130) Then GoLeft = 1
'
'Test if we are over the platform
If LemY > (Platformy - 17) Then
'Test if we have landed or Collided
If (LemX >= Platformx) And (Lemx < (Platformx + 16)) Then
'Landing test
If LemSpeed <= 2.0 Then
If Mod_is_playing = 1 Then
PlayMOD Stop
EndIf
PlayMOD "landed.mod" , 4000
Print @(75,50) "Successfully Landed"
Pause 2000
Run
Else
If BoosterWas1 = 1 Then
Sprite Off BoosterSpr(BoosterSprNum)
EndIf
If Mod_is_playing = 1 Then
PlayMOD Stop
EndIf
PlayMOD "explode.mod" , 4000
Sprite Off LanderSpr
For a = 1 To 5
Sprite on ExplodeSpr(a) , LemX , LemY
Pause 100
Sprite off ExplodeSpr(a)
Next a
Print @(80,50) "You Crashed !!!"
Pause 2000
Run
EndIf
EndIf
EndIf
'We check collision with the Terrain
FootPix(1) = Pixel(LemX,LemY + 16)
FootPix(2) = Pixel(LemX + 15,LemY + 16)
If (FootPix(1) <> 0) Or (FootPix(2) <> 0) Then
If BoosterWas1 = 1 Then
Sprite Off BoosterSpr(BoosterSprNum)
EndIf
Sprite Off LanderSpr
If Mod_is_playing = 1 Then
PlayMOD Stop
EndIf
PlayMOD "explode.mod" , 4000
For a = 1 To 5
Sprite on ExplodeSpr(a) , LemX , LemY
Pause 100
Sprite off ExplodeSpr(a)
Next a
Print @(80,50) "You Crashed !!!"
Pause 2000
Run
EndIf
If Timer >= 100 Then
'Timer routine every 100mS
PlatformCount = PlatformCount + 1
Recompute
Redraw
Timer = 0
EndIf
Loop
Sub Recompute
'This part is executed every 100mS
LEMSpeed = LEMSpeed + (Gravity * 0.1)
If (GoUP = 1) And (Fuel > 0) Then
LemSpeed = LemSpeed - (Gravity * 0.2)
Fuel = Fuel - 0.3
GoUp = 0
Booster = 1
Else
Booster = 0
EndIf
If (GoRight = 1) And (Fuel > 0) Then
Vx = Vx + 0.1
Fuel = Fuel - 0.1
GoRight = 0
EndIf
If (GoLeft = 1) And (Fuel > 0) Then
Vx = Vx - 0.1
Fuel = Fuel - 0.1
GoLeft = 0
EndIf
'Record the LEM position
OldLemX = Int(LemX) : OldLemY = Int(LemY)
LemY = Int(LemY + LemSpeed)
LemX = Int(LemX + Vx)
'Clip the LEM in the screen
If LemX > (GMx - 17) Then LemX = GMx - 17
If LemX < 5 Then LemX = 5
If LemY > (GMy - 17) Then LemY = GMy - 17
If LemY < 50 Then LemY = 50
End Sub
Sub Redraw
'This part is executed every 100mS
Print @(0,0) "Speed " @(35,0) Str$(Int(LemSpeed)) + " "
Print @(100,0) "Fuel "@(135,0) Str$(Int(Fuel)) + " "
'Check if we have to erase the booster
If BoosterWas1 = 1 Then
Sprite Off BoosterSpr(BoosterSprNum)
BoosterWas1 = 0
Else
If Mod_is_playing = 1 Then
PlayMOD Stop
Mod_is_playing = 0
EndIf
EndIf
'We redraw the LEM
Sprite Move LanderSpr , LemX , LemY
' Draw the Booster if needed
If Booster = 1 Then
If Mod_is_playing = 0 Then
PlayMOD "turbine.mod"
Mod_is_playing = 1
EndIf
BoosterSprNum = BoosterSprNum + 1
If BoosterSprNum > 2 Then BoosterSprNum = 1
Sprite On BoosterSpr(BoosterSprNum) , LemX + 5 , LemY + 12
Booster = 0
BoosterWas1 = 1
EndIf
'Cycle the platform Sprites evey 300mS
If PlatformCount = 3 Then
Sprite Off PlatformRSpr(PlatFormSprNum)
Sprite Off PlatformLSpr(PlatFormSprNum)
PlatFormSprNum = PlatFormSprNum + 1
If PlatFormSprNum > 5 Then PlatFormSprNum = 1
Sprite On PlatformLSpr(PlatFormSprNum) , Platformx , Platformy
Sprite On PlatformRSpr(PlatFormSprNum) , Platformx + 16, Platformy
PlatformCount = 0
EndIf
End Sub