Game

Blitz3D Forums/Blitz3D Programming/Game

Zach3D(Posted 2006) [#1]
Why does this not work?
What happens is, the main menu loads, then when I click
it starts but for some reason a different screen is loaded.
And the game doesnt seem to be functioning at all.
I know this is incomplete so no comments about that
What im not sure of is why the castle isnt being rendered
and why the cannon isnt and why the attackers arent there.

Entire Source:
http://www.freewebs.com/attotheriveronus/CastleDefence.zip

Graphics 900,700,32,2


Global Castle = LoadImage("Castle.jpg")
Global Cannon = LoadImage("Cannon.jpg")
Global CannonBall = LoadImage("CannonBall.jpg")
Global Arrow = LoadImage("Arrow.jpg")
Global Knight = LoadImage("Knight.jpg")
Global Rammer = LoadImage("Rammer.jpg")
Global GameMenu = LoadImage("Menu1.jpg")
Global NextLevelMenu = LoadImage("LevelMenu.jpg")

MaskImage Castle,255,0,0
MaskImage Cannon,255,0,0
MaskImage CannonBall,255,0,0
MaskImage Arrow,255,0,0
MaskImage Knight,255,0,0
MaskImage Rammer,255,0,0

Type Attacker
Field vx#,img,hp,typeA,x,y
End Type

Type Projectile
Field dmg,typeP,img,xv#,yv#,dist,x,y
End Type


Global CANNONS = 10
Global ARROWS = 25
Global Lives = 10
Global Angle = 0
Global Attackers = 0
Global Level = 1
Global MaxA = 0
Global KILLS = 0
Global GAME_MODE = 2
Global NotLoaded = False


While Not KeyHit(1)
Cls
If NotLoaded = False
CANNONS = 10
ARROWS = 25
Lives = 10
Angle = 0
Attackers = 0
Level = 1
MaxA = 0
KILLS = 0
GAME_MODE = 2
NotLoaded = True
EndIf
 Select GAME_MODE
  Case 1
      DrawScenery()
      AimControl()
      FireControl()
      UpdateAttackers()
      UpdateLevel()
      UpdateProjectiles()
  Case 2
      UpdateMenu()
;  Case 3
;      UpdateShopMenu()
 End Select
Flip
Wend

Function StartNewGame()


GAME_MODE    = 1

End Function


Function DrawScenery()
DrawImage Castle,0,500
DrawImage Cannon,200,500
End Function

Function UpdateMenu()
DrawImage GameMenu,0,0
If MouseHit(1) And (MouseX() > 0 And MouseX() < 900)
If MouseY() > 0 And MouseY() < 700
Cls
StartNewGame()
EndIf
EndIf
End Function

Function AimControl()
  If KeyDown(200)
    Angle = Angle + 2
  EndIf

  If KeyDown(208)
    Angle = Angle - 2
  EndIf
End Function

Function UpdateProjectiles()
 For PX.projectile = Each projectile
   PX\dist = PX\dist + 1
   PX\y = PX\y + PX\yv#
   PX\x = PX\x + PX\xv#
     For A.attacker = Each attacker
       If ProjectileCollide(PX,A)
         A\hp = A\hp - PX\dmg
         FreeImage PX\img
         Delete PX
       EndIf
     Next
 Next
End Function

Function UpdateAttackers()
 If Attackers < 3
  A.attacker = New attacker
  A\typeA = Rand(0,1)
   Select A\typeA
    Case 0
      A\img = Knight
      A\hp = 2
      A\vx = -3
    Case 1
      A\img = Rammer
      A\hp = 5
      A\vx = -2
   End Select

   For B.Attacker = Each Attacker
      B\x = B\x + B\vx
       If B\hp < 1
         FreeImage B\img
         Delete B
         KILLS = KILLS + 1
       EndIf
   Next
 EndIf
End Function



Function UpdateLevel()
 MaxA = ((Level + 2)^2) * (2/3)
  If Lives < 0
   GameOverScreen()
   GAME_MODE = 2
   Cannons = 10
   Arrows = 25
   Lives = 10
   Angle = 0
   Attackers = 0
   Level = 1
  EndIf

  If Kills >= MaxA
   ShowLevelScreen(Level+1)
   Level = Level + 1
   Kills = 0
   Cannons = Cannons + Level
   Arrows = Arrows + (3/2) * Level
   Delay(3000)
   GameMode = 1
  EndIf

End Function


Function GameOverScreen()
 Cls
 HSData = OpenFile("HighScores.dat")
 A$ = Input("Name: ")
 WriteInt(HSData,Kills)
 WriteString(HSData,A$)
 CloseFile HSData
 Kills = 0
End Function


Function FireControl()
  If KeyHit(Asc("A"))
     If Arrows < 1
        Goto Ending
     EndIf
     A.Projectile = New Projectile
     A\dmg = 1
     A\img = Arrow
     A\typeP = 1
     A\xv# = GetXV#(Angle)
     A\yv# = GetYV#(Angle)
     A\x = 200
     A\y = 400
     .Ending
  EndIf
  If KeyHit(Asc("B"))
     If Cannons < 1
        Goto Ending2
     EndIf
     A.Projectile = New Projectile
     A\dmg = 3
     A\img = CannonBall
     A\typeP = 2
     A\xv# = GetXV#(Angle)
     A\yv# = GetYV#(Angle)
     A\x = 200
     A\y = 400
     .Ending2
  EndIf
End Function





Function ProjectileCollide(PR.Projectile,AT.attacker)

If ImagesOverlap(PR\img,PR\X,PR\Y,AT\img,AT\X,AT\Y)
Return True
EndIf

End Function



Function ShowLevelScreen(levelX)

DrawImage NextLevelMenu,0,0
Text "Level " + Level,450,350

End Function


Function GetXV#(ang#)
Return Cos#(ang#)
End Function

Function GETYV#(ang#)
Return Sin#(ang#)
End Function



puki(Posted 2006) [#2]
That link is interesting - when I click it it opens a copy of this thread.


jfk EO-11110(Posted 2006) [#3]
I think the webspace provider doesn't allow directlinking, and if you try it neverless, it will redirect you to the referrer, that's where you came from, from here. Try to use the RMB - save as...

Zach: use the CODE tags for sourcecode: (code)...(/code), replace () by [].


jfk EO-11110(Posted 2006) [#4]
Zach : it seems you mistyped "gamemode" in the function UpdateLevel(), should it be "Game_Mode" ?


REJLA(Posted 2006) [#5]
Try eliminating the *(2/3) first line in the UpdateLevel() function

replace the line with:
MaxA = ((Level + 2)^2)


Since the expression is an integer (2/3) doesn't return 0.66 but returns zero instead


Zach3D(Posted 2006) [#6]
Ok but now I have a problem.. It is extremely laggy after i start rotating the Cannon

Heres new code:

Graphics 900,700,32,2

Include "Timers.bb"   ;Ignore this I didnt even use it yet

Global Castle = LoadImage("Castle.jpg")
Global Cannon = LoadImage("Cannon.jpg")
Global CannonBall = LoadImage("CannonBall.jpg")
Global Arrow = LoadImage("Arrow.jpg")
Global Knight = LoadImage("Knight.jpg")
Global Rammer = LoadImage("Rammer.jpg")
Global GameMenu = LoadImage("Menu1.jpg")
Global NextLevelMenu = LoadImage("LevelMenu.jpg")

MaskImage Castle,255,0,0
MaskImage Cannon,255,0,0
MaskImage CannonBall,255,0,0
MaskImage Arrow,255,0,0
MaskImage Knight,255,0,0
MaskImage Rammer,255,0,0

Type Attacker
Field vx#,img,hp,typeA,x,y
End Type

Type Projectile
Field dmg,typeP,img,xv#,yv#,dist,x,y
End Type


Global CANNONS = 10
Global ARROWS = 25
Global Lives = 10
Global Angle = 0
Global Attackers = 0
Global Level = 1
Global MaxA = 0
Global KILLS = 0
Global GAME_MODE = 2
Global NotLoaded = False


While Not KeyHit(1)
Cls
If NotLoaded = False
CANNONS = 10
ARROWS = 25
Lives = 10
Angle = 0
Attackers = 0
Level = 1
MaxA = 0
KILLS = 0
GAME_MODE = 2
NotLoaded = True
EndIf
 Select GAME_MODE
  Case 1
      DrawScenery()
      AimControl()
      FireControl()
      UpdateAttackers()
      UpdateLevel()
      UpdateProjectiles()
  Case 2
      UpdateMenu()
;  Case 3
;      UpdateShopMenu()
 End Select
Flip
Wend

Function StartNewGame()


GAME_MODE    = 1

End Function


Function DrawScenery()
DrawImage Castle,0,500
DrawImage Cannon,200,500
For A.projectile = Each projectile
DrawImage A\img,A\x,A\y
Next
For B.attacker = Each attacker
DrawImage B\img,B\x,B\y
Next
End Function

Function UpdateMenu()
DrawImage GameMenu,0,0
If MouseHit(1) And (MouseX() > 0 And MouseX() < 900)
If MouseY() > 0 And MouseY() < 700
Cls
StartNewGame()
EndIf
EndIf
End Function

Function AimControl()
  If KeyDown(200)
    Angle = Angle + 2
  EndIf

  If KeyDown(208)
    Angle = Angle - 2
  EndIf

RotateImage Cannon,Angle
End Function

Function UpdateProjectiles()
 For PX.projectile = Each projectile
   PX\dist = PX\dist + 1
   PX\y = PX\y + PX\yv#
   PX\x = PX\x + PX\xv#
     For A.attacker = Each attacker
       If ProjectileCollide(PX,A)
         A\hp = A\hp - PX\dmg
         FreeImage PX\img
         Delete PX
       EndIf
     Next
 Next
End Function

Function UpdateAttackers()
 If Attackers < 3
  A.attacker = New attacker
  A\typeA = Rand(0,1)
  Attackers = Attackers + 1
   Select A\typeA
    Case 0
      A\img = CopyImage(Knight)
      A\hp = 2
      A\vx = -3
    Case 1
      A\img = CopyImage(Rammer)
      A\hp = 5
      A\vx = -2
   End Select

   For B.Attacker = Each Attacker
      B\x = B\x + B\vx
       If B\hp < 1
         FreeImage B\img
         Delete B
         KILLS = KILLS + 1
       EndIf
   Next
 EndIf
End Function



Function UpdateLevel()
 MaxA = ((Level + 2)^2)
  If Lives < 0
   GameOverScreen()
   GAME_MODE = 2
   Cannons = 10
   Arrows = 25
   Lives = 10
   Angle = 0
   Attackers = 0
   Level = 1
  EndIf

  If Kills >= MaxA
   ShowLevelScreen(Level+1)
   Level = Level + 1
   Kills = 0
   Cannons = Cannons + Level
   Arrows = Arrows + (3/2) * Level
   Delay(3000)
   Game_Mode = 1
  EndIf

End Function


Function GameOverScreen()
 Cls
 HSData = OpenFile("HighScores.dat")
 A$ = Input("Name: ")
 WriteInt(HSData,Kills)
 WriteString(HSData,A$)
 CloseFile HSData
 Kills = 0
End Function


Function FireControl()
  If KeyHit(Asc("A"))
     If Arrows < 1
        Goto Ending
     EndIf
     A.Projectile = New Projectile
     A\dmg = 1
     A\img = CopyImage(Arrow)
     A\typeP = 1
     A\xv# = GetXV#(Angle)
     A\yv# = GetYV#(Angle)
     A\x = 200
     A\y = 400
     .Ending
  EndIf
  If KeyHit(Asc("B"))
     If Cannons < 1
        Goto Ending2
     EndIf
     A.Projectile = New Projectile
     A\dmg = 3
     A\img = CopyImage(CannonBall)
     A\typeP = 2
     A\xv# = GetXV#(Angle)
     A\yv# = GetYV#(Angle)
     A\x = 200
     A\y = 400
     .Ending2
  EndIf
End Function





Function ProjectileCollide(PR.Projectile,AT.attacker)

If ImagesOverlap(PR\img,PR\X,PR\Y,AT\img,AT\X,AT\Y)
Return True
EndIf

End Function



Function ShowLevelScreen(levelX)

DrawImage NextLevelMenu,0,0
Text "Level " + Level,450,350

End Function


Function GetXV#(ang#)
Return Cos#(ang#)
End Function

Function GETYV#(ang#)
Return Sin#(ang#)
End Function




Ross C(Posted 2006) [#7]
I provided a solution to your timer post.