Dialog box darstellung?

Posted By: tagimbul

Dialog box darstellung? - 06/12/17 14:15

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
Posted By: HellThunder

Re: Dialog box darstellung? - 06/12/17 23:39

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
Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 07:07

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 =)
Posted By: jenGs

Re: Dialog box darstellung? - 06/13/17 08:52

Ich hab etwas ähnliches mit einem shader gemacht.

Leider geht das nur mit monospace ansonsten wird das sehr kompliziert.

Ich hab einen Bitmapfont generiert mit den entsprechenden Zeichen die ich brauchte.

Dann einen Array erstellt mit einer Größe des maximalen ascii Zeichen, der an der entsprechenden Position passend zur Bitmap den Zeichencode als Array-Position hatte. Das heißt auf der Bitmap ist das erste Zeichen ein "A" also ist im array der Wert der dem code für A zugeordnet ist die position (Einzeilig) des Zeichens in der Bitmap.

Nun Text in den Shader zu schreiben ist etwas tricky. Ich hab eine 32 bit FLoat bitmap erstellt, die mit den Zeichen positionen (über den lookup array den ich erstellt hatte) gefüllt wird.

Im Shader selbst wird nun die position mit dem Text-Offset subtrahiert und dann durch die Zeichenbreite geteilt. Damit weiß ich an welcher Textposition/Zeichenposition ich mich befinde. Entsprechend die Data bitmap abgefragt und die Position des Zeichens erfahren und dann auf die Zielbitmap geschrieben.

Das lief erstaunlich schnell, besonders, wenn man die data Bitmap nicht jeden Frame neu befüllen muss. Da es eine 32 bit float bitmap ist, können dann noch metainfos wie Farbe mitgegeben werden. Ich hatte das mal für eine editbox verwendet.

Ich werde mal versuchen dies animiert multiline umzuschreiben (hatte soetwas auch schon angefangen) und unicode zu integrieren.

Hatte vor kurzem auch versucht mit der Methode nicht monospace Fonts auf Bitmaps zu schreiben. Aber das macht nur Kopfschmerzen. Das ganze ist so schon recht komplex.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 09:04

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:

Quote:


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





Posted By: Ayumi

Re: Dialog box darstellung? - 06/13/17 09:51

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.


Code:
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);
	}
}

Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 10:42

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.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 10:48

also du kannst gerne es versuchen =)

einzelne wörter zu colorieren und buchstabe für buchstabe anzeigen lassen.

ich tüftle dann parallel dazu an einem dialog system das gamepad buttons und keyboard tasten anzeigt =)
Posted By: Ayumi

Re: Dialog box darstellung? - 06/13/17 11:02

Nein, pro Frame ein Wort und damit ein Digitaufruf. Ausserdem sind die Texte alle temporär weil du sie zur Laufzeit festlegst und aufrufst. Soll heissen, du hast maximal ein Paneltext gleichzeitig.

Ich weiß nicht, ob Unicode funktioniert, aber das Beispiel kann ich trotzdem fertigstellen. Kann ja mal unterschiedliche Sprachen nehmen, in meinem Fall bietet sich chinesisch an.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 13:14

ja unicode geht. habs getestet.
beim format bei diggits muss einfach 0 rein
Posted By: Ayumi

Re: Dialog box darstellung? - 06/13/17 14:08



Hier ein zweites Beispiel mit einfärben der Wörter. Du kannst das gerne umbauen und auch die Keywörter aus einer Textdatei laden.

Ausserdem gibt es noch ein Problem mit der Breite jeden Digits. Das laesst sich vermutlich beheben, indem das erstellen entweder ausgelagert wird oder die Digits vorher erstellt werden.

Das Problem mit der Breite geh ich spaeter nochmal an und poste meine Lösung.


Code:
typedef struct Keyword
{
  STRING* Word;
  COLOR Color;
} Keyword;
Keyword Keywords[2];

FONT* fontTest = "Arial#20";

STRING* strFile[4000];

void InitKeywords()
{
	Keywords[0].Word = str_create("unendlich");
	vec_set(Keywords[0].Color, vector(255,0,0));
	Keywords[1].Word = str_create("Satz");
	vec_set(Keywords[1].Color, vector(0,255,0));	
}


