Verfasst: 08.02.2005 19:35
Wäre vielleicht nett, den Code zur Verfügung zu stellen, damit man mal gucken kann wie man sowas macht.
Gruss
Mipooh
Gruss
Mipooh
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