Seite 3 von 3

Verfasst: 08.02.2005 19:35
von mipooh
Wäre vielleicht nett, den Code zur Verfügung zu stellen, damit man mal gucken kann wie man sowas macht.

Gruss
Mipooh

Verfasst: 08.02.2005 21:07
von Kekskiller
Eigentlich ist das Projekt schon abgeschlossen :| .
Aber von mir aus... Ich will aber nicht vollgelappt werden, falls irgendwer
ne bessere Lösung dafür hat... NAgut hier der Source:

Code: Alles auswählen

;Inits
InitSprite()
InitKeyboard()


;Sprite-Konstanten
Enumeration
  
  #alien1a
  #alien1b
  #alien2a
  #alien2b
  #alien3a
  #alien3b
    
  #explo
  #ship
  #shot
    
  #wall1
  #wall2
  
  #cursorright
  #cursorleft
  
  #speed1
  #speed2
  #speed3
  
  #size1
  #size2
  #size3
  
  #title
  
  #go
  #web
  
EndEnumeration


;Strukturen
Structure alien
  x.w
  y.w
  ani.b
  kind.b
  hits.b
EndStructure

Structure wall
  x.w
  y.w
  hits.b
EndStructure

Structure shot
  x.w
  y.w
  speed.b
EndStructure

Structure ship
  x.w
  y.w
  speed.b
  hits.b
EndStructure


;Alien-Eigenschaften
Dim aliens.alien(0,0)
Global AlienDirection
Global AlienSpeed
Global AlienDownSpeed
Global AlienUpdateSpeed ;geht bis 100
Global AlienUpdateCounter

Global AlienBorderXMin ;Begrenzung links
Global AlienBorderXMax ;Begrenzung rechts

Global AlienBlockHeight ;Blockhöhe
Global AlienBlockWidth ;Blockbreite
Global AlienDegree ;Abstand zwischen Aliens
Global AlienMaxHits ;wie lange die Explo-Animation dauert
Global AliensLeft ;wie viele Aliens noch

Global AliensWillWinY ;an welcher Y-Stelle die Aliens gewonnen haben
Global AlienAtFront ;ob sie Front berührt haben

Global AlienShotCounter
Global AlienShotRate

NewList shots.shot()

#type_alien1 = 0
#type_alien2 = 2
#type_alien3 = 4

Dim AlienTypeList(2)
AlienTypeList(0) = #type_alien1
AlienTypeList(1) = #type_alien2
AlienTypeList(2) = #type_alien3


;Spieler-Eigenschaften
Global player.ship
Global PlayerMaxHits
Global PlayerShotCounter
Global PlayerShotRate


;Wand-Eigenschaften
Dim walls.wall(0)

Global WallBlockWidth
Global WallDegree


;Deklarierungen
Declare DrawAliens()
Declare UpdateAliens()
Declare UpdateShip()
Declare DrawShip()
Declare UpdateShots()
Declare DrawShots()
Declare CreateShot(x, y, speed)
Declare UpdateWalls()
Declare DrawWalls()
Declare DrawBar(x,y, width,height, max.f,part.f, fore,back, center, vertikal)
Declare UseGameBoyFilter()
Declare MainMenu(menupos, gamespeed, gamesize)
Declare InitGame(gamespeed, gamesize)
Declare LoadSprites()
Declare Game()
Declare FreeSprites()


;Initialisierung
#window = 0

#ScreenWidth = 150
#ScreenHeight = 100

