当前位置: 首页 > 知识库问答 >
问题:

图形不会自动移动,并且在按箭头键时也会生成副本而不是移动

季凡
2023-03-14

我在做一个蛇游戏,我在试着让蛇向右移动。这里的问题是蛇并不是真的在移动,它似乎只是复制自己向右,而且它也不会自动向右,你必须一直按下键。

我真的不知道是什么问题,我做了一些代码没有任何图像。这将使代码能够按原样运行以进行测试。

public class Game{
    static Graphics g;

    public static void main(String[] args) {                   
        JFrame b = new JFrame("Snake");
        b.setBounds(300,60,905,700);
        b.setBackground(Color.DARK_GRAY);
        b.setResizable(false);
        Snake snake = new Snake();

        b.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        b.add(snake);
        b.setVisible(true);
   }
}
public class Snake extends JPanel implements KeyListener,ActionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private int[] snakeXlength = new int [750];
    private int[] snakeYlength = new int [750];
    
    private boolean right = true;
    private boolean left = false;
    private boolean up = false;
    private boolean down = false;
    private ImageIcon rightmouth;
    private ImageIcon snakeimage;
    private ImageIcon leftmouth;
    private ImageIcon downmouth;
    private ImageIcon upmouth;
    private ImageIcon enemy;

    private Timer timer;
    private int snakeDelay = 100;
    private int moves = 1;
    private int lengtOfSnake = 3;
    public Snake(){
        
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(snakeDelay, this);
        timer.start();
        
    }
    public void paint(Graphics g) {
          g.setColor(Color.WHITE);
            g.drawRect (20, 24, 851, 612);  
              g.setColor(Color.BLACK);
                g.fillRect (21, 25, 850, 610);

        if (moves == 0) {
            snakeXlength[2]= 63;
            snakeXlength[1]= 83;
            snakeXlength[0]= 100;
            
            snakeYlength[2]= 100;
            snakeYlength[1]= 100;
            snakeYlength[0]= 98;

             rightmouth = new ImageIcon("rightmouth.png");

            rightmouth.paintIcon(this, g, snakeXlength[0], snakeYlength[0]);

        }
        for(int a = 0; a < lengtOfSnake; a++) {
    
            
            
            if (a == 0 && right) {
            if (a == 0 && right) {
                g.setColor(Color.RED);
                
                g.drawRect(5,10,snakeXlength[a],snakeYlength[a]);

               g.fillRect (snakeXlength[a],snakeYlength[a],21,21);
                g.drawRect(5,10,snakeXlength[a],snakeYlength[a]);
                // rightmouth = new ImageIcon("rightmouth.png");

                //rightmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);

            }

            if (a == 0 && left) {
                 leftmouth = new ImageIcon("leftmouth.png");

                leftmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);

            }
 
            if (a == 0 && down) {
                 downmouth = new ImageIcon("downmouth.png");

                downmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);

            }
            if (a == 0 && up) {
                 upmouth = new ImageIcon("uptmouth.png");

                upmouth.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);
        
                
                }
            if (a != 0) {
                g.setColor(Color.GREEN);

                g.fillOval(snakeXlength[a],snakeYlength[a],17,17);
                 //snakeimage = new ImageIcon("snakeimage.png");

                //snakeimage.paintIcon(this, g, snakeXlength[a], snakeYlength[a]);

            }
            
        }
                
        g.dispose();
        
    }

    public void keyPressed(KeyEvent e) {
        timer.start();
        if(right) {
            for (int r = lengtOfSnake-1; r >= 0;r--) {
                snakeYlength[r+1] = snakeYlength[r];
            }
            for(int r = lengtOfSnake;r >=0;r--) {
                if(r==0) {
                    snakeXlength[r] =   snakeXlength[r] +25;
                    
                }
                
                else {
                    snakeXlength[r] =   snakeXlength[r-1];

                }
                
                if(snakeXlength[r] > 850){
                    snakeXlength[r] = 25;
                }
            }
                repaint();

        }
        
        if(left) {
            
        }
        if(up) {
            
        }
        if(down) {
            
        }
    }
    
    @Override
    public void keyTyped(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
            moves++;
            right = true;

            if(left != true) {
                right = true;

            }
            else
            {
                right = false;
                left = true;
            
                
            }
            down = false;
            up = false;

        }
        
        if(e.getKeyCode() == KeyEvent.VK_LEFT) {
            moves++;
            left = true;

            if(right != true) {
                left = true;

            }
            else
            {
                left = false;
                right = true;
            
                
            }
            down = false;
            up = false;

        }       if(e.getKeyCode() == KeyEvent.VK_UP) {
            moves++;
            up = true;

            if(down != true) {
                up = true;

            }
            else
            {
                up = false;
                down = true;
            
                
            }
            left = false;
            right = false;

        }
        
            if(e.getKeyCode() == KeyEvent.VK_DOWN) {
        moves++;
        down = true;

        if(up != true) {
            down = true;
        }
        else
        {
            up = true;
            down = false;
        
            
        }
        left = false;
        right = false;

    }
    }

    @Override


    
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        
    }
}

