ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何使用Java中的KeyListener移动Polygon对象

2019-10-03 09:12:07  阅读:208  来源: 互联网

标签:keylistener java polygon swing


我正在研究2D游戏作为一个学习项目,我遇到了一个问题.我无法弄清楚如何在JPanel(添加到JFrame)中使用KeyListener移动Polygon对象.我尝试过frog.translate(int x,int y)方法,它不会更新位置.我也试过手动更改阵列坐标.我的代码示例如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Board extends JPanel implements KeyListener {

    private Frog frog;

    public Board() {
        setBackground(Color.GREEN);
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;        

        frog = new Frog();   

        // Frog graphics
        g2.setColor(Color.BLACK);
        g2.drawPolygon(frog);
        g2.setColor(new Color(0,150,15));
        g2.fillPolygon(frog);
    }

    @Override
    public void keyTyped(KeyEvent ke) {
    }

    @Override
    public void keyPressed(KeyEvent ke) {
        int c = ke.getKeyCode();
        if(c == KeyEvent.VK_LEFT){
            frog.moveFrogLeft(25);
            //frog.translate(-25,0);
        }

        if(c == KeyEvent.VK_RIGHT){
            frog.moveFrogRight(25);
            //frog.translate(25,0);
        }

        if(c == KeyEvent.VK_UP){
            frog.moveFrogUp(25);
            //frog.translate(0,-25);
        }

        if(c == KeyEvent.VK_DOWN){
            frog.moveFrogDown(25);
            //frog.translate(0,25);
        }
        repaint();
     }

     @Override
     public void keyReleased(KeyEvent ke) {
     } 
 }

///////////////////////

import java.awt.Polygon;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class Frog extends Polygon {

    private Integer[] xcoord;
    private Integer[] ycoord;

    public Frog(){

        xcoord = new Integer[] {5,10,10,15,15,20,
            20,30,30,35,35,40,40,
            45,45,40,40,30,30,40,
            40,45,45,40,40,35,35,
            30,30,20,20,15,15,10,
            10,5,5,10,10,20,20,
            10,10,5,5};

        ycoord = new Integer[] {10,10,5,5,20,20,
            10,10,20,20,5,5,10,10,
            15,15,25,25,30,30,35,35,
            40,40,45,45,35,35,40,40,
            35,35,45,45,40,40,35,35,
            30,30,25,25,15,15,10};

        for(int i = 0; i < xcoord.length; i++){
            this.addPoint(xcoord[i],ycoord[i]);
        }
    }

    public void moveFrogLeft(int x) {
        if(xcoord[0] - x < 0){
            //do nothing
        } else {
            for(int i = 0; i < xcoord.length; i++){
                xcoord[i] = xcoord[i] - x;
            }
        }
    }

    public void moveFrogRight(int x){
        if(xcoord[0] + x > 600){
            //do nothing
        } else {
            for(int i = 0; i < xcoord.length; i++){
                xcoord[i] = xcoord[i] + x;
            }
        }
    }

    public void moveFrogUp(int y){
        if(ycoord[0] - y < 0){
            //do nothing
        } else {
            for(int i = 0; i < ycoord.length; i++){
                ycoord[i] = ycoord[i] - y;
            }
        }
    }

    public void moveFrogDown(int y){
        if(ycoord[0] + y > 600){
            //do nothing
        } else {
            for(int i = 0; i < ycoord.length; i++){
                ycoord[i] = ycoord[i] + y;
            }
        }
    }
}

解决方法:

这段代码有一个简单的问题:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;        

    frog = new Frog();// <-- !!!!!

    // Frog graphics
    g2.setColor(Color.BLACK);
    g2.drawPolygon(frog);
    g2.setColor(new Color(0,150,15));
    g2.fillPolygon(frog);
}

每次青蛙被涂上时,标记的线都会用新的实例覆盖青蛙,从而将其重置到原始点.除了明显的问题,这是意外行为的原因,永远不要在paintComponent(…) – 方法中做任何不必要的计算.任何预计算,对象生成等都应该在paintComponent之外完成!

标签:keylistener,java,polygon,swing
来源: https://codeday.me/bug/20191003/1848401.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有