mouse_click with box?

Posted By: Rasch

mouse_click with box? - 04/14/09 14:54

hi people,

i use the EVENT_CLICK function. And everything works fine. there is no problem with the code but the mouse only detects the entity if you are over the entity. And i don´t mean over the entitys bounding box. Just if you are exactly on the model you can click or touch it.

Is there a way to make the entity mouse_detect whatever bigger? or is it possible to select via bounding box?

greets
Posted By: VeT

Re: mouse_click with box? - 04/14/09 18:03

I think, trace comes through all polygons of all models... if you want bb selection, write your own code, wich would send a trace in the world and watching for bb's.
Posted By: Ralph

Re: mouse_click with box? - 04/14/09 21:10

What about mouse_range?
This should solved your problem.
Posted By: Rasch

Re: mouse_click with box? - 04/14/09 21:44

@Ralph

Das erhöht ja nur meine Reichweite. Mir geht es einfach darum das er nicht das sichtbar des Modells nur selektiert sondern schon wenn die Maus etwas daneben ist das Modell selektiert smile
Posted By: Ralph

Re: mouse_click with box? - 04/14/09 21:52

Warum konvertierst du nicht die Mausposition in 3D Koordinaten(vec_for_screen) und machst dann per vec_dist eine prüfung wie weit die Maus von der Entity weg ist?

Also in etwa so:
Code:
VECTOR* temp = nullvector;
temp.x = mouse_pos.x;
temp.y = mouse_pos.y;
temp.z = 200;
vec_for_screen(temp,camera);
if(vec_dist(my.x,temp.x) > 400 && mouse_left == 1)
{
  //irgendwelcher Code den du ausführst
  //wenn die Maus im Umkreis von 400 Quants
  //zu dieser Entity ist und die linke Maustaste gedrückt wird.
}


MFG Ralph
Posted By: Rasch

Re: mouse_click with box? - 04/14/09 22:10

gut der Code ist schonmal hilfreich. Allerdings brauch ich das ganze so.

Ich hab meinen player vor mir (3rd person) und ich möchte mit der Maus gegner im Umkreis anklicken. Wenn ich das tue rennt mein Char dahin und fängt an sich mit ihnen zu "prügeln". Das ganze funktioniert, nur will ich nun das ich nicht mit der Maus direkt über das Mesh fahren muss sondern das meine Maus schon die Bounding Box als Modell erkennt.

Und genau das krieg ich nicht hin im Moment
Posted By: CHaP

Re: mouse_click with box? - 04/14/09 22:39

Ahja, also ich hätte einen Vorschlag.

Ist zwar nicht der aller Schönste aber er funktioniert.

Erstell dir in der Größe, wo der Spieler den Gegner schon anklicken kann, eine Box. Wenn es mehrere verschiedenen Feinde sind, brauchst du natürlich auch verschieden skalierte.

Diese Boxen werden dann jedem Gegner drübergesetzt. Das heißt: Diese Entitys sind umschlossen von denen. Fungieren also als Hülle.

Das sind am Ende die eigentlichen, anklickbaren Objekte im Level.
Es wird also nicht mehr der Gegner ansich klickbar gemacht, sondern die Box umhin herum. Somit musst du dann der Box das Handle des Gegners mit beim erstellen übergeben, um diesen dann indirekt zu selektieren. Oder du benutzt die Box allein als Ziel zum anvisieren, da die Box ja den selben Vektorursprung hat, wie die Gegner-Entity.

Zu guter letzt, werden die Boxen noch mit ENABLE_CLICK maskiert und bekommen das TRANSLUCENT Flag mit einem Alpha Wert von 0.1 oder kleiner. Damit sind diese sogut wie nicht sichtbar (Hoffe ich zumindest, habs noch nicht getestet.) und können trotzdem noch angeklickt werden. Zur Not kannst du noch das ZNEAR Flag setzen.

Versuchs mal. =)
Viel Glück!
Posted By: Rasch

Re: mouse_click with box? - 04/15/09 08:45

Diese Möglichkeit habe ich berits probeirt nur stecke ich fest bei übergeben das Handles. Wie genau soll das vonstatten gehen? Ich wähle meine Unit nämlich per mouse_ent und weise dieser dann einen Pointer zu (für die gerade anvisierte Unit)

Gruß
Posted By: CHaP

Re: mouse_click with box? - 04/15/09 11:33

Ach, das würde ich ganz einfach halten.

Da du ja, für jeden Gegner eine Box erstellt hast oder eine die in etwa, für alle Gegner konform ist, ist das Problem schon mal gelöst.

Ich versuch das mal Stichwortartig grob zu beschreiben:


Als erstes erstellen wir die Entitys.

Code:
   ENTITY* NewEnemy = ent_create("gegner.mdl",vector(x,y,z),Enemy)
   ENTITY* NewEnemyBox = ent_create("gegner_boxes.mdl",vector(x,y,z),EnemyBox)


Damit später der Gegner selektiert werden kann, übergeben wir das Handle der zum Gegner gehörigen Box.

Code:
   NewEnemyBox.skill1 = handle(NewEnemy);


Somit ist das Gegner-Handle jetzt in der entsprechenden Gegner-Box hinterlegt.

In der FUNCTION von der EnemyBox musst du natürlich auch dafür sorgen, dass diese Box dem Gegner folgt, also ständig die 1zu1 Vektoren inne hat. Der einfachste Weg herfür ist auch das entsprechende Handle zu benutzen.

Code:
void EnemyBox()
{
   ENTITY* pMyEnemy = ptr_for_handle(my.skill1);
   while(1)
   {
      vec_set(my.x,pMyEnemy.x);
      wait(1);
   }
}


Damit die Box klickbar wird, fehlt noch folgendes in dieser FUNCTION.

Code:
void EnemyBox()
{
   ...
   my.emask |= (ENABLE_CLICK);
   my.event = EnemyBoxEvent;
   ...
}


EVENT-FUNCTION dazu:

Code:
void EnemyBoxEvent()
{
   switch(event_type)
   {
      case EVENT_CLICK:
      {
         ENTITY* ClickedEnemy = ptr_for_handle(my.skill1);
         MakeSomethingWithTheSelectedEnemy(ClickedEnemy);
         break;
      }
   }
}


So, im Ganzen dürfte das es schon gewesen sein.
Es wird jedesmal, wenn die Box angeklickt wird, das Handle aus der Box gelesen und in einen Pointer für den entsprechenden Feind konvertiert und anschließend in eine Funktion übergeben.
Diese Funktion dürfte dann die "normale" Funktion sein, die du für deine klickbaren-Gegner, ohne klickbare-Box, benutzen würdest.

Damit diese Box dann relativ unsichtbar wird, sollte noch das TRANSLUCENT Flag gesetzt werden.

Code:
   set(my,TRANSLUCENT);
   my.alpha = 0.1;

Posted By: Rasch

Re: mouse_click with box? - 04/16/09 06:26

Alles klar dann probier ich das ganze mal so danke
© 2023 lite-C Forums