`
乱世群英
  • 浏览: 18724 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java 游戏编程 (七)

阅读更多
现在开始配置键盘
既然要配置键盘,就要使用到swing组件。比如按钮JButton b = new JButton("确定");
在swing绘制组件时,swing会在AWT事件派生线程中进行所有的绘制工作,当组件改变外观时,组件会调用repaint方法请求重画。按下按钮,动画循环中的下次绘图会改变外观。解决这个问题,就要捕获重画请求,并将其忽略。重画请求是发送到RepaintManager对象,我们可以开发一个类NoRepaintManager覆盖原功能。
package com.jsheng.game.util;

import javax.swing.RepaintManager;
import javax.swing.JComponent;

/** function:
 * company: jsheng
 * @author wanghn      wanghaining9999@sina.com
 */
public class NoRepaintManager extends RepaintManager {

    public static void install() {
        RepaintManager repaintManager = new NoRepaintManager();
        repaintManager.setDoubleBufferingEnabled(false);
        RepaintManager.setCurrentManager(repaintManager);
    }

    public void addInvalidComponent(JComponent c) {
    }

    public void addDirtyRegion(JComponent c, int x, int y,
        int w, int h)
    {
    }

    public void markCompletelyDirty(JComponent c) {
    }

    public void paintDirtyRegions() {
    }

}


创建可以配置键盘的测试
package com.jsheng.game.test1;
import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;

import com.jsheng.game.util.GameAction;
import com.jsheng.game.util.InputManager;
import com.jsheng.game.util.NoRepaintManager;

/** function:
 * company: jsheng
 * @author wanghn      wanghaining9999@sina.com
 */
public class KeyConfigTest extends InputManagerTest 
implements ActionListener{

    protected GameAction config;

    private JButton playButton;
    private JButton configButton;
    private JButton quitButton;
    private JButton pauseButton;
    private JPanel playButtonSpace;
    public static void main(String[] args) {
        new KeyConfigTest().run();
    }

    private static final String message ="键盘配置";

    private JPanel dialog;
    private JButton okButton;
    private List inputs;

    public void init() {
    	super.init();
    	NoRepaintManager.install();
    	config = new GameAction("config");
    	
    	quitButton = createButton("quit", "退出");
        playButton = createButton("play", "继续");
        pauseButton = createButton("pause", "暂停");
        configButton = createButton("config", "配置");
        playButtonSpace = new JPanel();
        playButtonSpace.setOpaque(false);
        playButtonSpace.add(pauseButton);

        JFrame frame = super.screen.getFullScreenWindow();
        Container contentPane = frame.getContentPane();

        if (contentPane instanceof JComponent) {
            ((JComponent)contentPane).setOpaque(false);
        }

        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));
        contentPane.add(playButtonSpace);
        contentPane.add(configButton);
        contentPane.add(quitButton);
        inputs = new ArrayList();

        JPanel configPanel = new JPanel(new GridLayout(5,2,2,2));
        addActionConfig(configPanel, moveLeft);
        addActionConfig(configPanel, moveRight);
        addActionConfig(configPanel, jump);
        addActionConfig(configPanel, pause);
        addActionConfig(configPanel, exit);

        // 创建按钮
        JPanel bottomPanel = new JPanel(new FlowLayout());
        okButton = new JButton("OK");
        okButton.setFocusable(false);
        okButton.addActionListener(this);
        bottomPanel.add(okButton);

        JPanel topPanel = new JPanel(new FlowLayout());
        topPanel.add(new JLabel(message));

        Border border =
            BorderFactory.createLineBorder(Color.black);

        dialog = new JPanel(new BorderLayout());
        dialog.add(topPanel, BorderLayout.NORTH);
        dialog.add(configPanel, BorderLayout.CENTER);
        dialog.add(bottomPanel, BorderLayout.SOUTH);
        dialog.setBorder(border);
        dialog.setVisible(false);
        dialog.setSize(dialog.getPreferredSize());

        dialog.setLocation(
            (screen.getWidth() - dialog.getWidth()) / 2,
            (screen.getHeight() - dialog.getHeight()) / 2);
        
        screen.getFullScreenWindow().getLayeredPane().add(dialog,
            JLayeredPane.MODAL_LAYER);
    }

    private void addActionConfig(JPanel configPanel,
        GameAction action)
    {
        JLabel label = new JLabel(action.getName(), JLabel.RIGHT);
        InputComponent input = new InputComponent(action);
        configPanel.add(label);
        configPanel.add(input);
        inputs.add(input);
    }

    public void setPaused(boolean p) {
        super.setPaused(p);
        playButtonSpace.removeAll();
        if (isPaused()) {
            playButtonSpace.add(playButton);
        }
        else {
            playButtonSpace.add(pauseButton);
        }
    }
    public void draw(Graphics2D g) {
        super.draw(g);
        JFrame frame = super.screen.getFullScreenWindow();

        frame.getLayeredPane().paintComponents(g);
    }
    public void actionPerformed(ActionEvent e) {
    	if(e.getSource() == okButton){
    		config.tap();
    		return;
    	}
        Object src = e.getSource();
        if (src == quitButton) {
            super.exit.tap();
        }
        else if (src == configButton) {
            config.tap();
        }
        else if (src == playButton || src == pauseButton) {
            super.pause.tap();
        }
    }


    public void checkSystemInput() {
        super.checkSystemInput();
        if (config.isPressed()) {
            // hide or show the config dialog
            boolean show = !dialog.isVisible();
            dialog.setVisible(show);
            setPaused(show);
        }
    }


    private void resetInputs() {
        for (int i=0; i<inputs.size(); i++) {
            ((InputComponent)inputs.get(i)).setText();
        }
    }


    public JButton createButton(String name, String toolTip) {

       
        String imagePath = "images/menu/" + name + ".png";
        ImageIcon iconRollover = new ImageIcon(imagePath);
        int w = iconRollover.getIconWidth();
        int h = iconRollover.getIconHeight();

        Cursor cursor =
            Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);

        Image image = screen.createCompatibleImage(w, h,
            Transparency.TRANSLUCENT);
        Graphics2D g = (Graphics2D)image.getGraphics();
        Composite alpha = AlphaComposite.getInstance(
            AlphaComposite.SRC_OVER, .5f);
        g.setComposite(alpha);
        g.drawImage(iconRollover.getImage(), 0, 0, null);
        g.dispose();
        ImageIcon iconDefault = new ImageIcon(image);

        image = screen.createCompatibleImage(w, h,
            Transparency.TRANSLUCENT);
        g = (Graphics2D)image.getGraphics();
        g.drawImage(iconRollover.getImage(), 2, 2, null);
        g.dispose();
        ImageIcon iconPressed = new ImageIcon(image);

        JButton button = new JButton();
        button.addActionListener(this);
        button.setIgnoreRepaint(true);
        button.setFocusable(false);
        button.setToolTipText(toolTip);
        button.setBorder(null);
        button.setContentAreaFilled(false);
        button.setCursor(cursor);
        button.setIcon(iconDefault);
        button.setRolloverIcon(iconRollover);
        button.setPressedIcon(iconPressed);

        return button;
    }
    class InputComponent extends JTextField  {

		private static final long serialVersionUID = 1L;
		private GameAction action;

        public InputComponent(GameAction action) {
            this.action = action;
            setText();
            enableEvents(KeyEvent.KEY_EVENT_MASK |
                MouseEvent.MOUSE_EVENT_MASK |
                MouseEvent.MOUSE_MOTION_EVENT_MASK |
                MouseEvent.MOUSE_WHEEL_EVENT_MASK);
        }

        private void setText() {
            String text = "";
            List list = inputManager.getMaps(action);
            if (list.size() > 0) {
                for (int i=0; i<list.size(); i++) {
                    text+=(String)list.get(i) + ", ";
                }
                text = text.substring(0, text.length() - 2);
            }

            synchronized (getTreeLock()) {
                setText(text);
            }

        }


        private void mapGameAction(int code, boolean isMouseMap) {
            if (inputManager.getMaps(action).size() >= 3) {
                inputManager.clearMap(action);
            }
            if (isMouseMap) {
                inputManager.mapToMouse(action, code);
            }
            else {
                inputManager.mapToKey(action, code);
            }
            resetInputs();
            screen.getFullScreenWindow().requestFocus();
        }

        protected void processKeyEvent(KeyEvent e) {
            if (e.getID() == e.KEY_PRESSED) {
                if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE &&
                    inputManager.getMaps(action).size() > 0)
                {
                    inputManager.clearMap(action);
                    setText("");
                    screen.getFullScreenWindow().requestFocus();
                }
                else {
                    mapGameAction(e.getKeyCode(), false);
                }
            }
            e.consume();
        }

        protected void processMouseEvent(MouseEvent e) {
            if (e.getID() == e.MOUSE_PRESSED) {
                if (hasFocus()) {
                    int code = InputManager.getMouseButtonCode(e);
                    mapGameAction(code, true);
                }
                else {
                    requestFocus();
                }
            }
            e.consume();
        }


        protected void processMouseMotionEvent(MouseEvent e) {
            e.consume();
        }

        protected void processMouseWheelEvent(MouseWheelEvent e) {
            if (hasFocus()) {
                int code = InputManager.MOUSE_WHEEL_DOWN;
                if (e.getWheelRotation() < 0) {
                    code = InputManager.MOUSE_WHEEL_UP;
                }
                mapGameAction(code, true);
            }
            e.consume();
        }
    }
}

如果有看不懂的参考以前的篇章。
分享到:
评论

相关推荐

    JAVA游戏编程

    JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门

    游戏编程游戏编程java游戏编程java

    总的来说,Java游戏编程涵盖了广泛的编程知识,从基础到高级,从理论到实践,都需要深入理解和掌握。通过不断的学习和实践,开发者可以利用Java创造出丰富多样的游戏世界。在"JavaGames"这个压缩包中,可能包含了...

    Java游戏编程(游戏开发与编程序列).rar

    Java游戏编程是软件开发领域中的一个分支,它利用Java编程语言来创建各种类型的游戏,从简单的2D小游戏到复杂的3D大作。本资源“Java游戏编程(游戏开发与编程序列).rar”可能包含一系列教程、源代码示例或者相关...

    Java游戏编程原理与实践教程+随书原代码

    Java游戏编程原理与实践教程是一本深入探讨如何使用Java语言进行游戏开发的专业书籍。它涵盖了游戏编程的基础概念、核心技术以及实战技巧,旨在帮助读者从零基础到熟练掌握Java游戏开发。书中结合了大量的实例和源...

    《Java 2游戏编程》

    《Java 2游戏编程》是一本专为游戏开发爱好者和专业人士设计的教程,由美国作者Thomas Petchel撰写,并由晏利斌、孙淑敏、邵荣等人翻译成中文。这本书深入浅出地介绍了如何使用Java 2平台进行游戏开发,涵盖了从基础...

    java游戏编程导学

    Java游戏编程导学 在Java游戏开发领域,Java以其跨平台、高效稳定的特点,成为许多开发者的选择。本导学将深入探讨如何利用Java语言来创建引人入胜的游戏。Java游戏编程不仅涉及到基本的编程概念,还涵盖了图形渲染...

    Java游戏编程原理与实践教程源码

    Java游戏编程原理与实践是计算机科学中的一个重要领域,它结合了Java编程语言的特性与游戏设计的技巧。在这个教程源码包中,包含了多种经典游戏的实现,如推箱子、俄罗斯方块、超级玛丽等,这些都是游戏开发初学者和...

    java游戏编程原理与实践教程pdf+源代码

    Java游戏编程原理与实践教程是一本深入探讨如何使用Java语言进行游戏开发的专业书籍,由陈锐、夏敏捷、葛丽萍三位专家共同编著。这本书不仅涵盖了基础的编程概念,还详细介绍了游戏开发中的关键技术和实战技巧。通过...

    JAVA游戏编程.

    在JAVA游戏编程的世界里,开发者可以利用JAVA的强大功能和丰富的库来创造引人入胜的游戏体验。本课程资料集合了从基础知识到高级技术的全面学习路径,帮助你深入理解JAVA在游戏开发中的应用。 首先,从第二章的...

    Java游戏编程读书笔记

    在深入探讨Java游戏编程的世界之前,我们先要理解Java作为一种编程语言的基础特性。Java是由Sun Microsystems(现为Oracle公司)于1995年推出的,它是一种面向对象、跨平台的语言,具有“一次编写,到处运行”的特性...

    Java游戏编程入门

    想学JAVA游戏编程吗?快来了解下吧!这个资源是Java初学者的极品教程,讲的简单透彻。

    Java游戏编程

    Java游戏编程是一个涵盖广泛的主题,它涉及到使用Java编程语言来创建各种类型的游戏,从简单的2D小游戏到复杂的3D大作。在这个领域中,开发者需要掌握基础的编程概念,以及特定于游戏开发的技术。 首先,Java是一种...

    java游戏编程光盘源代码

    java游戏编程光盘源代码!~

    Java游戏编程源码教程

    Java游戏编程源码教程是一门深入浅出的学习资源,适合对Java编程有兴趣并希望进入游戏开发领域的初学者。本教程通过实例源码讲解,旨在帮助读者掌握Java在游戏开发中的应用,逐步提升编程技巧和游戏设计能力。 首先...

    Java游戏编程开发教程

    Java游戏编程开发教程是针对那些想要利用Java语言创建游戏的开发者设计的一套全面学习资源。Java作为一种跨平台、面向对象的编程语言,因其强大的性能和灵活性,在游戏开发领域有着广泛的应用。本教程将深入探讨如何...

    JAVA游戏编程源代码

    以下将详细介绍与"JAVA游戏编程源代码"相关的技术要点。 1. **Java基础知识**:Java是面向对象的语言,理解类、对象、封装、继承和多态等核心概念至关重要。同时,熟悉Java语法,如控制流(if-else,switch,循环)...

    《Java游戏编程》源代码

    在百科里搜索“Java游戏编程” (http://baike.baidu.com/view/647813.htm),就能发现一部好书——《Java游戏编程》,是深入学习java可望而不可求(难买)的好书

    Java游戏编程小手册

    "Java游戏编程小手册" 本资源是一个Java游戏编程的小手册,涵盖了Java游戏开发的基本概念、技术和框架。下面是从该资源中提炼出的知识点: 一、Java游戏开发概述 Java游戏开发是使用Java语言创建游戏的过程。...

    Java 游戏编程入门

    在《Java游戏编程入门》这本书中,作者向我们揭示了使用Java语言开发游戏的基本概念和技术。这是一本适合初学者的教程,旨在帮助那些对编程和游戏开发感兴趣的人快速掌握必要的技能。书中不仅包含了Java语言的基础...

    Java2游戏编程.pdf

    本书的出版标志着Java游戏编程技术的深入探索和应用,是对游戏开发人员和爱好者来说一本非常实用的参考书籍。 从书的内容来看,涵盖了Java游戏编程的众多方面,主要包括以下几点: 1. Java 2D游戏编程基础:书中从...

Global site tag (gtag.js) - Google Analytics