共有1个答案

桂坚
2023-03-14

它似乎只是把自己复制到右边

public void paint(Graphics g) 
{
    g.setColor(Color.WHITE);

自定义绘制应通过重写PaintComponent(...)来完成,然后需要调用super.PaintComponent(...):

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    g.setColor(Color.WHITE);

这将确保在进行自定义绘画之前清除面板的背景。

它不会自动向右--你必须一直按这个键。

嗯,这通常是一个游戏的设计方式。您只有在按键被按下时才有动作,因为这将不断生成事件。然后,如果你不想运动,你就不按任何键。

如果你想要动画,那么你就使用一个摆动计时器。每次计时器激发时,您都调用move(...)方法。此方法需要查看“方向”变量来确定是否向左、向右、向上或向下移动snake。

退房:

  1. 按下并按住键时使用键盘进行动画动作,以及
  2. 为连续动画获取类外部JPanel的宽度和高度
 类似资料:
  • 刚开始使用pygame,当你按住箭头键时,试图让一个简单的点在屏幕上移动。目前,它只在你按键时移动,但你必须重复按键。 此外,我很感激你对我目前的代码有任何建议,可以改进或改变,使之更有效。

  • 问题内容: 我正在尝试创建一个简单游戏的开始。我要做的第一件事是将图形导入到我的代码中,然后在屏幕上移动它。我能够在屏幕上画一个球并四处移动,但是当我从文件导入图形时,无法四处移动。我想念什么或做错什么? 我的司机是在另一个班级,如下所示: 问题答案: 这里有两个大问题: 您正在从中读取文件。 永远 不要这样做,因为这会不必要地减慢绘图速度。可能在构造函数中读取一次图像,然后在图形中使用存储的im

  • 我正在用PyGame制作一个小游戏,相机聚焦在一个代表角色的精灵上,当按下箭头键时,地图会围绕它移动。问题是地图不动。我以前多次遇到过这个问题,我想我已经把它缩小到可能的范围,但是我不知道如何真正解决这个问题。 这是代码: 基于我过去的PyGame程序,我总是在移动被绘制到屏幕上的精灵集时遇到问题,比如我在这里所做的。即使是平庸简单的例子也会失败。我想知道的是这是为什么,我怎样才能简明扼要地画出大

  • 我现在正在实验JavaFX,教自己如何使用箭头键移动文本和项。我做了一个程序,如果按下箭头键,就可以简单地在舞台上移动文本。 我想使一个圆圈移动我的窗格,而不是文本。要使用箭头键移动我的圆圈,我必须做哪些更改?

  • 问题内容: 在我的詹金斯上,我配置了: 源代码管理 Git存储库:https : //bitbucket.org/username/project.git 凭据:用户名/密码 建造者触发器 将更改推送到BitBucket时生成 在我的BitBucket Webhooks上: http://Jenkins.URL:8080 / bitbucket-hook 我尝试将小的更改推送到.txt文件,但是J

  • 问题内容: 我正在尝试通过keyEvent向左移动一个圆圈。到目前为止,圆已在窗口上绘制,但不会向左移动!我觉得问题是我在容器中添加了Window()构造函数。在控制台上没有输出告诉我它正在工作。因此,我认为它甚至不会到达KeyEvent类。这是我的代码: 问题答案: 实际上,这是您要添加到的内容,但重点是,因此,当您键入内容时,该内容将转到与类无关的内容。因此,为了克服它,你只需要调用的类的对象