【问题标题】:How to move image in Applet?如何在 Applet 中移动图像?
【发布时间】:2012-08-27 06:59:50
【问题描述】:

我想在applet 中左右上下移动角色,但它根本不动。这是我的代码,请帮忙

import javax.swing.JPanel;

import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import java.applet.*;
import java.awt.event.*;
import java.awt.*;

public class drawCenter extends Applet
{
    private int x,y;// the x and y of the position of the player
    private BufferedImage image, pos;

    public void init(  )
    {
        try
        {
            image = ImageIO.read(new File("pokemonCenter.png"));
            pos = ImageIO.read(new File("player/maleInGame.png"));
        }
        catch (IOException ex)
        {

        }
        x = 150; y = 171;
    }

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

        switch( keyCode )
        {
            case KeyEvent.VK_UP: if( y>0 )
            {
                y=y-19;
                repaint();

            }

            break;
            case KeyEvent.VK_DOWN: if( y<171 )
            {
                y=y+19;
                repaint();

            }

            break;
            case KeyEvent.VK_LEFT:if( x>0 )
            {
                x=x-15;
                repaint();

            }

            break;
            case KeyEvent.VK_RIGHT:if( x<285 )
            {
                x=x+15;
                repaint();

            }

            break;
        }
        e.consume();
    }

    public void keyReleased(){

    }

    public void paint( Graphics g )
    {
        g.drawImage(image, 0, 0, null);
        g.drawImage(pos, x, y, null);
    }
}

【问题讨论】:

  • 你可能会关注我在你开始的另一个线程上创建的8 or so points
  • “如何在 Applet 中移动图像?” 与您在应该正在开发的应用程序中所做的完全相同。

标签: java image swing applet awt


【解决方案1】:

您的代码假装有一个 KeyListener,但在任何地方都找不到 KeyListener,更不用说添加到 GUI 的组件中了。您的解决方案:创建一个实现 KeyListener 或扩展 KeyAdapter 的类,然后将其添加到具有焦点的 GUI 组件中。

请查看:How to Write a KeyListener

另外,我建议您避免让您的 GUI 类、Applet 实现 KeyListener,因为这会使该类承担太多责任。我认为最好为您的 KeyListener 创建一个匿名内部类,甚至是一个单独的独立类。

【讨论】:

    【解决方案2】:

    让你的类实现KeyListener,然后在你的构造函数中调用super.addKeyListener(this)。正如您现在所拥有的那样,您既没有指定类实现接口(尽管实现了它需要的方法),也没有使用Applet 注册侦听器。

    【讨论】:

    • 为什么推荐他用super?
    • @HovercraftFullOfEels 对我来说更有意义。另外,如果我提倡过早优化,invokespecialinvokevirtual 快;-)
    • 能否请您详细说明invokespecialinvokevirtual
    • @SriHarshaChilakapati 差异是相当微不足道的......这是一个玩笑。如果你真的想学,那你看看JVM规范怎么样?
    • @veer 我没有阅读任何规范,也不是计算机科学专业的学生。我只是为了好玩而学习 Java
    【解决方案3】:

    试试这个。

    import javax.swing.*;
    import java.awt.*;
    
    import static java.awt.event.KeyEvent.*;
    
    public class DrawCenter extends JApplet implements KeyListener {
    
        Image character = null;
        int x = 0;
        int y = 0;
    
        public Image loadImage(String name){
            return new ImageIcon(getClass().getClassLoader().getResource(name)).getImage();
        }
    
        public void init(){
            character = getImage("pokemonCenter.png");
            x = getWidth()/2 - character.getWidth(null)/2;
            y = getHeight()/2 - character.getHeight(null)/2;
            addKeyListener(this);
        }
    
        public void keyPressed(KeyEvent e){
            switch (e.getKeyCode()){
                case VK_LEFT: x--; break;
                case VK_RIGHT: x++; break;
                case VK_UP:    y--; break;
                case VK_DOWN: y++; break;
            }
            repaint();
        }
    
        public void paint(Graphics g){
            g.drawImage(character, x, y, null);
        }
    
    }
    

    如果您正在制作游戏,请查看游戏循环或尝试Game-Engine (If you'r interested, go to http://game-engine-for-java.googlecode.com/ )

    【讨论】:

    • KeyListener 方法的其余部分在哪里? :)
    • @brano88 刚刚删除它们以使答案简短
    • 糟糕!我已经忘记了。我以为他可以添加其他人
    【解决方案4】:

    你应该是这样的:

    package stack;
    
    
    import java.applet.*;
    
    import java.awt.event.*;
    
    import java.awt.*;
    
    public class DrawCenter extends Applet implements KeyListener{
    
        private int x=50,y=50;// the x and y of the position of the player
    
    
        public void init(  ){ 
            addKeyListener(this);
        }
    
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
    
            switch( keyCode ) { 
                case KeyEvent.VK_UP: if( y>0 ){ //when up key is pressed and the position of the player is not on the edge
                                    y=y-19;
                                    repaint();
                                }
                                break;
            case KeyEvent.VK_DOWN: if( y<171 ){//when down key is pressed and the position of the player is not on the edge
                                        y=y+19;
                                        repaint();
                                    }
                                    break;
            case KeyEvent.VK_LEFT:  if( x>0 ){
                                        x=x-15;
                                        repaint();
                                    }
                                    break;
            case KeyEvent.VK_RIGHT: if( x<285 ){
                                        x=x+15;
                                        repaint();
                                    }
                                    break;
            }
        } 
    
        public void keyReleased(){
    
        }
    
    
        public void paint( Graphics g ){ //will draw the background and the character
            g.fillRect(x, y, 20, 20);
    
        }
    
        @Override
        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub
    
        }
    }
    

    【讨论】:

    • 你为什么使用e.consume()?它不允许 swing 处理它的其他功能。
    • 哦……好像我在修改他的代码时忘记删除它了。我会解决的。
    • 角色仍然没有移动
    • 只要点击Applet的表面,它就会按箭头键移动。
    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2013-07-25
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多