Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用图像代替矩形?_Java - Fatal编程技术网

在Java中使用图像代替矩形?

在Java中使用图像代替矩形?,java,Java,这是我第一次尝试用java创建2d游戏,我制作了一个8位的小角色,我想用它来代替屏幕上出现的矩形。我不太明白如何将.png图像放入矩形中,或者如何制作角色,在本例中,是保存到硬盘上的图像。谢谢 import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; public class Keying extends JPanel { pub

这是我第一次尝试用java创建2d游戏,我制作了一个8位的小角色,我想用它来代替屏幕上出现的矩形。我不太明白如何将.png图像放入矩形中,或者如何制作角色,在本例中,是保存到硬盘上的图像。谢谢

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Keying extends JPanel {

    public Rectangle character;
    public int charW = 24;
    public int charH = 36;

    public boolean right = false;
    public boolean left = false;
    public boolean up = false;
    public boolean down = false;

    public Keying(Display f, Images i)
    {
        character = new Rectangle(180, 180, charW, charH);
        f.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_D)
                {
                    right = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_A)
                {
                    left = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_S)
                {
                    down = true;
                }
                if (e.getKeyCode() == KeyEvent.VK_W)
                {
                    up = true;
                }
            }
            public void keyReleased(KeyEvent e)
            {
                if (e.getKeyCode() == KeyEvent.VK_D)
                {
                    right = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_A)
                {
                    left = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_S)
                {
                    down = false;
                }
                if (e.getKeyCode() == KeyEvent.VK_W)
                {
                    up = false;
                }
            }
        });
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.white);
        g.setColor(Color.black);
        g.fillRect(character.x, character.y, character.width, character.height);

        if (right)
        {
            character.x += 1;
        }
        if (left)
        {
            character.x -= 1;
        }
        if (down)
        {
            character.y += 1;
        }
        if (up)
        {
            character.y -= 1;
        }
        repaint();
    }   
}

这个过程相对简单

从加载角色图像开始

public class Keying extends JPanel {

    //public Rectangle character;
    private java.awt.BufferedImage character;
    private java.awt.Point characterLocation;
    //...

    public Keying(Display f, Images i) throws IOException
    {
        character = javax.ImageIO.read(...);
        characterLocation = new Point(0, 0);
        //...
有关更多详细信息,请参阅

然后,您只需绘制
字符
图像

@Override
protected void paintComponent(Graphics g)
{
    g.drawImage(character, characterLocaiton.x, characterLocation.y, this);
建议

  • 避免使用
    KeyListener
    ,因为它很容易关注您不想处理的问题。请改为使用键绑定,有关详细信息,请参阅
  • 避免将任何逻辑放在任何绘制例程中,绘制可以在任何时间进行,其中许多是您无法控制的,这可能会使您的角色朝着您不期望的方向移动,或者比他们应该的速度更快。相反,这属于负责更新状态和调度绘制请求的主游戏循环
  • 永远不要在任何绘制方法中更改组件的状态,这可能会导致绘制请求的无限循环,这将消耗您的系统资源。在您的上下文中,不要调用
    setBackground
    (当您调用此选项时,背景已经被绘制)或
    repaint

更改为我从阅读/加载图像页面和您发布的内容中收集的内容。收到以下错误:/-------------------------------------javax.imageio.IIOException:无法读取输入文件!test.Keying.(Keying.java:28)at test.Display.(Display.java:20)at test.MonGame.(MonGame.java:7)线程“main”java.lang.ExceptionInInitializerError中的异常由java.lang.NullPointerException at java.awt.Container.add(未知源)at java.awt.Container.add(未知源)引起图像存储在哪里(相对于您的项目)?您提供了什么路径
ImageIO.read
?在与类相同的包中,路径只是.png图像的名称。我猜我必须使用like/test/src/(图像名称)?使用
character=ImageIO.read(new File())
b尝试使用类似
ImageIO.read(getClass().getResource(“图像名称”))
(别忘了包含图像扩展名)是的:你太棒了!谢谢你,我的朋友