0 registered members (),
1,397
guests, and 7
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Dialog box darstellung?
#466386
06/12/17 14:15
06/12/17 14:15
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
vor längerer zeit habe ich mal ein programm geschriben das mit eine text datei ausliesst und sie stückweise in einen dynamsichen string array abspeichert. bereit stehen mir also einzelne dialoge in einzelnen string nun würde ich gerne ein dialogbox schreiben wie hier: diese Dialogbox kann folgendes -verschiedene Wörter in unterschiedlichen Farben darstellen -icon bmap anzeigen -Buchstaben und bmaps der reihe nach abspielen -mehrere seiten darstellen meine frage wäre wie man das am sinnvollsten in 3DGS umsetzen könnte. ich hätte schon ein paar Ideen, aber ich fürchte die sind sehr primitiv und würden nur sehr langsam laufen. daher dachte ich ich frage euch mal falls ihr schon so etwas ähnliches gemacht habt. ich hoffe ihr könnt mir helfen freundliche grüsse tom
Last edited by tagimbul; 06/12/17 14:16.
|
|
|
Re: Dialog box darstellung?
[Re: tagimbul]
#466393
06/12/17 23:39
06/12/17 23:39
|
Joined: Nov 2005
Posts: 204 Bavaria
HellThunder
Member
|
Member
Joined: Nov 2005
Posts: 204
Bavaria
|
Stand auch mal vor der Überlegung wie man sowas am besten lösen könnte. Das größte Problem für mich damals war der automatische Zeilensprung. Ich habe Zelda und auch viele andere Adventures und JRPGs gespielt und musste leider feststellen, dass die Zeilenumbrüche keinerlei Logik folgten. Bedeutet also, das wurde manuell von den Entwicklern gemacht (Zelda, Suikoden, Final Fantasy, Tales Of...). - Einfachste Weg für das Beispiel von oben sind vier TEXT* mit jeweils einem String. Platziere sie untereinander. - Den InputString, welcher die gesamte Nachricht beinhaltet, teilst du einfach auf, so dass jeder String mit einer bestimmten Anzahl von Zeichen befüllt wird. - Fülle die Strings der TEXT* Zeichen für Zeichen, mit einer for oder while Schleife und vergiss das wait nicht. - Benutze einen MonoSpace Fonttype (jedes Zeichen besitzt dann die gleiche Breite und du kannst ein Maximum an Buchstaben für jede Zeile bestimmen. - Icon BMAPs realisierst du über PANEL*. Hier siehst du ein etwas älteres Resultat daraus: YouTube Video - MessageBox
Last edited by HellThunder; 06/12/17 23:44.
|
|
|
Re: Dialog box darstellung?
[Re: HellThunder]
#466405
06/13/17 07:07
06/13/17 07:07
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
ja ich hab mal was ähnliches gemacht. aber mit einem TEXT und dann mit str_width und dem text flag WWRAP gearbeitet. damit konnte auch andere fonts nehmen als ein monospace
ich tüftle sozusagen an einem system rum das noch mehr drauf haben soll. ich würde gerne unicode nutzen so das man die text datei in der alle dialoge drin stehen manipulieren kann und jeder einen sprachmod erstellen kann. also chinesisch, japanisch, hebräisch, grichisch ect. also alle sonderzeichen die es so gibt
also icons anzeigen wäre ja nicht so das problem. nur beim colorieren bestimmter wörter. da ist man mit den gegebenen funktionen für TEXT objekte ein wenig eingeschränkt. es bräuchte eine funktion zum colorieren von einzelnen wörtern in einem TEXT objekt
alles andere... uff ^^ ich müsste einen dialog string aus der txt datei auslesen und in stücke zerhacken und einzelne wörter rausfiltern. und dann müste ich mit str_width die daraus entstandenen neuen strings einzeln messen und gucken ob es in eine zeile des dialog panels passt
es wäre kein ding der unmöglichkeit doch es wären schon ein recht grosser haufen an funktionen für etwas das so oft aufgerufen werden soll...
ich glaube ich reduziere einer meiner ansprüche und zwar der hinsichtlich der colorierung. dann kann ich zwar keine einzelnen wörter aber immerhin noch den ganzen text einfärben
hm... ich glaube ich mach es so wie du hier empfielst. in der text datei einzelne zeilen machen und mit str_width prüfen wie lang der string in pixel ist. so kann ich auch gleich im vorfeld prüfen ob der string zu lang ist. in einer zeile in der txt datei schreibe ich dann icon hinweise hin wie etwa "du must #key_1# drücken" und dann key_1 aus dem string löschen und mit leerschlägen füllen die in etwa der pixelbreite des icons entsprechen und dann an der position ein icon einblenden... irgendwie so
ich glaube so kann ich dann auch den grundgedanken für nicht lateinsiche schriften beibehalten. In A8 unterstützen alle Stringfunktionen Unicode-Strings.
doch dann würde es wieder in sehr komplizierten codes auslaufen wenn man jeden buchstaben einzeln erscheinen lassen will. da hab ich mir schon überlegt ob ich einfach text und icons vor der schlussentlichen darstellung in eine bmap rendern soll um dann in einem shader eine 4 zeilige blende(oder jeh nachdem wieviel zeilen man hat) basteln soll deren anzeige ich mit einer einzigen variable steuer.
joa... ich glaub ich werde da mal ein wenig rum probieren und danke für die Anregung
mfg tom =)
Last edited by tagimbul; 06/13/17 07:19.
|
|
|
Re: Dialog box darstellung?
[Re: jenGs]
#466411
06/13/17 09:04
06/13/17 09:04
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
jo ich hoffe ihr verzeiht mir meine rechtschreib fehler gleich ^^ war einfach mal Brainstorming ich hab mir mal ein konzept zurecht gelegt und das würde auch mit unicode gehen:
gegeben ist ein roher string array ausgelesen von einer text datei. beispiel der text datei: " Dialogue_000_3; ich bin die erste Zeile von dialogue 0; ich bin die zweite Zeile von dialogue 0; ich bin die drite und letzte Zeile von dialogue 0; Dialogue_001_2; ich bin die erste Zeile von dialogue 1; ich bin die zweite und letzte Zeile von dialogue 1; Dialogue_002_3; ich bin die erste Zeile von dialogue 2; ich bin die zweite Zeile von dialogue 2; ich bin die drite und letzte Zeile von dialogue 2; "
in dem unteren code würde im text dann sowas stehen:
" Dialogue_000_3; ich bin die erste Zeile von dialogue 0 und zum weiterschalten in der dialogbox muss ich #1 drücken; "
// Dialogue_000_3 bedeutet das es der dialog 000 ist und 3 zeilen beinhaltet evtl kann man das auch gleich nutzen
///////////////// PHASE 1 ////////////////////////////// roher string vorbereiten fürs struct
0 man findet im ersten string ein #1 und nun passiert: 1 in einem temporären string wird alles bis hierher gespeichert dieser string wird mit str_width geguckt wieviel pixel das resulatat wird in einen var array gespeichert 2 ich zähle alle zeichen in diesem string in ein varaiblen array. dieser sagt mir dann bei welcher nummer ich das icon
einblenden werde 3 ich leere den temporären sting wieder 4 ich schreibe die zahl, in dem falle "1" von "#1" in einen weiteren array 5 ich lösche das "#1" und setze an der stelle ein paar leerschläge die platz machen für das icon bzw die icon pixel
breite 6 ich schreibe i in eine variable 7 ich wiederhole schrit 1, solange bis kein # mehr gefunden wird / break
8 else/ kein # gefunden. weiter in PHASE 2
0 bis 7 ist also eine for schleife und "var i" bestimmt welcher array benutzt wird. "i" sagt auserdem auch noch wieviel # bzw icons gefunden wurden
///////////////// PHASE 2 ////////////////////////////// struct eigenschaften füllen
nun habe ich die daten:
(1) variable wieviel pixel ein icon vom lesestart aus gesetzt werden muss (2) variable wieviel buchstaben/ziffern ein icon vom lese start entfernt ist (4) variable welche icon nummer ich benötige. 1,2,3,4,5 usw (5) den fertigen string für die dialogbox ohne # und mit leerschlägen (6) variable wieviel icons in einer zeile sind
diese daten könnte ich eigentlich in ein struct verwandeln. damit ich dann mit dem struct weiter arbeiten kann
weitere struct daten: var "zu welchem dialog es gehört 0001, 0002 oder 0003 usw " var "welche zeile es ist. 1,2,3,4 usw" var "wieviele zeilen es hat" var "welche array nummer es hat //ähnlich wie bei beim roh string einteilen"
fazit: ich wandle die rohen strings aus dem alloziier prozess um in ein struct diese sind fix und können beim initialisieren des games gesetzt werden und sind dann zugänglicher für das dialog box system
// das roh string file kann man nun löschen
///////////////// PHASE 3 ////////////////////////////// das struct im dialog system benutzen
mit dem neuen daten typ / struct füttere ich nun das dialog system
die strings werden buchstabe für buchstabe mit str_trunc (String, Zahl) abgeschnitten und beim erreichen des uchstabenzahl eines icons wird dann ein icon eingeblendet
///////////////// PHASE ? ////////////////////////////// der text debugger dialog_tester.c in dieser datei werden alle strings geladen und getestet ob sie zu lang sind dazu werden alle strings ausgelesen, die #key_?" entfernt, die nötigen pixel dazugerechnet, das font berücksichtigt und in einer text datei werden alle strings reingeschrieben die fehlerhaft sind mit den dazugehörigen dialog nummern dann kann man mit dieser text datei die dialog.txt korigieren desweiteren kann man die grösse angeben die man benutzt. also die dialog box pixel breite und auch die icon pixel breite
dies macht man zwar manuel aber immerhin besser als garnichts
///////////////// PHASE X ////////////////////////////// das colorieren via shader
ich rendere die TEXT in ein kleines renderbild mit unzähligen skill1 ... skill41 parameter kann ich nun colorier positionen und colorierungs felder (x1 x2 y1 y2)
basteln und mehrere einfärbungen auch via vecskill. falls nötig und erwünscht dann das renderbild in das dialogbox panel rendern man müsste also ein 4 kanal bmap rendern da diese aber nur ein ausschnit ist und somit klein und vom shader schnell verarbeitbar sollte das easy gehen ich könnte sogar noch weiter gehen und zum string struct 4 oder 6 positionen für eine collorierung angeben indem ich
eine funktion schreibe die bei lesen (phase 1) schlüsselwörter durchkämmt wie etwa "Schwert", "Schild" oder "Bogen" und
an dort die startposition in pixel sucht und auch die länge des wortes ausliest in pixel und diese dann weiter gebe an
den shader. ich könnte auchnoch colorierungen rein machen wie etwa "@255,0,0@Schwert" was soviel heisst wie das dass
nöchste wort nach @255,0,0@ so eingefärbt werden soll somit wäre im struct für diesen string dann noch eine anzahl an gefundenen @ markierungen und in einem vector dessen
oder ich nutze im shader ein HLS converter damit ich nurnoch eine zahl zwischen 0 und 360 reingeben muss fürs colorieren ^^
farbe. und die jeweiligen positionen bzw pixel entfernung von start zu wortbeginn und pixel länge des wortes. das alles wird an den shader gegeben und so gibt es dann colorierte texte
Last edited by tagimbul; 06/13/17 09:24.
|
|
|
Re: Dialog box darstellung?
[Re: tagimbul]
#466414
06/13/17 09:51
06/13/17 09:51
|
Joined: Oct 2008
Posts: 681 Germany
Ayumi
User
|
User
Joined: Oct 2008
Posts: 681
Germany
|
Da mich das Thema interessiert, hier ein Ansatz, wie ich das angehen würde. Vielleicht schreib ich s noch fertig, aber momentan fehlt mir die Muse. Aus dem Stringarray muss ein Struct gefertigt werden, was den Stringpointer und die Farbe beinhaltet (z.b.). Unter pan_setdigits wird pan_setcolor aufgerufen. Ausserdem brauchts noch eine zusätzliche Schleife mit den Wörtern, die eingefärbt werden sollen, was auch ein Struct sein kann (Wort+ Farbe). Das ganze sollte schnell genug laufen.
STRING* keyE ="e";
PANEL* DsPanel =
{
bmap = bmpDsObj;
pos_x = 100;
pos_y = 100;
}
PANEL* DsPanelE =
{
bmap = bmpDsShowE;
}
FONT* fontTest = "Arial#20";
STRING* strFile[4000];
action DialogTrigger()
{
DsPanelE.pos_x = 400;
DsPanelE.pos_y = 400;
var strWidth = 0;
var posX =0, posY = 0;
var charCount;
var counter = 0;
while(1)
{
var dist = abs(vec_dist(player.x, my.x));
if(dist < 255)
{
set(DsPanelE, SHOW);
if(key_pressed(key_for_str(keyE)))
{
while(key_pressed(key_for_str(keyE)))
wait(1);
while(!key_pressed(key_for_str(keyE)))
{
set(DsPanel, SHOW);
var fileHandle = file_open_read("ColoredText.txt");
if (fileHandle)
{
while(1)
{
if(charCount == -1)
break;
strFile[counter] = str_create("");
charCount = file_str_readto(fileHandle,strFile[counter], " ", 4000);
strWidth += str_width (strFile[counter], fontTest); // 200 max
if(strWidth < 300)
{
posX = strWidth + 5;
}
else
{
posY += 30;
posX = 0;
strWidth = 0;
}
pan_setdigits(DsPanel, 0, posX,posY, strFile[counter], fontTest, 1, 0);
counter++;
wait(1);
}
file_close (fileHandle);
}
reset(DsPanelE, SHOW);
wait(1);
}
while(key_pressed(key_for_str(keyE)))
wait(1);
reset(DsPanel, SHOW);
set(DsPanelE, SHOW);
}
}
else
{
reset(DsPanelE, SHOW);
reset(DsPanel, SHOW);
}
wait(1);
}
}
Last edited by Ayumi; 06/13/17 09:51.
|
|
|
Re: Dialog box darstellung?
[Re: Ayumi]
#466415
06/13/17 10:42
06/13/17 10:42
|
Joined: Jun 2010
Posts: 212
tagimbul
OP
Member
|
OP
Member
Joined: Jun 2010
Posts: 212
|
dann würdest du jedes wort in einem string in einzelne strings unterteilen und in mehreren digits anzeigen lassen damit du sie colorieren kannst?
man kann ja nicht interhalb von einem digit mehrfarbige wörter zeichnen.
und ich glaube zuviele digitsaufrufe in einem frame, mit einem unicode, haut schon ordentlich auf die fps
sagen wir mal in einer zeile sind 10 wörter und dann insgesamt 6 zeilen die dargestelt werden in einem frame wären dass dann 60 digits aufrufe
und bei digits fällt glaubs der REVERSE flag aus. d.h man kann keine sprach mods/packete schreiben für sprachen die rückwärts geschriben werden wie z.B arabisch
daher würde sich glaubs TEXT besser anbieten. weil der kann auch unicode und kann auch keine einzelnen wörter farbig anzeigen ^^ aber ich glaub der speed is dort besser wenn man ihn als ganzes nutzt. und um zusätzlich die cpu zu entlasten kann man ja denn text in die gpu schiken zum colorieren.
Last edited by tagimbul; 06/13/17 10:46.
|
|
|
|