我正在使用Graphics g为播放器和地图绘制图像。 每当玩家移动时,我都希望将玩家图像更新到新位置,而不更新地图图像。 我怎样才能做到这一点?

预先感谢您的任何答复!

对不起,我的代码混乱。

   Main:
package Main;
import java.awt.Dimension;

import javax.swing.JFrame;

public class Main {
    public static JFrame frame;

    static int size = 32;
    static int width = size*20;
    static int height = size*17;

    static playerObj p = new playerObj(200,200);

    static tileMap grid = new tileMap();

    public static void main(String[] args) {
        frame = new JFrame("Game");
        frame.getContentPane().setPreferredSize(new Dimension(width-9, height-9));
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.add(new drawGraphics());
        frame.setVisible(true);
    }
}

drawGraphics:
package Main;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class drawGraphics extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;

    boolean running = true;
    boolean renderMap = true;

    playerObj p = Main.p;
    int size = Main.size;
    static int x = 0;
    static int y = 0;

    Thread thread = new Thread(this);

    public drawGraphics() {
        setFocusable(true);
        addKeyListener(new controls());
        start();
    }

    public void start() {
        thread.start();
    }

    public void paint(Graphics g) {
        Graphics2D d = (Graphics2D) g;
        super.paintComponent(g);

        if (renderMap) {
            map(d);
        }

        player(g);

        repaint();
    }

    public void player(Graphics g) {
        try {
            BufferedImage pImg = ImageIO.read(new File("images/player.png"));
            g.drawImage(pImg, p.getX(), p.getY(), null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void map(Graphics g) {
        System.out.println("2dfsdf");
        Graphics2D d = (Graphics2D) g;
        for (int i = 0; i < tileMap.map.length; i++) {
            for (int j = 0; j < tileMap.map[i].length; j++) {
                d.setColor(tileMap.map[i][j].getC());
                d.fillRect(tileMap.map[i][j].getX(), tileMap.map[i][j].getY(),
                        Main.size, Main.size);
                if (tileMap.map[i][j].solid()) {
                    d.setColor(Color.BLACK);
                    d.drawRect(tileMap.map[i][j].getX(),
                            tileMap.map[i][j].getY(), Main.size, Main.size);
                }
            }
        }
    }

    public void move() {
        if (controls.up) {
            controls.goUp();
            y--;
            repaint();
        }
        if (controls.down) {
            controls.goDown();
            y++;
            repaint();
        }
        if (controls.left) {
            controls.goLeft();
            x--;
            repaint();
        }
        if (controls.right) {
            controls.goRight();
            x++;
            repaint();
        }
        if (controls.place) {
            repaint();
        }
    }

    public void run() {
        while (running == true) {
            move();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

===============>>#1 票数:4 已采纳

不要直接在JFrame中绘制,而要在JFrame中显示的JPanel中绘制。

如果您将Swing用作GUI库,则将背景绘制为BufferedImage,然后首先在paintComponent方法中进行绘制。 然后在接下来需要的任何位置绘制图像精灵:

@Override  // this is in a JPanel extended class
protected void paintComponent(Graphics g) {
   super.paintComponent(g);
   if (backgroundImg != null) {
      g.drawImage(backgroundImg, 0, 0, null);
   }
   if (spriteImg != null) {
      g.drawImage(spriteImg, spriteX, spriteY, null);
   }
}

您的代码存在一些问题:

  • 不要覆盖paint ,然后在其中调用super.paintComponent
  • 而是重写paintComponent并在其中调用相同的super方法。
  • 切勿在paint或paintComponent内部调用repaint() 请改用Swing计时器。
  • 在您的player(...)方法中,每次调用该方法时,您都会重新读取图像,这会使绘画慢下来。 不要这样做,而是一次读取图像,然后将其保存到变量中。

  ask by TIMMEHf32432 translate from so

未解决问题?本站智能推荐:

2回复

Java Make Objects立即出现

我的装载栏有问题。 我希望加载栏在开始加载图像之前出现在我的面板上。 但是,加载图像后会出现加载条。 这是我的代码。 在我的homePanel.loadImage()里面是这样的: 当我尝试运行它时,JFrame是空白的,几秒钟后加载条将与“DONE!”一起出现。 在输出
2回复

保持绘制图形 - 删除super.paintComponent

我有一个名为Foo的类,它扩展了一个名为Bar的类,它扩展了JPanel并实现了ActionListener。 当我选择圆形并单击绘制按钮时,我绘制一个圆形,当我按下矩形并单击绘制时,它会删除前一个形状并绘制一个矩形。 但是,我想在JPanel上保留所有形状,直到我选择单击“删除”按钮。
2回复

尝试在java中绘制时,图形不显示任何内容

这是我项目中最小的SSCCE,我可以实现给你看。 任何人都可以解释为什么我在Render创建的正方形没有显示出来? 我感谢任何帮助,这是非常重要的 这段代码是可编译的,它运行,但正如我所说,它没有显示正方形。 循环类 渲染类 主要课程 MyPanel类
1回复

一旦被另一个类调用,Java图形将不适用于JPanel类

我创建了一个计算器,该计算器应该在按下某些键时提示您进行Pong游戏。 我的乒乓球游戏是单独创建的,本身运行良好。 但是,一旦在我的Calculator程序中实现了图形,图形将拒绝移动。 下面是Calculator程序中的KeyAdapter代码,它将提示Pong游戏: 这是P
2回复

Java repaint()不会调用paintComponent()来绘制图像

我已经阅读了很多有关此问题的答案,但是即使使用简单的代码也无法找到我的错误。 这是问题所在:我想在JPanel中的JLabel中绘制图像,但未调用JLabel的paintComponent()方法。 这是代码: ImagePainter类应绘制图像 这是一个标准的JFram
2回复

Java图形大量更新卡纸(简单的Pong游戏)

我是更动态的Java swing编程的新手。 我当然在Buttons , Panels等中使用了常规的摆动组件。 所以我正在尝试使用Swing和Graphics2D制作一个非常基础的pong游戏。 我以前做了一个绘画程序,我成功地做到了。 我的问题是程序运行时图形严重卡死。 到
1回复

绘制几个多边形后,Java绘图程序会变慢

作为大学项目的一部分,我正在开发一个用于注释图像的Java swing程序。 该程序的一个特点是能够在图像的某些区域周围绘制多边形,然后可以用标题标记。 绘制多边形时,每次单击都会在图像上绘制一个新的绿色顶点,并通过绘制一条线将此顶点链接到前一个顶点。 当用户移动鼠标时,还会绘制一条预
1回复

Java-移动窗口或最小化后,图形消失了[关闭]

我正在编写一个程序,其中绘制了不同的元素(如矩形和椭圆形)。 单击JButton之后,应该在屏幕上绘制一些东西。 我希望它可以留在屏幕上,但是每次我移动窗口或最小化它时,每个绘制的对象都会不断消失。 我搜索了类似的主题,但没有任何帮助。 有两种方法:编译Java程序后绘制图形对象(每
1回复

Java图形-当我单击->之前所有方法时repaint()不起作用

我在重绘方法上遇到了新问题。 有一个框架,我可以在其中画几个图形。 当我单击特定范围的坐标时,它应更改一个图形的状态,然后重新绘制该特定范围。 但这重画不起作用...这是初始化图形的方法(未显示图形的声明): 然后我的课KnopfRot : 以及带有方法updateKnop
2回复

将矩形绘制到屏幕后如何清除矩形?

我意识到游戏中缺少的一个主要因素是时间感,滴答声或FPS。 我正计划很快实现这一目标,但想获得一些有关如何设置“项目符号”的反馈。 我希望用户按下空格键,并在屏幕上发射子弹。 现在我已经没有FPS的感觉了。 但是,它只是画出一条巨大的线,这意味着子弹“踪迹”永远不会消失。 我想知道为什