Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.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_Eclipse_Graphics - Fatal编程技术网

如何在java中使角色平滑移动?

如何在java中使角色平滑移动?,java,eclipse,graphics,Java,Eclipse,Graphics,我目前正在eclipse中制作一个“英雄”移动,如果按下一个键,我会在改变的X坐标中重新绘制它。这是可行的,但动作粗糙,甚至显得滞后。我真的很感激任何帮助/建议,代码看起来很长,但它确实很基本 级别代码 英雄密码 }尝试使用双缓冲或三缓冲 看看这个 来自Wiki的更多信息: 在计算机图形学中,双缓冲是一种绘制不显示(或更少显示)口吃、撕裂和其他瑕疵的图形的技术 一个程序很难绘制一个显示,这样像素就不会改变多次。例如,在更新一页文本时,清除整个页面然后绘制字母要比以某种方式擦除新旧字母中不存在的所

我目前正在eclipse中制作一个“英雄”移动,如果按下一个键,我会在改变的X坐标中重新绘制它。这是可行的,但动作粗糙,甚至显得滞后。我真的很感激任何帮助/建议,代码看起来很长,但它确实很基本

级别代码 英雄密码
}尝试使用双缓冲或三缓冲 看看这个

来自Wiki的更多信息: 在计算机图形学中,双缓冲是一种绘制不显示(或更少显示)口吃、撕裂和其他瑕疵的图形的技术

一个程序很难绘制一个显示,这样像素就不会改变多次。例如,在更新一页文本时,清除整个页面然后绘制字母要比以某种方式擦除新旧字母中不存在的所有像素容易得多。然而,该中间图像被用户视为闪烁。此外,计算机监视器不断地重画可视视频页面(大约每秒60次),因此,即使是一次完美的更新,也可能在“新”图像和未重画的“旧”图像(称为撕裂)之间作为一个水平分隔线瞬间可见

首先看一看,了解有关绘画如何工作以及如何与之融合的更多细节

Swing中的绘制使用被动渲染算法,这意味着绘制周期可以在任何时候发生,原因有很多,很多都是您无法控制或不知道的

这意味着可以随时调用
paint
。涂漆应尽快完成,以免降低应用性能

为此,您不应该加载资源、做出过于复杂的逻辑决策或从paint方法中更新状态

首先将图像加载到其他地方,例如在构造函数中

绘画是一系列复杂的链式方法调用(“绘画链”),很容易被破坏,从而导致各种各样的怪异。作为一般建议,建议覆盖
paintComponent
以执行自定义绘制,还应调用
super.paintComponent
,以维护原始的“绘制链”


我还建议使用over
KeyListener
,除了提供更灵活和可重用的解决方案外,它还解决了
KeyListener

的焦点相关问题。您是否在事件调度线程(EDT)上运行GUI?如果没有,那就麻烦了。不,我没有。你能解释一下怎么做吗@LewBlochAnd我会在哪里使用它@LewBloch顺便谢谢你。请阅读精美手册!此外,考虑自己做一些研究,例如,使用搜索引擎。你不能从这样的地方学习编程!你必须养成自己做作业的习惯和技能。不要用画法来加载资源;喜欢油漆组件而不是油漆;在进行任何自定义绘制之前,请致电super.paintXxx;与KeyListener相比,更喜欢键绑定Swing it self,正确使用时会受到默认值的双重影响我在提供的代码中没有看到BufferStrategy。swing在“幕后”使用它吗?我认为不是。是的,Swing使用一个内部缓冲区来绘制所有子组件,自从创建以来就已经完成了,这就是为什么您可以在Swing中制作动画,而不使用任何类型的双缓冲区,不像Awty,您可以直接查看“创建一个具有双缓冲区和流布局的新JPanel”。还有很多其他的方法可以用来打开和关闭它
JFrame window = new JFrame("Level");
Hero hero = new Hero(0, 800);

public Level()
{
    this.setFocusable(true);
    this.addKeyListener(this);
    window.add(this);
    window.setSize(1400, 980);
    window.setLocation(40,20);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);
}

public void paint(Graphics g)
{
    try {
        Image i = ImageIO.read(getClass().getResource("/Sprites/Background.jpg"));
        g.drawImage(i, 0, 0, null);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    hero.drawHero(g);
}

@Override
public void keyPressed(KeyEvent kp) 
{
    if(kp.getKeyCode()==KeyEvent.VK_RIGHT)
    {
            hero.setxAxis(hero.getxAxis()+5);
            this.repaint();
    }
    if(kp.getKeyCode()==KeyEvent.VK_LEFT)
    {
            hero.setxAxis(hero.getxAxis()-5);
            this.repaint();
    }
}
public class Hero {
int xAxis;
int yAxis;
Image heroImage;
public Hero(int xAxis, int yAxis)
{
    super();
    this.xAxis = xAxis;
    this.yAxis = yAxis;
    try {
        heroImage = ImageIO.read(getClass().getResource("/Sprites/Pic1.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public int getxAxis() {
    return xAxis;
}

public void setxAxis(int xAxis) {
    this.xAxis = xAxis;
}

public int getyAxis() {
    return yAxis;
}

public void setyAxis(int yAxis) {
    this.yAxis = yAxis;
}

public void drawHero(Graphics g) {
    g.drawImage(heroImage, xAxis, yAxis, null);
}