action DialogTrigger() 
{
	InitKeywords();
	
	
	DsPanelE.pos_x = 400;
	DsPanelE.pos_y = 400;
	var strWidth = 0;
	var posX =30, posY = 30;
	var charCount;
	var counter = 0;
	int i;
	
	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);
															
							pan_setdigits(DsPanel, 0, posX,posY, strFile[counter], fontTest, 1, 0);
							
							for(i = 0; i< 2; i++)
							{
								if(str_cmp(Keywords[i].Word, strFile[counter])) {
									pan_setcolor(DsPanel, 1, counter, Keywords[i].Color);
									break;
								}
							}
							
							strWidth += str_width (strFile[counter], fontTest); 
							if(strWidth < 250)
							{
								posX = strWidth + 10;	
							}
							else
							{
								posY += 30;
								posX = 30;
								strWidth = 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);
	}
}

Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 14:53




sooo ich hab mal meinen.... parser?? .. geschriben ^^
ich geb den blauen text rein und bekomme den unteren grünen mit lücken ^^
platzhalter für die gamepad icons.
und ich hab position, nummerierung und anzahl der buchstaben bis zum jeweilig nächsten abschnit =)

macht laune sowas^^



edit: oh sehe deinen post erst jetzt. ich muss noch testen.
hey wenn wir unsere codes kombinieren haben wir ein zelda dialog box system hehe
Posted By: tagimbul

Re: Dialog box darstellung? - 06/13/17 20:13

ohne wie arschig. str_width liest keine leerschläge nach dem string aus

STRING* test1 = "hallo";
STRING* test2 = "hallo ";

beide haben mit str_width eine pixelbreite von 33

ohhh das ist ärgerlich....
Posted By: HellThunder

Re: Dialog box darstellung? - 06/13/17 23:11

Schon mal versucht die whitespaces temporär mit einem anderen char zu ersetzen?
Posted By: tagimbul

Re: Dialog box darstellung? - 06/14/17 07:02

guten morgen *kaffe schlürf*
gibt es denn einen unsichtbaren char der sowohl bei normalen fonts als auch bei unicode ist?

edit:
ahs sorry jetzt wirk der kaffe ^^
oh bei fonts kenn ich mich nicht so aus. gibt es denn standart chars die bei jedem font die gleiche pixel grösse haben wie eine leertaste?

edit2:
ok sagen wir mal ich nehme ein "i" als leertasten ersatz. dann kommt es schlussendlich auf das font an und wie das i dort drin ist.
ohman das ist wirklich ärgerlich ^^
aber ich versuchs mal so.
Code:
function str_width2 (STRING* str, FONT* fo, STRING* replace)
{
	str_replace(str, " ",replace); 
	return(str_width(str,fo));
}

Posted By: tagimbul

Re: Dialog box darstellung? - 06/14/17 08:32



ich habs hingekrigt =) pixel perfekt für "Arial#20b"
ein "f" entspricht der gleichen pixel breite wie ein leerschlag.
anzeige ist mit digits.

dann tüftle ich nun mal an colorisierten wörtern.
aus deinem code, Ayumi, werd ich nicht so ganz schlau.
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/14/17 17:50

hier ein str_width, das trailing whitespaces mitzählt:

Code:
var my_str_width(STRING * Str, FONT * Font)
{
	char StrTemp[3];
	StrTemp[0] = ' '; StrTemp[1] = '.'; StrTemp[2] = '\0';
	
	var WhitespaceWidth = str_width(StrTemp, Font) - str_width(&(StrTemp[1]), Font);
	
	var StrWidth = str_width(Str, Font);
	
	int i;
	for(i = str_len(Str) - 1; i > 0; i--)
	{
		if((Str->chars)[i] == ' ')
		{
			StrWidth += WhitespaceWidth;
		}
		else
		{
			break;
		}
	}
	
	return StrWidth;
}


ist evtl. noch etwas optimierbar (indem man sich die whitespace breite zwischenspeichert anstatt sie jedes mal wieder auszurechnen).
Posted By: tagimbul

Re: Dialog box darstellung? - 06/14/17 18:12

oh cool danke vielmal!!

edit:
ich verstehe nicht ganz wie der funktioniert.
wenn ich ihn durch meine funktion austausche hab ich abweichungen.
da in der schrift die ich nutze ein "f" genau soviel pixel hat wie ein " " kann ich ziemlich save davon ausgehen das es klapt. bei deiner ist dann mein letztes symbol nicht am richtigen platz
was genau macht du hier?
Code:
str_width(&(StrTemp[1]), Font)



edit2:
die funktion crasht auch bei sehr vielen stings...
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/14/17 18:57

Originally Posted By: tagimbul

was genau macht du hier?
Code:
str_width(&(StrTemp[1]), Font)



Das ist der string StrTemp nicht von anfang an, sondern ab der 2. stelle (index [1]). Damit rechne ich: leerz. = länge(" .") - länge(".");

