Seite 1 von 1

Linked List

Verfasst: 21.10.2006 19:29
von Thomas
Hi,
ich krig die Kriese...
Ich find meinen Fehler einfach nicht!

Also ich helfe zurzeit einem Freund (Totalanfänger) bei seinem Ersten Spiel.
Das mit den Fischen war seine Idee, also sagt bitte nichts dazu.

Ich krig das einfach nicht hin, das die Fische in die Liste "geladen" (oder wie man dazu sagt) und dann wieder ausgelesen und angezeigt werden und von links nach rechts über den Bilschirm "schwimmen"
(Ich hab sowas schon öfter geschrieben, aber diesmal hauts einfach nicht hin.)

Bestimmt ist das Problem ganz einfach und ich sehe es wieder mal viel zu kompliziert.

Also Schaut euch den Code mal an.

Danke!

Code: Alles auswählen

;**********-Sprite, Tastatur, Maus, Sprite3D initialisieren-**********

If InitSprite() = 0
  MessageRequester("Fehler (Sprite)", "Konnte DirectX nicht finden", 0)
  End
EndIf

If InitSprite3D() = 0
  MessageRequester("Fehler (3D)", "Konnte DirectX nicht finden", 0)
  End
EndIf

If InitKeyboard() = 0
  MessageRequester("Fehler (Keyboard)", "Konnte DirectX nicht finden", 0)
  End
EndIf

If InitMouse() = 0
  MessageRequester("Fehler (Mouse)", "Konnte DirectX nicht finden", 0)
  End
EndIf

;**********-Konstanten, Variablen werte zuweisen-**********

#ScreenWidth  = 800
#ScreenHeight = 600

Global FullScreen.l
Global BootPosition.l
Global BootSpeed.l
Global FischSpeed.l

BootPosition = 250
BootSpeed = 4
FischSpeed = 2

;**********-Auswahlfenster für Optionen-**********

