Im Screen mit Struktur Sprites verwalten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Velox
Beiträge: 39
Registriert: 18.09.2011 18:02

Im Screen mit Struktur Sprites verwalten

Beitrag von Velox »

Ist nicht einfach einen Titel zu finden.
Also brauche ich mal die Fachkompetenz von euch! :lol:
Daher mal gleich zu meinem Problem!

Die Suche ergab das hier:
Die Suche ergab 48 Treffer
Benutzte Suchanfrage: +Struktur
Ich habe eine Testexe für euch die mein Problem deutlich zeigen soll.
Ich erstelle selbst Grafiken die ich als 2D Sprites in 3D Sprites auf dem Screen anzeigen lasse.
Soweit keine Probleme!

Dann kann der Benutzer durch Rechtsklick 4 Elemente erzeugen und hier beginnt mein Problem:

Wie kann ich mit Strukturen (worin ich die Element-Daten gespeichert habe) Daten in eine Datei speichern sowie auslesen und während der Laufzeit verändern?

Hier sind noch die Element-Daten der Struktur:

Structure Elements

Number.i
ElementSprite2D.i
ElementSprite3D.i
ElementX.i
ElementY.i

EndStructure

Global NewList NewElement.Elements()


Wie oben geschrieben, brachte mir die Suche nicht viel Hilfe.

Hier dann noch die Testexe:

http://www.file-upload.net/download-376 ... s.rar.html


Danke schon jetzt für alle die mir weiterhelfen können! :allright:
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von man-in-black »

indem du das ganze handelst wie EINE Variable. Eine struktur ist eigt auch nichts anderes, als ein bündel aus mehreren variablen (einfach ausgedrückt)

beispiel ohne struktur:

Code: Alles auswählen

newlist element.s()
;liste füllen
openfile(...)
foreach element()    
writestring(element())
next
closefile()
beispiel mit struktur:

Code: Alles auswählen

struktur punkt
x.l
y.l
endstriktur
newlist element.punkt()
;liste füllen
openfile(...)
foreach element()    
writelong(element()\x)
writelong(element()\y)
next
closefile()
(hab alles, kann alles, weiß alles!!^^)

Bild
Velox
Beiträge: 39
Registriert: 18.09.2011 18:02

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von Velox »

Hm...
Vielleicht fehlte da noch ne Frage meinerseits. :lol:

Wie kann ich die einzelnen Grafiken identifizieren?

Da jede Grafik bisher nur über die #SpriteID indentifizierbar sind, nur kann der Benutzer auch mehr als 1 Flamme haben.
Und in der Struktur habe ich Number.i genommen, nur blicke ich da selbe nicht wirklich hinter wie ich das abspeichern kann und beim nächsten Start auf die einzelnen Elemente zugreifen kann?
Diese müssen irgendwie aus einer Datei gelesen werden.

Einfach und kurz zusammen gefasst:

Wenn man 4 Elemente erstellt sollen die Koordinaten für X und Y sowie die eindeutige Element-ID gespeichert und beim nächsten Start wieder ausgelesen und an den Koordinaten angezeigt werden. Wie macht man sowas?
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von man-in-black »

ich weis jetzt zwar nicht, ob ich deine Frage wirklich verstanden habe.
(die exe kann ich leider an diesem PC nicht testen, aber das ist ein anderes trauriges thema... -.-)

Du hast in deinem Spiel/Programm eine Liste mit allen Flammen und deren Positionen auf dem Screen. Klickst du mit der rechten
Maustaste wahllos auf den Screen erscheinen dort 4 neue (es wird die liste also um 4 elemente aufgestockt).
Bei einem Neustart sollen diese Flammen wieder an den richtigen Positionen erscheinen (folglich die alte Liste der letzten benutzung).
soweit so gut. speichern und laden kannst du die liste dann über den weg aus dem letzten post. Vllt ist es auch noch sinnvoll
am anfang der Datei die Listen/array-größe anzugeben, um diese beim laden richtig zu dimensionieren oder weitere informationen unterhalb der Liste speichern zu können.

am ende dürfte deine datei dann so aussehen:

Code: Alles auswählen

0   ;ID vom ersten element
100   ;positionx element1
200   ;positiony elemen1
1    ;ID element2
45   ;positionx element2
...
man erkennt durch die kommentare hoffentlich gut, dass immer blöcke entstehen. in diesem fall 3 variablen für ein element.

wenn du unterschiedliche sprites für die flammen nutzen willst, packst du einfach noch eine typ-beschreibende Variable in die struktur.
"flammenfarbe", "flammenart", "...typ",... oder eben den pfad des bildes.

Identifizieren kannst/musst du die Flammen, indem du ihnen, wie du vorgeschlagen hast, eine Nummer verpasst. In einigen Fällen reicht es auch aus, den Index der einzelnen Elemente in der Liste zu nehmen (ListIndex()) - aber vorsicht, wenn dann ein Element gelöscht wird, weil evt andere Beziehungen verwürfelt werden könnten... (Tut mir leid, wenn ich jetzt sowas banales erkläre, aber im moment sehe ich nicht, wo dein Identifikationsproblem liegt...)
(hab alles, kann alles, weiß alles!!^^)

Bild
Velox
Beiträge: 39
Registriert: 18.09.2011 18:02

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von Velox »

