Bei Spiel Hintergrund Scrollen

Anfängerfragen zum Programmieren mit PureBasic.
TheNewOne
Beiträge: 60
Registriert: 06.04.2011 14:33

Bei Spiel Hintergrund Scrollen

Beitrag von TheNewOne »

Hey Leute,
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
Win7, 64bit, PB 4.60
Benutzeravatar
Little Progger
Beiträge: 43
Registriert: 21.04.2010 10:05
Computerausstattung: 2,8 gHz Dual core
Geforce 9800GT Green Edition
500GB SATA
Wohnort: Daheim
Kontaktdaten:

Re: Bei Spiel Hintergrund Scrollen

Beitrag von Little Progger »

Eins vorneweg: Um die Uhrzeit war ich zu müde um den Code sorgfältig zu studieren und habs lieber sein lassen aber vielleicht bringen dir die Tipps ja trotzdem was.

Gib doch den Dingern, die sich im Hintergrund bewegen sollen, einfach ein Offset. D.h. jeweils den x und y Koordinaten mit nem globalen XOffset und YOffset addieren. So veränderst du zumindest die eigentlichen XY Werte der Dinge nicht (was dann auch bei der Kollisionsabfrage erheblich leichter sein sollte (?))
Wär cool, wenn du sagst wo genau du die Kollision abfragst.

Ach ja und ich würd mal die globals ein bisschen mehr deklarieren, sonst sind das alles integer. (und bei spielerx und y würde mir double oder float sinnvoller erscheinen).
Antworten