überprüfen von instancen

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

  • überprüfen von instancen

    Sorry für die schlechte überschrift, doch ich wusste nicht wie ich mein problem benennen soll.

    Also es geht um volgendes:

    Ich habe ein Problem bei der überprüfung meines obj_players, ob vor ihm das obj_block steht. wenn ja, darf er sich nicht nach rechts bewegen. ich habe dies teilweise mit position_meeting gelöst. doch ich wollte das er noch zusätzlich 3 andere positionen der y achse überprüft.

    mein Char ist 16+20 Pixel groß. Wenn nun er nur eine Koordinte überprüft, könnte er sozusagen zur hälfte durch den Block marschieren. versteht ihr mein Problem?

    Hier der script:

    GML-Quellcode

    1. if (keyboard_check(vk_right)) {
    2. sprite_index = spr_rechts_gehend;
    3. if not (place_meeting(obj_player.x + +16,obj_player.y + 0 && obj_player.y + +10 && obj_player.y + +10,obj_block)){
    4. x+=+2;
    5. }
    6. }
  • Nö, ich habs nicht so recht verstanden, vielleicht könntest du dein Bild malen?

    Das is jedenfalls sehr seltsamer Code.

    GML-Quellcode

    1. if not (place_meeting(obj_player.x + +16,obj_player.y + 0 && obj_player.y + +10 && obj_player.y + +10,obj_block)){


    GML-Quellcode

    1. &&

    du meinst wohl:

    GML-Quellcode

    1. ( not place_meeting(obj_player.x + 16, obj_player.y,obj_block) && not place_meeting(obj_player.x + 16, obj_player.y + 10,obj_block))


    lass das + + 1 weg, das is unnötig und machts unübersichtlich, ein + reicht, du musst ihm nicht sagen, dass eine Zahl positiv ist, das erkennt er selbst ;)

    Liess dir besser nochmal GML durch, du hast da nämlich ein paar grundlegende Dinge falsch gemacht...

    Ansonsten wär vielleicht ein schönes aufschlussreiches Bild hilfreich =)
    "das war meine letzte flamewar PM an dich ."
  • Also gut. ich habe mal schnell mit Paint net ein kleines Bild gemalt wie das ganze ausschauen sollte:



    Ich meine, das rechts von Objekt Player, an 3 Punkten (die ich Rot angedeutet habe) überprüft wird ob sich in dieser entfernung das objekt Block befindet.

    Der Hintergedanke ist dabei, das der Spieler vor dem objekt Block "stoppt". Da er aber bei dem befehl place_meeting nur eine Koordinate in der nähe des Players überprüft, kann es vorkommen das (wenn der Block sich weiter oben bzw unten befindet...) er über dem Block marschiert. (Weil die Koordinate nicht mit dem obj_Block kollidiert.)

    Und darum will ich 3 Koordinaten (rote Punkte) überprüfen lassen, damit dieser fehler mit der Wand nicht vorkommt.

    (Und sorry, das ich ein bisschen falsch scripte. ich lerne nebenbei JAVA, und da passiert es mir oft, das ich GML und java vermische.)
  • mach doch einfach mit place_free(...)
    das check quasi mit der aktuellen mask an der angegebenen position, und nicht nur ein punkt.
    dann brauchst nur einmal überprüfen(wobei ich dachte, place_meeting macht genau das gleiche)...

    GML-Quellcode

    1. if (place_free(x+16, y))
    2. {
    3. x+= 1;
    4. }
    5. //wobei folgendes auch funktionieren müsste:
    6. if (!place_meeting(x+16,y,obj_block))
    7. {
    8. x+=1;
    9. }


    und die 3 überprüfungen machst du prinzipiell genau gleich wie in java ;)
    "das war meine letzte flamewar PM an dich ."
  • @ LogantheMaster:
    Das gleiche mach ich ja auch bei meinem Script. Das Problem ist eben nur des er NUR einen Punkt überprüft...

    @ blubberblub:

    Sorry für die dämliche Frage, aber was genau ist ein "mask"?
    Meinst du dass er mit Place_free, das Sprite des Players sozusagen nach rechts "verschiebt" und eine Kollision überprüft?
  • Okay, ein anderer Vorschlag:

    versuchs mit

    GML-Quellcode

    1. if !collision_rectangle(x,y-10,x+3,y+10,obj_block,true,false) x+=2
    2. //die 3 kommt so zustande, dass ich die Hälfte des Objekts nehme (16/2) und dann 5 Pixel nach rechts gehen will


    Ein Mask ist der Sprite mit dem die Kollision geprüft wird, ist entweder der "richtige" Objekt-Sprite oder im Objekt selbst unterhalb von "Depth" eingestellt.
  • LEWA schrieb:



    Sorry für die dämliche Frage, aber was genau ist ein "mask"?
    Meinst du dass er mit Place_free, das Sprite des Players sozusagen nach rechts "verschiebt" und eine Kollision überprüft?

    Geh mal im Objekt Editor links guggen, da steht mask. Die Maske ist prinzipiell ein Sprite, das der Gamemaker zur Kollisionsprüfung verwendet, wenn du keine Mask ausgewählt hast, dann überprüft er standartmässig mit dem normalen Sprite vom Objekt.
    Jap, place_free funktioniert genau so ;)

    Logans Lösung überprüft allerdings auch ein wenig überhalb und unterhalb nach Kollision, wenn du das wolltest.
    "das war meine letzte flamewar PM an dich ."
  • Benutzer online 8

    8 Besucher