Linked List

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Linked List

Beitrag 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
v6.00
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Danke für eure Hilfe!

:D
v6.00
Antworten