home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / VbLander_G1760776222004.psc / frmLander.frm < prev    next >
Text File  |  2004-06-23  |  21KB  |  555 lines

  1. VERSION 5.00
  2. Begin VB.Form frmLander 
  3.    Appearance      =   0  'Flat
  4.    AutoRedraw      =   -1  'True
  5.    BackColor       =   &H00000000&
  6.    BorderStyle     =   1  'Fixed Single
  7.    Caption         =   "VB Lander"
  8.    ClientHeight    =   6360
  9.    ClientLeft      =   150
  10.    ClientTop       =   720
  11.    ClientWidth     =   8880
  12.    FillStyle       =   0  'Solid
  13.    Icon            =   "frmLander.frx":0000
  14.    LinkTopic       =   "Form1"
  15.    MaxButton       =   0   'False
  16.    ScaleHeight     =   424
  17.    ScaleMode       =   3  'Pixel
  18.    ScaleWidth      =   592
  19.    StartUpPosition =   3  'Windows Default
  20.    Begin VB.Menu mnuGame 
  21.       Caption         =   "&Game"
  22.       Begin VB.Menu mnuGameNew 
  23.          Caption         =   "&New game"
  24.       End
  25.       Begin VB.Menu S1 
  26.          Caption         =   "-"
  27.       End
  28.       Begin VB.Menu mnuGameStart 
  29.          Caption         =   "&Start"
  30.          Shortcut        =   ^S
  31.       End
  32.       Begin VB.Menu mnuGamePause 
  33.          Caption         =   "&Pause"
  34.          Shortcut        =   ^P
  35.       End
  36.       Begin VB.Menu S2 
  37.          Caption         =   "-"
  38.       End
  39.       Begin VB.Menu mnuGameAbout 
  40.          Caption         =   "&About game"
  41.       End
  42.       Begin VB.Menu mnuGameExit 
  43.          Caption         =   "&Exit"
  44.       End
  45.    End
  46. End
  47. Attribute VB_Name = "frmLander"
  48. Attribute VB_GlobalNameSpace = False
  49. Attribute VB_Creatable = False
  50. Attribute VB_PredeclaredId = True
  51. Attribute VB_Exposed = False
  52. '**********************************************************************
  53. '*  (C) Sala Bojan 2004, alas@eunet.yu
  54. '*  You may use any file as you like, if you liked it, you can vote.
  55. '*  This is not finished game, just a simple 'Lander' demo.
  56. '*  It can be played on any computer with Win32, with the same quality
  57. '**********************************************************************
  58.  
  59. Option Explicit
  60.  
  61. ' Some holders for DC's we will use in the game
  62. Dim hLunar              As HHOLDER ' Lunar module
  63. Dim hlSide              As HHOLDER ' Side fire, left and right image...
  64. Dim hlDown              As HHOLDER ' Down fire image
  65. Dim hlCrashed           As HHOLDER ' Crashed lunar module image
  66.  
  67. Dim hLevel              As HHOLDER ' Moon surface
  68.  
  69. ' Location data
  70. Dim hlLeft              As POINTAPI ' This is a location of the left lander's leg
  71. Dim hlRight             As POINTAPI ' Right leg
  72. Dim hlMiddle            As POINTAPI ' The middle one
  73.  
  74. Dim pMouse              As POINTAPI ' Location of the mouse
  75.  
  76. ' Some other stuffs now
  77. Dim lPen                As Long ' Pen that will be used for a moon surface, it is be HPEN in c++
  78.  
  79. Dim BitmapLoaded        As BITMAP ' Bitmap that we have just loaded, we will store the data here
  80. Dim BitmapInfoHeader    As HBITMAPINFOHEADER ' Bitmap INFOHEADRER, a bitmap file informations header
  81.  
  82. Dim IsGameRunning       As Boolean
  83. Dim IsGamePaused        As Boolean
  84. ' When the lander safely lands, both IsCrashed and IsLanded will be TRUE!
  85. Dim IsCrashed           As Boolean ' If the lander has landed and/or crashed, this is TRUE
  86. Dim IsLanded            As Boolean ' But if it is landed, this option will be TRUE too
  87.  
  88. Dim lTmrCounter         As Long ' Just a counter for performance
  89.  
  90. Dim lmX                 As Single ' lunar module position X
  91. Dim lmY                 As Single ' lm position Y
  92.  
  93. Dim lmAccX              As Single ' Acceleration increment
  94. Dim lmAccY              As Single
  95.  
  96. Dim gTime               As Long ' Count the socore, the faster you land, better
  97.  
  98. '**********************************************************************
  99. '*  This function will create a new empty DC
  100. '*
  101. '*  W      - Width of the new DC
  102. '*  H      - Height of the new DC
  103. '*  BPP    - Bit count, 1, 4, 8, 24...
  104. '*  hDC    - A buffer that will recieve the created DC
  105. '**********************************************************************
  106. Public Sub CreateBlankDC(W&, H&, BPP&, hdc&, hBMP&)
  107.     Dim hDIB& ' DIB location
  108.     
  109.     ' Write some basic bitmap informations by using INFOHEADER
  110.     With BitmapInfoHeader
  111.         .biSize = Len(BitmapInfoHeader) ' size of the structure in bytes
  112.         .biBitCount = BPP
  113.         .biHeight = H
  114.         .biWidth = W
  115.         .biPlanes = 1 ' Must be one :)
  116.         .biSizeImage = GetImageSize(W, H) ' Image size, use the function I've found somewhere
  117.     End With
  118.    
  119.     hdc = CreateCompatibleDC(0) ' Create empty DC (device context)
  120.     hDIB = CreateDIBSection(hdc, BitmapInfoHeader, DIB_RGB_COLORS, 0, 0, 0) ' Create DIB section
  121.    
  122.     If hDIB Then ' If it was created
  123.         hBMP = SelectObject(hdc, hDIB) ' Select our DIB to DC, BMP that is
  124.         BitBlt hdc, 0, 0, W, H, hdc, 0, 0, vbBlackness ' Just fill the image with blackness
  125.     Else
  126.         MsgBox "Error in creation of DIB"
  127.         Exit Sub
  128.     End If
  129.  
  130. End Sub
  131.  
  132. '**********************************************************************
  133. '*  It will copy desired bitmap to a specifed DC, simply draws the bitmap to it
  134. '*
  135. '*  BitmapFileName      - File name of the bitmap
  136. '*  BPP                 - Bit count
  137. '*  hDC                 - Where to paint the BMP
  138. '*  hBMP                - ID for the bitmap, to have it in memory :)
  139. '**********************************************************************
  140. Public Sub LoadBitmapIntoDC(BitmapFileName$, BPP&, hdc&, hBMP&)
  141.     Dim VBImage As StdPicture ' VBA's object for some image manipulations, VERY nice stuff!
  142.     Dim hDCT&, hBMPT& ' Temporary data to copy the bitmap
  143.     
  144.     
  145.     Set VBImage = LoadPicture(BitmapFileName) ' Load the image, you can even open JPG, GIF, WMF...
  146.     GetObjectA VBImage.handle, Len(BitmapLoaded), BitmapLoaded ' Get the handle of BITMAP structure
  147.  
  148.     ' This function is made to CREATE DC and COPY the bitmap to it, to simplify the process
  149.     CreateBlankDC BitmapLoaded.bmWidth, BitmapLoaded.bmHeight, BPP, hdc, hBMP ' Now we will create simple blank DC, so you wouldn bother with it
  150.     
  151.     hDCT = CreateCompatibleDC(hdc) ' Create a temporary dc, to store the bitmap
  152.     hBMPT = SelectObject(hDCT, VBImage.handle) ' Temp bmp
  153.     
  154.     ' Now we will simply copy the bitmap from temp to specified DC bit by bit, safer way to "put" the bitmap to a DC
  155.     BitBlt hdc, 0, 0, BitmapInfoHeader.biWidth, BitmapInfoHeader.biHeight, hDCT, 0, 0, vbSrcCopy
  156.     
  157.     ' Select the temp, delete it, not needed anymore
  158.     SelectObject hDCT, hBMPT
  159.     
  160.     DeleteDC hDCT
  161.     DeleteObject hBMPT
  162.     
  163. End Sub
  164.  
  165. '**********************************************************************
  166. '*  This func will create a black mask of the source HDC
  167. '*
  168. '*  SrcDC       - Source DC, to create mask for
  169. '*  DstDC       - Destination, where to put the mask
  170. '*  DstBMP      - Destination bitmap for the mask (just long integer data)
  171. '*  W           - Width of the dst bitmap
  172. '*  H           - height
  173. '**********************************************************************
  174. Public Sub CreateMaskDC(SrcDC&, DstDC&, DstBMP&, W&, H&)
  175.     Dim x&, y&
  176.     
  177.     CreateBlankDC W, H, 24, DstDC&, DstBMP ' Create new DC
  178.     
  179.     ' Now cycle pixels
  180.     For x = 0 To W
  181.         For y = 0 To H
  182.             If GetPixel(SrcDC&, x, y) <> 0 Then ' If we have some 'non-black' color
  183.                 SetPixel DstDC&, x, y, RGB(255, 255, 255) ' Put the WHITE color
  184.             End If
  185.         Next y
  186.     Next x
  187.     
  188.     ' We have used white for mask, black for background, invert it to be correct
  189.     BitBlt DstDC&, 0, 0, W, H, DstDC&, 0, 0, vbDstInvert
  190. End Sub
  191.  
  192. '**********************************************************************
  193. '*  Simply draws a moon surface to a hLevel's hdc
  194. '*
  195. '**********************************************************************
  196. Public Sub DrawLevel()
  197.     Dim i&
  198.     ' pt is array of points for line(s)
  199.     Dim pt(10) As POINTAPI, p As POINTAPI
  200.     
  201.     ' First fill memory with black color
  202.     BitBlt hLevel.hdc, 0, 0, Me.ScaleWidth, 60, 0, 0, hLevel.hdc, vbBlackness
  203.     
  204.     ' Create a PEN  which we will use for drawing a surface (see included module for API explanations)
  205.     lPen = CreatePen(0, 1, RGB(255, 255, 255))
  206.     SelectObject hLevel.hdc, lPen ' Select created pen to surf DC
  207.     
  208.     ' Now put some random points to a memory
  209.     For i = 0 To 10
  210.         Randomize i * GetTickCount
  211.         pt(i).x = i * CInt((Me.ScaleWidth / 10))
  212.         pt(i).y = CInt(Rnd * 50) + 1
  213.     Next i
  214.     pt(10).x = Me.ScaleWidth + 1 ' Last one must be >= then the form's width
  215.     
  216.     ' There must be at least two points with the same Y, so lander could land
  217.     Randomize
  218.     i = CInt(Rnd * 10) + 1: If i > 10 Then i = 10 ' Check if i is bigger then 10 (dunno why, it just happends)
  219.     pt(i).y = pt(i - 1).y ' See...
  220.     
  221.     ' Now just draw the level
  222.     For i = 1 To 10
  223.         ' We use 'p' just because stupid API Text Viewer have only Ex version of this api
  224.         MoveToEx hLevel.hdc, pt(i - 1).x, pt(i - 1).y, p
  225.         LineTo hLevel.hdc, pt(i).x, pt(i).y
  226.     Next i
  227.     
  228.     ' Fill it with the white color, there must not be a "leak"!
  229.     FillColor = RGB(255, 255, 255)
  230.     ExtFloodFill hLevel.hdc, 0, 59, 0, 1 ' You see... only 'Ex' or 'Ext' versions are avivable :P...
  231. End Sub
  232.  
  233. '**********************************************************************
  234. '*  This func will calculate image size, not written by me...
  235. '*  W   - Width
  236. '*  H   - Height
  237. '**********************************************************************
  238. Public Function GetImageSize(W&, H&) As Long ' from c++ macro
  239.     GetImageSize = ((W * 3 + 3) And &HFFFFFFFC) * H
  240. End Function
  241.  
  242. '**********************************************************************
  243. '*  Form's 'load' message handler
  244. '**********************************************************************
  245. Private Sub Form_Load()
  246.     ' The game has started
  247.     IsGameRunning = True
  248.     
  249.     ' Show the form just before the loop, 'DoEvents' message processor will not do this
  250.     Me.Show
  251.     
  252.     ' Set lander's position to center
  253.     lmX = Me.ScaleWidth / 2 - 10
  254.     lmY = 50
  255.     
  256.     ' Create some sprites
  257.     LoadBitmapIntoDC App.Path & "\lander.bmp", 24, hLunar.hdc, hLunar.hBMP
  258.     CreateMaskDC hLunar.hdc, hLunar.mhDC, hLunar.mBMP, 30, 25
  259.     
  260.     LoadBitmapIntoDC App.Path & "\lside.bmp", 24, hlSide.hdc, hlSide.hBMP
  261.     
  262.     LoadBitmapIntoDC App.Path & "\ldown.bmp", 24, hlDown.hdc, hlDown.hBMP
  263.     
  264.     LoadBitmapIntoDC App.Path & "\lcrashed.bmp", 24, hlCrashed.hdc, hlCrashed.hBMP
  265.     
  266.     CreateBlankDC Me.ScaleWidth, 60, 24, hLevel.hdc, hLevel.hBMP
  267.     
  268.     DrawLevel
  269.     
  270.     lmdMaxFuel = 500 ' Starting fuel level
  271.     lmdFuel = lmdMaxFuel ' Current fuel :)
  272.     
  273.     GameLoop ' Start the loop
  274. End Sub
  275.  
  276. '**********************************************************************
  277. '*  If player has moved the mouse on this form, activate the game
  278. '*  (if it is not paused before by him)
  279. '**********************************************************************
  280. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  281.     If Not IsGameRunning Then
  282.         If Not IsGamePaused Then IsGameRunning = True
  283.         GameLoop
  284.     End If
  285. End Sub
  286.  
  287. '**********************************************************************
  288. '*  Delete holders from memory
  289. '**********************************************************************
  290. Private Sub Form_Unload(Cancel As Integer)
  291.     DeleteHolder hLunar
  292.     DeleteHolder hLevel
  293.     DeleteHolder hlDown
  294.     DeleteHolder hlSide
  295.     DeleteHolder hlCrashed
  296. End Sub
  297.  
  298. '**********************************************************************
  299. '*  Now the game starts
  300. '**********************************************************************
  301. Public Sub GameLoop()
  302.     Dim kLeft As Boolean ' If LEFT was pressed
  303.     Dim kRight As Boolean ' RIGHT
  304.     Dim kDown As Boolean ' DOWN
  305.     Dim kLegs(1 To 3) As Boolean ' To see if all the legs have touched the surface at the same Y level
  306.         
  307.     Dim i% ' :), '%' is integer
  308.     
  309.     Dim sBuf$ ' Buffer to store some strings
  310.  
  311.     If Not IsGamePaused Then SetWindowCaption "" ' Set the window title to default
  312.     
  313.     SetBkMode hdc, 0 ' Set background mode, TRANSPARENT in this case (hdc is the 'default' hdc, window's in this case)
  314.     
  315.     ' Set window font now
  316.     Font.Bold = True
  317.     Font.Size = 10
  318.  
  319.     ' Here we go
  320.     While IsGameRunning
  321.         DoEvents ' Process some messages
  322.             
  323.         GetCursorPos pMouse ' Get the mouse position
  324.         
  325.         ' See if user has left the window with his mouse, pause the game then
  326.         With pMouse
  327.             ' VB Form position is in Twips, so we must divide it with 15
  328.             If .x < Left / 15 Then GoTo pause
  329.             If .x > Left / 15 + ScaleWidth Then GoTo pause
  330.         
  331.             If .y < Top / 15 + 48 Then GoTo pause
  332.             If .y > Top / 15 + ScaleHeight Then GoTo pause
  333.         End With
  334.         
  335.         ' If TMR_INTERVAL time has passed, then process next frame...
  336.         If lTmrCounter + TMR_INTERVAL <= GetTickCount Then
  337.             
  338.             lTmrCounter = GetTickCount ' Reset counter
  339.             
  340.             gTime = gTime + 1 ' Count the players time, for scoring
  341.             
  342.             ' Reset key indicators
  343.             kDown = False
  344.             kRight = False
  345.             kLeft = False
  346.                 
  347.             ' As I said, IsCrashed indicates if player has crashed OR/AND landed ('soft' crashing... :)
  348.             If Not IsCrashed = True Then
  349.             
  350.                 lmAccY = lmAccY + 0.05 ' Send the lander down, gravity
  351.             
  352.                 If lmdFuel > 0 Then ' If we have some fuel
  353.                     ' Use GetKeyState api to check if the key is pressed, slow but better
  354.                     ' than VB's key events
  355.                     If GetKeyState(vbKeyDown) < 0 Then
  356.                         kDown = True
  357.                         lmAccY = lmAccY - 0.1
  358.                     End If
  359.                     
  360.                     If GetKeyState(vbKeyRight) < 0 Then
  361.                         lmAccX = lmAccX - 0.05
  362.                         kLeft = True
  363.                     End If
  364.                     
  365.                     If GetKeyState(vbKeyLeft) < 0 Then
  366.                         lmAccX = lmAccX + 0.05
  367.                         kRight = True
  368.                     End If
  369.                 Else
  370.                     lmdFuel = 0 ' If it is <0 for some reason, like -1
  371.                 End If
  372.             
  373.                 lmX = lmX + lmAccX ' Now move the ship
  374.                 lmY = lmY + lmAccY
  375.             
  376.             End If
  377.             
  378.             ' Set position of the module's legs
  379.             hlLeft.x = lmX
  380.             hlLeft.y = lmY + 24
  381.             hlRight.x = lmX + 29
  382.             hlRight.y = lmY + 24
  383.             hlMiddle.x = lmX + 15
  384.             hlMiddle.y = lmY + 24
  385.             
  386.             ' Reset legs, all of them must touch the land at the same frame
  387.             For i = 1 To 3: kLegs(i) = False: Next i
  388.             
  389.             ' Check for lander's collision, first check if he is in the needed range
  390.             If lmY + 24 > Me.ScaleHeight - 60 Then
  391.                 ' One by one, check all the legs by using GetPixel
  392.                 If GetPixel(hLevel.hdc, hlLeft.x, hlLeft.y - (Me.ScaleHeight - 59)) = vbWhite Then
  393.                     IsCrashed = True
  394.                     kLegs(1) = True
  395.                 End If
  396.                 If GetPixel(hLevel.hdc, hlRight.x, hlRight.y - (Me.ScaleHeight - 59)) = vbWhite Then
  397.                     IsCrashed = True
  398.                     kLegs(2) = True
  399.                 End If
  400.                 If GetPixel(hLevel.hdc, hlMiddle.x, hlMiddle.y - (Me.ScaleHeight - 59)) = vbWhite Then
  401.                     IsCrashed = True
  402.                     kLegs(3) = True
  403.                 End If
  404.                 ' Lander has landed, all the legs have collided
  405.                 If kLegs(1) And kLegs(2) And kLegs(3) Then
  406.                     If lmAccY < 1 Then
  407.                         IsLanded = True
  408.                     End If
  409.                 End If
  410.             End If
  411.             
  412.             ' Drawing part, just to draw the game
  413.             BackColor = 0 ' Set the back color to BLACK
  414.             Cls ' Clear the window
  415.             
  416.             ' Draw the level
  417.             BitBlt hdc, 0, Me.ScaleHeight - 60, Me.ScaleWidth, 60, hLevel.hdc, 0, 0, vbSrcCopy
  418.             
  419.             ' Now draw lander (if it has landed it looks a bit different)...
  420.             If IsCrashed And Not IsLanded Then
  421.                 BitBlt hdc, lmX, lmY + 10, 30, 25, hlCrashed.hdc, 0, 0, vbSrcCopy
  422.             ElseIf IsLanded Then
  423.                 BitBlt hdc, lmX, lmY - 1, 30, 25, hLunar.mhDC, 0, 0, vbSrcAnd
  424.                 BitBlt hdc, lmX, lmY - 1, 30, 25, hLunar.hdc, 0, 0, vbSrcPaint
  425.             Else
  426.                 BitBlt hdc, lmX, lmY, 30, 25, hLunar.mhDC, 0, 0, vbSrcAnd
  427.                 BitBlt hdc, lmX, lmY, 30, 25, hLunar.hdc, 0, 0, vbSrcPaint
  428.             End If
  429.  
  430.             ' Draw acceleration flame
  431.             If Not IsCrashed Then
  432.                 If kRight Then
  433.                     BitBlt hdc, lmX - 12, lmY + 4, 18, 9, hlSide.hdc, 18, 0, vbSrcInvert
  434.                     
  435.                     lmdFuel = lmdFuel - 1
  436.                 End If
  437.                 If kLeft Then
  438.                     BitBlt hdc, lmX + 24, lmY + 4, 18, 9, hlSide.hdc, 0, 0, vbSrcInvert
  439.                 
  440.                     lmdFuel = lmdFuel - 1
  441.                 End If
  442.                 If kDown Then
  443.                     BitBlt hdc, lmX + 8, lmY + 17, 14, 31, hlDown.hdc, 0, 0, vbSrcInvert
  444.                 
  445.                     lmdFuel = lmdFuel - 1.5
  446.                 End If
  447.             End If
  448.             
  449.             
  450.             ForeColor = RGB(255, 255, 255) ' Set fore color for text
  451.             
  452.             ' Print some text
  453.             sBuf = "Speed: " & Round(lmAccY, 1)
  454.             TextOut hdc, 16, 16, sBuf, Len(sBuf)
  455.             
  456.             sBuf = "Fuel: " & Round(lmdFuel, 0)
  457.             TextOut hdc, 16, 32, sBuf, Len(sBuf)
  458.         
  459.             sBuf = "Time: " & gTime
  460.             TextOut hdc, 16, 48, sBuf, Len(sBuf)
  461.         
  462.             ' Handle 'landed', and 'crashed' modes
  463.             If IsCrashed Then
  464.                 If IsLanded Then
  465.                     With frmResult
  466.                         .picRes(0).Visible = True ' Change the picture
  467.                         .Caption = "You have landed..."
  468.                         .lblRes = "You have landed, now how to go back... one-way ticket I guess..."
  469.                         .Show vbModal, Me
  470.                     End With
  471.                 Else
  472.                     With frmResult
  473.                         .picRes(1).Visible = True
  474.                         .Caption = "You have crashed..."
  475.                         .lblRes = "Very nice hole... well, you know what? I bet you can make a bigger one!"
  476.                         .Show vbModal, Me
  477.                     End With
  478.                 End If
  479.                 IsGameRunning = False
  480.                 IsGamePaused = True
  481.             End If
  482.                 
  483.         End If
  484.         
  485.         ' Finito
  486.     Wend
  487.     
  488. Exit Sub
  489. pause:
  490.     SetWindowCaption "- PAUSED"
  491.     IsGameRunning = False
  492. crashed:
  493.     IsGameRunning = False
  494. End Sub
  495.  
  496. '**********************************************************************
  497. '*  Set the title of the main window
  498. '**********************************************************************
  499. Public Sub SetWindowCaption(Text As String)
  500.     Caption = "Lunar Lander " & Text
  501. End Sub
  502.  
  503. Private Sub mnuGameAbout_Click()
  504.     frmAbout.Show vbModal, Me
  505. End Sub
  506.  
  507. '**********************************************************************
  508. '*  Exit game
  509. '**********************************************************************
  510. Private Sub mnuGameExit_Click()
  511.     Unload Me
  512. End Sub
  513.  
  514. '**********************************************************************
  515. '*  Restart game
  516. '**********************************************************************
  517. Private Sub mnuGameNew_Click()
  518.     
  519.     lmX = Me.ScaleWidth / 2 - 10
  520.     lmY = 50
  521.     
  522.     lmdMaxFuel = 500
  523.     lmdFuel = lmdMaxFuel
  524.     
  525.     IsLanded = False
  526.     IsCrashed = False
  527.     IsGameRunning = True
  528.     IsGamePaused = False
  529.     
  530.     gTime = 0
  531.     
  532.     DrawLevel
  533.     
  534.     GameLoop
  535.     
  536. End Sub
  537.  
  538. '**********************************************************************
  539. '*  Pause game
  540. '**********************************************************************
  541. Private Sub mnuGamePause_Click()
  542.     IsGameRunning = False
  543.     IsGamePaused = True
  544. End Sub
  545.  
  546. '**********************************************************************
  547. '*  Unpause game
  548. '**********************************************************************
  549. Private Sub mnuGameStart_Click()
  550.     IsGameRunning = True
  551.     IsGamePaused = False
  552.     GameLoop
  553. End Sub
  554.  
  555.