Rechteck Zufallsverschiebung mit Abprallen

P

ProblemKind

Gast
Hey,
wir müssen im inforamtik utnerricht ein rechteck programmieren, welches zufällig starten soll und am rand des fenster (500x500) abprallen soll. Beim Abprallen sollte Einfalls=Ausfallswinkel beachtet werden.

bisher sieht das programm so aus:
Java:
 public void paint(Graphics g)
    {
        int xKoordinate = 20;
        int yKoordinate = 20;
        
        int maxX = getSize().width;
        int maxY = getSize().height;
        
        while (yKoordinate < 200)
        {
            while (xKoordinate +110 < maxX +6 )
            {
                try {Thread.sleep(10);}
                catch ( InterruptedException e) {}   
                g.clearRect(xKoordinate-5, yKoordinate-5,110,110);
                xKoordinate++;
                zeichneRechteckMitRand(xKoordinate, yKoordinate,g);
            }   
    
            while (xKoordinate +10 >10 )
            {
                try {Thread.sleep(10);}
                catch ( InterruptedException e) {}   
                g.clearRect(xKoordinate-5, yKoordinate-5,110,110);
                xKoordinate--;
                zeichneRechteckMitRand(xKoordinate, yKoordinate,g);
            } 
    
        }  
    }
        public void zeichneRechteckMitRand (int x,int y, Graphics g)
        {
            
        
        g.setColor(Color.black); // alles Folgende bis zu nächsten änderung bekommt die Farbe Orange, also das innere Rechteck
        g.fillRect(x, y, 100, 100); // zeichnet und färbt das innere Rechteck. die Parameter (20,20,100,100) bedeuten. Die ersten Beiden Parameter geben an wo das Rechteck beginnt. Die zweiten Beiden geben die Länge des Rechtecks an.
        g.setColor(Color.red); // Alles folgende, also Rand, bekommt die Farbe Grün 
        g.fillRect(x-5,y-5,110,5); // obener Rand, Parameterbeschreibung s.o.
        g.fillRect(x-5,y+100,110,5);// untenerer Rand, Parameterbeschreibung s.o.
        
        g.fillRect(x-5,y-5,5,110); // linker Rand, Parameterbeschreibung s.o.
        g.fillRect(x+100,y-5,5,110); // rechter Rand, Parameterbeschreibung s.o.   
    }

Ich hoffe ihr könnt mir helfen, falls weiter Inforamtionen benötigt werden einfach anfragen!
 

Lowpass

Aktives Mitglied
Du hast von der Aufgabe erzählt und gezeigt wo Du bisher stehst.

Du hast allerdings vergessen zu erwähnen, wo Dein Problem liegt. Du erwartest ja hoffentlich nicht, dass jemand Deine Aufgabe für Dich fertig stellt?
 
P

ProblemKind

Gast
Das erwarte ich antürlich nicht.
Aber ich wäre erfreut über ein paar Ansatzpunkte wo ich im Rpogramm ansetzen kann.
Ich weiss einfach nicht wo ich weiterschreiben kann und wie ich den Zufall einbinden kann o0
 

Marco13

Top Contributor
Nicht in die paint eine while-Schleife packen, das blockiert das Zeichnen. Die Bewegung sollte in einem eigenen Thread laufen, und in der paint sollte NUR das Rechteck (an seiner aktuellen Position) gezeichnet werden.

Zufällige Bewegungsrichtung:
Code:
Random random = new Random(0);
...

int velX = random.nextInt(10);
int velY = random.nextInt(10);
 

Lowpass

Aktives Mitglied
Meiner Meinung nach musst Du noch eine Variable für den aktuellen Winkel haben, in dem sich das Rechteck bewegt - zumal Du den beim Abprallen auch für die Berechnung des neuen Winkels brauchst.
 

Quaxli

Top Contributor
Ich hab' heute meinen Gutmütigen..... :D:D:D
Damit Du aber auch noch was machen mußte bzw. lernst hab' ich nix kommentiert, als ich es schnell zusammen geklopft habe.

Java:
import javax.swing.*;
import java.awt.*;


public class RecMove extends JPanel implements Runnable{

	private static final long	serialVersionUID	= 1L;
  JFrame frame;
  Rec rectangle;
	
	public static void main (String[] args){
		new RecMove();
	}
	
	public RecMove(){
		setPreferredSize(new Dimension(400,400));
		
		rectangle = new Rec(20,20,100,100,this);
		
		frame = new JFrame("RecMove");
		frame.setLocation(100,100);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(this);
		frame.pack();
		frame.setVisible(true);
		
		Thread t = new Thread(this);
		t.start();
		
	}

	public void paintComponent(Graphics g){
		super.paintComponents(g);
		rectangle.paintRect(g);
	}
	
	
	public void run() {
		
		while(frame.isVisible()){
			
			rectangle.doLogic();
			rectangle.move();
			
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {}
			frame.repaint();
			
		}
		
	}
	
}


class Rec extends Rectangle{
	
	private static final long	serialVersionUID	= 1L;
	int dx = 1;
	int dy = 2;
  JPanel parent;
	
	public Rec(int x, int y, int w, int h,JPanel p){
		super(x,y,w,h);
		parent = p;
	}
	
	public void paintRect(Graphics g){
		g.setColor(Color.RED);
		g.drawRect(x,y,width,height);
	}
	
	public void move(){
		x += dx;
		y += dy;
	}
	
	public void doLogic(){ 
		
		if(x<=0){
			dx *= -1;
		}
		
		if(x+width>parent.getWidth()){
			dx *= -1;
		}
		
		if(y<0){
			dy*= -1;
		}
		
		if(y+height>parent.getHeight()){
			dy *= -1;
		}
		
	}
	
	
}
 

