Java版SLG游戏开发入门[0]--让绘制的窗口响应鼠标事件

  什么是SLG呢?也就是Simulation Game的缩写,即模拟策略游戏。

  以我这种准骨灰级玩家的视点来看(鄙人88年开始玩FC,时年6岁),早期的SLG游戏,大体只是《三国志》(I由1985年开始发售)这类发布指令扩充军备并战斗的“命令下达式游戏”,并没有什么分类上的难度。但自从《火焰纹章》(1990年开始发售)出现伊始,即策略游戏与传统RPG的分野变得模糊起来,这种具有故事情节的战棋策略游戏,同时兼具了SLG及RPG的双特性,以后的岁月中人们习惯分类其为——SRPG,火焰系列也据此被后人视作SRPG的鼻祖游戏之一。但事实上讲,此类游戏仍旧具备着传统SLG那样如同下棋般战斗并采用回合制的特点,RPG的情节部分仅仅是作为游戏内容的补充罢了,始终摆脱不掉传统策略游戏地图-〉指令-〉战斗的大框架,故此客观上依然应被划入了SLG范围。再后来,随着电脑的普及,如大众软件这些媒体杂志又把文明和模拟城市乃至美少女梦工厂这样的游戏也划分进SLG里,但按照现在的说法,足球经理、模拟人生应该是“SIM”,即单纯的Simulation,而美少女梦工厂则是TCG——不过在日式游戏划分中,这些依然都属于SLG。

  就鄙人看来,强分策略类游戏类型是没有什么意义的,作为最初源泉的SLG是能够包含SRPG、RTS种种分支的。就好比有的人是博士、有的人是硕士,但我们依旧可以将其统称为“知识分子”,划到一个大圈子里面去。又比如我们平时可能常说“上海人怎样”、“北京人如何”,但当我说“中国人”时,自然能够将这些都包罗其中,无论好坏,谁都脱身不得。 而在此类游戏中,包含策略因素的这个大圈子的统一称谓,便是SLG无疑。

  实际上,绝大多数英文站点也是将此类游戏统一丢到Simulation Game下的(包括模拟城市之类的纯SIM),并没有进行SRPG(Strategies Role Play Games)或RTS(Real-Time Strategy Game)乃至其余种种的细分。归根究底,因为这些游戏近似的因素太多,在大多数时候已经难以区分其本来面貌,“名无实,实无名”,只能一概而论了。而今有不少新生代玩家喜欢硬分游戏种类,窃以为愚了。

——————————————————————————————————————————————————————————

  闲话说了不少,现在开始进入正题。在本系列中,我将结合实例尝试以Java实现典型战棋类SLG的主要功能,本文为第0节,也就是准备章节。

  看过我以前写的RPG及ACT系列的朋友们,应该已对Java中2D图形绘制功能有了初步的认识,在本文中,我将阐述如何令绘制的窗体而非组件响应鼠标事件,及如何在窗体中自定义非标准大小的鼠标指针,作为本系列的预备知识。

  首先,我们都知道,在Java中可以通过Cursor组件自定义游标样式,比如下图有一组取材自Langrisser2的光标图片。

 

  在Java桌面开发中,我们可以通过分解这组图片来得到小图,以此来自定义鼠标光标。
 
  但是有一个问题,这时无论图片原始大小如何,至多也只能是32x32大小,如果超出这个范围,则无法作为游标在窗体中完整显示。

  也就是说,如上图这样46x46的大图,要么缩小显示,要么局部显示,总之46x46的状态下是无法完整的显示在窗体中的。

  可我们明明见到很多游戏中的光标是不规则不成比例的,究竟如何做到呢?其实很简单,自己绘制就好了。

  绝大多数不合规矩的东西,我们都可以自己把它“画出来”,只要能确定它的坐标。

  如下代码记录了键盘及鼠标状态下的图标移动:
  1. /**
  2.      * 键盘事件设置
  3.      * 
  4.      */
  5.     public void setKeyset() {
  6.         addKeyListener(new KeyAdapter() {
  7.             public void keyTyped(KeyEvent e) {
  8.             }
  9.             public void keyReleased(KeyEvent e) {
  10.             }
  11.             public void keyPressed(KeyEvent e) {
  12.                 if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
  13.                     currentX = currentX + move;
  14.                 }
  15.                 if (e.getKeyCode() == KeyEvent.VK_LEFT) {
  16.                     currentX = currentX - move;
  17.                 }
  18.                 if (e.getKeyCode() == KeyEvent.VK_UP) {
  19.                     currentY = currentY - move;
  20.                 }
  21.                 if (e.getKeyCode() == KeyEvent.VK_DOWN) {
  22.                     currentY = currentY + move;
  23.                 }
  24.                 repaint();
  25.             }
  26.         });
  27.     }
  28.     /**
  29.      * 鼠标事件设置
  30.      * 
  31.      */
  32.     public void setMouse() {
  33.         addMouseListener(new MouseAdapter() {
  34.             public void mousePressed(MouseEvent e) {
  35.             }
  36.             public void mouseReleased(MouseEvent e) {
  37.             }
  38.         });
  39.         addMouseMotionListener(
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值