Boulder Dash Problem mit den Schmetterlingen

  • Boulder Dash Problem mit den Schmetterlingen

    Hallo an Alle :)

    Hab mal wieder ein kleines Problem bei Boulder Dash. Bin jetzt fast fertig mit dem Hauptengine des Spiels.
    Aber dennoch habe ich ein kleines Problem. Folgendes:
    Wenn ich die Schmetterling zur Explosion bringe kann es manchmal sein, das sie nicht genau im Raster sind. Und die dabei erzeugten Diamanten sind versetzt. Sie lassen sich zwar einsammeln, aber sie fallen nicht mehr nach unten.
    Am besten ihr ladet auch das Prog und testet es mal. Es lässt sich nämlich schlecht erklären.
    Ich kannn nur hoffen das jemand einen Rat weis.

    Gruss Drachen
    Dateien
  • Das liegt daran, dass die Objekte an Stellen außerhalb des Rasters sind. Du müsstest die zerstörten Objekte vor der Umwandlung in Diamanten z.B. mit move_snap ins Raster bewegen.

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Hallo

    Danke für die Antworten.
    Aber das benutze ich bereits. Hier einen Auszug aus dem Code "fallende Diamaten"

    GML-Quellcode

    1. /////////////////////////////////////////////////
    2. // Diamaten fallen nach unten //
    3. /////////////////////////////////////////////////
    4. {
    5. if ( !place_snapped(32,32) ) exit;
    6. if (place_empty(x,y+32))
    7. {
    8. vspeed = 4;
    9. fallen = 1; // Stein ober Diamant fällt
    10. }
    11. else if (place_meeting(x,y+32,obj_Rand) ||
    12. place_meeting(x,y+32,obj_Erde) ||
    13. place_meeting(x,y+32,obj_Fels) ||
    14. place_meeting(x,y+32,obj_Diamant) ||
    15. place_meeting(x,y+32,obj_Mauer))
    16. {
    17. // Prüft ob links-unten und links nebenan alles frei ist
    18. vspeed = 0;
    19. fallen = 0; // Stein ober Diamant fällt nicht mehr
    20. if (place_empty(x-32,y+32) && place_empty(x-32,y))
    21. {
    22. move_snap (x-32,y); // Felsbrocken nach links verschieben
    23. }
    24. // Prüft ob rechts-unten und rechts nebenan alles frei ist
    25. else if (place_empty(x+32,y+32) && place_empty(x+32,y))
    26. {
    27. move_snap (x+32,y); // Felsbrocken nach rechts verschieben
    28. }
    29. else
    30. instance_change(obj_Diamant,true);
    31. }
    32. }
    Alles anzeigen


    Das Problem ist, das er die Explosion richtig setzt wenn der Felsbrocken oder der Diamant den Schmetterling trifft. Aber dann beim erzeugen der Diamaten sie dann nach unten um ein paar Pixel versetzt. Warum weis ich leider nicht. Hab schon alles versucht was ich weis. Die einzigt Vermutung die ich habe ist folgender. Da ich alle Objekte mit vspeed bewege, treffen sich die Sprits irgend wo und lösen dann die Collision aus. Solange es nur die Explosion ist, funktioniert es. Bloss bei der Erzeugung von den Diamanten haut es nicht immer hin. Ich kann nur hoffen das einer von euch mir den richtigen Tip geben kann.
    Gruss Drachen :)
  • Hi looiger joi

    Ich weis zwar nicht wie man ins negative kommt mit move_snap da ich immer von der Position des Objektes gehe. Aber ich werde es mal genauer unter die Lupe nehmen.
    Danke

    Druss Drachen

    [Zusammengeschoben durch CAS]

    Hallo wieder an Alle ;)

    Ich habe das Problem gelöst. Ist zwar nicht sehr elegant, aber funktioniert. Für jeden der das Prog herunter geladen hat, fügt folgendes hinzu beim
    Script "scr_Raster3x3"

    GML-Quellcode

    1. ////////////////////////////////////////////
    2. // Diamanten und Explosionen erzeugen //
    3. ////////////////////////////////////////////
    4. {
    5. var pos_x, pos_y, zwischen_x, zwischen_y;
    6. pos_x = 0;
    7. pos_y = 0;
    8. zwischen_x = 0; // Neu für X-Wert
    9. zwischen_y = 0; // Neu für Y-Wert
    10. Treffen = argument0;
    11. Erzeugen = argument1;
    12. /////////////////////////////////
    13. // Feld 3x3 Raster erzeugen //
    14. /////////////////////////////////
    15. zwischen_x = x/32; // X-Wert zuwischen lagern
    16. zwischen_y = y/32; // Y-Wert zwischen lagern
    17. x = floor(zwischen_x)*32; // X-Wert runden und mit Rasterwert multiplizieren
    18. y = floor(zwischen_y)*32; // Y-Wert runden und mit Rasterwert multiplizieren
    19. for(pos_y=-1;pos_y<=1;pos_y+=1)
    20. {
    21. for(pos_x=-1;pos_x<=1;pos_x+=1)
    22. {
    23. if(!position_meeting(x+32*pos_x,y+32*pos_y,obj_Rand))
    24. {
    25. if(position_meeting(x+32*pos_x,y+32*pos_y, Treffen))
    26. {
    27. position_destroy(x+32*pos_x,y+32*pos_y);
    28. instance_create(x+32*pos_x,y+32*pos_y,Erzeugen);
    29. }
    30. else
    31. {
    32. position_destroy(x+32*pos_x,y+32*pos_y);
    33. instance_create(x+32*pos_x,y+32*pos_y,Erzeugen);
    34. }
    35. }
    36. }
    37. }
    38. }
    Alles anzeigen


    Ich weis zwar nicht warum er innerhalb des Raster eine Collision auslöst, aber mit der Umrechnungsmethode klappt es. Aber wenn jemanden dazu noch was einfällt, kann er es mir mit teilen. Damit ich bei meine nächsten Projekte so einen Fehler vermeiden kann.
    Gruss Drachen :)
  • Benutzer online 1

    1 Besucher