Procedure startfenster()

  If OpenWindow(0,(getsystemmetrics_(#SM_CXSCREEN)/2)-(200/2),(getsystemmetrics_(#SM_CYSCREEN)/2)-(140/2),200,140,#PB_WINDOW_SYSTEMMENU,"Wähle Bildschirmmodus")
    If CreateGadgetList(WindowID())
      ButtonGadget(1, 10,  10, 180, 30, "Vollbild"    )
      ButtonGadget(2, 10,  50, 180, 30, "Fenstermodus")
      ButtonGadget(3, 10, 100, 180, 30, "Beenden"     )
    EndIf

    Repeat

      EventID.l = WaitWindowEvent()

      If EventID = #PB_EventGadget
        Select EventGadgetID()
          Case 1
            FensterSchliessen = 1
            FullScreen = 1
          Case 2
            FensterSchliessen = 1
            FullScreen = 0
          Case 3
            End
        EndSelect
      EndIf    

      If EventID = #PB_Event_CloseWindow
        End
      EndIf

    Until FensterSchliessen = 1

    CloseWindow(0)
  EndIf

EndProcedure

;**********-Eigenschaften der Fische abspeichern (Liste)-**********

Structure F
  Sp.l
  X.l
  Y.l
  A.l
EndStructure
NewList F.F()
Procedure Newfisch(Sprite, PositionX, PositionY, Activiert)
  AddElement(F())
  Sp.l = Sprite                                   ;Welches Sprite der Fisch hat
  X.l = PositionX                                 ;X-Position des Fisches
  Y.l = PositionY                                 ;Y-Position des Fisches
  A.l = Activiert                                 ;ob der Fisch mit dem Angelhaken zusammenstößt
EndProcedure

;**********-Grafiken laden-**********

Procedure loadGraphics()

  LoadSprite( 1, "Grafik\Hintergrund.bmp", 0)
  LoadSprite( 2, "Grafik\Boot.bmp", 0)
  LoadSprite( 5, "Grafik\Angel.bmp", 0)
  LoadSprite( 6, "Grafik\Haken.bmp", 0)
  LoadSprite(10, "Grafik\Fisch 1.bmp", 0)
  LoadSprite(11, "Grafik\Fisch 2.bmp", 0)
  LoadSprite(12, "Grafik\Fisch 3.bmp", 0)
  LoadSprite(13, "Grafik\Fisch 4.bmp", 0)
  LoadSprite(14, "Grafik\Hai.bmp", 0)

EndProcedure

;**********-Sprites anzeigen-**********

Procedure displayGraphics()

  DisplaySprite(1, 0, 0)
  
  DisplayTransparentSprite(2, BootPosition, 350)

  ResetList(F())
  While NextElement(F())
    DisplayTransparentSprite(F()\Sp, F()\X, F()\Y)
  Wend
EndProcedure

;**********-Alle funktionen der Fische-**********

Procedure fische()

  If FischDelay = 0
    NewFisch(Random(4) + 10, #ScreenWidth + 150, Random(50) * 4, 0)
    FischDelay = Random(20) * 50
  Else
    FischDelay - 1
  EndIf
  
  ResetList(NF())
  While NextElement(NF())
    F()\X - FischSpeed
    If NF()\X > - 150
      DeleteElement(NF())
    EndIf
  Wend

EndProcedure

;**********-überprüft, ob z.B. eine Taste gedrückt wird-**********

Procedure checkControls()

  ExamineKeyboard()
  ExamineMouse()

  If KeyboardPushed(#PB_Key_Right)
    BootPosition + BootSpeed
    If BootPosition >= #ScreenWidth - SpriteWidth(2)
      BootPosition = #ScreenWidth - SpriteWidth(2)
    EndIf
  EndIf

  If KeyboardPushed(#PB_Key_Left)
    BootPosition - BootSpeed
    If BootPosition <= 0
      BootPosition = 0
    EndIf
  EndIf

  If KeyboardReleased(#PB_Key_Escape)
    End
  EndIf

EndProcedure

;**********-in dieser Schleife werden die einzellnen Proceduren (Schleifen) zusammengefügt-**********

Procedure gameloop()

      displayGraphics()
      fische()
      checkControls()

      FlipBuffers()
      ClearScreen(0,0,0)
      Delay(0)

EndProcedure

;Hier werden die einzellnen Proceduren aufgerufen.

startfenster()

If FullScreen = 1
  If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "Fischy")

      loadGraphics()

    Repeat

      gameloop()

    ForEver

  EndIf
EndIf

Verfasst: 21.10.2006 19:33
von Kaeru Gaman
zuerst fällt mir auf, du musst die eigenschaften auch mit den elementen verknüpfen, nicht leer im raum stehen haben:

Code: Alles auswählen

Procedure Newfisch(Sprite, PositionX, PositionY, Activiert) 
  AddElement(F()) 
  F()\Sp.l = Sprite                                   ;Welches Sprite der Fisch hat 
  F()\X.l = PositionX                                 ;X-Position des Fisches 
  F()\Y.l = PositionY                                 ;Y-Position des Fisches 
  F()\A.l = Activiert                                 ;ob der Fisch mit dem Angelhaken zusammenstößt 
EndProcedure 

Verfasst: 21.10.2006 21:16
von #NULL
..und dann benutzt du in der procedure Fische() eine LL names NF(). die gibt es aber nicht, und der compiler müßte dir das auch sagen. nachdem ich sie in F() umbenannt habe läuft das programm schonmal.

Verfasst: 21.10.2006 21:39
von #NULL
..und dein

Code: Alles auswählen

FischDelay = Random(20) * 50
ist beim nächsten mal in der proc sowieso futsch, weil FischDelay weder Global noch Static ist, ist also immer 0, und deine liste bläht sich auf..
..jedoch, dein

Code: Alles auswählen

    If F()\X > - 150
      DeleteElement(F())
    EndIf
sollte ein

Code: Alles auswählen

    If F()\X < - 150
      DeleteElement(F())
    EndIf
werden, damit die viehcher auch mal sterben.

<edit:>
denkfehler von mir: nicht damit sie mal sterben, sondern damit du sie überhaupt mal zu sehen bekommst, bevor sie Deleted werden.

Verfasst: 22.10.2006 15:30
von Thomas
Danke für eure Hilfe!

:D