OpenWindow(#window, 0,0, 150,100, #PB_Window_TitleBar|#PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Ace Invaders")
OpenWindowedScreen(WindowID(), 0,0,150,100, 0, 0,0)


;Spiel starten
LoadSprites()
MainMenu(0, 1, 1)
End


;Prozeduren
Procedure LoadSprites()

  ;Sprites
  CatchSprite(#alien1a, ?alien1a)
  CatchSprite(#alien1b, ?alien1b)
  CatchSprite(#alien2a, ?alien2a)
  CatchSprite(#alien2b, ?alien2b)
  CatchSprite(#alien3a, ?alien3a)
  CatchSprite(#alien3b, ?alien3b)
  
  CatchSprite(#explo, ?explo)
  CatchSprite(#ship, ?ship)
  CatchSprite(#shot, ?shot)
  
  CatchSprite(#wall1, ?wall1)
  CatchSprite(#wall2, ?wall2)
  
  CatchSprite(#title, ?title)
  
  CatchSprite(#cursorright, ?cursorright)
  CatchSprite(#cursorleft, ?cursorleft)
  
  CatchSprite(#speed1, ?speed1)
  CatchSprite(#speed2, ?speed2)
  CatchSprite(#speed3, ?speed3)
  
  CatchSprite(#size1, ?size1)
  CatchSprite(#size2, ?size2)
  CatchSprite(#size3, ?size3)
  
  CatchSprite(#go, ?go)
  CatchSprite(#web, ?web)
  
EndProcedure

Procedure InitGame(gamespeed, gamesize)

  ;Alieninitialisierung
  AlienBorderXMin = 10
  AlienBorderXMax = 140
  
  Select gamespeed
    Case 0
      AlienUpdateSpeed = 80
    Case 1
      AlienUpdateSpeed = 86
    Case 2
      AlienUpdateSpeed = 92
  EndSelect
  
  AlienSpeed = 1
  AlienDownSpeed = 2
  AlienDirection = 0
  
  Select gamesize
    Case 0
      AlienBlockHeight = 3
      AlienBlockWidth = 8
    Case 1
      AlienBlockHeight = 4
      AlienBlockWidth = 10
    Case 2
      AlienBlockHeight = 5
      AlienBlockWidth = 12
  EndSelect
  
  AlienDegree = 2
  AlienMaxHits = 5
  AliensLeft = 0
  
  AliensWillWinY = 81
  AlienAtFront = 0
  
  AlienShotRate = 35
  
  Dim aliens.alien(AlienBlockWidth - 1,AlienBlockHeight - 1) ;12 * 3 aliens
  
  alienstartx = 150 / 2 - ( (SpriteHeight(#alien1a) + AlienDegree) * (AlienBlockWidth) / 2 )
  alienstarty = 5
  
  alientype = 2
  
  For zy = 0 To AlienBlockHeight - 1
  
    If alientype >= 2
      alientype = 0
    Else
      alientype + 1
    EndIf
    
    For zx = 0 To AlienBlockWidth - 1
      aliens(zx,zy)\x = alienstartx + (SpriteWidth(#alien1a) + AlienDegree) * zx
      aliens(zx,zy)\y = alienstarty + (SpriteHeight(#alien1a) + AlienDegree) * zy
      aliens(zx,zy)\ani = 0
      aliens(zx,zy)\kind = AlienTypeList(alientype)
      aliens(zx,zy)\hits = 0
    Next
    
  Next
  
  
  ;Spieler-Initialisierung
  PlayerMaxHits = 5
  player\hits = PlayerMaxHits
  
  player\x = 150 / 2
  player\y = 87
  
  player\speed = 1
  PlayerShotRate = 75
  
  
  ;Wand-Initialisierung
  WallBlockWidth = 6
  WallDegree = 15
  
  Dim walls.wall(WallBlockWidth - 1)
  
  wallstartx = 150 / 2 - ( (SpriteHeight(#wall1) + WallDegree) * (WallBlockWidth + 1) / 2 )
  wallstarty = 80
  
  For zx = 0 To WallBlockWidth - 1
    walls(zx)\x = wallstartx + (SpriteWidth(#wall1) + WallDegree) * zx
    walls(zx)\y = wallstarty
    walls(zx)\hits = 0
  Next
  
EndProcedure

Procedure Game()
  
  Protected gameevent
  gameevent = 0
  
  ClearList(shots())
  
  Repeat
    
    If AliensLeft = AlienBlockWidth * AlienBlockHeight
      Delay(25)
      gameevent = 1
    ElseIf player\hits <= 0
      Delay(25)
      gameevent = 1
    ElseIf AlienAtFront = 1
      Delay(25)
      gameevent = 1
    EndIf
    
    ExamineKeyboard()
    UpdateWalls()
    UpdateShots()
    UpdateAliens()
    UpdateShip()
    event = WindowEvent()
    
    ClearScreen(0, 0, 0)
      DrawAliens()
      DrawShip()
      DrawShots()
      DrawWalls()
      StartDrawing(ScreenOutput())
        DrawBar(2,96, 25,2, 5,player\hits, RGB(255,255,255),RGB(128,128,128), 0, 0)
        aliens = AlienBlockWidth * AlienBlockHeight
        DrawBar(29,96, 119,2, aliens,aliens - AliensLeft, RGB(255,255,255),RGB(128,128,128), 0, 0)
      StopDrawing()
    FlipBuffers()
    
    Delay(1)
  Until KeyboardReleased(#PB_Key_Escape) Or event = #PB_Event_CloseWindow Or gameevent <> 0
  
  If event = #PB_Event_CloseWindow
    FreeSprites()
    CloseScreen()
    CloseWindow(#window)
    End
  EndIf
  
EndProcedure

Procedure DrawAliens()
  For zy = 0 To AlienBlockHeight - 1
    For zx = 0 To AlienBlockWidth - 1
      If aliens(zx,zy)\hits < AlienMaxHits
        Select aliens(zx,zy)\hits
          Case 0
            DisplayTransparentSprite(aliens(zx,zy)\kind + aliens(zx,zy)\ani, aliens(zx,zy)\x, aliens(zx,zy)\y)
          Default 
            DisplayTransparentSprite(#explo, aliens(zx,zy)\x, aliens(zx,zy)\y)
        EndSelect
      EndIf
    Next
  Next
EndProcedure

Procedure UpdateAliens()

  change_aliendir_to = AlienDirection
  shotisgone = 0
  
  For zy = 0 To AlienBlockHeight - 1
    For zx = 0 To AlienBlockWidth - 1
      If AlienUpdateCounter >= 100 - AlienUpdateSpeed ;wenn Counter zuende gezählt
        If aliens(zx,zy)\hits = 0 ;nur wenn nicht getroffen
        
          Select AlienDirection
            Case 0
              aliens(zx,zy)\x + AlienSpeed
              If aliens(zx,zy)\x + SpriteWidth(#alien1a) >= AlienBorderXMax ;falls an rechtem Rand, Richtung ändern
                change_aliendir_to = 1
              EndIf
            Case 1
              aliens(zx,zy)\x - AlienSpeed
              If aliens(zx,zy)\x <= AlienBorderXMin ;falls an linkem Rand, Richtung ändern
               change_aliendir_to = 0
              EndIf
          EndSelect
          
          If aliens(zx,zy)\y + SpriteWidth(#wall1) >= AliensWillWinY
            AlienAtFront = 1
          EndIf
          
        EndIf
        aliens(zx,zy)\ani = 1 - aliens(zx,zy)\ani ;animieren
      EndIf
      
      If AlienShotCounter >= 100 - AlienShotRate And shotisgone = 0 And aliens(zx,zy)\hits = 0 ;falls noch nicht geschossen und selbst nicht tod
        If SpriteCollision(#ship, player\x, 0, #alien1a, aliens(zx,zy)\x, 0)
          If zy = AlienBlockHeight - 1
            CreateShot(aliens(zx,zy)\x + SpriteWidth(#alien1a) / 2 - 1, aliens(zx,zy)\y + SpriteWidth(#alien1a), 1)
            shotisgone = 1
          Else
            locked = 0 ;zählt lebende Aliens unter aktuellem Alien
            For azy = zy + 1 To AlienBlockHeight - 1
              If aliens(zx,azy)\hits = 0
                locked + 1
              EndIf
            Next
            If locked = 0 ;falls keine Aliens unter aktuellem Alien
              CreateShot(aliens(zx,zy)\x + SpriteWidth(#alien1a) / 2 - 1, aliens(zx,zy)\y + SpriteWidth(#alien1a), 1)
              shotisgone = 1
            EndIf
          EndIf
        EndIf
        
      EndIf
      
      If aliens(zx,zy)\hits > 0 And aliens(zx,zy)\hits < AlienMaxHits
        aliens(zx,zy)\hits + 1
      EndIf
      If aliens(zx,zy)\hits = 0
        ForEach shots()
          If SpriteCollision(#shot, shots()\x, shots()\y, #alien1a, aliens(zx,zy)\x, aliens(zx,zy)\y)
            aliens(zx,zy)\hits + 1 ;falls getroffen dann Trefferanimation hochzählen
            AliensLeft + 1
            DeleteElement(shots())
          EndIf
        Next
      EndIf
    Next
  Next
  
  If AlienShotCounter >= 100 - AlienShotRate
    AlienShotCounter = 0
  EndIf
  AlienShotCounter + 1
  
  If AlienUpdateCounter >= 100 - AlienUpdateSpeed
    AlienUpdateCounter = 0 ;zurücksetzen
  Else
    AlienUpdateCounter + 1
  EndIf
  If change_aliendir_to <> AlienDirection
    For zx = 0 To AlienBlockWidth - 1
      For zy = 0 To AlienBlockHeight - 1
        aliens(zx,zy)\y + AlienDownSpeed
      Next
    Next
    AlienDirection = change_aliendir_to ;Richtung ändern, falls notwendig
  EndIf
EndProcedure

Procedure UpdateShip()
  If player\hits > 0
    If KeyboardPushed(#PB_Key_Right)
      player\x + player\speed
      If player\x + SpriteWidth(#ship) > AlienBorderXMax
        player\x = AlienBorderXMax - SpriteWidth(#ship)
      EndIf
    ElseIf KeyboardPushed(#PB_Key_Left)
      player\x - player\speed
      If player\x < AlienBorderXMin
        player\x = AlienBorderXMin
      EndIf
    EndIf
    If KeyboardPushed(#PB_Key_Space) And PlayerShotCounter >= 100 - PlayerShotRate
      CreateShot(player\x + SpriteWidth(#ship) / 2 - 1, player\y, -2)
      PlayerShotCounter = 0
    Else
      PlayerShotCounter + 1
    EndIf
  EndIf
EndProcedure

Procedure DrawShip()
  Select player\hits
    Case 0
      DisplayTransparentSprite(#explo, player\x, player\y)
    Default
      DisplayTransparentSprite(#ship, player\x, player\y)
  EndSelect
EndProcedure

Procedure UpdateShots()
  ForEach shots()
    del = 0
    shots()\y + shots()\speed
    If shots()\y <= 0
      del = 1
    ElseIf shots()\y >= 100
      del = 1
    EndIf
    If SpriteCollision(#shot, shots()\x, shots()\y, #ship, player\x, player\y) And player\hits > 0
      player\hits - 1
      del = 1
    EndIf
    If del = 1
      DeleteElement(shots())
    EndIf
  Next
EndProcedure

Procedure DrawShots()
  ForEach shots()
    DisplayTransparentSprite(#shot, shots()\x, shots()\y)
  Next
EndProcedure

Procedure CreateShot(x, y, speed)
  AddElement(shots())
  shots()\x = x
  shots()\y = y
  shots()\speed = speed
EndProcedure

Procedure UpdateWalls()
  For zx = 0 To WallBlockWidth - 1
    If walls(zx)\hits < 2
      ForEach shots()
        If SpriteCollision(#shot, shots()\x, shots()\y, #wall1, walls(zx)\x, walls(zx)\y)
          walls(zx)\hits + 1 ;falls getroffen dann Trefferanimation hochzählen
          DeleteElement(shots())
        EndIf
      Next
    EndIf
  Next
EndProcedure

Procedure DrawWalls()
  For zx = 0 To WallBlockWidth - 1
    If walls(zx)\hits < 2
      Select walls(zx)\hits
        Case 0
          DisplayTransparentSprite(#wall1, walls(zx)\x, walls(zx)\y)
        Case 1
          DisplayTransparentSprite(#wall2, walls(zx)\x, walls(zx)\y)
      EndSelect
    EndIf
  Next
EndProcedure

Procedure DrawBar(x,y, width,height, max.f,part.f, fore,back, center, vertikal)
  If center = 1
    x = x - (width / 2)
    y = y - (height / 2)
  EndIf
  
  If x <= 0 : x = 0 : EndIf
  If y <= 0 : y = 0 : EndIf
  
  If x + width >= #ScreenWidth-1
    x = #ScreenWidth-1 - width
  EndIf
  If y + height >= #ScreenHeight-1
    y = #ScreenHeight-1 - height
  EndIf
  
  Select vertikal
    Case 0
      partw = (part * width) / max
      Box(x,y, width,height, back)
      Box(x,y, partw,height, fore)
    Case 1
      parth = (part * height) / max
      Box(x,y, width,height, back)
      Box(x,y, width,parth, fore)
  EndSelect
EndProcedure

Procedure MainMenu(menupos, gamespeed, gamesize)

  Protected titlex, textx, cursor1x, cursor2x
  Protected leftlocked, rightlocked
  
  titlex = 150 / 2 - SpriteWidth(#title) / 2
  textx = 150 / 2 - SpriteWidth(#speed1) / 2
  cursor1x = textx - SpriteWidth(#cursorleft)
  cursor2x = textx + SpriteWidth(#speed1)
  
  Repeat
    
    ExamineKeyboard()
    event = WindowEvent()
    
    If KeyboardReleased(#PB_Key_Down)
      If menupos < 2
        menupos + 1
      EndIf
    ElseIf KeyboardReleased(#PB_Key_Up)
      If menupos > 0
        menupos - 1
      EndIf
    ElseIf KeyboardReleased(#PB_Key_Right)
      Select menupos
        Case 0
          If gamespeed < 2
            gamespeed + 1
          EndIf
        Case 1
          If gamesize < 2
            gamesize + 1
          EndIf
      EndSelect
    ElseIf KeyboardReleased(#PB_Key_Left)
      Select menupos
        Case 0
          If gamespeed > 0
            gamespeed - 1
          EndIf
        Case 1
          If gamesize > 0
            gamesize - 1
          EndIf
      EndSelect
    EndIf
    
    Select menupos
    
      Case 0
        If gamespeed = 0
          leftlocked = 1
        Else
          leftlocked = 0
        EndIf
    
        If gamespeed = 2
          rightlocked = 1
        Else
          rightlocked = 0
        EndIf
        
      Case 1
        If gamesize = 0
          leftlocked = 1
        Else
          leftlocked = 0
        EndIf
    
        If gamesize = 2
          rightlocked = 1
        Else
          rightlocked = 0
        EndIf
        
      Case 2
        rightlocked = 0
        leftlocked = 0
        
    EndSelect
    
    If KeyboardReleased(#PB_Key_Space)
      If menupos = 2
        InitGame(gamespeed, gamesize)
        Game()
      EndIf
    EndIf
    
    ClearScreen(0, 0, 0)
      
      DisplayTransparentSprite(#title, titlex, 20)
      
      DisplayTransparentSprite(#speed1 + gamespeed, textx, 55)
      DisplayTransparentSprite(#size1 + gamesize, textx, 63)
      DisplayTransparentSprite(#go, textx, 71)
      
      If leftlocked = 0
        DisplayTransparentSprite(#cursorright, cursor1x, 55 + 8 * menupos)
      EndIf
      
      If rightlocked = 0
        DisplayTransparentSprite(#cursorleft, cursor2x, 55 + 8 * menupos)
      EndIf
      
    FlipBuffers()
    
  Until KeyboardReleased(#PB_Key_Escape) Or event = #PB_Event_CloseWindow
  
  If event <> #PB_Event_CloseWindow
    
    websitex = 150 / 2 - SpriteWidth(#web) / 2
    websitey = 100 / 2 - SpriteHeight(#web) / 2
    
    Repeat
      event = WindowEvent()
      ExamineKeyboard()
      ClearScreen(0, 0, 0)
        DisplayTransparentSprite(#web, websitex, websitey)
      FlipBuffers()
    Until KeyboardReleased(#PB_Key_Escape) Or KeyboardReleased(#PB_Key_Space) Or event = #PB_Event_CloseWindow
    
  EndIf
  
  FreeSprites()
  CloseScreen()
  CloseWindow(#window)
  End
  
EndProcedure

Procedure FreeSprites()
  
  ;Sprites
  FreeSprite(#alien1a)
  FreeSprite(#alien1b)
  FreeSprite(#alien2a)
  FreeSprite(#alien2b)
  FreeSprite(#alien3a)
  FreeSprite(#alien3b)
  
  FreeSprite(#explo)
  FreeSprite(#ship)
  FreeSprite(#shot)
  
  FreeSprite(#wall1)
  FreeSprite(#wall2)
  
  FreeSprite(#title)
  
  FreeSprite(#cursorright)
  FreeSprite(#cursorleft)
  
  FreeSprite(#speed1)
  FreeSprite(#speed2)
  FreeSprite(#speed3)
  
  FreeSprite(#size1)
  FreeSprite(#size2)
  FreeSprite(#size3)
  
  FreeSprite(#go)
  FreeSprite(#web)
  
EndProcedure


DataSection
  
  alien1a: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien1a.bmp"
  alien1b: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien1b.bmp"
  alien2a: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien2a.bmp"
  alien2b: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien2b.bmp"
  alien3a: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien3a.bmp"
  alien3b: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\alien3b.bmp"
  
  explo: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\explo.bmp"
  ship: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\ship.bmp"
  shot: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\shot.bmp"
  
  wall1: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\wall1.bmp"
  wall2: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\wall2.bmp"
  
  title: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\title.bmp"
  
  cursorright: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\cursorright.bmp"
  cursorleft: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\cursorleft.bmp"
  
  speed1: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\speed1.bmp"
  speed2: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\speed2.bmp"
  speed3: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\speed3.bmp"
  
  size1: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\size1.bmp"
  size2: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\size2.bmp"
  size3: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\size3.bmp"
  
  go: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\go.bmp"
  web: IncludeBinary "C:\Eigene Dateien\PureBasic\AceInvaders\web.bmp"
  
EndDataSection
Hochladen will ich nicht schon wieder was, betteln ist so elend...

Verfasst: 09.02.2005 13:10
von hardfalcon
Wieso musst du betteln, um was hochladen zu können?
Ich würde dir gerne (Web)space auf meinem Webspace bei cybton.com zur Verfügung stellen (momentan 100MB, kann aber noch gut ausgebaut werden), aber ich finde einfach kein gescheites PHP Upload-SCript, das eine Benutzerverwaltung hat und auch mit SafeMode=1 läuft.

Verfasst: 09.02.2005 19:35
von Kekskiller
Danke, danke, das war aber nur so ein Spruch, hab das über Blitz-
Pasting gemacht (ne Seite), das fällt bei mir unter betteln :wink: .

Verfasst: 11.02.2005 16:08
von Lebostein
Warum machst du dir die Mühe mit den FreeSprites? Soviel ich weiß entfernt PB automatisch alle Sprites bei Programmende.

Verfasst: 11.02.2005 19:28
von Kekskiller
Ist so eine dumme Angewohnheit, hab ich mir angewöhnt, als ich noch nicht
viel Ahnung von Sprites und Speicher hatte. Finde es jedenfalls besser, da
ich nicht weiß, ob wirklich alles, was ich erstelle auch wirklich gelöscht wird.
Als Vorsatz für spätere Angelegenheiten in anderen Sprachen behalte ich
das bei.