Problem mit Linked List

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Problem mit Linked List

Beitrag von DerMeister »

Hallo
Ich habe mal begonnen eine Art Tetris-Klon zu programmieren bin aber gleich am Anfang auf ein Problem gestoßen.
Zuerst klappt alles ganz normal, der Klotz bewegt sich nach unten, bis er unten angekommen ist und bleibt dort stehen, wenn aber dann ein neuer Klotz entstehen soll entstehen statt einem gleich unendlich viele neue Klötze, jedenfalls entsteht ein roter "Batzen" der immer länger wird, je weiter er sich nach unten bewegt.

Hier ist der Code:

Code: Alles auswählen

Structure brick
  PosX.l
  PosY.l
  Speed.l
  Stuck.l
EndStructure

Global NewList Brick.brick()

Procedure NewBrick(PosX,PosY,Speed,Stuck)
  AddElement(Brick())
  Brick()\PosX = PosX
  Brick()\PosY = PosY
  Brick()\Speed = Speed
  Brick()\Stuck = Stuck
EndProcedure

Global delay

InitSprite()
InitKeyboard()

OpenScreen(800,600,32,"Tetris")

Repeat
  ExamineKeyboard()
  ClearScreen(RGB(255,255,255))
    
  If delay = 0
    NewBrick(200,0,1,0)
    delay = 1
  EndIf
    
  Gosub display

  FlipBuffers()
  
  If KeyboardPushed(1)
    End
  EndIf  

Until KeyboardPushed(1)

display:
  StartDrawing(ScreenOutput())
  
  ResetList(Brick())
  While NextElement(Brick())
    ;Display
    Box(Brick()\PosX,Brick()\PosY,50,20,RGB(255,0,0))   
    ;Movement down
    If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
    EndIf
    If Brick()\PosY = 580
      Brick()\Stuck = 1
      delay = 0
    EndIf  
  ;Movement Left\Right
    If KeyboardPushed(#PB_Key_Right) And Brick()\Stuck = 0
      Brick()\PosX + 2
    ElseIf KeyboardPushed(#PB_Key_Left) And Brick()\Stuck = 0
      Brick()\PosX - 2
    EndIf    
  Wend    
  
  StopDrawing()   

Return
Vielleicht kann mir ja jemand sagen was ich falsch gemacht habe...
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: Problem mit Linked List

Beitrag von Kevin »

aus:

Code: Alles auswählen

    If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
    EndIf
    If Brick()\PosY = 580
      Brick()\Stuck = 1
      delay = 0
    EndIf 
muss

Code: Alles auswählen

   If Brick()\Stuck = 0
      Brick()\PosY + Brick()\Speed
      If Brick()\PosY = 580
        Brick()\Stuck = 1
        delay = 0
      EndIf 
  EndIf
werden weil er sonst wenn das Teil ankommt, und Stuck=1 ist, auch noch das delay auf 0 zurücksetz
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: Problem mit Linked List

Beitrag von gnasen »

Du prüfst, ob ein Stein unten angekommen ist, um dann den "delay switch" umzulegen. Soweit so gut. Nun prüfst du aber immer ob irgendein Stein unten angekommen ist und die Bedingung ist immer Wahr, wenn ersteinmal ein Stein unten angekommen ist.
Also müsstest du einen bereits platzierten Stein markieren, sodass dieser nichtmehr daraufhin geprüft wird, ob er so langsam mal unten ist (denn das ist er ja bereits)
pb 4.51
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Re: Problem mit Linked List

Beitrag von DerMeister »

Ah, OK Vielen Dank.
Die logischen Fehler sind immer die schlimmsten...
Antworten