Warum es crasht, kann ich mir nicht erklären. Evtl. kommt die engine nicht mit den vielen temporären char arrays (StrTemp) klar. Syntaxmäßig bin ich mir aber fast sicher dass kein fehler drin ist.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/14/17 18:57

hey kartoffel irgendwas stimmt mit deiner funktion nicht.
Code:
///////////////////////////////
#include <acknex.h>
#include <default.c>

FONT* arial_font = "Arial#20b"; // truetype font, 20 point bold characters


var my_str_width(STRING * Str, FONT * Font)
{
	char StrTemp[3];
	StrTemp[0] = ' '; 
	StrTemp[1] = '.'; 
	StrTemp[2] = '';
	
	var WhitespaceWidth = str_width(StrTemp, Font) - str_width(&(StrTemp[1]), Font);
	
	var StrWidth = str_width(Str, Font);
	
	int i;
	for(i = str_len(Str) - 1; i > 0; i--)
	{
		if((Str->chars)[i] == ' ')
		{
			StrWidth += WhitespaceWidth;
		}
		else
		{
			break;
		}
	}
	
	return StrWidth;
}




///////////////////////////////
function main()
{
	
	wait(4);
	var temp1, temp2;
	
	temp1 = 	my_str_width("f a f a",arial_font);
	temp2 = 	my_str_width("WhitespaceWidth",arial_font);
	
	//	var WhitespaceWidth = str_width("a a", arial_font) - str_width("aa", arial_font);
	

	while(1)
	{
		DEBUG_VAR(temp1,0);
		DEBUG_VAR(temp2,20);
		wait(1);
	}
}



es crasht sehr oft.

eine alternative zu deinem StrTemp wäre[quote][/quote]

Code:
var temp1 = str_width("a a", arial_font) - str_width("aa", arial_font);
		var temp2 = str_width("f", arial_font) ;


f hat wie ein leerschlag in Arial#20b genau 5 pixel
und temp2 ergibt hier 5 ^^

ahh jetzt versteh ich wieso der dort breaken soll. die leerzeichen am ende eines stringes werden nicht gezählt und dort schneidest du ab. leerzeichen in der mitte oder am anfang gehen auch mit
es geht auch so ^^
Code:
var temp1 = str_width(" a", arial_font) - str_width("a", arial_font);



aber ich weis echt nicht warum der so oft crasht...

edit:
ah ok die funktion mag es nicht wenn man ihr direkt etwas mit "blabla" reingibt
nun scheint es stapiel zu sein.
aber den teil mit dem char array hab ich zu meiner variante geändert.
Code:
var my_str_width(STRING * Str, FONT * Font)
{
	
	var WhitespaceWidth  = str_width(" a", arial_font) - str_width("a", arial_font);
	
	var StrWidth = str_width(Str, Font);
	
	var i;
	
	if( (Str->chars)[i] == ' ')
	{
		for(i = str_len(Str) - 1; i > 0; i--)
		{
			if( (Str.chars)[i] == ' ')
			{
				StrWidth += WhitespaceWidth;
			}
			else
			{
				break;
			}
		}
	}		
	return StrWidth;
}



edit2:

ja mit meiner modifikation ist es nun auch wieder pixel perfekt :DDD
danke nochmal für die funktion =)
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/14/17 19:00

kopier die funktion nochmal neu. hab kurz nach dem posten meinen code editiert. das forum hier löscht backslashs. (um nen backslash zu schreiben muss man zwei machen: \\ -> \) der fehler ist das fehlende '\0'
Posted By: tagimbul

Re: Dialog box darstellung? - 06/14/17 22:48

ja so hatte ich es aber es klapt nun ganz gut mit meiner variante.
bei deiner hatte ich pixel abweichungen bei arial20b
Posted By: tagimbul

Re: Dialog box darstellung? - 06/15/17 07:20

kurze frage. ich bastle meinen code gerade dynamsich um.
jetzt bin ich bei alokieren nicht so ganz sicher ob ich das korregt mache
Code:
function string_array_initialisieren (var elements)
{
	STRING **	vararray = (STRING **)malloc(sizeof(STRING *));
	vararray = (STRING **)realloc(vararray, elements*sizeof(STRING *));
	return vararray;
}

var** var_array_initialisieren(var size)
{
	var **arr=malloc(sizeof(var *)*size);
	return arr;
}

.....

STRING **testarr = string_array_initialisieren(elements);
var* testarr = var_array_initialisieren(elements);



also wenn ich var* testarr so erstelle ist das richtig oder muss ich var ** testarr ?



Posted By: Kartoffel

Re: Dialog box darstellung? - 06/15/17 08:45

Hmm, okay. Warum's Abweichungen gibt, keine Ahnung confused

Zu den Arrays: Kommt drauf an, ob du einen Array aus VARs oder aus VAR-POINTERN willst. Normalerweise wenn man einen Array erstellen will nimmt man immer den Typ eines Elements (z.B. 'var') und hängt noch ein '*' an um daraus sozusagen eine indizierbare Liste aus den Elementen dieses Typs zu machen. ('var' -> 'var*', 'STRING*' -> 'STRING**').
Strings objekte werden in Acknex generell schon als Pointer verwendet, deshalb wird daraus ein 'STRING**'. Wichtig: immer str_create() & str_remove()/ptr_remove() richtig verwenden!

In deinem Beispiel erstellt die Funktion ein Array (var**) bestehend aus var-pointern (var*) (der Typ 'var*' im unteren Bereich passt nicht zu dem Rückgabewert der funktion 'var**'!). Falls du einen Array von var-objekten willst würdest du 'var * VarArray = sys_malloc(sizeof(var) * ArraySize);' verwenden (wie gerade beschrieben).

Aus Zufall würde dein Code oben auch mit dem Typ-Fehler funktionieren, weil in dem Fall (32bit Anwendung) ein Pointer genau die gleiche größe hat wie eine var. Also kann man ein 'var*' Array auch als 'var' Array "misbrauchen" (sollte man natürlich nicht).
Posted By: tagimbul

Re: Dialog box darstellung? - 06/15/17 10:12

ah okey danke vielmal =) habs gecheckt ^^ bei STRINGS einfach ein * mehr ^^

Code:
function string_array_initialisieren (var elements)
{
	STRING ** vararray = sys_malloc(sizeof(STRING *) * elements);
	return vararray;
}
....

	STRING **zeilen = string_array_initialisieren(x);



nun habe ich ein anderes problem ^^"

ich definiere ein struct

Code:
typedef struct 
{ 
	var len; 
	VECTOR color; 
	STRING ** string;
	STRING* name;
} COLORSTYLES;



dann erstelle ich mit der funktion das struct als array
Code:
COLORSTYLES** colorstyle_initialisieren (var elements)
{
	COLORSTYLES **arr=sys_malloc(sizeof(COLORSTYLES * )*elements);
	return arr;
}

.....

	COLORSTYLES * colorstyles= colorstyle_initialisieren(colorstyles_summe);



und nun das problem. im struct habe ich einen STRING** vorbereitet den ich dann eigentlich ebenfalls so füllen wollte

Code:
colorstyles[0].string = string_array_initialisieren(10);



doch dann kommt als fehlermeldung "syntax error"


so erstelle ich den string array:
Code:
function string_array_initialisieren (var elements)
{
	STRING ** vararray = sys_malloc(sizeof(STRING *) * elements);
	return vararray;
}



ich versteh nicht wieso das nicht geht...
bei anderen aufrufungen von "string_array_initialisieren" ist es kein problem.
nur hier wenn ich in struct string pointer schreiben will...
kannst du mir da helfen?
mfg tom


edit:
witzigerweise geht das hier
Code:
colorstyles[0].string  = sys_malloc( sizeof(STRING*) * colorstyles[0].len );



edit2:
doch wenn colorstyles[0].len grösser ist als 5 dann crasht es o.O
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/15/17 10:41

1) In deinem 3. code (COLORSTYLES):
Erstmal stimmt wieder der typ nicht. Du erstellst einen array aus 'COLORSTYLES*' elementen (also ein 'COLORSTYLES**'), gibst das ganze zurück, aber weist es einer 'COLORSTYLES*' variablen zu.

Abgesehn davon hast du glaub ich ein * zu viel. Wenn ich das richtig versteh, willst du eine Liste an COLORSTYLES-elementen und nicht pointern machen. Das wäre:
Code:
COLORSTYLES ColStyles * = sys_malloc(sizeof(COLORSTYLES) * NumStyles);


2) STRING* array problem: wenn du in lite-c auf members von einem arrayelement zugreifen willst brauchst du klammern.
Code:
(ColStyle[0]).string = blabla;


3) will noch anmerken dass die strings zu dem zeitpunkt immernoch nicht vollständig initialisiert sind. dazu brauchst du noch ein str_create()

Allgemein würd ich dir empfehlen dich ein bisschen in die pointer/array geschichte einzulesen.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/15/17 11:05

bin im handbuch kurz über structs stöber gewesen.
nun mache ich es mal so wie es dort gezeigt wird.


ahh ja das mit dem struct string klammern hab ich vergessen ! thx!

Code:
COLORSTYLES * mycol = malloc(sizeof(COLORSTYLES)); // creates a new SPOT struct at runtime
	memset(mycol,0,sizeof(COLORSTYLES)); // set the struct content to zero (it's undefined after malloc)	
	COLORSTYLES* colstyles = malloc(colorstyles_summe*sizeof(COLORSTYLES)); // creates an array of colorstyles_summe SPOT structs



jetzt stürzt nichts mehr ab =)

jetzt kann ich auch den string im struct erstellen
Code:
(colstyles[i]).str  = sys_malloc( sizeof(STRING*) * colstyles[i].len );



und dann füllen und bearbeiten
Code:
((colstyles[0]).str)[0] = str_create(""); 
 	str_cpy(((colstyles[0]).str)[0], zeilen[0]);



geilo thx grin
Posted By: tagimbul

Re: Dialog box darstellung? - 06/15/17 16:49





HEUREKA !!!
JAAA grin geschaft ^^
und alles dynamisch. text dateien werden ausgelesen, speicher alloziiert und und und ^^
voll cool grin *freude*

jetzt muss ich es nurnoch mit den icons kombinieren dann hab ichs =)

ich hab 2 text dateien
dialog.txt und keywords.txt
beide werden ausgelesen und am ende alles voll automatisch in structs verpackt. bereit um von einem dialog system benutzt zu werden =)
Posted By: tagimbul

Re: Dialog box darstellung? - 06/16/17 09:54

hey ich räume gerade den code auf und schreibe verschiedene funktionen
nun hab ich das problem das ich ein sehr chaotisches struct habe das ein array ist und ihn ihm selber sind weitere arrays
Code:
((colstyles[i]).str)[j]



wie kann ich eine "call by reference" funktion schreiben wo ich so ein struct array reingeben kann und auf die arrays im array schreiben kann?
is ein weilchen her seit ich das zuletzt gemacht habe ^^"


ah ok ich habs.
Code:
function call_by_ref_test (COLORSTYLES ** colstyles,var colorstyles_summe)
{
	var i;
	for (i=0; i<colorstyles_summe; i++)
	{
		(*colstyles)[i].name = str_create(""); 
		(*colstyles)[i].len = 0; 
	}	
}

......

	call_by_ref_test (&colstyles,colorstyles_summe);


Posted By: tagimbul

Re: Dialog box darstellung? - 06/18/17 20:42

hey =)
ich hab die tage viel am code rumgebastelt, er ist beinahe fertig =)
das dynamische erstellen von structs geht mittlerweile echt gut nur bei VECTOR hab ich ein problem.
ich hab schon etwas im forum rumgesucht wie man dynamisch einen vector erstellt aber nichts gefunden...

ich habe eine struct mit einem vector pointer und dann noch eine zeile fürs allokieren.

Code:
typedef struct 
{ 	
	VECTOR * color;
	var color_n; // sagt wieviel farben es braucht
} LINE_WORD_COLOR;

....

//ein array vom struct LINE_WORD_COLOR wurde erstellt

....

(line_word_color)[i].color_n  = 2;
(line_word_color)[i].color =  sys_malloc(sizeof(VECTOR*)*(line_word_color)[i].color_n );

 .....

((line_word_color)[i].color)[j].x = 255;


also strings und var's kann ich in struct array allokieren aber dann bei den vectoren geht eine menge schief :S
wie allokiert man VECTOR arrays richtig?
mfg tom


edit:

oh gott xd ich hab gerade versucht den fehler zu isolieren und es schmiert schon ab wenn ich nur eine einzige variable nutze ^^"
ufff

wenn ich mein struct...
Code:
typedef struct 
{ 	
	STRING ** str; // speichert die wörter ab die gefunden wurden
	var  color_n;
	var * color_nr; // sagt welche wort nummer welche farbe hat
	VECTOR * color;
	var len; //die summe der diggits, bzw die anzahl der strings in dieser zeile die benötigt werden
	
} LINE_WORD_COLOR;  // defines a struct type named "DIALOG"


...als array erzeuge...
Code:
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR*) *  all_dialog_lines  );




....dann kann ich doch gleich in variablen reinschreiben oder?
Code:
(colors_in_zeilen)[i].color_n =0;



sieht das für euch korrekt aus? da sollten eig. keine fehler auftauchen oder?
Posted By: Ayumi

