Wiel

Status
Niet open voor verdere reacties.

Mtchl

Nieuwe gebruiker
Lid geworden
30 sep 2008
Berichten
2
Hopelijk kan iemand mij hier verder mee helpen, want ik loop behoorlijk vast..
Mijn bedoeling is om een een wiel te maken waar aan te zien is, dat deze naar rechts beweegt.

http://img227.imageshack.us/my.php?image=vbck2.jpg
Zie afbeelding hierboven, alleen dan natuurlijk iets vloeiender.

package Auto;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/

public class Auto extends Applet {
private Bal bal;
private Button stopKnop;

public void init() {
bal = new Bal( 10, Color.gray );
stopKnop = new Button("stop");
stopKnop.addActionListener( new StopKnopHandler() );
add( stopKnop );
}

public void paint( Graphics g ) {
bal.stuiter( g );
}

class StopKnopHandler implements ActionListener {
public void actionPerformed( ActionEvent e ) {
bal.nuStoppen();
}
}
}

class Bal {
private int grootte;
private int x = -100;
private int y = 0;
private int dx = 1;
private Color wisKleur;
private boolean doorgaan;

public Bal( int grootte, Color wisKleur ) {
this.grootte = grootte;
this.wisKleur = wisKleur;
doorgaan = true;
}

public void stuiter( Graphics g ) {
g.translate(200, 200);
while( doorgaan ) {
teken( g, Color.red );
slaap( 10 );
teken( g, wisKleur );
verplaats();
}
}

public void nuStoppen() {
doorgaan = false;
}

private void teken( Graphics g, Color kleur ) {
g.setColor( kleur );
g.fillOval( x, y, grootte, grootte);
}

private void verplaats() {
if( x + dx > 100 || x + dx < -100 ) {
dx = -dx;
}
x += dx;
y = (int) (x+100) * (x-100) / 100;
}

private void slaap( int millisec ) {
try { Thread.sleep( millisec ); }
catch( InterruptedException e ) {}
}
}

Dit is mijn programma tot nu toe, hopelijk kan iemand mij hier verder mee helpen.

Vr.gr. Mtchl
 
Hoi..

ik heb je code wat aangepast. Het tekent nog steeds je zelfde bal, dus je mag er zelf nog een wiel van maken :p..

Ik heb volgende aangepast:

Omgezet naar Swing. dus JApplet/Jbutten enz.. NOOIT meer Applet :evil: gebruiken, is echt zeer verouderd. (dit geldt voor iedereen die dit leest!)

Je moet ook nooit in applet in een oneindige lus maken. Zoals in bal.stuiter() stond. JAVA moet zelf ook nog dingen uitvoeren. (zoals kijken of iemand op knop drukt).
Als je een animatie wil maken kan je beter een Timer klas gebruiken. Deze kan je instellen dat om de zoveel tijd iets wordt uitgevoerd.
De timer loopt in de achtergrond en zo houd java tijd over om iets anders te doen.

Ik heb verder het je bal in eigen JComponent laten stuiteren. (Door dit te doen krijg je automatisch "double buffering". zadat je bal niet meer knippert. Door super.PaintComponent() aan te roepen wordt de achtergrond gewist..
(hoef je dan niet meer zelf te doen)

Een ander trucje is setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Dit zet antialiasing aan zodat je bal niet meer zo gekarteld er uit ziet.

Maar als je wiel moet maken. Moet je je in de geometrie verdiepen :D. In plaats van het stuiteren.
Maak je gebruik van X = Math.sin(a) en Y = Math.cos(a). (a loopt van 0 -> 2 * Math.PI). Hier mee kan je je bal een circel laten beschrijven..


Code:
package auto;

import java.awt.*;
import java.awt.event.*;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.Timer;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2008</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */
public class Auto extends JApplet {
    
    private static final int DELAY = 20; 
    private Bal bal;
    private JButton stopKnop;
    private JComponent balPanel;
    private Timer timer;

    public void init() {
        bal = new Bal(10, Color.RED);
        balPanel = new JComponent() {
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D) g;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                super.paintComponent(g2);
                bal.teken(g2);
            }
        };
        
        stopKnop = new JButton("stop");
        getContentPane().add(stopKnop,BorderLayout.NORTH);
        getContentPane().add(balPanel,BorderLayout.CENTER);
        
        stopKnop.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                timer.stop();
            }
        });
        
        timer = new Timer(DELAY,new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bal.verplaats();
                balPanel.repaint();
            }
        });
    }

    public void start() {
        timer.start();
    }
    
    public void stop() {
        timer.stop();
    }
}

class Bal {

    private int grootte;
    private int x = -100;
    private int y = 0;
    private int dx = 1;
    private Color balKleur;

    public Bal(int grootte, Color balKleur) {
        this.grootte = grootte;
        this.balKleur = balKleur;
    }

    public void teken(Graphics g) {
        g.translate(200, 200);
        g.setColor(balKleur);
        g.fillOval(x, y, grootte, grootte);
    }

    public void verplaats() {
        if (x + dx > 100 || x + dx < -100) {
            dx = -dx;
        }

        x += dx;
        y = (int) (x + 100) * (x - 100) / 100;
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan