aus String eine Variablen erstellen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

BB-Freak

Betreff: aus String eine Variablen erstellen

BeitragDi, Jul 19, 2011 18:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es eine möglichkeit das hir umzusetzten ?

Ich habe einen Type mit einem Field(z.B. LOL$). Ich möchte jetzt für jeden Type eine eigene Variabele mit dem String$, der in LOL$ gespeichert ist(z.B. "XD"), anlegen. Und in dieser Variable ein Bild zu speichern.

Hoffentlich klingt das jetzt nicht zu unverständlich(-> Ich weiß nicht wie ichs besser beschriben soll Rolling Eyes ).

Freu mich schon auf eure Hilfe.
mfG BB-Freak Very Happy

Xeres

Moderator

BeitragDi, Jul 19, 2011 18:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab eine dumpfe Ahnung was du möchtest, aber das solltest du wirklich besser formulieren...
Pseudocode könnte auch helfen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

BBPro2

BeitragDi, Jul 19, 2011 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
same, nicht den leisesten schimmer..

Midimaster

BeitragDi, Jul 19, 2011 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
so wird das nix....

Zunächst mal die Begriffsklärung:

Also ein TYPE ist eine Festlegung eines "user-definierten" Variablen-Typs. BB bringt schon den Variablen-Typ STRING oder z.b. INTEGER mit, aber Du kannst auch eigene "erschaffen".

BlitzBasic: [AUSKLAPPEN]
Type USER
Field Unter_A$
Field Unter_B%
End Type
D.User = New User


Alle daraus mit NEW erzeugten Elemente sind niemals "Typen" sondern vielleicht "Objekte" oder auch "Variablen" ähnlicher einer A$ ( die ist ein Objekt von Typ STRING) oder B% (die ist ein Objekt von Typ INTEGER) oder eben D.User (die ist ein Objekt von Typ USER).

Jetzt kommen die Inhalte: "Hubert" ist der Inhalt des Objektes A$. 123 ist der Inhalt des Objektes B%. Der Inhalt von Objekt D besteht aus zwei Einträgen: Einem STRING-Objekt und einen INTEGER-Objekt. Die wiederum können Inhalte enthalten.


LOGIK:

Es ist in den seltensten Fällen nötig, derartig komplizierte Konstruktionen, wie Du sie erwähnst, zu erschaffen. Wenn Du einem Objekt noch ein Bild hinzufügen möchtest, dann füge einfach ein drittes Field...
BlitzBasic: [AUSKLAPPEN]
Field Unter_Bild%

... in den Typ ein. Lade dort das Bild rein...
BlitzBasic: [AUSKLAPPEN]
D\Unter_A$="XD"
D\Unter_Bild = LoadImage("")

... und schon gehört es fest verbunden zu dem Element des Types, zu dem z.B. auch der String "XD" gehört. Willst Du das Bild finden, dann suchst Du einfach nach dem Element mit den String...
BlitzBasic: [AUSKLAPPEN]
For loc.User = Each User
If loc\Unter_A$ = "XD"
...... was auch immer du tun willst
EndIf
Next

... und schon befindest sich das Bild in diesem Moment unter...
BlitzBasic: [AUSKLAPPEN]
loc\Unter_Bild

BB-Freak

BeitragDi, Jul 19, 2011 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnellen Antworten Very Happy

Um das ganze noch einmal zu verdeutlichen :
Ich hatte keine Lust mehr für jedes Bild, das ich laden möchte jedes mal eine Zeile zu schrieben. Deshalb hatte ich vor eine Function zu machen, die alle Dateien eines Ordner ausliest, überpfrüft ob sie ein Bild oder eine andere Art von Datei sind und sie dan Läd Wink .

Ausdiesem Grund wollte ich wissen wie ich das mache, das für jedes "Objekt" ein Bild in eine Variable geladen wird, die genau so heißt wie das ausgelesen Bild.

Midimaster

BeitragDi, Jul 19, 2011 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Da liegst Du mit dem TYPEs schon genau richtig. Dein TYPE sollte dann Dateiname und Bild enthalten:

BlitzBasic: [AUSKLAPPEN]
Type Bilder
Field Name$
Field Image%
End Type

Pfad$="C:\"
Verz = ReadDir( Pfad )
Repeat
Datei$ = NextFile(Verz)
If Datei = "" Then Exit
If FileType( Pfad + Datei) = 1 Then
If Right(Datei,3)="jpg" ; oder wie auch immer du das löst...
loc.Bilder = New Bilder
loc\Name = Datei
loc\Image = LoadImage( Pfad + Datei )
EndIf
End If
Forever
CloseDir Verz

For Bild.Bilder = Each Bilder
DrawImage Bild\Image , 0 , 30
Text 0 , 0 , Bilder\Name
WaitKey()
Next

aMul

Sieger des Minimalist Compo 01/13

