Problem mit Linked List

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Machete @PB
Beiträge: 81
Registriert: 12.09.2006 03:12

Problem mit Linked List

Beitrag von Machete @PB »

Hallo mal wieder^^
Ich versuche gerade mit PB eine Art Warcraft3-Tower-Defense zu realisieren.
Ich habe einen Screen in mehrer Reihen unterteilt. Auf einer Reihe laufen die Gegner und auf der anderen kann man frei Türme platzieren. Nun laufen die Monster von rechts nach links und wenn sie links angekommen sind, werden sie wieder nach rechts 'gebeamt' aber eine Reihe tiefer. Das funktioniert alles schonmal zufriedenstellend. Nun wollte ich aber einbauen, dass mit einem Klick auf einen bereits gebauten Turm dessen Stärke angezeigt wird. Dabei hat sich herausgestellt, dass immer nur der Turm 'aktiviert' wird, der als letztes gebaut wurde und ich weis nicht warum

ich hoffe ihr könnt mir helfen
Der Code der LL's:

Code: Alles auswählen


Structure Gegner
  x.w
  y.w
  Width.w
  Height.w
  Speed.w
  Sprite.w
  HP.w
  HPVOLL.w
  boni.w
EndStructure

NewList Gegner.Gegner()


Structure Tower
  x.w
  y.w
  width.w
  height.w
  delay.w
  rate.w
  range.w
  image.w
  dmg.w

EndStructure
NewList Tower.Tower()

;--------------------------------------------------------------------------------
;ab hier steht alles in der Repeat-Schleife
;--------------------------------------------------------------------------------
;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ResetList(Tower())
While NextElement(Tower())
  ResetList(Gegner())
  While NextElement(Gegner())
    
    IncludeFile "Include_hpleiste.pb"
    If SpriteCollision(Gegner()\Sprite,Gegner()\x,Gegner()\y,4,Tower()\x-75,Tower()\y-75) And Tower()\delay <= 0
      Gegner()\HP - Tower()\dmg
      Tower()\delay = 100    
    EndIf
    If Tower()\delay > 0
      Tower()\delay - 1
    EndIf
    
    
    If SpriteCollision(2,MouseX(),MouseY(),Tower()\image,Tower()\x,Tower()\y)
      Coll + 1
    Else
      Coll = 0
    EndIf 
    
    ;hier will ich die Turmdaten später checken      
    
    If MouseX() > Tower()\x And MouseX() < Tower()\x+Tower()\width
      infomer = 1
    Else
      infomer = 0
    EndIf
    If MouseY() > Tower()\y And MouseY() < Tower()\y+Tower()\height
      infomer2 = 1
    Else
      infomer2 = 0
    EndIf
    If infomer = 1 And infomer2 = 1
      info = 1
    Else 
      info = 0
    EndIf
    ;____________________________________________      
  Wend 
  
Wend

;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------Collisions::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::




;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


ResetList(Gegner())
While NextElement(Gegner())
  
  
  
  DisplayTransparentSprite(Gegner()\Sprite,Gegner()\x,Gegner()\y)
  
  
  Gegner()\x - Gegner()\Speed
  
  
  If Difficulty = 0  
    boni = Gegner()\boni
  ElseIf Difficulty = 1
    boni = Gegner()\boni/2
  ElseIf Difficulty = 2
    boni = 0
  EndIf
  
  
  
  If Gegner()\x <= 0 - Gegner()\width And Gegner()\y = 10
    Gegner()\x = 1024 - Gegner()\width
    Gegner()\y = 210
  ElseIf Gegner()\x <= 0 - Gegner()\width And Gegner()\y = 210
    Gegner()\x = 1024 - Gegner()\width
    Gegner()\y = 410
  ElseIf Gegner()\x <= 0 + Gegner()\width And Gegner()\y = 410
    DeleteElement(Gegner())
    If Difficulty = 0 
      Leben - 1
    ElseIf Difficulty = 1
      Leben - 3
    ElseIf Difficulty = 2
      Leben - 5
    EndIf 
    
  ElseIf Gegner()\HP <= 0
    Gold + Gegner()\boni
    DeleteElement(Gegner())
    
  EndIf
  
  
  
Wend
;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;---------DisplayGegner:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::





;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

ResetList(Tower())
While NextElement(Tower())    
  Start3D()
  DisplaySprite3D(1,Tower()\x-75,Tower()\y-75,5)
  Stop3D()
  DisplayTransparentSprite(Tower()\image,Tower()\x,Tower()\y)
  
  
  
Wend
;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;-----DisplayTower::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Ich habe die Suche längere Zeit vergebens durchforstet und bitte um Vergebung, fals dieses Thema dort schon einmal geklärt wurde



mfg
Machete@PB
Benutze Topos-PB-Version 3.3
Benutzeravatar
Machete @PB
Beiträge: 81
Registriert: 12.09.2006 03:12

Beitrag von Machete @PB »

Weis denn keiner was ich meine oder wie ich das lösen könnte? :(
Benutze Topos-PB-Version 3.3
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das hat nix mit der 3.30 zu tun sondern mit deiner logik.

hab deinen code jetzt nicht gelesen, problembeschreibung genügt mir.
wenn du auf einen turm klickst, musst du die ganze liste durchgehen,
um zu prüfen, ob genau dieser turm geklickt wurde.
erst dann ist dein aktuelles listenelement der aktuelle turm und nicht der letzte turm.

das ist aber recht umständlich. wenn du sowieso im grunde regelmäßige felder hast,
kannst du auch mit einem 2dimensinalen Maparray arbeiten, wo du die türme direkt "reinschreibst".
dann kannst du bei einem klick einfach anhand der koordinaten ausrechnen,
auf welches Feld geklickt wurde, und schaust dann ins array,
ob da ein turm steht und wenn ja was für einer.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Machete @PB
Beiträge: 81
Registriert: 12.09.2006 03:12

Beitrag von Machete @PB »

Hm Mist ich dachte mir schon, dass das umständlich wird...
das mit den Feldern geht leider nicht, denn man kann die Türme frei mit der Maus platzieren, aber halt nur da nicht wo die Gegner laufen

Also der andere Weg wäre dann mit SelectElement(LinkedList(), Position) oder? aber wie kann ich da heraus bekommen welches Element da jetzt gefragt ist? Das muss ich mir jetzt oder Morgen genauer ansehn

Aber danke für den Hinweis :allright:
Benutze Topos-PB-Version 3.3
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Also der andere Weg wäre dann mit SelectElement(LinkedList(), Position) oder?
ja nee

> aber wie kann ich da heraus bekommen welches Element da jetzt gefragt ist?
ja wie ich sagte, die ganze liste durchrödeln.
deswegen hab ich dir ja zu nem array geraten.

> das mit den Feldern geht leider nicht, denn man kann die Türme frei mit der Maus platzieren, aber halt nur da nicht wo die Gegner laufen
ja und überschneiden dürfen sie sich doch auch nicht...
das hieße ja, du müßtest bei jedem neuen Turm ebenfalls die ganze Liste durchrödeln, ob ja schon ein Turm steht.

ein Feld-Array bedeutet noch lange nicht, dass jeder Turm genau ein Feld einnehmen muss.
du kannst auch türme konzipieren, die 4x4 oder 5x5 felder groß sind.
wichtig ist nur, dass eine matrixbasierte verwaltung wesentlich einfacher zu realisieren ist,
als für jeden pup immer und immer wieder die ganze Liste durchrödeln zu müssen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Ich kann an deinem Source keinen Fehler finden, habe selbst PB 4.0 und realisiere daher alles mit ForEach(...)
Aber While ...Wend , scheint hier genauso zu funktionieren.
Nur als Vorschlag. Wenn ich solche Probleme habe, baue ich mir Textzeilen zur Kontrolle ein. Hier vielleicht so:

Code: Alles auswählen

If MouseX() > Tower()\x And MouseX() < Tower()\x+Tower()\width 
      TurmxText$ = str(Tower()\x)
      infomer = 1 
    Else 
      infomer = 0 
    EndIf 
    If MouseY() > Tower()\y And MouseY() < Tower()\y+Tower()\height 
      TurmyText$ = str(Tower()\y)
      infomer2 = 1 
    Else 
      infomer2 = 0 
    EndIf 
    If infomer = 1 And infomer2 = 1 
      info = 1 
    Else 
      info = 0 
    EndIf 
.
.
.
; irgendwo später
StartDrawing(ScreenOutput())
Drawtext(10,10,"Turmx: "+ TurmxText$)
Drawtext(10,30,"Turmy: " + TurmyText$)
Drawtext(10,50,"Mousex: " + Str(Mousex())
Drawtext(10,70,"Mousey: " + Str(Mousey())
Stopdrawing()
Damit kannst Du immer sehen ob sich Turmx und -y ändern, wenn Du über einen Turm gehst und ungefähr zu Mousex() und -y() passen.
Wenn es zusammenpaßt hast Du den Fehler vielleicht noch woanders und verrennst Dich bloß.
Würde mich interessieren wenn Du den Fehler raus hast, woran es lag. Reine Neugier... :wink:
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Du könntest es auch so machen das du eine Variable erstellst die das aktuell ausgewählte Element beinhaltet. Du stetzt die Variable dirket nach (oder vor) dem ausruft von ResetLlist(Tower()) auf null. Vor dem Letzten wend (also dem von der Schleife mit dem auslesen der Towers) wird diese um eins erhöt.
Jezt änders du nurnoch das Info=-1 ist wenn kein Turm ausgewält ist (da null ein Element ist) und wenn ein Element ausgewählt ist dann setzt du den Nummer des aktuellen Elementes.
Inetwa so:

Code: Alles auswählen

NewList Tower()

ResetList Tower()
ChoosenElement=0
Info=-1 ;Das ist wichtig da du sonst nur den letzten Turm auswählen kannst
While NextElement(Tower())
  If Towerausgewhaelt ;hier steht dann die Abfrage, ob der Tower ausgewählt ist.
  Info=ChoosenElement
  EndIf
ChoosenElement+1
Wend

If Info>-1
SelectElement(Tower(),Info)
Debug Tower()\Power
EndIf
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

@kswb73
Gute Idee!! :allright:

Gibt´s unter PB3.3 auch ListIndex() ? Dann müßte man nicht unbedingt mit zusätzlichen Variablen arbeiten (ChoosenElement)

Code: Alles auswählen

Info = ListIndex(Tower())  
(Was vermutlich auch nicht viel macht)

P.S.: Mein Vorschlag war auch mehr allgemeiner Natur. Die Textzeilen darf man nur später nicht vergessen zu löschen... sieht sonst doof aus. :wink:
Fehler zu finden ist sonst teilweise fast unmöglich, wenn man nicht hin und wieder schaut was man bekommt und ob es mit dem übereinstimmt
was man meint bekommen müssen.

//edit:
@Machete
Der Link zu Deiner Stadt ist Tot, Kannst Du den noch aktivieren?
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
Machete @PB
Beiträge: 81
Registriert: 12.09.2006 03:12

Beitrag von Machete @PB »

Hallo
Erstmal danke für die vielen Vorschläge
besonderes Dankeschön an kswb73, genauso hats geklappt :allright:


Achja der Link müsste jetzt auch funktionieren^^
Benutze Topos-PB-Version 3.3
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Jau, funzt!
Weiß noch nich, was man da machen kann, aber das gehört wohl auch eher in die Laberecke.
Viel Spaß und Erfolg für Dein Projekt noch.
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Antworten