如何让游戏角色移动

时间:2015-05-25 17:40:58

标签: java swing jpanel actionlistener key-bindings

我需要能够使用KeyListener和KeyBinding移动鸡的图像。我无法弄清楚如何让角色移动(鸡),我需要能够让他绕着框架移动。可以通过在我的代码中使用图像或将其转换为swing组件来完成。

这是我的代码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class primary extends JFrame {
    public primary(){

        //Creates Title Image 
        JLabel title = new JLabel(" ");
        ImageIcon tl = new ImageIcon("title.gif");
        title.setIcon(tl);

        //Creates Start Image
        final JButton start = new JButton("");
        ImageIcon st = new ImageIcon("start.gif");
        start.setIcon(st);

        //Creates Options Image
        JButton options = new JButton("");
        ImageIcon opt = new ImageIcon("options.gif");
        options.setIcon(opt);
        options.setBackground(Color.BLACK);

        //Create first frame for "Start" button
        final JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(1, 1));
        p1.add(start, BorderLayout.CENTER);

        //Create second panel for title label
        final JPanel p2 = new JPanel(new BorderLayout());
        p2.setLayout(new GridLayout(1, 3));
        p2.add(title, BorderLayout.WEST);

        //Create third panel for "Options" button
        final JPanel p3 = new JPanel(new BorderLayout());
        p3.setLayout(new GridLayout(1, 1));
        p3.add(options, BorderLayout.SOUTH);

        //Creates fourth panel to organize all other primary
        final JPanel p4 = new JPanel(new BorderLayout());
        p4.setLayout(new GridLayout(1, 3));
        p4.add(p1, BorderLayout.WEST);
        p4.add(p2, BorderLayout.CENTER);
        p4.add(p3, BorderLayout.EAST);


        //When button is clicked, it changes the level
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(start.isEnabled()) {
                    remove(p4);
                    setSize(1440, 500);
                    add(new ContentPanel1());
                    validate();
                }
                else {
                    return;
                }
            }
        });

        //Adds fourth panel to frame
        add(p4, BorderLayout.CENTER);
    }

    public static void main(String arg[]) {
        primary frame = new primary();

        //Finds screen size of monitor
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        //Creates the frame
        frame.setTitle("Cockadoodle Duty: Awakening");
        frame.setSize(screenSize);
        frame.setLocale(null); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        String background = "#000000";
        frame.setBackground(Color.decode(background));
    }
}

class coordinate {
    public static int x;
    public static int y;
}

class ContentPanel1 extends JPanel{
    Image back = Toolkit.getDefaultToolkit().getImage("back.gif");
    Image chick = Toolkit.getDefaultToolkit().getImage("chicken.gif");
    Image corn = Toolkit.getDefaultToolkit().getImage("corn.gif");

    ContentPanel1() {
        MediaTracker mt = new MediaTracker(this);

        mt.addImage(back, 0);
        try {
            mt.waitForAll();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    protected void paintComponent(Graphics g){
        coordinate.x = 20;
        coordinate.y = 321;
        super.paintComponent(g);
        int imwidth = back.getWidth(null);
        int imheight = back.getHeight(null);
        g.drawImage(back, 1, 1, null);
        g.drawImage(chick, coordinate.x, coordinate.y, null);
        g.drawImage(corn, 700, 337, null);
    }
}

1 个答案:

答案 0 :(得分:2)

  1. 您正在对paintComponent方法中的coordinate.x和coordinate.y值进行硬编码,这样做会使鸡无法移动。
  2. 我自己,我不会创建一个静态值的Coordinate类,因为它没什么用处。相反,为什么不给ContentPanel1类一个private Point chickenLocation字段。
  3. 我没有看到你的代码尝试在任何地方使用密钥绑定,如果没有这种尝试,我们很难知道你可能做错了什么。如果您还没有这样做,请阅读Key Binding tutorial并首先试着试一试。当然,我们可以为您提供代码,但这会让您失去自己创造它的极其宝贵的经验。
  4. 我会给你一些提示 -
    • 我会将键绑定到正在进行绘图的JPanel。
    • 此组件有三个InputMaps,我使用与JComponent.WHEN_IN_FOCUSED_WINDOW条件关联的那个。这样,JPanel就不需要专注于绑定工作。
    • 您可以在此网站上找到许多使用键绑定进行简单动画的示例,其中许多是我的。例如,请查看this Stackoverflow search link
  5. 如果您仍然需要帮助,请向我们展示您的代码尝试以及您的具体问题。