BeitragDi, Jul 19, 2011 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier sei aber noch hinzugefügt, dass wenn du es auf die beschriebene Art und Weise löst, und dann bestimmte Bilder anhand ihres Namen zeichnen willst, und du dir nicht was ganz schlaues ausdenkst, du dann jedes mal deine Type-Liste durchgehen und die Namen der Bilder vergleichen musst. Strings vergleichen ist allerdings relativ langsam und in großer Menge nicht anzuraten.

Wenn du also bestimmte Bilder vom Namen her aufrufen willst solltest du sie irgendwo in extra dafür bestimmte variablen laden.

Wenn du aber nur eine Reihe von Bildern laden und wie eine Liste oder so anzeigen möchtest, sollte das kein Problem darstellen.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

BB-Freak

BeitragDo, Jul 21, 2011 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
@aMaul: Genau das wollte ich verhindern -> deswegen der Thread Wink
Heißt das es gibt keine Möglichkeit es so umzusetzten Question

Midimaster

BeitragDo, Jul 21, 2011 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
werde doch mal konkreter....

um wieviele Bilder geht es denn? und wozu werden die Bilder im Spiel eingesetzt?

Dem compiliertem Programm ist es am Ende doch sowieso völlig egal ob eine Variable für eine bestimmtes Bild...
BlitzBasic: [AUSKLAPPEN]
DumpfGegner


oder ...
BlitzBasic: [AUSKLAPPEN]
Bild(10045)


oder...
BlitzBasic: [AUSKLAPPEN]
&x4Fd5EA345


...heißt.

Also, was ich damit sagen will ist: Variablennamen sind sowieso nur was für den Programmierer, solange er sich noch durch den Editor wühlt. Wozu also erreichen wollen, dass die Variablen nach dem Programmstart einen best. "Namen" annehmen?

Wenn Du uns mal genauer beschreibst, warum Du glaubst, dass Du das so brauchst, können wir Dir sicherlich eine Alternative aufzeigen, die schnell und trotzdem unkompliziert ist.
  • Zuletzt bearbeitet von Midimaster am Fr, Jul 22, 2011 7:59, insgesamt einmal bearbeitet
 

Hangman

BeitragDo, Jul 21, 2011 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
eine weitere Möglichkeit wäre die Bilder zu nummerieren und dann in ein array zu laden...
dann könnte man noch sowas zur Hilfe machen:
BlitzBasic: [AUSKLAPPEN]

Const BILD_GEGNER% = 0
Const BILD_SPIELER% = 1
... usw.


wäre zwar auch eine Zeile pro Bild aber die Zeile wäre kürzer... weiß nicht ob dir das lieber ist^^
Tatsache ist nur, dass Variablennamen nicht so dynamisch verteilt werden können wie du es möchtest.
Ich habe Berthold gebrochen.

BB-Freak

BeitragDo, Jul 21, 2011 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, ich wollte mir eine Function schreiben, die für egal welches Spiel geeignet ist.

D.h. eine Function, die automatisch alle Bilder(oder andere Dateien) in einem Ordner ins Spiel läd
und als Variable direckt den Namen nimmt den die Datei eh schon hatte so kann man ohne für jedes Bild eine extra Zeile zu schreiben einfach die Function rein setzten und die benötigten Bilder werden automatisch geladen. Und man kann sie wie gewohn im Prog. benutzen.

BladeRunner

Moderator

BeitragDo, Jul 21, 2011 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Lös Dich doch von der Fixen idee mit den namen, denn das ist in BB nicht möglich, und sinnvoll ist es auch nicht, denn woher willst Du während deines Programmes denn wissen welche Bilder du unter welchen Namen geladen hast, sprich Du müsstest ja beim Programmieren ja schon wissen auf welche Namen du später zugreifen musst.
Was selbstredend geht ist alle Bilddateien in ein Array zu laden und das zu verwenden, was auch sinnvoll ist wenn es um eine erweiterbare Anzahl Mediadateien geht die anhand einer Karte o.ä. angezeigt werden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Midimaster

BeitragFr, Jul 22, 2011 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Grunde könnte man Deine Idee mit einer Art Pre-Prozessor vergleichen. Dann macht der Gedanke Sinn.

Grundsätzliches:
Variablen-Namen sind was für den Editor. Nur der Leser braucht sie! Zur Laufzeit, also wenn das Programm mit F5 gestartet wurde existieren keine Variablennamen mehr. Es macht also wenig Sinn eine Funktion zu schreiben, die sich nach dem Programmstart irgendwelche Variablennamen ausdenkt.

Beispiel:

