Zu schnell um zu Kollidieren?

  • GM 8

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

  • Zu schnell um zu Kollidieren?

    Hallo Leute,

    Sagtmal, kann es sein, dass sich ein Objekt zu schnell bewegen kann, damit es auf Kollision mit einem Anderen Objekt
    den Auslöser welcher dadurch losgehen würde, ignoriert? Ich merke das gerade selbst bei meinem Spiel:
    Ich habe eine Kugel mit den Maßen 10x2 pixel. sprich so hier : ------>
    Diese hat eine Geschwindikeit von 200 und ist somit unausweichlich schnell. Das Poblem ist jetzt aber, dass Die Kugel kaum
    den Gegner trifft sindern hindurch geht ohne das etwas passiert. Nur aus bestimmtem entfernungen und Winkeln trifft die
    Kugel. Ich hab keine Ahnung was das zu bedeuten hat.

    Hat eventuell Jemand Tips? Danke schonmal :)

    Euer <(Kirby)>

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Selbst bei Speed 40 gehen die Kugeln aus einem Schrägen Winkel durch 32x32 Dicke Objekte oder prallen
    schon einige Pixel vorher an die "Wand". Bei einem Snipergewehr sollte der Gegner nicht ausweichen sollen
    und durch Wände solln die Kugeln auch nicht gehen. Jetzt bin ich ratlos

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Dieser "Fehler" ist ganz normal und auch logisch.
    Da dein Spiel ja nicht mit einer Unendlichen Framerate läuft, muss das Objekt ja auch "Springen". Diese Frage taucht hier allerdings in regelmäßigen Abständen auf.

    Lösung: mit diversen collision_* Funktionen zwischen der aktuellen Position und der nächsten checken, ob alles frei ist.

    Und noch was: Nehm es mir nicht Übel, aber so eine Frage kommt in der Regel nur von D'n'D Einsteigern oder vllt gar von GML Anfängern. Die allermeisten überschätzen sich beim Anmelden hier mit der Selbsteinschätzung. Und bitte bedenke: Die ist nicht dafür da, um angeben zu können, für wie toll man sich hält. Sondern dafür, die Hilfe, die du durch Posts wie diese bekommen wirst, an dich anpassen zu können.

    Der gute MewX hat da mal was verfasst:

    guten Mew schrieb:

    Anfänger heißt, dass ihr gerade mit GML angefangen habt und noch mit Grundbegriffen und der Hilfedatei kämpft.
    Ein Anfänger ist man solange, wie man sich noch unsicher ist über Dinge wie Klammern, Aufbau von z.b. switch-Statements etc..

    Fortgeschritten heißt, dass man vielleicht noch nicht alle Funktionen kennt, aber zumindest weiß, wo man sie findet und wie man sie dann auch benutzt. Sonst sollte ein Fingerzeig ausreichen, um euch bei einem Problem zu helfen.
    Es wird auch erwartet, dass ihr bis auf wenige Ausnahmen jedes Game Maker Script mithilfe der Dokumentation lesen und verstehen könnt.
    Quereinsteiger von anderen Sprachen dürften diesen Rang von Anfang an tragen, da sie mit Dokumentationen schon Erfahrung haben sollten.

    Experte heißt, dass ihr die Hilfedatei komplett gelesen habt, beste Kenntnisse über den Funktionsumfang des Game Makers habt und auch mittlerweile programmtechnisches Geschick, das auch außerhalb des GMs zur Geltung kommt, vorweisen könnt.
    Eure Probleme (sofern ihr überhaupt mal welche habt) erfordern meist den Einsatz von DLLs oder einen sehr raffinierten Umgang mit dem GM. 1-2 Jahre solltet ihr, je nachdem wieviel ihr mit dem GM die Woche über macht, schon mit dem Game Maker programmiert haben.


    MfG SDX
  • Sorry aber da muss ich eben selber lachen :D

    GML-Quellcode

    1. var pix,piy,mx,my,lw,ex,ey,txx,tyy;
    2. if position_meeting(x,y,obj_clear){instance_destroy();}
    3. else
    4. {
    5. lw=sprite_width;
    6. ex=lengthdir_x(sprite_width,image_angle);
    7. ey=lengthdir_y(sprite_width,image_angle);
    8. pix=x+ex;
    9. piy=y+ey;
    10. if ey>0
    11. {
    12. with p_stop
    13. {
    14. t=(y-other.y)/ey;
    15. if t>0
    16. {
    17. mx=other.x+ex*t;
    18. if mx=median(x,mx,x+32*image_xscale)
    19. if t<lw
    20. {
    21. pix=mx;
    22. piy=y;
    23. lw=t;
    24. }
    25. }
    26. }
    27. }
    28. if ey<0
    29. {
    30. with p_stop
    31. {
    32. my=y+32*image_yscale;
    33. t=(my-other.y)/ey;
    34. if t>0
    35. {
    36. mx=other.x+ex*t;
    37. if mx=median(x,mx,x+32*image_xscale)
    38. if t<lw
    39. {
    40. pix=mx;
    41. piy=my;
    42. lw=t;
    43. }
    44. }
    45. }
    46. }
    47. if ex>0
    48. {
    49. with p_stop
    50. {
    51. t=(x-other.x)/ex;
    52. if t>0
    53. {
    54. my=other.y+ey*t;
    55. if my=median(y,my,y+32*image_yscale)
    56. if t<lw
    57. {
    58. pix=x;
    59. piy=my;
    60. lw=t;
    61. }
    62. }
    63. }
    64. }
    65. if ex<0
    66. {
    67. with p_stop
    68. {
    69. mx=x+32*image_xscale;
    70. t=(mx-other.x)/ex;
    71. if t>0
    72. {
    73. my=other.y+ey*t;
    74. if my=median(y,my,y+32*image_yscale)
    75. if t<lw
    76. {
    77. pix=mx;
    78. piy=my;
    79. lw=t;
    80. }
    81. }
    82. }
    83. }
    84. length=point_distance(x,y,pix,piy);
    85. image_xscale=length/sprite_width;
    86. }
    Alles anzeigen


    Die Lösung war nichmal so schwer eig. Das ist ne gute alternative find ich.

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • 100 Zeilen für sowas?
    Wie wärs mit

    GML-Quellcode

    1. collision_line(xprevious, yprevious, x, y, obj_enemy, true, false);


    Wenns sichs nur um Geschosse handelt, die praktisch keine Breite haben (Sniperrifle), ist das wohl die einfachste Lösung.

    Edit: Ups, hab grad SDX' Post gelesen, muss ihm aber auch bei der Selbsteinschätzung zustimmen...

    © 2008 by Teamgrill Productions
  • Selbst die ENtwickler selbst können Dir nicht alle Fragen beantworten also was soll das schon wieder?^^
    Nein, schau doch meinen obigen Code an, er prüft sofort das Andere Ende der Map und alles dazwisschen.
    Das heißt, dass die "Kugel" realistisch schnell ist und sofort Ihr Ziel erreicht. Funktioniert Super :)

    Danke trotzdem für die Antwort...

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Man kann einen Step auch z.B. mit einer for-Schleife in beliebig viele Schritte unterteilen, um exakte Kollisionserkennung zu erhalten. Kirby, hab mir deinen Code wegen der Länge jetzt nicht angeschaut - wird auch geprüft, ob Wände dazwischen liegen?
    █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
    █████ ███████ ███ your █████ ████ government.
  • Benutzer online 3

    3 Besucher