Kollisionserkennung bei Taschenlampen Tutorial

  • GM 6

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kollisionserkennung bei Taschenlampen Tutorial

    Hallo Leute!
    Ich bräuchte mal Hilfe bei einem Tutorial das ich schon lange auf der Platte habe (leider weiß ich nicht mehr wer der Autor davon ist, finde den Thread auch nicht mehr).
    Es handelt sich dabei um eine Taschenlampe deren Licht bei auftreffen auf eine Wand realistisch angepasst wird. Soweit so gut, jetzt will ich aber eine kleine Modifikation vornehmen, folgendes:
    Die Gegner sollen nur sichtbar sein wenn sie vom Licht getroffen werden. Hab da schon ein paar Sachen ausprobiert, mein Problem besteht haupsächlich darin das ich die ID der im Licht stehenden Gegnern nicht zuordnen kann
    um die dann auf visible=true oder false zu setzen. Hier ist mal das Example:

    grinchxl.bplaced.net/fogofwar.rar
  • Habs mir mal angeguckt. Am einfachsten ist es die Schleife aus dem Script "nofog" auszunutzen und einfach immer wenn ein lichtkegel gedrawt wird auch die gegner im lichtkegel sichtbar zu machen.
    Vor der Schleife setzt man dann einfach alle "object3" Instanzen auf visible = false;

    GML-Quellcode

    1. //script nofog
    2. with(object3){
    3. visible = false;
    4. }
    5. for(i=45;i>-45;i-=2.5)
    6. {
    7. for(ii=0;ii<argument3;ii+=10)
    8. {
    9. dir=argument2+i
    10. xx=argument0+lengthdir_x(ii,dir)
    11. yy=argument1+lengthdir_y(ii,dir)
    12. col = collision_circle(xx,yy,8,block,1,1); //Prüfen ob da nen Block ist der Licht abhält
    13. if (!col) {
    14. draw_sprite(sprite1,0,xx,yy)
    15. }
    16. else {
    17. break
    18. }
    19. //Nochmal ne Kollision prüfen und gucken ob da nen Gegner im Lichtkegel ist
    20. col2 = collision_circle(xx,yy,8,object3,1,1);
    21. if(col2>0){
    22. with(col2){visible = true}
    23. }
    24. }
    25. }
    Alles anzeigen


    Das ist meiner Meinung nach nicht wirklich schöner code, vor allem da 2 Kollisionsprüfungen durchgeführt werden aber es funktioniert. Quick'n'Dirty. :]

    Man könnte die Gegner und andere Objekte mit nem gemeinsamen Parent subtypisieren und dann den collision circle z.B. nur für "obj_lightable" berechnen lassen, oder gleich für alle Objekte falls du das willst.
    Dann würd ich nach dem collision_circle über den Objektnamen nen Switch machen und gucken was passieren soll wenn im Circle nen Block liegt oder ein Gegner oder sonst was.
    Ok... mein Satzbau grad war scheiße aber ich denke du hast meinen Gedanken verstanden oder? o.o
  • Super, werd ich gleich mal probieren, danke. Das ganze soll nur für die Gegner gelten, alles andere bleibt sichtbar, also sollte dein erster Lösungsweg ausreichen, die doppelte Kollisionsabfrage nehm ich in kauf. :thumbsup:
    Hab bei dem ganzen jetzt aber schon wieder ein anderes Problem, hab das TaschenlampenExample jetzt in mein Spiel integriert, welches große Räume verwendet, da geht dann die Performance arg in die Knie, obwohl es mit der größe des Raumes ja nichts zu tun haben sollte, da die Surface ja nur so groß gezeichnet wird wie der View.