Im Code heißt eine Deiner Variablen GegnerBild. Mit ihrer Hilfe machtst Du die Vorgänge im Computer für Dich begreifbar. z.b. scheint es so, als ob Du ein Bild in sie "hineinlädst". In Wirklichkeit sieht der Computer nach dem compilieren nur eine Speicherstelle z.b. die Adresse: 453427435. Dort befindet sich das Bild. Alle Stellen, wo im Code GegnerBild[ stand sind beim compilieren durch 453427435 ersetzt worden. Nichts deutet mehr auf den urspünglichen Namen hin. Nun lädst Du während mit deiner "Wunder-Funktion" ein Bild "SoUndSo" in den Speicher. An welchen Speicher? Woher sollte der Computer nun wissen, welche der Speicherstellen die richtige ist?

Die einzige Möglichkeit wäre, der Computer wüßte bereits vor dem Compilieren, dass Datei "SoUndSo" etwas mit 453427435 zu tun hat, was normalerweise eben durch die Zeile festgelegt wird:
GegnerBild = LoadImage("SoUndSo").


Pre-Prozessor

Was vielleicht in Deinem Fall Sinn machen würde, ist ein Programm zu schreiben, das vor dem Compilieren Code-Zeilen automatisch erstellt und Dir so Schreibarbeit abnimmt.

Der Pre-Prozessor scannt das Bilderverzeichnis durch und erstellt für jedes gefundene Bild "SoUndSo"diese Zeile:
BlitzBasic: [AUSKLAPPEN]
SoUndSo = LoadImage("SoUndSo")

Diese Zeilen könnten mit WriteLine eine neue "*.BB" Datei erzeugen, die dann in den Hauptcode eingebunden wird.


Array
Ich bin mir nicht sicher, ob die Array-Idee von Hangman in Kombination mit dem autom. Einlesen des Verzeichnis Dir wirklich weiter hilft. Schließlich ist ja nicht sichergestellt, in welcher Reihenfolge die Dateien gefunden werden. So könnte es vorkommen, dass nach einem Kopieren der Bilder zum User plötzlich ein anderes Bild in Bild(BildGegner) geladen wird als bei Dir.
  • Zuletzt bearbeitet von Midimaster am Fr, Jul 22, 2011 10:03, insgesamt einmal bearbeitet
 

Hangman

BeitragFr, Jul 22, 2011 9:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
eine weitere Möglichkeit wäre die Bilder zu nummerieren und dann in ein array zu laden...


Ich dachte an eine Nummerierung im Dateinamen der Bilder Wink

1.png
2.png
3.png

oder
1_Gegner.png etc...

also wäre das schon sichergestellt, dass immer das gleiche Bild in Bild_Gegner ist aber wie gesagt auch dabei müsste man ein bisschen schreiben Wink Beim Programmieren kommt man halt nicht ganz drum herum auch mal etwas tippen zu müssen Shocked
Ich habe Berthold gebrochen.

BB-Freak

BeitragFr, Jul 22, 2011 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaub ich werde es so machen, dass wie folgt alle Dateien in ein Objekt geladen werden.
Ich mach mir dann nochmal eine zusätzliche Function:
Code: [AUSKLAPPEN]

Function Bild(Name$)
 For Datei.Datein = Each Datein
  If Datei\Name$=Name$ Then
   Return Datei\Image$
  Endif
 Next
End Function

Ist das Sinnvoll ?
Arrow Eine Function ist doch im prinzip auch ein Unterprogramm ?
  • Zuletzt bearbeitet von BB-Freak am Fr, Jul 22, 2011 14:55, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, Jul 22, 2011 14:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Abgesehen davon, das die Datentypen widersprüchlich sind, bleibt halt das Problem, dass für jeden Aufruf schlimmstenfalls alle Einträge durchgegangen werden müssen...
Vielleicht solltest du lieber ein Programm schreiben, das BlitzBasic Code ausgibt. Den könntest du einmal includeieren und sparst dir damit die Schreibarbeit.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragFr, Jul 22, 2011 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
nun schreib doch mal endlich für wieviele Bilder das sein soll....

10? 100? 1.000? 10.000?

Bei 10 ist nämlich das Verfahren sicherlich nicht "zu langsam", bei 10.000 kannst du es vergessen....

mehr input!

BB-Freak

BeitragFr, Jul 22, 2011 15:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon gesagt ich wollte die Function eigentlich für alle meine Projekte verwenden, das heißt 10-10.000 Bilder .

aMul

Sieger des Minimalist Compo 01/13

BeitragFr, Jul 22, 2011 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Midimaster sagte ist das dann zu langsam. Du musst die dann ja bei jedem DrawImage() neu nachfragen, was ganz klar zu langsam ist. Du macht DrawImage() damit im schlimmsten Falle einige Tausend mal langsamer. Damit kannst du dann Echtzeit-Grafik vergessen.

Stattdessen tue lieber was dir schon angeraten wurde:
Schreibe dir einen kleinen Code, der ein Verzeichnis durchgeht und für jede Datei darin eine BB-Ladezeile erstellt.
Für ein Verzeichnis mit den Dateien "Bild1.png", "UltraBossGegner.png" und "Hintergrund.jpg" könnte der erstelle Code zum Beispiel so aussehen:
BlitzBasic: [AUSKLAPPEN]
Const PFAD$ = "bilder\"
Local Bild1 = LoadImage(PFAD + "Bild1.png")
Local UltraBossGegner = LoadImage(PFAD + "UltraBossGegner.png")
Local Hintergrund = LoadImage(PFAD + "Hinterground.jpg")


Den Code müsstest du dann nur noch per Include einbinden, oder direkt kopieren und schon kannst du deine Variablen benutzten.
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group