【问题标题】:Java applet won't move imageJava小程序不会移动图像
【发布时间】:2013-01-06 21:39:55
【问题描述】:

我正在尝试用 Java 制作一种 Space Invaders 游戏,首先是让 PNG 宇宙飞船在屏幕上移动。它出现在它应该去的地方,只是它拒绝移动。该程序编译得很好,eclipse没有给我任何错误/警告。谁能告诉我我做错了什么?

这是我的代码:

import java.awt.*;
import java.net.*;
import java.awt.geom.*;
import java.applet.*;
import java.awt.event.*;

public class DrawImage extends Applet implements KeyListener{
    private static final long serialVersionUID = 1L;
    private Image image;
    private int keycode;
    AffineTransform identity = new AffineTransform();
    private boolean keyleft = false;
    private boolean keyright = false;
    private URL getURL(String filename){
        URL url = null;
        try
        {
            url = this.getClass().getResource(filename);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return url;
    }
    public void init()
    {
        image = getImage(getURL("spaceship.png"));
        addKeyListener(this);
    }

    public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        //fill background with black
        AffineTransform trans = new AffineTransform();
        g2d.setColor(Color.GREEN);
        g2d.fillRect(0,0,getSize().width,getSize().height);
        g2d.drawImage(image,320,240,this);
        trans.setTransform(identity);
        if(keyright == true)
        {
            trans.translate(-10,0);
            keyleft = false;
        }
        else if(keyleft == true)
        {
            trans.translate(10,0);
            keyright = false;
        }
    }
    public void keyPressed(KeyEvent e)
    {
        keycode = e.getKeyCode();
        if(keycode == KeyEvent.VK_LEFT)
        {
            keyleft = true;
        }
        else if(keycode == KeyEvent.VK_RIGHT)
        {
            keyright = true;
        }
        repaint();
    }
    public void keyTyped(KeyEvent e){}
    public void keyReleased(KeyEvent e){}

}

【问题讨论】:

  • 小程序是否可聚焦?它焦点吗?考虑 1) 在第三个千年中超越 AWT。 2) KeyListener 上的键绑定 3) JFrame 而不是 JApplet 4) 使用 Java Web Start 从链接启动框架。
  • 我从一本书改编而来——不知道可聚焦是什么意思,因为它没有被提及。在 AWT 上摆动?这意味着什么?我希望它是一个小程序,以便它可以在网络上运行
  • 本书出版于2009年
  • 这本书具体是什么书?我对它的看法随着每条新评论而下降。真的,摆脱它 - 它会浪费你很多时间。
  • Jonathon S. Harbour 的 Java 游戏编程入门第二版。它实际上是一本非常好的书,帮助我理解了很多。你为什么不用你认为能让它们一次性工作的东西来回答我的问题之一,而不是不断批评我的技术和资源?

标签: java applet awt 2d-games


【解决方案1】:

您应该在您的paint() 方法中将转换设置为您的g2d:

g2d.setTransform(trans);

那么整个方法就是:

  public void paint(Graphics g)
    {
        Graphics2D g2d = (Graphics2D)g;
        //fill background with black
        AffineTransform trans = new AffineTransform();
        g2d.setColor(Color.GREEN);
        g2d.fillRect(0,0,getSize().width,getSize().height);
        trans.setTransform(identity);
        if(keyright == true)
        {
            trans.translate(-10,0);
            keyleft = false;
        }
        else if(keyleft == true)
        {
            trans.translate(10,0);
            keyright = false;
        }
        g2d.setTransform(trans);
        g2d.drawImage(image,320,240,this);
    }

【讨论】:

  • 你真的试过那个代码吗?很明显,transform 从未使用过,但如果在绘制操作完成后设置它不会有任何效果。有关成功使用(3 个串联)仿射变换的示例,请参阅 this answer
  • @AndrewThompson 你是对的,我更新了代码。它应该像这样工作,对吧?
  • 看起来更好,虽然我也没有测试过。
  • @imulsion 也许 keyright 和 keyleft 变量不起作用。删除整个 if...elseif... 块,然后将翻译放入硬编码中,例如:trans.translate(-10,0);因此无论您是否按下按钮都会应用它。如果您将翻译注释掉,请检查图像的位置是否不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2016-03-20
  • 2012-05-22
  • 2017-09-16
  • 1970-01-01
  • 2014-02-09
  • 2014-07-02
相关资源
最近更新 更多