Marco13

Top Contributor
Den Winkel kann man aus dem Bewegungsvektor berechnen. Natürlich wäre eine Polardarstellung (aus Betrag der Geschwindigkeit und Winkel) eine Alternative, wäre aber unüblich und könnte bei den "normalen" Schritten (also während der Bewegung) unhandlicher sein, als ein Bewegungsvektor.
 

Lowpass

Aktives Mitglied
Ich gebe zu, dass ich in Sachen grafischer Darstellung und insbesondere Animation nicht sehr erfahren bin... vielleicht eine blöde Frage:
was Du als Bewegungsvektor bezeichnest sind die Koordinaten-Deltas in Quaxlis Lösung - also die Angabe von Pixeln, oder?
Schränkt man sich da nicht massiv ein? Will man einen steilen Winkel erreichen, muss man grosse Bewegungssprünge in Kauf nehmen (z.B. 7/1) - und beschränkt man sich auf kleine Zahlen, arbeitet man mit einer sehr kleinen Anzahl an möglichen Winkeln und hat ein Rechteck, dass sich praktisch auf festen Bahnen bewegt...
 

Marco13

Top Contributor
Nur bedingt. Man kann statt int auch float oder double nehmen (und die aktuelle Position auch als solche speichern). Für's Zeichnen muss natürlich auf int gecastet werden, aber das muss man in jedem Fall.
 

Quaxli

Top Contributor
Ich wollte die Lösung nicht zu aufwändig gestalten. Grundsätzlich würde man nicht nur Fließkommazahlen verwenden, sondern auch die Bewegung von der für einen Schleifendurchlauf benötigten Zeit abhängig machen. Dann hätte man bei ausreichend hohen FPS eine kontinuierliche und ruckelfreie Bewegung.
 
P

ProblemKind

Gast
Okay.. ich kann echt nur wow sagen, hab mir das grade ma durchgelesen was ihr hier so zu meinem prob gepostet habt:
1. danke@ quaxli is wahrscheinlich ne gute lösung wobei ich sie nciht verstehe, ich arbeite mich doch nochmal rein und versuche es zu verstehen^^
2. auch danke an die anderen für die diskussion, auch davon hab ich leider wenig verstanden^^
wie gesagt werde ich mich nochmal reinarbeiten und werde mich falls ich fragen hab doch nochmal an euch wenden, daher lass ich den thread noch für ein paar tage auf unerledigt
mfg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
laxla123 Rechteck programmieren Java Basics - Anfänger-Themen 4
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
L Wie vergrößere ich ein Rechteck in alle Richtungen um eins und bekomme dessen Rand? Java Basics - Anfänger-Themen 2
S Erste Schritte Java - Applet - Rechteck ständig versetzen Java Basics - Anfänger-Themen 14
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
S Erste Schritte Ein Rechteck aus Sternchen mit Wiederholungsanweisung erstellen Java Basics - Anfänger-Themen 2
J Rechteck zeichnen mit Canvas Java Basics - Anfänger-Themen 7
T Rechteck Programmieren Java Basics - Anfänger-Themen 4
F Klasse Rechteck definieren Java Basics - Anfänger-Themen 21
S Rechteck zeichnen Java Basics - Anfänger-Themen 2
M Erste Schritte Gefülltes Rechteck programmieren Java Basics - Anfänger-Themen 1
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
S Ein Rechteck soll an einer Seite gespiegelt werden. Java Basics - Anfänger-Themen 5
G Methoden Nicht überlappte teile eines Rechteck's Java Basics - Anfänger-Themen 9
T Rechteck Koolision Java Basics - Anfänger-Themen 4
O Rechteck Java Basics - Anfänger-Themen 10
X Rechteck Java Basics - Anfänger-Themen 2
I Rechteck Zeichnen Java Basics - Anfänger-Themen 9
M Farbiges Rechteck zeichnen Java Basics - Anfänger-Themen 2
F Rechteck/Quadrat getroffen? Java Basics - Anfänger-Themen 2
K Rechteck/Quadrat Java Basics - Anfänger-Themen 5
M Umfang von Rechteck oder Kreis anhand der Parameter Java Basics - Anfänger-Themen 2
J Rechteck Java Basics - Anfänger-Themen 8
G Rechteck zeichen Java Basics - Anfänger-Themen 4
B Rechteck aus Sternen Zeichnen Java Basics - Anfänger-Themen 8
J itext - Rechteck in PdfCell Java Basics - Anfänger-Themen 2
E klasse für ein Rechteck schreiben Java Basics - Anfänger-Themen 25
K Rechteck mit einem Loch in dem Mitte Java Basics - Anfänger-Themen 11
B Swing Rechteck zeichnen Java Basics - Anfänger-Themen 14
H Rechteck ziehen bei einer Application Java Basics - Anfänger-Themen 2
Dilandau rechteck des applet inhalts als gif-datei speichern? Java Basics - Anfänger-Themen 2
R mit MouseDragged Rechteck verschieben. Java Basics - Anfänger-Themen 2
G Linie innerhalb Rechteck Java Basics - Anfänger-Themen 2
G dicke linie zeichnen bzw schräges rechteck füllen Java Basics - Anfänger-Themen 2
W Problem mit einem Programm Rechteck Fläche, Umfang Java Basics - Anfänger-Themen 6
A Breakout-Spiel , Ball mit Platten abprallen lassen Java Basics - Anfänger-Themen 1
Z Object Kreis am Frame abprallen lassen! Java Basics - Anfänger-Themen 12
N Bälle abprallen lassen Java Basics - Anfänger-Themen 10
J Kreis herumfliegen & abprallen von Rändern Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben