Kreise in Javascript bewegen (Klassen, move Methode)?

1 Antwort

Für die Richtungen:

  • left: X wird verringert.
  • right: X wird erhöht.
  • up: Y wird verringert.
  • down: Y wird erhöht.

Bedeutet für den Ablauf:

  1. Überprüfen, ob der erste Parameter "left", "right", "up" oder "down" ist, falls nichts davon zutrifft entweder nichts tun oder eine Fehlermeldung ausgeben.
  2. Die Methode delete aufrufen.
  3. Die durch den ersten Parameter bezeichnete Koordinate um den Wert des zweiten Parameters in die ebenfalls durch den ersten Parameter bezeichnete Richtung verschieben.
  4. Die Methode draw aufrufen.

Paul0172 
Beitragsersteller
 16.10.2021, 15:24

Hallo, klappt leider nicht so ganz! Liegt aber eher daran das ich es bestimmt falsch programmiert habe.

Wäre sehr nett von ihnen wenn sie vielleicht dieses kurzen Code Teil kurz schreiben könnten und ihn hier reinstellen.

0
Zahhak  16.10.2021, 15:34
@Paul0172

Ne ne, so läuft das nicht.

1. Du zeigst deinen Code.

2. Ich suche den Fehler.

3. Ich beschreibe den Fehler.

4. Du behebst den Fehler (oder versuchst es zumindest).

0
Paul0172 
Beitragsersteller
 16.10.2021, 15:39
@Zahhak

ok, verstehe hier ist der Code den ich jetzt mal probiert habe:

Nicht wundern lerne Javascript noch nicht lange falls sie sich denken was hat der den da gemacht!

move(way, distance) {

    if (way == 'right') {

      this.startX += distance;

    } else if (way == 'left') {

      this.startX -= distance;

    } else if (way == 'down') {

      this.startY += distance;

    } else if (way == 'up') {

      this.startY -= distance;

    }

    this.delete();

    this.draw();

  }

0
Zahhak  16.10.2021, 15:44
@Paul0172

Dann solltest du dir den in meiner Antwort beschriebenen Ablauf noch mal ansehen.

Besonders Schritt 2 und 3 und deren Abfolge.

Kleiner Tipp: "delete" löscht genau genommen den Kreis nicht, sondern überschreibt ihn.

0
Paul0172 
Beitragsersteller
 16.10.2021, 15:53
@Zahhak

Ok ich bin mit dem 3 Punkt überfordert, könnten sie den nochmal anders probieren zu erklären?

0
Zahhak  16.10.2021, 16:00
@Paul0172
  1. Erst prüfen, ob "way" einen der vier zulässigen Werte enthält und falls nicht, den gesamten Vorgang abbrechen.
  2. Dann "delete" aufrufen.
  3. Dann, falls "way" den Inhalt "left" hat "distance" von X abziehen und X auf das Ergebnis dieser Subtraktion festlegen. Ebenso für die anderen drei jetzt noch möglichen Werte für "way".
  4. Zum Schluss "draw" aufrufen.

Du machst das ganze aber eher in der Reihenfolge 3., 2., 4. und lässt 1. völlig aus.

Im Grunde musst du also nur die Reihenfolge der Teilschritte korrigieren und Teilschritt 1 ergänzen.

0
Paul0172 
Beitragsersteller
 16.10.2021, 16:14
@Zahhak

ok,

Ich verstehe nur nicht bei ihrem neuem Punkt 3. wo sie geschrieben haben "und X auf das Ergebnis dieser Subtraktion festlegen", da stehe ich an. Und warum hatte ich den Punk 1 völlig ausgelassen, ich habe doch die Überprüfung auf die einzelnen Richtungen gemacht, oder?

Hier das was ich probiert habe:

move(way, distance) {

  if (way == 'right') {

   this.delete();

   this.startX += distance;

   this.draw();

  } else if (way == 'left') {

   this.delete();

   this.startX -= distance;

   this.draw();

  } else if (way == 'down') {

   this.delete();

   this.startY += distance;

   this.draw();

  } else if (way == 'up') {

   this.delete();

   this.startY -= distance;

   this.draw();

  }

 }

0
Zahhak  16.10.2021, 16:25
@Paul0172

Das sollte soweit funktionieren.

Allerdings könntestbdu ggf. noch einen else-Zweig hinzufügen um eine Fehlermeldung audzugeben falls eine ungültige Richtung angegeben wurde.

0
Paul0172 
Beitragsersteller
 16.10.2021, 16:28
@Zahhak

Das ist leider das Problem das es nicht funktioniert, wobei ich leider auch nicht weiß warum

0
Zahhak  16.10.2021, 16:31
@Paul0172

Inwiefern genau äußert sich denn das nicht funktionieren?

0
Paul0172 
Beitragsersteller
 16.10.2021, 16:33
@Zahhak

Wenn ich es ausführe und den Kreis nach rechts z.B. bewegen möchte wird dieser gelöscht und das ist bei links, hoch und runter auch so

0
Paul0172 
Beitragsersteller
 16.10.2021, 16:47
@Zahhak

Nein leider nicht , ich denke er löscht den Kreis wieder an den neuen Koordinaten weg, weil die delete Methode enthält ja die x,y koordinaten und wenn die durch die Move Methode überschrieben werden steht ja in der delete methode auch die neuen Koordinaten drin, und löscht somit den neuen Kreis auch gleich.

Wenn das Sinn ergibt keine Ahnung

Hier steht mal der ganze Code, dann können Sie vielleicht den Fehler ja finden:

class Circle {

  constructor (ctx, startX, startY, center, sangle, eangle, radius) {

    this.startX = startX;

    this.startY = startY;

    this.length = length;

    this.center = center;

    this.sangle = sangle;

    this.eangle = eangle;

    this.radius = radius;

  }

  draw() {

    ctx.beginPath();

    ctx.arc(this.startX, this.startY, this.center, this.sangle, this.eangle, this.radius);

    ctx.stroke();

    ctx.globalCompositeOperation = 'source-over';

  }

  delete() {

    ctx.beginPath();

    ctx.globalCompositeOperation = 'destination-out';

    ctx.arc(this.startX, this.startY, this.center, this.sangle, this.eangle, this.radius);

    ctx.fill();

    ctx.stroke();

  }

  move (way, distance) {

    if (way == 'right') {

      this.delete();

      this.startX += distance;

      this.draw();

    } else if (way == 'left') {

      this.delete();

      this.startX -= distance;

      this.draw();

    } else if (way == 'down') {

      this.delete();

      this.startY += distance;

      this.draw();

    } else if (way == 'up') {

      this.delete();

      this.startY -= distance;

      this.draw();

    }

  }

}

btnDraw.onclick = function () {

  const circle1 = new Circle(ctx, 250, 75, 50, 0, 2 * Math.PI);

  const circle2 = new Circle(ctx, 380, 75, 50, 0, 2 * Math.PI);

  const circle3 = new Circle(ctx, 510, 75, 50, 0, 2 * Math.PI);

  circle1.draw();

  circle2.draw();

  circle3.draw();

};

 

btnRight1.onclick = function() {

  const circleright1 = new Circle(ctx, 250, 75, 50, 0, 2 * Math.PI);

  circleright1.move('right', 10);

};

btnLeft1.onclick = function() {

  const circleleft1 = new Circle(ctx, 250, 75, 50, 0, 2 * Math.PI);

  circleleft1.move('left', 10);

};

btnDown1.onclick = function() {

  const circledown1 = new Circle(ctx, 250, 75, 50, 0, 2 * Math.PI);

  circledown1.move('down', 10);

};

btnUp1.onclick = function() {

  const circleup1 = new Circle(ctx, 250, 75, 50, 0, 2 * Math.PI);

  circleup1.move('up', 10);

};

0