A Ball bouncing in a rect

Hello Guys,

This is my next taks where I need help;

Schreiben Sie ein Programm mit einem 100x100 Fenster mit einem Ball (Durchmesser 20) in einem Rechteck(Position20,10 - Breite 60, Höhe 80). Verwenden Sie noFill() für das Rechteck!

Animieren Sie den Ball so, dass er von den Wänden des gezeichneten Rechtecks abprallt. Startpunkt ist 50,50. Geschwindigkeit zufällig im Bereich -3 bis 3 in beide Richtungen. Verwenden Sie float für Position und Geschwindigkeit! Der Ball sollte das Rechteck nie verlassen. Achten Sie darauf, dass der Ball korrekt abprallt. d.h. er berührt die Seiten, aber übertritt sie nicht.

Now this is my unfinished code:

float x = 0;
float y = 0;
float speed = random(-3,3);



void setup () 
{
  
  size(100, 100);
}


void draw() 
{  
background(0);
  fill(255);
  rect(20, 10, 60, 80);
  
  ellipse(50+x,50+y,20,20);
  x = x + speed ;
  y = y + speed;
  
  if(x >60 && x <40)
  {
    speed = -speed;
  }
  
  if(y >80 && x <20)
  {
    speed = -speed;
  }
  
  
}

Now what I dont understand is the noFill() thing.
When I put it after or before the rect. I cant see anything.
There I need a solution.

And the If causes are wrong.
The ball is not gooing backwards.

Can someone give me a hint. Then I will try it again.

1 Like

Schreiben Sie ein Programm mit einem 100x100 Fenster mit einem Ball (Durchmesser 20) in einem Rechteck(Position20,10 - Breite 60, Höhe 80). Verwenden Sie noFill() für das Rechteck!

Animieren Sie den Ball so, dass er von den Wänden des gezeichneten Rechtecks abprallt. Startpunkt ist 50,50. Geschwindigkeit zufällig im Bereich -3 bis 3 in beide Richtungen. Verwenden Sie float für Position und Geschwindigkeit! Der Ball sollte das Rechteck nie verlassen. Achten Sie darauf, dass der Ball korrekt abprallt. d.h. er berührt die Seiten, aber übertritt sie nicht.

Erste Zeile: if(x >60 && x <40) UND zweite Zeile if(y >80 && x <20)

  • Wo ist der Tippfehler? Tipp: Schaue nach, wo x steht und wo y steht.

  • Ausserdem: if (x>60 && x<40) —>>> was bedeutet hier das && ? Wann ist die Bedingung WAHR? Tipp: Nie.

Wie lautet die Bedingung richtig, wenn du sie auf Deutsch erläutern solltest?

Beste Grüße,

Chrisir

Es sind eine ganze Reihe von Fehlern in deinem Code.

Du musst einfach mehr testen und mit mehr Ruhe überlegen. Du behelligst sonst das Forum mit jeder einzelnen Aufgabe. Eigentlich solltest du diese ganz alleine lösen können und nur in Ausnahmefällen eine Frage im Forum stellen.

  • Warum meinst du z.B., dass speed für x und y stets gleich sein sollte?

zum Thema noFill()

einfach mal in die reference schauen, da steht jeder Befehl erklärt.

noFill() stellt die Füllung für alle nachfolgenden Formen (Rechteck, Ellipse…) aus.

Dies bleibt erhalten, auch wenn draw() erneut startet (was 60x pro Sekunde passiert).

Beispiel:


void setup () 
{
  size(500, 500);
  stroke(255, 0, 0);
}


void draw() 
{  
  background(0);

  fill(255);  // WEISS 
  rect(20, 10, 60, 80);

  noFill();  // KEINE Füllung
  ellipse(250, 250, 50, 50);

  rect(20, 310, 60, 80); // KEINE Füllung

  fill(0, 0, 255); // BLAU 
  rect(220, 410, 60, 80);
}
1 Like

Ganz verstehe ich es leider nicht.

Die If werte sind komplett falsch.
Es prallt leider nicht zurück oder geht über dem Recheck.

float x = 0;
float y = 0;
float speed = random(-3,3);



void setup () 
{
  background(0);
  size(100, 100);
}


void draw() 
{  
  

  fill(255);
  rect(20, 10, 60, 80);
  fill(255);
  ellipse(50+x,50+y,20,20);
  
  
  x = x + speed ;
  y = y + speed;

  if(x < 20  || x > width-40 ) 
  {
    speed = -speed;
  }
  else{
    speed = -speed;
  }
    
  if(y < 20 || y > height-20)
  {
    speed = -speed;
  }
  else
  {
    speed = -speed;
  }
  
}
1 Like

Wie gesagt, da speed auch die Richtung bezeichnet, muss speed für x und y unterschiedlich sein.

Bitte sage hier nicht +50 für x und y, stattdessen gebe x und y anfangs (also vor setup()) einen Wert, so dass sich der Ball im Rechteck befindet.

eine if-Abfrage, bei der erste Teil gleich dem else-Teil ist, ist sinnlos. Einer wird immer ausgeführt. Stattdessen lasse den else-Teil bitte fort.

1 Like