Re: Dialog box darstellung? - 06/18/17 21:48

Nimm den Pointer vom Vector (oder soll das n Vector-array werden?) und alles geht.

EDIT: Schon gelesen...nimm doch einfach vars.
Ansonsten ein Hinweis: VECTOR ist ein Struct wie auch COLOR.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/18/17 21:52

...ich bin dumm.... nun klapt es...
dasda:
Code:
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR*) *  all_dialog_lines  );


muss ich so:
Code:
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR*) *  all_dialog_lines  );



und vectoren so:
Code:
(colors_in_zeilen)[i].color =  malloc(sizeof(VECTOR)*(colors_in_zeilen)[i].color_n );



wer auch immer mal nach struct arrays und dynamischen sachen sucht wird an diesem beitrag provitieren können xD
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/18/17 22:20

Originally Posted By: tagimbul
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR*) * all_dialog_lines);
Die Typen stimmen auch hier nicht. Du erstellst einen Array aus Pointern (also LINE_WORD_COLOR**), und weißt das Ganze einem 'LINE_WORD_COLOR*' zu. Falls du damit versuchst die einzelnen elemente anzusteuern funktioniert das zwar evtl. aber aber du schreibst/liest dabei an Stellen im Speicher, die nicht für den array gedacht sind.

Nochmals der gut-gemeinte tipp: schau dir 1-2 pointer & array tutorials für C an.
Edit: "dynamic memory allocation" (bzw. "dynamische speicherverwaltung") wären weitere Schlagwörter.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/19/17 05:41

morgäähhnn *kaffe schlürf*
=)

ja ist echt so das thema pointer muss ich echt mal besser angucken!

ah ok danke!
gestern hats ein wenig klick gemacht.
also so oder?
Code:
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR**) * all_dialog_lines);



ich verspreche hoch und heilig das ich nach meinem dialog box projekt hier ein pointer tutorial mache!
danke für eure hilfe und geduld =)

zu mir meinten schon ein paar ich sollte pointer mal besser durchnehmen weill das zusätzlich ganz neue möglichkeite im programmieren ermöglichen würde.
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/19/17 09:47

Genau anders rum grin

Code:
LINE_WORD_COLOR * colors_in_zeilen = sys_malloc(sizeof(LINE_WORD_COLOR) * all_dialog_lines);


sys_malloc(size): size ist die größe des memory-blocks den du haben willst und sys_malloc gibt dir den pointer darauf zurück. sizeof(LINE_WORD_COLOR) ist die Größe eines LINE_WORD_COLOR-Objekts. Damit du einen array aus mehreren elementen bekommst musst du die Größe mal die array Länge nehmen.
Wenn du aber sizeof(LINE_WORD_COLOR*) verwendest, dann ist das nur die Größe eines pointers (32 bit -> 4 byte), weil der typ im sizeof ein pointer ist.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/19/17 10:20

...danke tongue
Posted By: tagimbul

Re: Dialog box darstellung? - 06/19/17 20:48

wow tongue
ich hab den ganzen tag pan_setstring gedebugt.
und mir viel dann auf das der auf einen string schaut und nicht setzt
und wenn man den string verändert, verändert man auch den string im diggit.
soviel zum thema pointer grin *grrr*
Posted By: tagimbul

Re: Dialog box darstellung? - 06/20/17 22:25

dasda würde aus einer .txt datei gelesen
in der txt deile sind dialoge und die einzelnen zeilen des dialoges.
ein panel ist = eine zeile
in dieser zeile steht in der txt datei:
"das ist dialog zeile 0 und dieses wort sollte rot sein #RGB255000000Schwert# dasda gelb #RGB255255000Banane# und das grün #RGB000255000Grüner Apfel# lala;"


mein eigener kleiner dialog parser tongue
morgen nurnoch ein set system machen das mit jedem belibigen font (ausser unicode smirk ) die einzelnen worte des dialoges aneinander reiht.
bis dahin danke für die viele hilfe =) wenn es fertig ist share ich es mit euch =)

eine sache die mir noch sorgen macht ist es das ich file_str_readto nutze weil:
*handbuch ausschnit
length - Maximale Anzahl der zu lesenden Zeichen 1..10000 zum Eibnlesen von ASCII-Zeichen in einen STRING*, 1..5000 zum Lesen von Unicode-Zeichen und1..999999 Einlesen in einen Buffer).

meint man da das zeichen in der text datei insgesamt oder die zeichen vom ersten delimiter zum nächsten und wieder nächsten usw. ?
Posted By: Ayumi

