gpt4 book ai didi

java - 尝试用java创建一个移动的 Sprite ,但有残像

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:56 26 4
gpt4 key购买 nike

我正在尝试用java创建一个移动的 Sprite ,我已经成功做到了,除了每次移动它时都会有一个跟随 Sprite 的残像。有没有什么方法可以轻松解决这个问题,而无需从根本上更改我的代码?

我完全不知道有什么方法可以解决这个问题。

为了获得完整的上下文,我必须发布所有三个文件。

这是第一个文件:

package gameproject;

import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;

public class CarMovement {

private int dx;
private int dy;
private int x = 635;
private int y = 550;
private int w;
private int h;
private Image moveimage;

public CarMovement() {

loadImage();
}

private void loadImage() {

ImageIcon q = new ImageIcon("racecar.png");
moveimage = q.getImage();

w = moveimage.getWidth(null);
h = moveimage.getHeight(null);
}

public void move() {

x += dx;
y += dy;
}

public int getX() {

return x;
}

public int getY() {

return y;
}

public int getWidth() {

return w;
}

public int getHeight() {

return h;
}

public Image getImage() {

return moveimage;
}

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

if (key == KeyEvent.VK_A) {
dx = -10;
}

if (key == KeyEvent.VK_D) {
dx = 10;
}

if (key == KeyEvent.VK_W) {
dy = -10;
}

if (key == KeyEvent.VK_S) {
dy = 10;
}
}

public void keyReleased(KeyEvent e) {

int key = e.getKeyCode();

if (key == KeyEvent.VK_A) {
dx = 0;
}

if (key == KeyEvent.VK_D) {
dx = 0;
}

if (key == KeyEvent.VK_W) {
dy = 0;
}

if (key == KeyEvent.VK_S) {
dy = 0;
}
}
}

第二个:

 package gameproject;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import javax.swing.Timer;

public class CarMovement2 extends JPanel implements ActionListener {

private Timer timer;
private CarMovement racecar;
private final int DELAY = 10;

public CarMovement2() {

initBoard();
}

private void initBoard() {

addKeyListener(new TAdapter());
setBackground(Color.black);
setFocusable(true);

racecar = new CarMovement();

timer = new Timer(DELAY, this);
timer.start();
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(0, 204, 0));
g.fillRect(0, 0, 400, 1100);
g.fillRect(1525, 0, 400, 1100);
g.setColor(new Color(102, 102, 102));
g.fillRect(400, 0, 1125, 1100);
g.setColor(new Color(255, 255, 255));
g.fillRect(940, 25, 25, 100);
g.fillRect(940, 325, 25, 100);
g.fillRect(940, 475, 25, 100);
g.fillRect(940, 625, 25, 100);
g.fillRect(940, 775, 25, 100);
g.fillRect(940, 925, 25, 100);
g.setColor(new Color(255, 255, 255));
g.fillRect(400, 175, 1125, 100);
g.setColor(new Color(0, 0, 0));
g.fillRect(400, 225, 50, 50);
g.fillRect(450, 175, 50, 50);
g.fillRect(500, 225, 50, 50);
g.fillRect(550, 175, 50, 50);
g.fillRect(600, 225, 50, 50);
g.fillRect(650, 175, 50, 50);
g.fillRect(700, 225, 50, 50);
g.fillRect(750, 175, 50, 50);
g.fillRect(800, 225, 50, 50);
g.fillRect(850, 175, 50, 50);
g.fillRect(900, 225, 50, 50);
g.fillRect(950, 175, 50, 50);
g.fillRect(1000, 225, 50, 50);
g.fillRect(1050, 175, 50, 50);
g.fillRect(1100, 225, 50, 50);
g.fillRect(1150, 175, 50, 50);
g.fillRect(1200, 225, 50, 50);
g.fillRect(1250, 175, 50, 50);
g.fillRect(1300, 225, 50, 50);
g.fillRect(1350, 175, 50, 50);
g.fillRect(1400, 225, 50, 50);
g.fillRect(1450, 175, 50, 50);
g.fillRect(1500, 225, 25, 50);
g.setColor(new Color(255, 255, 255));
g.fillRect(380, 0, 20, 1100);
g.fillRect(1525, 0, 20, 1100);
doDrawing(g);

Toolkit.getDefaultToolkit().sync();
}

private void doDrawing(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

g2d.drawImage(racecar.getImage(), racecar.getX(),
racecar.getY(), this);
}

@Override
public void actionPerformed(ActionEvent e) {

step();
}

private void step() {

racecar.move();

repaint(racecar.getX()-1, racecar.getY()-1,
racecar.getWidth()+2, racecar.getHeight()+2);
}

private class TAdapter extends KeyAdapter {

@Override
public void keyReleased(KeyEvent e) {
racecar.keyReleased(e);
}

@Override
public void keyPressed(KeyEvent e) {
racecar.keyPressed(e);
}
}
}

第三个:

package gameproject;


import java.awt.EventQueue;
import javax.swing.JFrame;
public final class CarMovement3 extends JFrame {

public CarMovement3() {

InitUI();
}

private void InitUI() {

add(new CarMovement2());

setTitle("Top Speed Triumph");
setSize(1900, 1100);
setResizable(false);

setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {

EventQueue.invokeLater(() -> {
CarMovement3 ex = new CarMovement3();
ex.setVisible(true);
});
}


}

以及 Sprite 的链接: http://www.clker.com/clipart-red-sports-car-top-view.html

最佳答案

所以,您的问题源于使用...

repaint(racecar.getX() - 1, racecar.getY() - 1,
racecar.getWidth() + 2, racecar.getHeight() + 2);

基本上,您没有覆盖足够的“现有”区域来完全“删除”它。

您可以简单地使用 repaint() 来代替,它将解决您的基本问题。在它真正成为问题之前,我会避免担心这种优化级别。

如果您想使用它,那么我会在移动之前拍摄护理位置的快照(即抓取其当前的 x/y 位置)并将其与新位置合并,以便覆盖这两个区域。或者调用 repaint(x, y, width, height) 两次,一次使用旧位置,一次使用新位置

private void step() {
Rectangle old = new Rectangle(racecar.getX(), racecar.getY(), racecar.getWidth(), racecar.getHeight());

racecar.move();

Rectangle now = new Rectangle(racecar.getX(), racecar.getY(), racecar.getWidth(), racecar.getHeight());

repaint(old);
repaint(now);
}

此外,您会发现 KeyListener 不可靠,我建议使用 the key bindings API这将解决 KeyListener 遇到的问题

我还建议使用 ImageIO 而不是 ImageIcon 作为加载图像的更可靠方式,请参阅 Reading/Loading an Image了解更多详情

关于java - 尝试用java创建一个移动的 Sprite ,但有残像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com