如何在Java游戏中重新绘制图像

时间:2014-12-10 21:28:03

标签: java graphics paint intersection bluej

大家好,我在绘制用户与之交叉的硬币时遇到了麻烦。我想要这个代码做的是当用户精灵与它在硬币上绘制的十个硬币图像中的任何一个相交时,它不再出现在屏幕上(还需要添加某种计数器以便当用户收集时所有十个硬币它将停止线程,并说“你赢了!”)。我的问题是我将如何进行此操作,因为我尝试在if语句中使用repaint(),并且它不再正确编译。任何帮助如何绘制硬币,甚至可能添加某种计数器(想一个for循环会派上用场)将不胜感激!这是代码:

public void paint(Graphics g)
{
    g.clearRect(0, 0, this.getWidth(), this.getHeight());
    one.paintComponent(g);
    two.paintComponent(g);
    three.paintComponent(g);
    four.paintComponent(g);
    five.paintComponent(g);
    six.paintComponent(g);
    seven.paintComponent(g);
    eight.paintComponent(g);
    nine.paintComponent(g);
    ten.paintComponent(g);
    monster.setLocation(r.nextInt(10) - 5 + monster.x, r.nextInt(10 - 5 + monster.y));
    monster.paintComponent(g);
    user.paintComponent(g);
    if(user.intersects(one))
    {
    }
    if(user.intersects(two))
    {
    }
    if(user.intersects(three))
    {
    }
    if(user.intersects(four))
    {
    }
    if(user.intersects(five))
    {
    }
    if(user.intersects(six))
    {
    }
    if(user.intersects(seven))
    {
    }
    if(user.intersects(eight))
    {
    }
    if(user.intersects(nine))
    {
    }
    if(user.intersects(ten))
    {
    }
    if(user.intersects(monster))
    {
            g.setFont(new Font("Serif", Font.BOLD, 35));
            g.drawString("YOU HAVE DIED, YOU LOSE!", 100, 100); //Prints this when you lose
            thread.interrupt(); //Stopping the thread if you die
    }
}

3 个答案:

答案 0 :(得分:0)

首先,您应该将硬币放入列表中。然后,如果有交互,您只需删除列表中的项目(硬币)即可。像这样:

private List<Coin> coins;

public ClassConstructor() {
    coins = new ArrayList();
    coins.add(new Coin(type value,...)); //this ten times if every Coin is different from other
    //or this if every Coin are same:
    for (int i = 0; i < 10; i++) {
        coins.add(new Coin(type value,...));
    }
}

public void update() {
    //whatever
    for (int i = coins.size(); i >= 0; i--) {
        if (user.intersects(coins.get(i))) {
            coins.remove(i);
            //...
        }
    }

}

public void paint(Graphics g) {
    for (int i = coins.size(); i >= 0; i--) {
        coins.get(i).paintComponent(g);
    }
}

现在,你不应该用thread.interrupt()结束一个Thread。如果该线程是你的游戏循环,你应该发送一个结束循环的标志。游戏循环线程:

@Override
public void run() {
    while (running) { //boolean running
        update();
        paint(g);
    }}

最后,您的更新将如下:

public void update() {
    //whatever
    for (int i = coins.size(); i >= 0; i--) {
        if (user.intersects(coins.get(i))) {
            coins.remove(i);
            //...
        }
    }
    if (user.intersects(monster)) {
        youThread.setRunning(false);
        try {
            gameLoopThread.join(); //"wait" until thread ends
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:0)

离开我的头顶,将while(true)放在你的Run()方法中(你说你正在使用一个线程)并在循环结束时调用循环内的repaint()一个像//thread//.sleep(allotted time)这样的东西。这将使线程停止设定的毫秒数。在repaint()的Javadoc中,您会看到它调用最近的paint(Graphics g)方法。通过这样做,您可以从程序中的任何位置访问paint()方法。

我对硬币的建议就是让它成为自己的班级。该课程看起来与此相似:

public class Coin{
int x;
int y;
public void Coin(int x, int y, Graphics g){
    Graphics2D g2 = (Graphics2D) g;
    Image img1 = (//File Location);
    g2.drawImage(img1, x, y, //this);
    //If you have trouble with the ImageObserver (this part) try //class name of the applet.this
    this.x = x;
    this.y = y;

    g2.finalize();
}
public int getX(){
    return x;
}
public int getY(){
    return y;
}
}

之后,在paint方法中,您可以生成10个Coin个对象,并使用您在参数中实例化的g。然后,您可以制作一组Coin个对象,并在您的Coin方法中手动添加10个paint(是的,它很痛苦)(你必须制作它们)在paint中传递Graphics变量)

Coin[] coins = new Coin[10];

顺便说一句,你是如何制作阵列的。制作硬币数组后,在for方法中制作paint循环。看起来应该是这样的:

        for(int i = 0; i < coins.length; i++){
            if(coins[i].getX == //user X && coins[i].getY == //user Y){
                    g.clearRect(coins[i].getX, coins[i].getY, //Coin radius, //Coin radius);
            }

        }

如果用户的X和Y等于硬币的X和Y,这将在硬币所在的任何地方绘制一个清晰的矩形。

答案 2 :(得分:0)

此代码来自我当前的项目(正在运行),我尝试将其调整为您的项目。

private void render () {
    BufferStrategy bufferstrategy = getBufferStrategy ();

    if (bufferstrategy == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bufferstrategy.getDrawGraphics();

    g.setColor(Color.white);
    g.fillRect(0, 0, getWidth(), getHeight());

    paint (g);

    g.dispose();
    bufferstrategy.show();
}
从run()调用

render(),其中Thread为。

让我们分解它,看看它是否可以帮到你。

  1. 它有一个BufferStrategy来准备好多少张图片。它可以在合理的范围内设置为你喜欢的任何东西。 2 - 4将成功。人们甚至可以工作。
  2. 它会将您当前的BufferStrategy设置为Graphics
  3. 然后用白色填充屏幕(也可以是清晰的)。
  4. 然后它绘制所有组件,在你的情况下它调用paint (Graphics g),而在我的情况下它遍历所有可绘制的对象。
  5. 它会重新呈现现在看起来的所有内容。
  6. 希望你能从中得到一些建议。