Re: Dialog box darstellung? - 06/20/17 22:44

Da length vom Typ "var" ist, dürfte das die maximal zulässige Anzahl sein (999999....), d.h. also der Text insgesamt, denn var geht laut Handbuch bis zu einem Festkommawert von 999999.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/21/17 08:22

das sind dann etwa so 2000 wörter... hmm das ist nicht gerace viel.

ich hab ein kumpel. der schreibt an seiner eigenen engine. und er hat einen eigenen FBX parser geschriben. das laden eines FBX files dauert ultra lange. also hat er nach dem ersten laden das file in binär form gespeichert. das hat das laden ums 100fache verschnellert.

kann man mit lite_c auch sowas?
etwas in binärer form laden, womit ich dann ein struct füllen kann?
wäre cool wenn ich nicht auf die file_str_.. angewiesen wäre und grössere dateien laden könnte dann würde ich einen converter schreiben der mir XML oder ein ähnliches format nutzen das geparst wird und in so ein binäres format für 3dgs schreibt.
geht mit 3dgs sowas?



edit:
also die idee wäre das man mit lite_c ein struct aus einer datei in die engine lädt/allokiert

die datei die geladen wird wurde von einem externen tool aus einer XML(oder was auch immer) geparst und als file für's laden mit lite_c bereitgestellt.

geht das?

edit2:
die idee dahinter ist quasi das man mit einer einzigen, praktischen, dialog datei arbeiten kann deren inhalt alle dialoge und dialog zeilen enthält, welche man im spiel bereitstellen haben will.
und so die 10'000 ASCII zeichen überschreiten kann und dialoge laden kann deren grösse so gross sein darf wie es will.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/21/17 19:04

ich musste nochmal den str_width2 durchgehen. hatte noch einen letzten bug
diese version ist nun entgültig und funktioniert tadellos =)
Quote:


var str_width2(STRING * Str, FONT * Font)
{
var StrWidth = str_width(Str,Font);
var WhitespaceWidth = str_width(" a", Font) - str_width("a", Font);
STRING* temp = str_create("");

var count = 0;
str_cpy(temp,Str);
str_clip(temp,str_len(temp)-1);
if(str_stri(temp," ") != 0 )
while(1)
{
count +=1;
str_cpy(temp,Str);
str_clip(temp,str_len(Str)-(count));
if(str_stri(temp," ") > 0 )
break;

}
StrWidth += WhitespaceWidth* count;
return StrWidth;
}


Posted By: tagimbul

Re: Dialog box darstellung? - 06/21/17 19:21



hihi ^^

jetzt sind nurnoch 2 sachen zu machen =)
-die grenze von maximal 10'000 in der text datei überwinden
-platz machen für icon's und die dann auch darstellen
Posted By: Ayumi

Re: Dialog box darstellung? - 06/21/17 20:38

Schau mal im Handbuch unter Dateifunktionen. Das verfahren, was du meinst, sind Streams. Angeblich mit GS nicht möglich aber intern wird sowieso alles über Bytes eingelesen.

Du könntest auch den ganzen Text auslesen, und die Strings in einer Schleife von einander trennen....aber der Overhead is nicht ohne.

Ansonsten schau dir mal File_seek an...da gibt's ein par nützliche Funktionen, die eben jenes problem umgehen könnten.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/21/17 22:10

txt_load klingt danach als wäre das etwas.
ach ist etwas ungenau erklärt im handbuch...
aber soweit ich das verstehe ist txt_load für das laden grösserer files
dann gibt es noch file_load was nur die chars ausliest und dann in einen buffer schreibt
das wäre dann:

void* pTerrain = file_load("terrain.hmp",NULL,&size);
add_buffer("terrain1.hmp",pTerrain,size);

nur wie wende ich das bei einer .txt datei an? und uff...
ich bin da echt überfragt...
Posted By: tagimbul

Re: Dialog box darstellung? - 06/23/17 20:57

ich bin ganz schön weit gekommen =)
dasda wäre mal der prototyp.
https://www.dropbox.com/sh/spmpbfqg3db1w8n/AAAAbBaEWkLzvqMtxHGUYDlQa?dl=0

ich habe ein paar nützliche funktionen geschriben mit der aus die main sauber und klein ist und alles easy ansteuerbar =)
die funktionen sind im "Dialog System Funktions Handbuch.txt" dokumentiert. so wie im 3dgs handbch

man kann alle dialoge, einzelne dialoge und auch einzelnen zeilen....
-ein eigenes font geben
-an belibigen orten im panel positionieren
-auf SHOW setzen oder reseten
-links oder rechtbündig setzen und auch zentriert

und man kann dialoge in der Y achse zyklisch positionieren.

ich hab nochnie sowas geschriben grin also auch architektur mässig und so ^^ bin ganzschön stolz ^^
ich werde daran solange weiter arbeiten bis ich ein kompletes dialog system habe grin und das teile ich dann auch gerne mit euch =) #open_source tongue
was nun noch ansteht sind die icons darzustellen und später modifiziere ich noch den parser damit man grössere files auslesen kann.

edit 24.06 01:38:
hab die eine falsche datei geupt nun geht es ^^" upsi ^^
Posted By: tagimbul

Re: Dialog box darstellung? - 06/28/17 10:10

hey ho =)
mein dialog system wird immer wie umfangreicher. hat mittlerweile einiges auf dem kasten grin

aber kurze frage:
wie kann ich die höhe eines fonts herrausfinden?
z.B bei: "Arial#30b"

also wieviel pixel nimmt das font maximal bei der Y achse ein?
gibt es da eine formel?
brauche dass für zyklische intervall positionierungen. damit ich "font höhe" + "zeilen abstand" mit einbauen kann
Posted By: Kartoffel

Re: Dialog box darstellung? - 06/28/17 11:33

ähh, normalerweise die Zahl beim erstellen ("Arial#30b")
Posted By: Ayumi

Re: Dialog box darstellung? - 06/28/17 11:47

Für Truetype Fonts gibt's eine Höhe, die du beim erstellen angeben kannst.
Bei Windows Fonts sind das Units bzw. Pixel. Anhand einer Größe wie 12 lässt sich das sicher variabel ausrechnen, in 3DGS aber nie getestet.

Draw_text und draw_textmode können auch die Höhe angeben.

TEXT Objekte haben bereits eine automatisch berechnete Höhe.
Posted By: tagimbul

Re: Dialog box darstellung? - 06/28/17 12:07

ahh ok ich hatte en photoshop drum nach gemessen. und da kamm ich nicht auf 30. dabei hab ich die "sholders" nicht berücksichtigt.
ich hab von cap line zu descender line gemessen.



alles klar danke =)
Posted By: tagimbul

Re: Dialog box darstellung? - 07/04/17 09:27

so hier ist mal die beta =)
https://www.dropbox.com/s/vjhgk23n1v6i2r2/DIALOG%20SYS%20BETA.rar?dl=0

man kann schon einige sachen machen. ich hab auch schon ein paar spilereien hinzugefügt tongue
ich werde noch mehrere ausrichtungs funktionen machen. zur zeit kann man:
-dialoge aus einer txt parsen
-einzelne zeilen oder ganzen dialogen neue fonts geben
-einen dialog zyklisch ausrichten in einem panel und das:
- XY centriert
- X zentriert mit eigenem Y wert
*die funktion berücksichtigt die font höhe einzelner zeilen

-auf ein einzelnes wort, eine ganze zeile oder einen ganzen dialog ein rainbow effect machen
-zeilen und ganze dialoge auf SHOW setzen oder reseten
-man kann Bmap's mit variablen längen nutzen. das programm erkennt selber wie lang es ist und stellt sich darauf ein
-man kann einzelne wörter/einzelne zeilen/ganze dialoge neu einfärben mit der auswahl ob wirklich alles oder nur strings die keine keywords sind eingefärbt werden sollen
-dialoge schreiben und reseten. die write_dialog_while ist etwas umfangreich und werde ich später genauer erläutern. jedoch kann ich sagen dass man mit 3 nützlichen funktionen immer einen rückgabe wert bekommt ob die aktuele seite geshrieben wurde oder ob die letzte seite erreicht wurde oder ob der dialog ganz beendet wurde.

gepalnt sind noch weitere funktionen z.B das man icons zur laufzeit austauschen kann. damit man dann einen switch bauen kann um zwischen gamepad und keyboard steuerung zu schalten.
und ich werde noch die ausrichtungs funktionen ergänzen.

aber bisher kann's schon einiges =)

edit:
beim parsen hab ich noch was verändert.
wenn man ein wort einfärben will muss man das so machen:
#RGB000255255n08beispiel

erst ein #RGB für die markierung, dann den farbwert 000 255 000
und dann ein "n" für die länge des wortes ind em fall hat "beispiel" eine länge von 8 und deshalb n08
maximaler wert ist 99. ich denke die farbigen wörter werden nicht mehr als 99 charst haben und sonst kann man die set_color funktion nutzen =)
© 2024 lite-C Forums