Kollisionserkennung funktioniert nicht

    Kollisionserkennung funktioniert nicht

    Hallo,

    Ich bin gerade dabei ein Minecraft-2D ähnelndes Spiel zu programmieren.
    Hier mein Problem:

    Dies ist mein Code:

    Quellcode

    1. //Block platzieren
    2. if(point_distance(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_player.x, obj_player.y) < global.p_radius*32){ //Radius
    3. if(position_meeting(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_player) == false){ //Kollision neben Spieler
    4. if(position_meeting(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_block) == false){ //Kollision neben Block
    5. if(global.p_blocks > 0){ //Mehr als 0 Blöcke
    6. instance_create(floor(mouse_x/32)*32, floor(mouse_y/32)*32, obj_block); //Block wird platziert (am Grid)
    7. global.p_blocks -= 1; //Ein Block abgezogen
    8. }
    9. }
    10. }
    11. }


    Im Folgenen werde ich ihn kurz erklären, damit jeder weiß, worum es geht:

    Mit dieser Zeile prüfe ich die Position des Mausklicks. Bei einem bestimmten Radius um den Spieler, wird der Code fortgesetzt

    Quellcode

    1. if(point_distance(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_player.x, obj_player.y) < global.p_radius*32)



    Mit diesen beiden Zeilen prüfe ich, ob an dieser Position schon ein Block oder Spieler ist. Da es ähnlich wie in Minecraft ist, wird hier mithilfe der Funktion floor, die x- und y-koordinate der Maus, durch 32 geteilt.
    Der Rest wird abgeschnitten und diese Zahl mit 32 multipliziert. So wird der Block nicht irgendwie im Raum platziert, sondern an einem Grid.

    Quellcode

    1. if(position_meeting(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_player) == false){ //Kollision neben Spieler
    2. if(position_meeting(floor(mouse_x/32)*32+16, floor(mouse_y/32)*32+16, obj_block) == false){ //Kollision neben Block

    Das Problem ist, dass ich trotzdem einen Block in meinen Spieler platzieren kann, wenn er zwischen zwei Blöcken steht.
    Wenn ich beim Spieler place_meeting benutze, kann ich, egal wann, den Spieler zubauen.
    Meine Frage ist, ob jemand weiß, wie ich dieses Problem lösen könnte.



    In diesem Code wird geprüft, wieviele Blöcke ich habe, wenn es mehr als 0 sind, wird der Block am Grid platziert und ein Block von allen Blöcken abgezogen.

    Quellcode

    1. if(global.p_blocks > 0){ //Mehr als 0 Blöcke
    2. instance_create(floor(mouse_x/32)*32, floor(mouse_y/32)*32, obj_block); //Block wird platziert (am Grid)
    3. global.p_blocks -= 1; //Ein Block abgezogen



    Mit lieben Grüßen,

    SuspecT :event_collision:
    Kann es sein, dass die Kollision präzise ist und so keine Kollision stattfindet, da das sprite nicht oben links anfängt?
    Die Funktion point_in_rectangle sollte besser sein.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
    Ich habe es nur überflogen und mir ist gleich am anfang aufgefallen, dass

    floor(mouse_x/32)*32+16 sinnlos ist. du willst bestimmt div nutzen willst. Sonst könnte man es einfach kürzen.
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:
    Wo und mit welchem Wert hast du denn global.p_radius deklariert ?
    Könnte der Übeltäter sein.

    global.p_radius = 3; 3 wird dann mit 32 multipliziert und somit habe ich den Radius für den Spieler, in dem er einen Block platzieren / abbauen kann.
    Das dürfte nicht der Fehler sein. Trotzdem danke für die mithilfe ^^


    Kann es sein, dass die Kollision präzise ist und so keine Kollision stattfindet, da das sprite nicht oben links anfängt?
    Die Funktion point_in_rectangle sollte besser sein.

    Ich weiß leider nicht wie ich point_in_rectangle benutze. Ich habe es mit angepassten Werten versucht, wie es auf der docs.yoyogames Seite steht, ohne Erflog.
    Ich kann immernoch Blöcke im Objekt platzieren.


    Ich habe es nur überflogen und mir ist gleich am anfang aufgefallen, dass

    floor(mouse_x/32)*32+16 sinnlos ist. du willst bestimmt div nutzen willst. Sonst könnte man es einfach kürzen.

    Du meinst ich soll das '/' durch "div" ersetzen? Irgendwie ändert das nichts.


    Danke für euere Hilfe, hat jemand noch eine bessere Idee, vielleicht mit Lösungsansatz?
    Oh ...xD ich habe dein floor() übersehen.

    mouse_x div 32 ist das gleiche wie floor(mouse_x / 32) ^^

    Damit kann man es auch nicht mehr kürzen^^
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz:

    GML-Quellcode

    1. if (mouse_check_button_released(mb_left)) {
    2. if (point_in_rectangle(obj_player.x,obj_player.y,(mouse_x div 32) * 32, (mouse_y div 32) * 32, (mouse_x div 32 +1) * 32, (mouse_y div 32 +1) * 32)) {
    3. //Player ist im rect
    4. }
    5. }


    Sollte gehen
    • Bluetooth Multiplayer
    • Wasser App: play.google.com/store/apps/details?id=com.gaming_apps.water_physics_simulation
    • :shifty: :motz: