Ball Fragen

  • Ball Fragen

    Neu

    Ich hatte gerade eine Idee für ein kleines Spiel, leider weiß ich mit meinen bisherigen Kenntnissen nicht, wie ich es umsetzen soll, daher 2 Fragen zu einem runden Objekt (bspw. einen Ball).

    1. Ich möchte beeinflussen können in welche Richtung er fliegt bspw. ich berühre Ihn unten links, er soll nach rechts oben fliegen, ich berühre Ihn mittig oben, er fliegt mittig nach unten usw.

    2. Er soll von Wänden abprallen, bspw. er kommt schräg von unten, also soll er schräg nach oben fliegen

    Ich hoffe das Prinzip ist verständlich erklärt.
  • Neu

    Jedes GameMaker Object hat die eingebauten Variablen hspeed und vspeed. Beide zusammen kannst du benutzen um deinen Ball in jede beliebige Richtung zu lenken.

    hspeed = 1 - Ball fliegt nach rechts
    vspeed = 1 - Ball fliegt nach unten
    Beides zusammen - Ball fliegt nach rechts unten.

    Dabei gibts ein kleines Problem, aber dazu dann später.

    Wenn du den Ball jetzt von unten nach oben schicken willst, zB bei jedem Mausklick und die Geschwindigkeit von der Distanz zur Mausposition abhängig sein soll, dann geht das so:

    GML-Quellcode

    1. if mouse_check_pressed(mb_left){hspeed = x - mouse_x;vspeed = y - mouse_y;}


    x - mouse_x ist distanz zwischen x vom Ball und der Maus ( bei ball.x = 32 und mouse_x = 24 => 32-24 = 8 => hspeed = 8 )


    Das vorher schon erwähnte Problem kennt man von alten Computerspielen, wo man oft schneller läuft wenn man nach Vorne und nach Rechts gleichzeitig läuft anstatt nur nach Vorne oder Rechts. Wenn der Ball hspeed und vspeed auf Eins hat, dann wandert er auch schneller diagonal durch den Raum, als wenn er nur entlang der x oder y achse wandert.
    Um das zu verhindern, muss man sich einen Kreis um den Ball vorstellen, der einen Radius der Geschwindigkeit hat. Egal wo man jetzt den Ball hinbewegt auf diesem Kreis, hat er die selbe Geschwindigkeit. Mit hspeed und vspeed hat man eher ein Quadrat um den Ball das die Geschwindigkeit anzeigt.

    GML-Quellcode

    1. if mouse_check_button_pressed(mb_left){//winkel zwischen ball und mousevar dir = point_direction(x, y, mouse_x, mouse_y);//distanz zwischen ball und mouse, was dann als speed gehandelt wirdvar spd = point_distance(x, y, mouse_x, mouse_y);//lengthdir_x und _y sind wie cos und sin und bezeichnen einfach eine länge in Richtung eines winkels einmal für die x und einmal für die y achsehspeed = lengthdir_x(spd, dir - 180);vspeed = lengthdir_y(spd, dir - 180);//lengthdir_x(32, 0 bis 360) und lengthdir_y(16, 0 bis 360) beschreibt zB eine Ellipse mit einer Breite von 32 und Höhe von 16 pixel}



    So, das war jetzt ein bisschen viel, aber ich hoffe es war verständlich :)

    EDIT:
    Die Kollisionen hab ich vergessen - da musst du bloß hspeed oder vspeed umdrehen also mal -1 rechnen. zB

    GML-Quellcode

    1. if(collision_line(x, y, x, y+vspeed, obj_wand, false, true){
    2. //wenn oben oder unten am ball (je nach vspeed) eine kollision mit obj_wand stattfindet, dann dreh den vspeed um
    3. vspeed *= -1;
    4. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Aku_Ryou ()

  • Neu

    Ja klar :)

    das kannst du auch mit den lengthdir funktionen machen:
    Du holst dir mit point_direction() die Richtung in die es gehen soll und die Länge sind dien 50 Pixel.

    GML-Quellcode

    1. lengthdir_x(50, dir);
    2. lengthdir_y(50, dir);

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Neu

    ahja, dass hätte ich beinahe vergessen, wenn du direction direkt einstellst, dann brauchst du nur die speed variable auf 50 stellen.

    GML-Quellcode

    1. direction = point_direction(x, y, 63, 110);
    2. speed = 50;

    das wars mehr brauchst du dann nicht.

    btw: die lengthdir funktionen geben dir eine Zahl zurück, also musst du wenn dann x += lengthdir_x(len, dir) und y += lengthdir_y() benutzen.
    Wie kommst du auf die fixen Zahlen bei point_direction?

    webwhiteboard.com/board/wqjrgeet

    ich hab unter dem Link ein Whiteboard erstellt wo du siehst was ich meine, in blau ist die direction eingezeichnet die dein code machen würde und in grün, dass was du eigtl machen willst :) ich hoffe, dass macht das verständlicher

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)