Seite 1 von 2

Problem mit schlaufe

Verfasst: 18.01.2008 20:59
von obar
Hallo zusammen,

habe folgendes Problem.

Ich möchte mir auf dem Screen einzelne Info's anzeigen lassen von Objekten, die ich auf der Map verteilt habe. Nun möchte ich das
mir auf einer Seite z.B 20 Objekte angezeigt werden. Nachher soll man mit Tasten Up/Down nächste Seite anzeigen lassen.

Die Anzeige sieht bis jetzt so aus.

Code: Alles auswählen

If CheckFlag = #True
      ;
      Global r.l, testen.l, color.l = RGB(255,255,255)
      Repeat
      r = 0
      testen = 1
      ClearScreen(0)
      ExamineMouse()
      ExamineKeyboard()
      ;    
      For o = 0 To mapHeight
          For p = 0 To mapWidth
              If map(p,o)\objID > 0
                  StartDrawing(ScreenOutput())
                  DrawingMode(#PB_2DDrawing_Outlined)
                  DrawingFont(FontID(10))
                  Box(200, 1, 400, 580, RGB(255,255,255))
                  DrawingMode(#PB_2DDrawing_Transparent)
                  DrawText(230, 20, "No",     color)
                  DrawText(320, 20, "ObjID",  color)
                  DrawText(375, 20, "ObjPos", color)
                  DrawText(435, 20, "Walk",   color)
                  DrawText(480, 20, "Event",  color)
                  DrawText(523, 20, "Sound",  color)
                 
                  DrawText(220, 40+r, RSet(Str(testen),5,"0"),                     color)
                  DrawText(323, 40+r, RSet(Str(map(p,o)\objID),3,"0"),             color)
                  DrawText(370, 40+r, RSet(Str(p),3,"0")+" / "+RSet(Str(o),3,"0"), color)
                  DrawText(443, 40+r, RSet(Str(map(p,o)\objWalk),1),               color)
                  DrawText(479, 40+r, RSet(Str(map(p,o)\objEvent),5,"0"),          color)
                  DrawText(530, 40+r, RSet(Str(map(p,o)\objSound),3,"0"),          color)
                                
                  StopDrawing()
                  ;
                  DisplayTransparentSprite(map(p,o)\objID, 280,40-1+r)
                  r+20
                  testen + 1
              EndIf
          Next
      Next
      ;    
      FlipBuffers()
      Until KeyboardPushed(#PB_Key_Escape)
      CheckFlag = #False
      ;
  EndIf  
Hier wird natürlich endlos angezeigt, also bis alle Objekte durch sind. Ich bin mir nicht ganz sicher wie ich die Schleife unterbrechen kann,
dass mir nur 20 angezeigt werden.
Bitte variablen Namen nicht beachten, ich weiss dass sie schei.. sind. Soll ja auch nur ein Test sein.

Verfasst: 18.01.2008 21:21
von RSBasic
...Ich bin mir nicht ganz sicher wie ich die Schleife unterbrechen kann...

Code: Alles auswählen

Break
:?:

Verfasst: 18.01.2008 22:19
von Kaeru Gaman
ne, komplett falsche herangehensweise.
wenn du irgendwelche 20 obj angezeigt haben willst (in ner liste) dann musst du dir ne listenverwaltung proggen.
die muss getrennt sein von deiner game-map darstellung.

ich hab deinen code jetz nich laufen lassen (hab hier kein PB),
aber grundsätzlich rate ich dir zu so einer elementaren unterscheidung.

Verfasst: 18.01.2008 22:37
von obar
Hä, also diese Schlaufe hat nix mit der Map-Darstellung zu tun.

Eigentlich solls so laufen, dass ich Obj. auf der Map setze. Dann kann ich irgendein Button im Editor drücken, der mir in einer
Liste auf einem neuen Screen, alle Obj. aufzeigt die gesetzt wurden.

Dazu lass ich die Schlaufe laufen der den ganzen 2dArray liest und jeweils prüft ob ein Objekt darauf gesetzt wurde.
Wenn der Wert grösser als 0 ist, wird das Objekt in der Liste angezeigt.

Wenn ich nun beispielsweise 1000 Objekte(übertreib :mrgreen: ) setze, ist die Liste natürlich riesig. Deshalb will ich nach z.B.
20 Objekten mit Pfeiltasten eine Seite vor oder zurück blättern können.

Verfasst: 18.01.2008 22:46
von Kaeru Gaman
yo und das is ne spezifische anwendung, die du selber proggen solltest.

also, du musst die darstellung von 20 listenelementen komplett trennen von der darstellung deiner map.
also wird auch die steuerung deiner liste (blättern, etc) komplett getrennt von der steuerung deiner map.

letztendlich unterscheidet sich die berechnung für deine 2D-Map im unteren Layer
nicht sehr stark von der 1D-Liste im draufliegenden Layer.

denk das mal durch was-wo-wann, da kommst du bestimmt drauf, ohne dass dir einer nen code vorlegt...
letzteres wär eh die schlechteste lösung.

Verfasst: 18.01.2008 22:59
von obar
Etwas verstehe ich noch nicht in deinen Ausführungen. Wenn du von Listenelementen sprichts,
dann meinst du aber nicht LinkedList? Weil diese verwende ich gar nicht für meine Objekte.

Verfasst: 18.01.2008 23:04
von Kaeru Gaman
nein, ich meine die elemente, die du objekte nennst, die du (zwangsweise) in einer liste anordnen wirst,
im gegensatz zu den elementen in der tabelle, die du MAP nennst...

für deine objekte wirst du normalerweise eine 1D-aufzählung anwenden.. nich?
deine map is 2D-angeordnet...

Verfasst: 18.01.2008 23:19
von #NULL
weiß nich genau ob du sowas meinst, aber ich hab hier so'ne zeilenweise ausgabe für screen: http://www.purebasic.fr/german/viewtopic.php?t=11212
wenn du statt der linkedlist ein 2d-array nimmst (eine dim für ne seite, und die andere dim für die zeilen der seite) könntest du über den seiten-index 'blättern'.

Verfasst: 18.01.2008 23:22
von obar
@Kaeru Gaman


Nein, ich habe nur eine Structur, wo Tile und Objekt drin ist(2d). Ich seh schon, ich bin ein Bisschen auf dem Falschen weg. Ich hab in Foren zwar viel gelesen und gegoogelt was tilemap angeht. Aber über die Objekt verwaltung, hab ich praktisch nichts gefunden.

Verfasst: 19.01.2008 01:03
von hardfalcon
Du musst zuerst einfach mal deine Map rendern, und dann deine gewünschten Objekte drüberzeichnen (die Objekte solltest du in einer LinkedList speichern, für die du als Datentyp ne Structure verwendest, in der z.B. Position auf der Map, SpriteID, Healthpoints, Einheitenname, etc, speicherst ; diese linkedlist wird dann mit ForEach bei jedem Durchlauf der Hauptschleife einmal komplett durchgegangen).