[A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen

Posted By: garv3

[A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 11/30/10 22:35

Hallo zusammen,

ich suche nach einer Möglichkeit, eine Entity bei der Berührung durch den Mauszeiger durchsichtig und untouchable zu machen, so dass eine dahinter liegende Entity gesehen wird und angeklickt werden kann. Das ist im Grunde ja kein Problem aber die durchsichtige Entity soll beim Release des Mauszeigerst wieder undurchsichtig werden. Allerdings kann ich das EVENT_RELEASE nicht abfragen, da die Entity anscheinend sofort dieses EVENT auslöst, wenn sie auf UNTOUCHABLE gesetzt wird. Außerdem muss sie bei dem Release ja auch wieder touchable werden, da bei der nächsten Berührung des Mauszeigers das Event zur Erzeugung der Transparenz sonst nicht getriggert würde.

Ich hab es z.B. so probiert:
Code:
function sprite_event()
{
	if(event_type == EVENT_TOUCH)
	{
		my.flags2 |= UNTOUCHABLE;
		set(my, TRANSLUCENT);
		return;
	}
	if(event_type == EVENT_RELEASE)
	{
		my.flags2 &= ~UNTOUCHABLE;
		reset(my, TRANSLUCENT);
	}
}
...
my.emask = ENABLE_TOUCH | ENABLE_RELEASE;

Allerdings flackert die Entity so unaufhaltsam,so lange der Mauszeiger sie berührt, da sie ja immer transparent und untransparent gesetzt wird...
Posted By: Revo

Re: [A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 11/30/10 23:12

grin dieses Problem hatte ich bei einem meienr ersten minigames auch (war zwar noch A4/A5 oder so - ist aber das gleiche Problem gewesen...)

hatte das damals nicht Lösen können.

Aber wenn ich recht überlege müsste es mit dem mouse_ent-pointer lösbar sein - wenn du es hinbekommst, dass du solange keine neue release-events annimmt solange die verdeckende entity noch mouse_ent ist - in einem pointer speicehrn oder so ...)
ist halt die Frage ob man irgendwie layers für die mausberührung amchen könnte (alternativ msust du halt mehrmals pro sekunde tracen und damit arbeiten - ist allerdings sehr ressourcenraubend ... frown )
Posted By: Superku

Re: [A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 11/30/10 23:26

Kannst doch eine Funktion starten, welche solange in einer while-Schleife wartet, bis sich die Maus auf 2D-Ebene von dem Modell entfernt (entweder mit ein paar vec_to_screen-Befehlen oder einer 2D-Projektion des Modells als Bitmap, was natürlich um einiges aufwändiger wäre).
Posted By: garv3

Re: [A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 12/01/10 00:43

Ich hab jetzt einfach eine Funktion gestartet, die in einer while-Schleife wartet, bis sich die Maus ein ganzes Stück bewegt hat. So wird die verdeckende Entity zwar nicht unbedingt sofort wieder sichtbar, wenn die Maus sie verlässt, aber das fällt kaum auf.

Habe jetzt aber noch eine andere Frage bezüglich des EVENT_TOUCH:
Die Entity ist eine Sprite-Entity mit Alphakanal. Kann man es irgendwie bewerkstelligen, dass das TOUCH event nicht getriggert wird, wenn die Maus sich über einem vollkommen transparenten Pixel des Sprites befindet?
Posted By: fogman

Re: [A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 12/01/10 01:50

Free-form buttons can be used when the button function retrieves the pixel at the mouse position through pixel_for_bmap(), and uses the pixel color or alpha value to determine whether the button was hit or not.

Vom Handbuch unter "button", sollte auch mit Sprites klappen
wenn Du einen Trace von der Maus draufschickst und den Alphawert an der Trefferstelle ausliest.
SCAN_TEXTURE muß aktiviert werden um über das Hit Struct an die Position zu kommen.
Posted By: garv3

Re: [A7] Entity bei Berührung durchsichtig und UNTOUCHABLE machen - 12/01/10 03:43

Danke für den Tipp, aber leider werden hit.u1 und hit.v1 nach dem Trace nicht gesetzt. Funktioniert vielleicht nur bei Model-Entities!?
Habe es bisher so probiert:
Code:
VECTOR temp_vec;
vec_set(temp_vec, mouse_dir3d);	
vec_normalize(temp_vec, 90000000);
vec_add(temp_vec, camera.x);  // Vektor für den Trace vorbereitet
BMAP* temp_bmap = bmap_for_entity(me,0);  // Die Bitmap geladen
var alphawert;
COLOR farbe;
var format = bmap_lock(temp_bmap, 0);  // Bitmap gelockt und Format gespeichert
var pixel;
my.push = 99999;  //Push erhöht, damit nur diese Enitity vom Trace getroffen werden kann
wait(1);  // einen Frame warten, das c_trace in event_funktionen sonst nicht funktioniert
while(mouse_ent == me)  // solange die maus über dem Sprite ist
{
	if (c_trace(camera.x, temp_vec, (IGNORE_PUSH | SCAN_TEXTURE | USE_POLYGON)) > 0)  // falls der trace von der camera durch den mousezeiger etwas trifft
	{
		if(hit.entity == me)  // falls das sprite selbst getroffen wurde
		{
			pixel = pixel_for_bmap(temp_bmap, hit.u1, hit.v1);  // pixel an trefferstelle auslesen (geht nicht)
			pixel_to_vec(farbe, alphawert, format, pixel);  // pixelwerte speichern
			debug1 = hit.u1;  // bleibt immer 0
			debug2++; // wird korrekt hochgezählt, solange der mauszeiger über dem sprite ist
		}
		vec_set(temp_vec, mouse_dir3d);
		vec_normalize(temp_vec, 90000000);
		vec_add(temp_vec, camera.x);  // trace-vektor neu berechnet, da sich die mausposition über dem sprite ja ändert
	}
	wait(1);
}
bmap_unlock(temp_bmap);  // Bitmap wieder freigegeben
debug1 = -2;  // wird korrekt zurückgesetzt, wenn die maus das sprite verlässt!
my.push = 1;  // push wieder reduzieren

Vielleicht siehst du ja einen Fehler...

Danke schonmal!
© 2024 lite-C Forums