gpt4 book ai didi

java - 透明背景清屏java

转载 作者:行者123 更新时间:2023-12-01 09:49:20 24 4
gpt4 key购买 nike

我不确定其他人是否也遇到过这个问题,但我正在做一些简单的动画工作。我试图有一个透明的背景,这很容易用以下代码制作:

jf.setBackground(new Color(0,0,0,0));

问题是,每当我试图移动的东西移动时(在我的例子中是史莱克图片),它会不断地绘制并且不会清除之前的史莱克。我将在下面发布我的所有代码。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import java.io.*;
import java.util.logging.*;
import java.util.logging.*;
import javax.imageio.*;

public class MoveTest extends JPanel implements KeyListener {

double velX = 0;
double velY = 0;
double moveX = 0;
double moveY = 0;

double posX = 1;
double posY = 1;

double friction = 1.005;

BufferedImage image;

public void paintComponent(Graphics g) {
super.paintComponent(g);
try{
image = ImageIO.read(new File("shrek.png"));
}catch (IOException ex){
System.out.println("Image Does Not Exist");
}

g.setColor(Color.RED);
moveX += velX;
moveY += velY;

posX += moveX;
posY += moveY;
g.drawImage(image,(int)posX,(int)posY,null);
}

public void keyPressed(KeyEvent e){
int key = e.getKeyCode();

int up = KeyEvent.VK_UP, w = KeyEvent.VK_W;
int down = KeyEvent.VK_DOWN, s = KeyEvent.VK_S;
int left = KeyEvent.VK_LEFT, a = KeyEvent.VK_A;
int right = KeyEvent.VK_RIGHT, d = KeyEvent.VK_D;

if(key == w || key == up)
velY = -.2;
if(key == s || key == down)
velY = .2;
if(key == a || key == left)
velX = -.2;
if(key == d || key == right)
velX = .2;
}

public void keyReleased(KeyEvent e){
int key = e.getKeyCode();

int up = KeyEvent.VK_UP, w = KeyEvent.VK_W;
int down = KeyEvent.VK_DOWN, s = KeyEvent.VK_S;
int left = KeyEvent.VK_LEFT, a = KeyEvent.VK_A;
int right = KeyEvent.VK_RIGHT, d = KeyEvent.VK_D;

if(key == w || key == up)
velY = 0;
if(key == s || key == down)
velY = 0;
if(key == a || key == left)
velX = 0;
if(key == d || key == right)
velX = 0;
}

public void keyTyped(KeyEvent e){}

public static void main(String[] args) {
MoveTest mt = new MoveTest();
JFrame jf = new JFrame();

jf.setTitle("Test one cladss");
jf.setSize(1440,900);
jf.setBackground(new Color(0,0,0,0));
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(mt);
jf.setVisible(true);

mt.setOpaque(true);
mt.addKeyListener(mt);
mt.requestFocusInWindow();

while(true){
//jf.removeAll();
jf.repaint();

mt.collision();
mt.friction();
try {
Thread.sleep(16);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}

public void collision(){
if(posX >= 1440-50|| posX <= 0){
velX -= (2*velX);
moveX -= (2*moveX);
}
if(posY >= 900-50 || posY <= 0){
velY -= (2*velY);
moveY -= (2*moveY);
}
}

public void friction(){
moveX /= friction;
moveY /= friction;
}
}

如果您有更多信息,请评论。如有任何帮助,我们将不胜感激!

最佳答案

我以前也遇到过这种情况。从 JFrame 重写的paintComponent 方法与从所有其他组件重写的方法不同。由于您已经覆盖了 JFrame 的绘制代码,因此它不再删除背景。解决办法有两种:

  1. 添加您自己的 JComponent(JPanel 效果很好)并覆盖它的绘制方法而不是 JFrame。

  • 调用 super.paintComponent 后,您要做的第一件事就是自行清除 Canvas 。
  • 此外:

    您不应该在每次绘画时都阅读您的图像。由于从任何线程调用重绘后不久就会进行绘制,因此图像可能会加载很多次。如果您需要加载一次,请在类中创建一个无名实例 block ,如下所示:

    {
    try{
    image = ImageIO.read(new File("shrek.png"));
    }catch (IOException ex){
    System.out.println("Image Does Not Exist");
    }
    }

    如果您只打算拥有一个副本,请将其设为静态 block :

    static {
    <load image here>
    }

    如果您想在每一帧中重新加载图像,因为它发生了变化,您需要找到一种方法来避免这样做。相反,任何图像动画都应该通过在 java 中编辑 BufferImage 对象或加载 sprite-map 来实现。

    关于java - 透明背景清屏java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709171/

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