Matze1992 Geschrieben 16. Juni 2009 Teilen Geschrieben 16. Juni 2009 hey, ich hab hier ein Programm, in dem auf der unteren Seite ein Rechteck ist und im feld springt ein Ball herum. Ich habe es jetzt schon 100 mal versucht, dass der Ball, wenn er auf der x-achse das Rechteck nicht berührt und somit den unteren Bildrand berührt, verschwindet. Ich komme einfach nicht weiter könnt ihr mir bitte helfen? Meine Steuerungsklasse: package Projekt; import java.awt.*; import java.awt.event.*; import java.awt.image.ImageObserver; import java.math.*; import java.awt.Button; import java.awt.Color; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.MediaTracker; import javax.swing.JFrame; class Steuerung extends Frame implements MouseListener, MouseMotionListener, ActionListener, Runnable { Rechteck rechteck = new Rechteck(Color.green.brighter()); Kreis ball = new Kreis(Color.red); int a=20; Thread ablauf; boolean m1=true,m2,m3,m4,m5; private Image weltall,herz1,herz2,herz3; private Image dbImage; // Variable für die Doppelpufferung private Graphics dbg; // Variable für die Doppelpufferung public Steuerung() { super("Cannonball"); setLayout(new FlowLayout()); addMouseListener(this); addMouseMotionListener(this); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent event) { System.exit(0); } }); ablauf = new Thread(this); //Thread wird gestartet ablauf.start(); weltall = getToolkit().getImage("sterne-bootes-krone-1g.jpg");//Name des Image wird angegeben MediaTracker mt = new MediaTracker(this); mt.addImage(weltall, 0); herz3 = getToolkit().getImage("herz.gif"); MediaTracker mt1 = new MediaTracker(this); mt1.addImage(herz3, 0); herz2 = getToolkit().getImage("herz.gif"); MediaTracker mt2 = new MediaTracker(this); mt2.addImage(herz2, 0); herz1 = getToolkit().getImage("herz.gif"); MediaTracker mt3 = new MediaTracker(this); mt3.addImage(herz1, 0); try { //Warten, bis das Bild vollständig geladen ist, mt.waitForAll(); mt1.waitForAll(); mt2.waitForAll(); mt3.waitForAll(); } catch (InterruptedException e) { //nichts } } public void paint(Graphics g) { g.drawImage(weltall,-80,20,this); //Position des Bildes g.drawImage(herz3,7,32,this); g.drawImage(herz2,42,32,this); g.drawImage(herz1,77,32,this); rechteck.paint(g); //Rechteck wird gezeichnet ball.paint(g); //Ball wird gezeichnet } public static void main(String[] args) { Steuerung Versuch = new Steuerung(); Versuch.setLocation(20, 100); Versuch.setSize(800, 600); Versuch.show(); } public void actionPerformed(ActionEvent e) { } public void run() { while(m1==true){ if(ball.xpos==8){ //Randbegrenzungen werden gesetzt m2=true; } if(ball.xpos==787){ m2=false; } if(ball.ypos==39){ m3=true; } if(ball.ypos==(rechteck.ypos-rechteck.hoehe)){ m3=false; } if(ball.ypos==598){ m4=true; } if(m2==true){ ball.setzeXpos(ball.xpos +1); //Flugrichtungen des Balles werden bestimmt } if(m2==false){ ball.setzeXpos(ball.xpos -1); } if(m3==true){ ball.setzeYpos(ball.ypos +1); } if(m3==false){ ball.setzeYpos(ball.ypos -1); } if(m4==true){ ball.ypos=-999999; } repaint(); try { Thread.sleep(2,5); } catch (InterruptedException e) { } } } public void mouseClicked(MouseEvent arg0) { // System.out.println("x-koordinate: " + arg0.getX()); //Bei Klick wird X-Koordinate ausgegeben // System.out.println("y-koordinate: " + arg0.getY()); //Bei Klick wird Y-Koordinate ausgegeben } public void mouseEntered(MouseEvent arg0) { } public void mouseExited(MouseEvent arg0) { } public void mousePressed(MouseEvent arg0) { ball.setzeXpos(rechteck.xpos); ball.setzeYpos(rechteck.ypos); } public void mouseReleased(MouseEvent arg0) { } public void mouseDragged(MouseEvent arg0) { } public void mouseMoved(MouseEvent arg0) { rechteck.setzeXpos(arg0.getX()); } /** * Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des * Bildschirmflackerns */ public void update(Graphics g) { if (dbImage == null) // Initialisierung des DoubleBuffers { dbImage = createImage(this.getSize().width, this.getSize().height); dbg = dbImage.getGraphics(); } // Bildschirm im Hintergrund löschen dbg.setColor(getBackground()); dbg.fillRect(0, 0, this.getSize().width, this.getSize().height); // Auf gelöschten Hintergrund Vordergrund zeichnen dbg.setColor(getForeground()); paint(dbg); // Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm // anzeigen g.drawImage(dbImage, 0, 0, this); } } Gruß Matze 1992 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 16. Juni 2009 Teilen Geschrieben 16. Juni 2009 Ein etwas passender Threadttitel als "Abprallen" wäre hilfreicher ich hab hier ein Programm, in dem auf der unteren Seite ein Rechteck ist und im feld springt ein Ball herum. Ein Bild ist immer hilfreicher, als Dein Code. Ich habe es jetzt schon 100 mal versucht, dass der Ball, wenn er auf der x-achse das Rechteck nicht berührt und somit den unteren Bildrand berührt, verschwindet. Ich komme einfach nicht weiter könnt ihr mir bitte helfen? Du möchtest erst einmal Dein Problem so beschreiben, dass man es versteht. Ich verstehe überhaupt nicht, was Du möchtest, denn um welches Rechteck geht es, welchen Ball? Ein Rechteck ist 2D, ein Ball 3D, wie soll das Bitte funktionieren, wenn das Rechteck in XY Richtung liegt, dann habe ich in Z keine Koordinate gegen die ich sinnvoll prüfen kann. Ich denke nach Deinem Code geht es um einen Kreis und Rechteck in 2D und meine Glaskugel sagt mir, dass Du eine Kollisiondedektierung zwischen beiden machen möchtest. Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Matze1992 Geschrieben 16. Juni 2009 Autor Teilen Geschrieben 16. Juni 2009 ja genau ich will ne kollision zwischen kreis und rechteck. und der kreis soll dann nach obe abprallen. Aber eben nur, wenn er das rechteck berührt... Matze Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 16. Juni 2009 Teilen Geschrieben 16. Juni 2009 j und der kreis soll dann nach obe abprallen. Aber eben nur, wenn er das rechteck berührt... Mal es Dir auf !! Überlege Dir was Du mathematisch brauchst (Hinweis auf Radien und Schnittpunktberechnung) ! Ein Tipp aus der Computergraphik, man modelliert so etwas über Vektoren. Aber wenn es nicht um Effizienz geht, dann funktioniert es auch über einen naiven Ansatz Dein Problem ist kein Codeproblem, deshalb mache es mit Stift und Papier Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.