Das mit dem Speichern und Auslesen sowie Positionieren der Elemente aus der Datei ist verständlich.

Wie kann ich mit SpriteCollision() herausfinden wenn ich ein Sprite "berühre" mit der Maus, welche ID es hat wenn ich mit Struktur arbeite?
Das habe ich nicht verstanden!

Denn die Struktur (sagt die Hilfe aus PB auch) wird jedesmal komplett durchlaufen anstatt direkt auf ein Element zugreifen zu können, wie es zum Beispiel mit Preferences der Fall wäre.
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von man-in-black »

Denn die Struktur (sagt die Hilfe aus PB auch) wird jedesmal komplett durchlaufen anstatt direkt auf ein Element zugreifen zu können, wie es zum Beispiel mit Preferences der Fall wäre.
meinst du wirklich "struktur" oder doch "datei"?
wenn du veränderungen während der laufzeit bearbeiten willst, wie z.B. die bewegung einer maus, dann passiert das eigt mit den im speicher befindlichen variablen/listen/... . man greift dabei in den seltensten Fällen direkt auf dateien zurück.
willst du z.B. die informationen vor abstürzen sichern, speicherst du alles intervallweise ab (z.B. alle 5min).

und nun zu deiner eigentlichen frage, wie man über die mausposition die flamme ermittelt (ausführlicher):
ersteinmal sollte dir klar sein, dass deine flammen positionsangaben und evt auch angaben zu ihrer größe haben (breite, höhe, radius,...). mit diesen kannst du ganz einfach ermitteln, ob sich ein punkt innerhalb der flamme befindet.

Code: Alles auswählen

if flammex <= mausx and flammex + flamme_breite => mausx
  if ;für y auch
    debug "punkt in flamme"
  endif
endif
bei listen musst du diese prüfung nur für JEDES Element wiederholen. angenommen, es gibt einen treffer, kannst du die überprüfung auch abbrechen, um zeit zu sparen.

Code: Alles auswählen

foreach element()
  if punkt_im_element() ;also der erste code oder eben die vordefinierten von PB wie SpriteCollision()
    debug element\ID
    break
  endif
next
ums dann noch schöner zu machen, kann man alles in eine procedure packen

Ich bin mir nicht sicher, ob das thema wirklich zu "Allgemein" gehört. Für mich sieht das eher nach "anfänger" aus...
(hab alles, kann alles, weiß alles!!^^)

Bild
Velox
Beiträge: 39
Registriert: 18.09.2011 18:02

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von Velox »

Hiermit:

Code: Alles auswählen

ForEach NewElement()
		
		;If MouseX() > (10) And MouseX() < (10 + Global_GraphicsSize) And MouseY() > (30) And MouseY() < (30 + Global_GraphicsSize)
		If MouseX() > (NewElement()\ElementX) And MouseX() < (NewElement()\ElementX + Global_GraphicsSize) And MouseY() > (NewElement()\ElementY) And MouseY() < (NewElement()\ElementY + Global_GraphicsSize)
			
			StartDrawing(ScreenOutput())
				
				DrawingMode(#PB_2DDrawing_Transparent)
				DrawingFont(FontID(#Font_Arial_10))
				DrawText(10, 300, Str(NewElement()\Number), RGB(255, 255, 255))
				;Break
				
			StopDrawing()
			
		EndIf
		
	Next
bekomme ich bei jedem Element als NewElement()\Number die Zahl 1.
Ist jetzt klar was ich meine? :)

Ich bekomme keine eindeutige ID für jedes Element, obwohl ich jedes Element +1 in die Struktur speicher.
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von man-in-black »

um ganz ehrlich zu sein, nein, es ist mir gerade nicht klar.
du überprüfst zwar alle elemente auf kollision mit der maus, speicherst aber gar keine inhalte ab bzw. erstellst keine neuen elemente,
wie oben beschrieben!? außerdem kann ich leider auch nicht sehen, wie "NewElement()\Number" mit 1 gefüllt wird.

wenn du deinen elementen ne ID oder in diesem fall "Number" verpasst, muss das zusammen mit der position beim erstellen passieren.
dafür kannst du entweder eine zweite variable nehmen, die bei jedem neuen element größer wird und die neue ID darstellt oder
du durchläufst für jedes neue element deine alte liste und nimmst die höchste ID + 1 für die neue...

bevor wir noch lange um den heißen brei reden, kannst du evt den groben projektcode zusammen mit einer beschreibung des selben reinstellen oder mir als PN schicken? Wahrscheinlich kann ich dann besser helfen...

oder ich hab heute wieder ein mords brett vorm kopf :lol:
(hab alles, kann alles, weiß alles!!^^)

Bild
Velox
Beiträge: 39
Registriert: 18.09.2011 18:02

Re: Im Screen mit Struktur Sprites verwalten

Beitrag von Velox »

Der Fehler sitzt 30cm vor dem Monitor. :lol:
Habe mit jedem Element +1 gemacht, nur das ganze vor der Repeat-Schleife, wodurch nichts +1 außer eine 1 zustande kam.
Fehler: Jede ID hatte die 1.
Hab es nun richtig.

Danke für deine Hilfe ! Problem und dieses Thema gelöst ! :allright:
Antworten