Ich bin gerade dabei ein kleines Spiel zu programmieren und habe nun Probleme den Hintergrund zu bewegen. Ich habe schon einige Beispiel-Codes ausprobiert, nur funktioniert es nicht so wirklich. Ich habe es schon geschafft dass sich der Hintergrund bewegt, aber dann funktioniert die Kollisions-Abfrage nicht mehr.
Ich hoffe jemand kann mir helfen.
Hier der Code:
Code: Alles auswählen
Global quit = #False
Global spielerx
Global spielery
Global schwerkraft = 5
Global sprung = #False
Global boden
Global n
Global m
Global r
Global maxRadius = 5
Global xE
Global yE
Global block.s
Global aktSlot
Global karte
Enumeration
#Slot
#Rahmen
#Spieler
#Mouse
#Blocklist
EndEnumeration
Structure Eigenschaften
name.s
moveable.i ;0 - Nicht durchquerbar;1 - Normal;2 - Langsam Durchquerbar;
sprite.i ;#Block_...
ntool.i ;0 - Unbreakable;1 - Spitzhacke;2 - Axt;3 - Harke;4 - Schaufel;5 - Kübel;
lvltool.i ;0 - Unbreakable;1 - Holz;2 - Stein;3 - Eisen;4 - Gold;
breaktime.l ;0 - Unbreakable;... sec;
maxstacks.i ;64?
EndStructure
Structure Ieig
ID.i
Menge.i
EndStructure
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Can't open screen & sprite enviroment!", 0)
End
EndIf
;------ Lade Blöcke ------;
If ReadFile(#Blocklist, "Blocks/Blocklist.txt")
While Eof(#Blocklist) = 0
r+1
ReadString(#Blocklist)
Wend
CloseFile(#Blocklist)
r - 1
Else
MessageRequester("Information","Konnte Datei nicht öffnen!")
EndIf
Global Dim Block.Eigenschaften(r) ;Anzahl Blöcke
;------ Karte Generieren ------;
Global Dim Spielfeld(200,200) ;X-Koordinate,Y-Koordinate
Global Dim Inventar.Ieig(9) ;Slot
For i = 0 To 9
Inventar(i)\ID = 0
Inventar(i)\Menge = 0
Next
Procedure Generate()
hoehe = Random(30) + 20
For x = 0 To 200
richtung = Random(1)
nHoehe = Random(2)
If richtung = 0
nHoehe * -1
EndIf
hoehe + nHoehe ; nächste Hoehe festegelgt
If hoehe < 0
hoehe = 0
ElseIf hoehe > 45
hoehe = 45
EndIf
For y = 45 To hoehe Step -1 ; Block = Erde
Spielfeld(x,y) = 1
Next
For y = hoehe To 0 Step -1 ; Block = Luft
Spielfeld(x,y) = 0
Next
Next
Repeat
i = Random(99)
j = Random(49)
If Not Spielfeld(i, j) = 0
Spielfeld(i, j) = 2
l + 1
EndIf
Until l = 200
EndProcedure
Generate()
If OpenWindow(0, 0, 0, 1600, 900, "XMG", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0), 0, 0, 1600, 900)
;------ Sprites ------;
CreateSprite(1000, 3, 3) ;Mouse
If StartDrawing(SpriteOutput(1000))
Box(0, 0, 3, 3, RGB(0, 0, 255))
Box(1, 1, 1, 1, RGB(255, 0, 0))
StopDrawing()
EndIf
CreateSprite(999, 24, 50) ;Spieler
If StartDrawing(SpriteOutput(999))
FillArea(0,0,RGB(255,0,0))
StopDrawing()
EndIf
CreateSprite(998, 30, 30) ;Slot
If StartDrawing(SpriteOutput(998))
Box(0, 0, 24, 24, RGB(0, 0, 0))
StopDrawing()
EndIf
CreateSprite(997, 34, 34)
If StartDrawing(SpriteOutput(997)) ;Rahmen
Box(0, 0, 34, 34, RGB(255, 255, 0))
Box(2, 2, 30, 30, RGB(0, 0, 0))
StopDrawing()
EndIf
CreateSprite(901, 20, 20)
If StartDrawing(SpriteOutput(901)) ;1
DrawText(0, 0, "1")
StopDrawing()
EndIf
CreateSprite(902, 20, 20)
If StartDrawing(SpriteOutput(902)) ;2
DrawText(0, 0, "2", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(903, 20, 20)
If StartDrawing(SpriteOutput(903)) ;3
DrawText(0, 0, "3", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(904, 20, 20)
If StartDrawing(SpriteOutput(904)) ;4
DrawText(0, 0, "4", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(905, 20, 20)
If StartDrawing(SpriteOutput(905)) ;5
DrawText(0, 0, "5", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(906, 20, 20)
If StartDrawing(SpriteOutput(906)) ;6
DrawText(0, 0, "6", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(907, 20, 20)
If StartDrawing(SpriteOutput(907)) ;7
DrawText(0, 0, "7", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(908, 20, 20)
If StartDrawing(SpriteOutput(908)) ;8
DrawText(0, 0, "8", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(909, 20, 20)
If StartDrawing(SpriteOutput(909)) ;9
DrawText(0, 0, "9", RGB(255, 255, 255))
StopDrawing()
EndIf
CreateSprite(900, 20, 20)
If StartDrawing(SpriteOutput(900)) ;0
DrawText(0, 0, "0", RGB(255, 255, 255))
StopDrawing()
EndIf
;------ Blockeigenschaften ------;
ReadFile(99, "Blocks/Blocklist.txt")
For u = 0 To r
block = ReadString(99)
ReadFile(u, "Blocks/Block_" + block + ".txt")
Block(u)\name = block
Block(u)\moveable = Val(ReadString(u))
LoadSprite(u, ReadString(u))
Block(u)\sprite = u
Block(u)\ntool = Val(ReadString(u))
Block(u)\lvltool = Val(ReadString(u))
Block(u)\breaktime = Val(ReadString(u))
Block(u)\maxstacks = Val(ReadString(u))
CloseFile(u)
Next
CloseFile(99)
EndIf
EndIf
Procedure CheckInventarAdd(ID)
For i = 0 To 9
If Inventar(i)\ID = 0
Inventar(i)\ID = ID
Inventar(i)\Menge = 1
Break
ElseIf Inventar(i)\ID = ID
If Inventar(i)\Menge < Block(Inventar(i)\ID)\maxstacks
Inventar(i)\Menge + 1
Break
EndIf
EndIf
Next
EndProcedure
Procedure DrawInventar()
For i = 0 To 9
DisplaySprite(998, i*32 + 10, 10)
Next
DisplaySprite(997, aktSlot*32 + 8, 8)
For i = 0 To 9
If Not Inventar(i)\ID = 0
DisplaySprite(Inventar(i)\ID, i*32 + 15, 15)
If Inventar(i)\Menge < 10
DisplayTransparentSprite(Inventar(i)\Menge + 900, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 9 And Inventar(i)\Menge < 20
DisplayTransparentSprite(901, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-10, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 19 And Inventar(i)\Menge < 30
DisplayTransparentSprite(902, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-20, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 29 And Inventar(i)\Menge < 40
DisplayTransparentSprite(903, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-30, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 39 And Inventar(i)\Menge < 50
DisplayTransparentSprite(904, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-40, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 49 And Inventar(i)\Menge < 60
DisplayTransparentSprite(905, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-50, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 59 And Inventar(i)\Menge < 70
DisplayTransparentSprite(906, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-60, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 69 And Inventar(i)\Menge < 80
DisplayTransparentSprite(907, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-70, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 79 And Inventar(i)\Menge < 90
DisplayTransparentSprite(908, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-80, i*32 + 29, 24)
ElseIf Inventar(i)\Menge > 89 And Inventar(i)\Menge < 100
DisplayTransparentSprite(909, i*32 + 22, 24)
DisplayTransparentSprite((Inventar(i)\Menge + 900)-90, i*32 + 29, 24)
EndIf
StopDrawing()
EndIf
Next
EndProcedure
Procedure DrawMap()
For x = 0 To 1580 Step 20
For y = 0 To 880 Step 20
DisplaySprite(Block(Spielfeld(x/20,y/20))\sprite, x, y)
Next
Next
EndProcedure
Procedure AbfrageOnGround()
If Block(Spielfeld(spielerx/20, spielery/20))\moveable = 0 Or Block(Spielfeld((spielerx+24)/20, spielery/20))\moveable = 0
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure Gravitation()
If Block(Spielfeld(spielerx/20, (spielery + schwerkraft)/20))\moveable = 1 And Block(Spielfeld((spielerx + 24)/20, (spielery + schwerkraft)/20))\moveable = 1
spielery + schwerkraft
If m = 0
If schwerkraft < 10
schwerkraft + 1
EndIf
Else
m - 1
EndIf
n = 1
Else
If n = 1
h = (spielery/20+1)*20
spielery = h
n = 0
EndIf
If schwerkraft > 0
schwerkraft = 0
EndIf
EndIf
If schwerkraft < 0
spielery + schwerkraft
EndIf
DisplaySprite(999, spielerx, spielery - 50)
DisplaySprite(1000, MouseX(), MouseY())
EndProcedure
Procedure Keys()
;------ Mouse ------;
ExamineMouse()
If MouseButton(#PB_MouseButton_Left)
xE = (MouseX() - (spielerx + 12))/20
If xE < 0
xE * -1
EndIf
yE = (MouseY() - (spielery - 25))/20
If yE < 0
yE * -1
EndIf
If (xE + yE) < maxRadius
CheckInventarAdd(Spielfeld(MouseX()/20, MouseY()/20))
Spielfeld(MouseX()/20, MouseY()/20) = 0
EndIf
EndIf
;------ Keyboard ------;
ExamineKeyboard()
If KeyboardPushed(#PB_Key_D)
If Not Block(Spielfeld((spielerx+25)/20, (spielery-1)/20))\moveable = 0 And Not Block(Spielfeld((spielerx+25)/20, (spielery-21)/20))\moveable = 0 And Not Block(Spielfeld((spielerx+25)/20, (spielery-41)/20))\moveable = 0
spielerx + 5
EndIf
EndIf
If KeyboardPushed(#PB_Key_A)
If Not Block(Spielfeld((spielerx-1)/20, (spielery-1)/20))\moveable = 0 And Not Block(Spielfeld((spielerx-1)/20, (spielery-21)/20))\moveable = 0 And Not Block(Spielfeld((spielerx-1)/20, (spielery-41)/20))\moveable = 0
spielerx - 5
EndIf
EndIf
If KeyboardPushed(#PB_Key_W)
If AbfrageOnGround() = #True
schwerkraft = - 5
m = 10
EndIf
EndIf
If KeyboardPushed(#PB_Key_1)
aktSlot = 0
ElseIf KeyboardPushed(#PB_Key_2)
aktSlot = 1
ElseIf KeyboardPushed(#PB_Key_3)
aktSlot = 2
ElseIf KeyboardPushed(#PB_Key_4)
aktSlot = 3
ElseIf KeyboardPushed(#PB_Key_5)
aktSlot = 4
ElseIf KeyboardPushed(#PB_Key_6)
aktSlot = 5
ElseIf KeyboardPushed(#PB_Key_7)
aktSlot = 6
ElseIf KeyboardPushed(#PB_Key_8)
aktSlot = 7
ElseIf KeyboardPushed(#PB_Key_9)
aktSlot = 8
ElseIf KeyboardPushed(#PB_Key_0)
aktSlot = 9
EndIf
EndProcedure
Repeat
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_CloseWindow
quit = #True
EndSelect
Until Event = 0
FlipBuffers()
ClearScreen(RGB(0, 0, 0))
DrawMap()
Keys()
DrawInventar()
Gravitation()
Delay(1)
Until quit = #True