Java相交方法无法正常工作

标签 java swing

有人可以告诉我为什么我的代码不能正常工作吗?

我试图在移动它时改变颜色,但它不起作用。

我正在使用相交方法。

package com.dilkiel.game;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Screen extends JPanel implements Runnable {

private static final long serialVersionUID = 1L;

private Thread thread;

public int tickCount = 0;
public boolean running = false;
public int xPlayerOffset = 100;
public int yPlayerOffset = 100;
public int WIDTH = 1280;
public int HEIGHT = 720;

public InputHandler input = new InputHandler(this);

public Screen() {
    setFocusable(true);
    setMaximumSize(new Dimension(WIDTH, HEIGHT));
    setMinimumSize(new Dimension(WIDTH, HEIGHT));
    setPreferredSize(new Dimension(WIDTH, HEIGHT));
    start();
}

public void tick() {
    tickCount++;
    if (input.up.isPressed()) {
        yPlayerOffset -= 5;
    }
    if (input.down.isPressed()) {
        yPlayerOffset += 5;
    }
    if (input.left.isPressed()) {
        xPlayerOffset -= 5;
    }
    if (input.right.isPressed()) {
        xPlayerOffset += 5;
    }
}

public synchronized void start() {
    running = true;
    thread = new Thread(this, "Game Loop");
    thread.start();
}

public synchronized void stop() {
    running = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Image frontView = new ImageIcon("res/frontView.png").getImage();
Rectangle player = new Rectangle(xPlayerOffset, yPlayerOffset + 40, 40, 40);
Rectangle box = new Rectangle(250, 250, 80, 80);

public void paint(Graphics g) {

    g.setColor(Color.CYAN);
    g.fillRect(0, 0, WIDTH, HEIGHT);
    g.drawImage(frontView, xPlayerOffset, yPlayerOffset, this);

    g.setColor(Color.BLACK);
    if (player.intersects(box)) {
        //i want this to work can you please show me how. Thanks
        g.setColor(Color.GREEN);
    }
    g.fillRect(xPlayerOffset, yPlayerOffset + 40, 40, 40);
    g.fillRect(250, 250, 80, 80);
    g.dispose();
}

public void run() {
    long lastTime = System.nanoTime();
    double nsPerTick = 1000000000D / 60D;

    int ticks = 0;
    int frames = 0;

    long lastTimer = System.currentTimeMillis();
    double delta = 0;

    while (running) {
        long now = System.nanoTime();
        delta += (now - lastTime) / nsPerTick;
        lastTime = now;
        boolean shouldRender = false;

        while (delta >= 1) {
            ticks++;
            tick();
            delta -= 1;
            shouldRender = true;
        }
        /*
         * try { Thread.sleep(2); } catch (InterruptedException e) {
         * e.printStackTrace(); }
         */
        if (shouldRender) {
            frames++;
            repaint();
        }

        if (System.currentTimeMillis() - lastTimer >= 1000) {
            lastTimer += 1000;

            System.out.println(ticks + ", " + frames);
            frames = 0;
            ticks = 0;
        }
    }
}
}

最佳答案

我提出了一些可能对您有帮助的观点。

  1. 使用Swing Timer而不是线程

    了解更多 How to Use Swing Timers

  2. 重写 paintComponent() 方法进行自定义绘制,而不是重写 paint() 方法。

  3. 不要忘记在重写方法中调用 super.paintComponent()

  4. 覆盖JComponent#getPreferredSize()而不是使用 setPreferredSize()

    了解更多 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

<小时/>

示例代码:(在 JPanel 中自定义绘画)

final JPanel panel = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        // your custom painting code here
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
};

示例代码:(Swing Timer)

// wait for 1 second
Timer timer = new Timer(1000, new ActionListener() {
    
    @Override
    public void actionPerformed(ActionEvent arg0) {            
        // next call 
    }
});
timer.setRepeats(false);
timer.start()

关于Java相交方法无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462052/

相关文章:

java - 字符串子字符串或拆分器 - 对从命令行参数插入的数据进行排序

java - 系统托盘图标,添加 "click here"链接

java - 在 gui Java 中对 if 语句的输出显示添加延迟

java - Swing 中的居中和 float 元素

java - 项目在 Netbeans 8.0 中运行,但不是作为 JAR

java - Swing - 如何在 JTable 单元格中添加 JPopupMenu

java - 如何编写 for 循环将 "Food"数组分配给名为 "Wolf"的对象?

java - 如何将 SQL native 查询的结果映射到 Java POJO 类(无实体)

java - 为什么人们仍然在 Java 中使用原始类型?

java - 按下箭头键时如何防止JScrollPane滚动