Domanda

My code below is for a checkers program. If the user either clicks on a stop button or holds the mouse, it stops, and the go button or mouse release moves the checkers from the beginning.

I am not able to figure out how to move the checkers from the same position that they were stopped at. Help Please!

import java.awt.Button;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Checkers extends java.applet.Applet implements Runnable,
        ActionListener {

Thread runner;
int xpos;
Image offscreenImg;
Graphics offscreenG;
Button  goButton, stopButton, exitButton;

private ExitButtonHandler ebHandler;

public void init() {
    // offscreenImg = createImage(getWidth(), getHeight());
    offscreenImg = createImage(this.size().width, this.size().height);
    offscreenG = offscreenImg.getGraphics();

    setSize(200, 250);

    addMouseListener(new Mouse());

    goButton = new Button("Go");
    goButton.setBounds(10, 200, 90, 20);
    setLayout(null);

    stopButton = new Button("Stop");
    stopButton.setBounds(100, 200, 90, 20);
    setLayout(null);

    exitButton = new Button("Exit");
    ebHandler = new ExitButtonHandler();
    exitButton.addActionListener(ebHandler);
    exitButton.setBounds(55, 220, 90, 20);
    setLayout(null);

    add(goButton);
    add(stopButton);
    add(exitButton);

    stopButton.addActionListener(this);
    goButton.addActionListener(this);
}

public void start() {
    if (runner == null) {
        runner = new Thread(this);
        runner.start();
    }
}

public void stop() {
    if (runner != null) {
        runner.stop();
        runner = null;
    }
}

public void run() {
    while (true) {
        for (xpos = 5; xpos <= 105; xpos += 4) {

            repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }

        }
        xpos = 5;

        for (xpos = 105; xpos >= 5; xpos -= 4) {
            repaint();

            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }
        xpos = 5;
    }
}

public void update(Graphics g) {
    paint(g);
}

public void paint(Graphics g) {
    // Draw background onto the buffer area
    offscreenG.setColor(Color.blue);
    offscreenG.fillRect(0, 0, 100, 100);
    offscreenG.setColor(Color.red);
    offscreenG.fillRect(0, 100, 100, 100);
    offscreenG.setColor(Color.red);
    offscreenG.fillRect(100, 0, 100, 100);
    offscreenG.setColor(Color.blue);
    offscreenG.fillRect(100, 100, 100, 100);

    // Draw checker
    offscreenG.setColor(Color.green);
    offscreenG.fillOval(xpos, 5, 90, 90);
    offscreenG.setColor(Color.yellow);
    offscreenG.fillOval(-xpos + 110, 105, 90, 90);

    // Now, transfer the entire buffer onto the screen
    g.drawImage(offscreenImg, 0, 0, this);
}

public void destroy() {
    offscreenG.dispose();
}

// Mouse events
public class Mouse extends MouseAdapter {

    public void mousePressed(MouseEvent e) {
        stop();

    }

    public void mouseReleased(MouseEvent e) {
        start();

    }
}

// Button events
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == stopButton) {
        stop();

    } else if (e.getSource() == goButton) {

        start();
    }

}

// exit button
public class ExitButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}

}

È stato utile?

Soluzione

You are recreating a new Thread which starts from the beginning every time you call the start function. Also, after you call stop you will not be able to "resume" where you left off.

You will want to change your Thread to use a flag of some type (boolean stopped;) and then change that flag when you call stop and start, so the Thread doesn't actually end but just "pauses." (stops moving, but is actually still running)

if (stopped) {
    //dont do stuff
}
else {
    //do stuff
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top