Dreieck Winkel Beta und HöheC

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

    • Dreieck Winkel Beta und HöheC

      Also zum Grundaufbau:Ich habe ein Objekt, dass ich mit der Maus fröhlich hin und her schieben kann. Jetzt habe ich darum einen Kreis gezeichnet, der praktisch das Sichtfeld abzeichnen soll mit einem Radius von 150.Dann habe ich die x und y Koordinaten genommen und mit

      GML-Quellcode

      1. r = 150;
      2. while (trace1 = true )
      3. { direct1 = point_direction(plX,plY,x,y) + direct1Mod;
      4. // plX ist die x Koordinate der Quelle und ext wäre dann der Ausgleich
      5. point1X = plX + lengthdir_x(r+ ext,direct1);
      6. point1Y = plY + lengthdir_y(r+ ext,direct1);
      7. direct1Mod+=0.1 ;
      8. if (!collision_line(plX,plY,point1X,point1Y,id,true,false)) {trace1 = false} }
      9. // noch mehr code für Kontaktpunkte und dann
      10. while (trace2 = true )
      11. direct2 = point_direction(plX,plY,x,y) + direct2Mod;
      12. point2X = plX + lengthdir_x(r+ ext,direct2);
      13. point2Y = plY + lengthdir_y(r+ ext,direct2);
      14. direct2Mod-=0.1 ;
      15. if (!collision_line(plX,plY,point2X,point2Y,id,true,false)) {trace2 = false}}
      Alles anzeigen

      Linien gezeichnet, die sich nach auftreffen auf ein (oder dieses) Objekt langsam bis zu dessen äußersten Kanten bewegen und so ein Dreieck bilden.
      So weit so einfach.
      Jetzt kommt der Teil an dem mich meine Schulkenntnisse verließen: Ich muss die Höhe des Dreiecks berechnen, damit die Seite C nicht innerhalb des Kreises rutscht wenn ich zu nah an einem Objekt stehe.
      So könnte ich durch die Höhe eben Prüfen ob sie mindestens 1px größer als der Radius des Sichtbereichs ist.Ich komm aber mit diesem arccos() bzw radtodeg() nicht klar. Probiert habe ich schon die seltsamsten Sachen und nix hilft.

      GML-Quellcode

      1. a = r; b= r;
      2. c = point_distance(point1X,point1Y,point2X,point2Y);
      3. beta = radtodeg( arccos( (sqr(b) - sqr(c) - sqr(a)) / (-2 * c * a) ) );
      4. h = a * sin(beta); // nope
      5. h2 = a/2 * sqrt(3); // nope

      WIE GEHT DAS?!
      Ich hab bald keine Haare mehr zum ausreissen ...

      EDIT:
      Der Kreise und die Linien und sowas:

      GML-Quellcode

      1. if (point_distance(plX,plY,x,y) < r) {
      2. draw_line(plX,plY,point1X,point1Y) // a
      3. draw_line(plX,plY,point2X,point2Y) // b
      4. draw_line(point1X,point1Y,point2X,point2Y) // c
      5. }
      6. draw_self()
      7. with(pl){
      8. draw_circle(x,y,other.r,1)
      9. }
      Alles anzeigen


      EDIT # 999:
      Ich bekomm dauernd nen Fehler vom Forum wonach meine Sizung abgelaufen sei. Aller 10 Sekunden oder sowas.
      Kennt einer noch das Kind das brüllte wes wolle jetzt unbedingt Unreal Tournament spielen ... SO GEHTS MIR GRAD! ^^

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von yokmp ()

    • Ich hab nach wie vor keine wirklich Ahnung die die Winkelberechnung nun eigendlich funktioniert.Meanwhile hab ich einfach die Distanz gemessen, durch Pi geteilt und das dann zu den Seiten a und b addiert.Dazu noch die If Abfrage angepasst und voila es funktioniert zwar nicht so super exakt aber es geht.Ein Problem wäre wenn man z.B. einen Platformer schreibt in dem man eine Lichtquelle spielt und auf einen schadowcaster steht. Dann hätte man an einer Ecke das Problem, dass der Schatten dann starr bleibt. Hier muss man also über sein Kollisions System arbeiten. Allerdings will ich das eben nur also quelle für meine Fackeln nutzen und die laufen ja bekanntlich nicht von selbst ^^

      GML-Quellcode

      1. /* minDist = Sprite width/height der beiden Objekte / 2
      2. also (max(width, height) + max(width, height)) / 2
      3. Das collision-script tut dann sein übriges
      4. */
      5. if (point_distance(plX,plY,x,y) < r) && (point_distance(plX,plY,x,y) > minDist) {inLight = true}
      6. else {inLight = false}
      7. if (inLight = true) {
      8. // while loops
      9. d = point_distance(x, y, point1X, point1Y);
      10. ext = d / pi;
      11. }
      Alles anzeigen