Daemonika Nightfire
Forumsgott/göttin
huhu,
ich habe mal ein paar kleine Beispiele zum Thema llDetectedTouchST(0); vorbereitet.
Vorwort:
llDetectedTouchST(0) gibt einen Vector <x, y, z,> aus, wobei die Z-Achse nicht beruecksichtigt wird, da eine Flaeche 2 Dimensional ist. Dennoch wuerde es zu Fehlermeldungen kommen, wenn man diesen Eintrag ganz weg laesst, weil die Funktion halt einen Vector verlangt.
Zudem sollte man noch erwaehnen, das ein Vector auch zerlegt und veraendert werden kann, da es sich um 3 Float's (komma-werte) innerhalb dieses Vector's handelt <float.x, float.y, float.z>. Das ist aber nur wichtig wenn man vor hat, entsprechende Eintraege zu veraendern.
Fangen wir mal mit einem einfachen Beispiel an.
Dieses Script dient erst einmal nur dazu, zu verstehen wie die Koordinaten auf der Flaeche verteilt sind. Dazu halte die Maus auf der Flaeche gedrueckt und schiebe sie herum, dabei kannst du am Hovertext die aktuellen Koordinaten deiner Maus ablesen.
*DS* TouchST Default
Im naechsten Beispiel geht es darum, einen bestimmten Bereich auf der Flaeche abzustecken.
Hier habe ich eigentlich das obere Script lediglich um eine Abfrage erweitert. In dieser Abfrage vergleiche ich ob die aktuellen Koordinaten innerhalb meines abgesteckten Bereiches liegen. Wenn das der Fall ist, aendert der Hovertext beim drueber fahren oder klicken mit der Maus die Farbe.
*DS* TouchST Sector
Jetzt stellt ihr euch wahrscheinlich die Frage, wie ich an die Koordinaten des Bereichs heran gekommen bin. Nun, das ist relativ einfach.
Dazu habe ich lediglich ein kleines Helfer Script hinein gelegt und die Flaeche von unten links nach oben rechts markiert.
Zwei Vectoren sind voellig ausreichend um einen vier-eckigen Bereich auf einer Flaeche zu begrenzen.
*DS* TouchST Helper
Mit Hilfe diesem kleinen Tools habe ich lediglich die Ausgaben vom Chat ins Script uebertragen.
Folgendes Beispiel ist schon etwas anspruchsvoller.
Hier wird die gesamte Flaeche in ein Raster zerlegt und man kann jeden Sektor separat abfragen.
Ich habe das Script so vorbereitet, das man mittels der oberen beiden Floats die Spalten und Zeilen individuell anpassen kann. Das Script rechnet die Werte automatisch um. Bei der aktuellen Einstellung verwendet das Script ein Raster von 100 Quadraten beginnend mit der Zahl 1.
Hierbei ist zu beachten, das es hier den selben Regeln folgt, wie die Verteilung der Vectoren, naemlich von unten links nach oben rechts.
Folgene Textur wird lediglich zur optischen Darstellung verwendet.
Der rote Bereich im Script ist ausschliesslich fuer diese Textur vorgesehen und hat mit dem eigentlichen Script herzlich wenig am Hut und kann bei eigenen Projekten komplett weg gelassen werden.
*DS* TouchST Grid
PS: Bevor sich jemand genoetig fuehlt die Richtung von unten links nach oben rechts zu beanstanden, schaut mal auf euren Nummernblock.
Beim naechsten Beispiel wird es etwas Tricky.
Als ich dieses Beispiel Fertig hatte, wollte ich mal in der Wiki nachsehen, ob es vielleicht eine elegantere Methode gibt. Naja, gibt es nicht und das Beispiel von dort funktioniert irrational, oder ist nicht fertig.
Hier soll die Textur dem Mauszeiger folgen.
Damit die Textur sich nicht voellig daneben benimmt, habe ich ganz einfach einen negativen Vector hinzu gegeben um das Zentrum der Textur unter der Maus zu halten. Weiterhin werdet ihr feststellen, das ich bei den Parametern im Befehl ganz einfach ein Minus Zeichen vor den Offset gesetzt habe, dadurch verhaelt sich die Bewegung der Textur nicht spiegelverkehrt zur Bewegung mit der Maus.
Diese Textur habe ich nur Verwendet, damit man eindeutig sieht, wie sie sich verhaelt.
*DS* TouchST Offset
Das war es erst einmal von mir. Anregungen und Verbesserungsvorschlaege sind natuerlich erwuenscht.
LG
Dae
ich habe mal ein paar kleine Beispiele zum Thema llDetectedTouchST(0); vorbereitet.
Vorwort:
llDetectedTouchST(0) gibt einen Vector <x, y, z,> aus, wobei die Z-Achse nicht beruecksichtigt wird, da eine Flaeche 2 Dimensional ist. Dennoch wuerde es zu Fehlermeldungen kommen, wenn man diesen Eintrag ganz weg laesst, weil die Funktion halt einen Vector verlangt.
Zudem sollte man noch erwaehnen, das ein Vector auch zerlegt und veraendert werden kann, da es sich um 3 Float's (komma-werte) innerhalb dieses Vector's handelt <float.x, float.y, float.z>. Das ist aber nur wichtig wenn man vor hat, entsprechende Eintraege zu veraendern.
Fangen wir mal mit einem einfachen Beispiel an.
Dieses Script dient erst einmal nur dazu, zu verstehen wie die Koordinaten auf der Flaeche verteilt sind. Dazu halte die Maus auf der Flaeche gedrueckt und schiebe sie herum, dabei kannst du am Hovertext die aktuellen Koordinaten deiner Maus ablesen.
*DS* TouchST Default
Code:
default
{
state_entry()
{
llSetTexture("1825a910-58bd-ddc9-530a-963c1df6875d", 0);
}
touch(integer total_number)
{
if(llDetectedTouchFace(0) == 0)
{
vector offset = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
llSetText("Vector " + (string)offset, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
}
}
on_rez(integer Dae)
{
llResetScript();
}
}
Im naechsten Beispiel geht es darum, einen bestimmten Bereich auf der Flaeche abzustecken.
Hier habe ich eigentlich das obere Script lediglich um eine Abfrage erweitert. In dieser Abfrage vergleiche ich ob die aktuellen Koordinaten innerhalb meines abgesteckten Bereiches liegen. Wenn das der Fall ist, aendert der Hovertext beim drueber fahren oder klicken mit der Maus die Farbe.
*DS* TouchST Sector
Code:
default
{
state_entry()
{
llSetTexture("c730adb7-6813-f256-8f7f-ce699b0a68c9", 0);
}
touch(integer total_number)
{
if(llDetectedTouchFace(0) == 0)
{
vector pos = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
llSetText("Vector " + (string)pos, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
// Diese beiden Vectoren sind ausschliesslich fuer diesen einen abgesteckten Bereich auf der Flaeche
vector UntenLinks = <0.10000, 0.50000, 0.00000>; // untere linke Ecke
vector ObenRechts = <0.50000, 0.90000, 0.00000>; // obere rechte Ecke
if(pos.x > UntenLinks.x && pos.y > UntenLinks.y && pos.x < ObenRechts.x && pos.y < ObenRechts.y)
{
llSetText("Vector " + (string)pos, <0,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
}
}
}
on_rez(integer Dae)
{
llResetScript();
}
}
Dazu habe ich lediglich ein kleines Helfer Script hinein gelegt und die Flaeche von unten links nach oben rechts markiert.
Zwei Vectoren sind voellig ausreichend um einen vier-eckigen Bereich auf einer Flaeche zu begrenzen.
*DS* TouchST Helper
Code:
default
{
touch_start(integer total_number)
{
vector pos = llDetectedTouchST(0);
llSay(0,(string)pos);
}
}
Folgendes Beispiel ist schon etwas anspruchsvoller.
Hier wird die gesamte Flaeche in ein Raster zerlegt und man kann jeden Sektor separat abfragen.
Ich habe das Script so vorbereitet, das man mittels der oberen beiden Floats die Spalten und Zeilen individuell anpassen kann. Das Script rechnet die Werte automatisch um. Bei der aktuellen Einstellung verwendet das Script ein Raster von 100 Quadraten beginnend mit der Zahl 1.
Hierbei ist zu beachten, das es hier den selben Regeln folgt, wie die Verteilung der Vectoren, naemlich von unten links nach oben rechts.
Folgene Textur wird lediglich zur optischen Darstellung verwendet.
Der rote Bereich im Script ist ausschliesslich fuer diese Textur vorgesehen und hat mit dem eigentlichen Script herzlich wenig am Hut und kann bei eigenen Projekten komplett weg gelassen werden.
*DS* TouchST Grid
Code:
// Anzahl Spalten und Zeilen
float X = 10; // Spalten
float Y = 10; // Zeilen
[COLOR="#FF0000"]// ↓ ---------------------- Textur Parameter -------------------------- ↓
// Folgende Funktion verschiebt den Offset bei ungeraden Teilschritten, damit am Rand keine halben Kaestchen entstehen.
// Dient nur zur optischen Darstellung dieses Beispiels und wird eigentlich nicht benoetigt.
float offset(float val)
{
if((integer)val % 2 == 0)
{
return val = 0.5;
}
return val = 0.0;
}
// ↑ ------------------------------------------------------------------- ↑[/COLOR]
default
{
state_entry()
{
[COLOR="#FF0000"]// ↓ ---------------------- Textur Parameter -------------------------- ↓
// Dient nur zur optischen Darstellung dieses Beispiels und wird eigentlich nicht benoetigt.
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXTURE, 0, "76c310f8-f813-6cb5-b7dd-f9402a0c3a51", <X, Y, 0.0>, <offset(X), offset(Y), 0.0>, 0.0]);
// ↑ -------------------------------------------------------------------↑[/COLOR]
}
touch_start(integer total_number)
{
if(llDetectedTouchFace(0) == 0)
{
vector pos = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
llSetText("Vector " + (string)pos, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
integer number = llFloor(pos.y*Y) * (integer)X + llCeil(pos.x*X); // rechnet die Koordinaten in ein Raster um
llSay(0,"Sector Nr. " + (string)number); // gibt die errechneten Koordinaten als integer im Chat aus
// Nun kann man auf diesem Raster beliebige Sektoren abfragen und das Script entsprechend reagieren lassen
if(number == 15)
{
llSay(0,"Gratuliere, du hast die Nr. " + (string)number + " gefunden.");
}
}
}
on_rez(integer Dae)
{
llResetScript();
}
}
Beim naechsten Beispiel wird es etwas Tricky.
Als ich dieses Beispiel Fertig hatte, wollte ich mal in der Wiki nachsehen, ob es vielleicht eine elegantere Methode gibt. Naja, gibt es nicht und das Beispiel von dort funktioniert irrational, oder ist nicht fertig.
Hier soll die Textur dem Mauszeiger folgen.
Damit die Textur sich nicht voellig daneben benimmt, habe ich ganz einfach einen negativen Vector hinzu gegeben um das Zentrum der Textur unter der Maus zu halten. Weiterhin werdet ihr feststellen, das ich bei den Parametern im Befehl ganz einfach ein Minus Zeichen vor den Offset gesetzt habe, dadurch verhaelt sich die Bewegung der Textur nicht spiegelverkehrt zur Bewegung mit der Maus.
Diese Textur habe ich nur Verwendet, damit man eindeutig sieht, wie sie sich verhaelt.
*DS* TouchST Offset
Code:
default
{
state_entry()
{
llSetTexture("cc41beb3-0d13-3e05-df36-e00caa3372a7", 0);
}
touch(integer total_number)
{
if(llDetectedTouchFace(0) == 0)
{
vector offset = llDetectedTouchST(0); // erkennt die Koordinaten wo die Flaeche geklickt wurde
llSetText("Vector " + (string)offset, <1,1,0>, 1.0); // einfacher Hovertext mit den aktuellen Koordinaten
offset += <-0.5,-0.5,0.0>; // schiebt das Zentrum der Textur zur geklickten Position
llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXTURE, 0, "cc41beb3-0d13-3e05-df36-e00caa3372a7", <1.0,1.0,0.0>, -offset, 0.0]);
}
}
on_rez(integer Dae)
{
llResetScript();
}
}
Das war es erst einmal von mir. Anregungen und Verbesserungsvorschlaege sind natuerlich erwuenscht.
LG
Dae
Zuletzt bearbeitet: