公开区 Blog论坛 Blog搜索 Blog首页 北邮人论坛
Welcome to sanyao's Blog
   惠风荡繁囿,白云屯曾阿,景昃鸣禽集,水木湛清华
>> 日历
>> 最近更新文章

更多     

>> 栏目分类
>> 每月档案
>> 最近收到的评论
Blog搜索
登录
用户名:
密  码:
>> 友情链接
>> 最近收到的引用通告
    >> 访问人数
    193788
    达则兼济天下 穷则独善吾身
    XML Klip Folio
    2007-11-07[评论] [写信问候]
    3.7 设计直观的用户界面 

    3.7 设计直观的用户界面

    现在让我们转到一些在所有游戏中都有的东西:用户界面。用户界面不只是说按什么键会让主角移动,它还包括开放的菜单、屏幕设置以及在游戏中的按钮。

    设计一个实用的、直观的、吸引人的用户界面是游戏开发中非常重要的一个方面。缺乏用户界面的游戏没有可玩性。

    3.7.1 用户界面设计技巧

    当你为你的游戏设计用户界面的时候,基本的规则是让它简洁,含义清楚,反应要灵敏。下面是一些技巧:

    ·         保持用户界面简洁整齐。并不是所有的选项都要一次性呈现给玩家。相反,你要将最常用或最有用的选项放在主画面,其他的通过一个简单的方法去访问。

    ·         确实每个选项或者按钮可以很容易被找到。如果需要按很多次才可以找到一个特定的功能的话,用户会觉得非常烦琐。

    ·         使用工具提示。工具提示是当你的鼠标停留在一个特定对象上时弹出的描述性语言。它们可以告诉你这个按钮是干什么的或者其他用户界面的作用。工具提示可以快速解答“这个是干什么的?”这样的疑惑。Swing内置了工具提示,所以这个很容易实现。

    · ......

    >> 阅读全文

      sanyao 发布于 2007-11-07 15:32:24 | 浏览[914] | 评论[0] | 引用[0] Trackback Ping URL
    2007-09-23[评论] [写信问候]
    3.6 使用输入管理器 

    3.6 使用输入管理器

    为了测试InputManager,首先你要创建一个简单的游戏,然后你可以加入让用户自定义键盘的功能

    我们创建的第一个游戏能够让主角左右移动并且跳跃,另外还会加入暂停游戏的功能。它还不是一个真正的游戏,因为没有敌人和目标,但在向真正的游戏迈进。

    3.6.1 暂停游戏

    不论你信不信,玩家有时要临时地停止游戏去拿罐饮料或者上个厕所,然后回来时却要求在他离开的那个时刻接着玩。

    另外你也希望在游戏切换到主菜单的时候暂停游戏,除非你确实希望这时候游戏继续运行。

    所以,让我们加入暂停游戏的功能吧。但在游戏暂停时究竟发生了什么呢?简单来说两件事:游戏对象和动画不再更新,输入被忽略(当然不包括恢复游戏的那个键)。为了完成这个目的,你需要修改一下动画循环,只有当游戏没有被暂停时检测输入和升级游戏对象。例如:

    if (!paused) {
        checkInput();

    ......

    >> 阅读全文
      sanyao 发布于 2007-09-23 21:58:31 | 浏览[1127] | 评论[0] | 引用[0] Trackback Ping URL
    2007-09-08[评论] [写信问候]
    3.5 创建输入管理器 

    3.5 创建输入管理器

    你已经掌握了键盘和鼠标输入,现在让我们把他们结合起来创建一个输入管理器吧。但首先我们要指出前面代码中的一些缺陷,你需要在输入管理器中改善它们。

    有件事你可能已经注意到了,前面的例子里用的都是同步方法。另外所有的事件都是通过AWT事件调度线程来发送的,它不同于主线程。很显然,你不希望在绘制操作的过程中改变游戏的状态(例如改变精灵的位置),所以方法同步后就可以避免这种情况。

    然而为了将来的游戏考虑,你需要在游戏循环的特定环节处理所有的输入。当按键被按下时,你可以通过很简单地设置布尔值来完成,例如,当空格键被按下的时候,可以在keyPressed()方法中设置布尔值jumpIsPressed,在后续的游戏循环中你可以检查jumpIsPressed变量是否被设置,如果被设置了,则编写代码让主角跳跃

    另外,有一些行为,如跳跃,你只希望只在键被按下时响应;另一些行为,如移动,你希望按键可以被持续响应。对于跳跃,如果你只希望只在键被按下时响应,那么当你看到游戏循环中jumpIsPressed为真时就把它设成假。这样,只要玩家不再一次按键,主角就不会再次跳跃。

    但如果用户不想按空格键来跳跃而希望用Ctrl键呢?很简单,在现在的情况下,你只要跟他说:“不好意思,你只能按空格键。”

    OK,你可能很好心,想让用户可以自定义键盘。为了达到这个目的,你需要为一个键映射一个通用行为,在运行中让行为映射到不同的键。现在,让我们把希望InputManager类做的事情列出来

    下面是你希望InputManager做的所有事情:

    ?         处理所有的按键和鼠标事件,包括相对移动。

    ......

    >> 阅读全文

      sanyao 发布于 2007-09-08 22:50:44 | 浏览[1494] | 评论[1] | 引用[0] Trackback Ping URL
    2007-08-30[评论] [写信问候]
    3.4 鼠标视角样式的鼠标移动 

    3.4 鼠标视角样式的鼠标移动

    你如果曾经玩过第一人称射击游戏,如Quake III,你已经使用过鼠标视角特性了。鼠标视角特性通过移动鼠标来使你的玩家观察周围。例如,如果你向左移动鼠标,你的角色看向左边。这个特性很酷的地方在于你可以一直移动你的鼠标,而鼠标不会被屏幕所限制。你可以一直晃动鼠标直到把你自己也晃晕了,或者晃出了鼠标垫

    在上个例子中,你可以检测到鼠标在屏幕上的位置,但你移不远,因为鼠标会因碰到屏幕边缘而停下来。这个肯定不能在第一人称视角射击游戏中使用,因为你不可能限制玩家的视野。因此我们可以用检测鼠标的相对位移来替代检测绝对位移。那么如何才能做到呢?

    Java API并没有提供直接检测鼠标相对位移的方法,但是有很多技巧都可以达到你想要的目的。

    其实你只要确定鼠标永远不会碰到屏幕边缘即可达到这个目的。每次鼠标移动后,你只要把鼠标重置到屏幕中间即可。这样鼠标就永远不会碰到屏幕边缘,你就可以计算鼠标相对于前一个位置移动了多少。

    下面是工作过程的分解:

    1.    开始时鼠标在屏幕中间。

    2.    用户移动鼠标,你计算移动了的距离。

    3.    你发送事件重置鼠标到屏幕中间。

    4.    当你检测到鼠标被重置时,忽略这个事件。 ......

    >> 阅读全文

      sanyao 发布于 2007-08-30 23:03:27 | 浏览[1371] | 评论[0] | 引用[0] Trackback Ping URL
    2007-08-26[评论] [写信问候]
    3.3 鼠标输入 

    3.3 鼠标输入

    键盘其实就是上面有一堆按钮的板,但鼠标则是一个复杂得多的设备。它不仅有按钮(取决与鼠标的不同,可能有单键、双键、三键之分),还能移动,还可能有滚轮

    那就是说,你能接收到三种不同类型的鼠标事件:

    ?         鼠标键点击

    ?         鼠标移动

    ?         鼠标轮滚动

    鼠标键行为和键盘键类似,但没有键重复。鼠标移动被分解成屏幕坐标的xy。鼠标滚轮事件会告诉你滚轮滚动得有多块。

    每种鼠标事件类型都有它自己的接收者: MouseListenerMouseMotionListenerMouseWheelListener。每种接收者都以一个MouseEvent作为参数。

    KeyListener类似MouseListener接口有用于检测鼠标按下,释放和点击(按下
    ......

    >> 阅读全文

      sanyao 发布于 2007-08-26 22:52:44 | 浏览[1128] | 评论[0] | 引用[0] Trackback Ping URL
    2007-08-26[评论] [写信问候]
    3.2 键盘输入 

    3.2 键盘输入

    对于一个游戏,你需要使用到很多键,如使用方向键来移动,可能使用Control键来发射武器。我们不会去处理像文本输入这样的事情我们会在本章后面的Swing组件中讨论这些。

    为了捕获键码事件,你需要做两件事:创建一个KeyListener,注册这个接收者去接收事件。注册接收者时,只要在你希望接收其键码事件的组件上调用addKeyListener()即可。在这儿的游戏中,这个组件就是全屏窗口

    Window window = screen.getFullScreenWindow();
    window.addKeyListener(keyListener);

    为了创建一个KeyListener,你只需要创建一个实现KeyListener接口的对象。 KeyListener接口有三个方法:keyPressed()keyReleased()keyTyped()"typed"事件发生在按键第一次被按下的时候,然后以按键重复速率重复发生。从按键被"typed"接收事件对游戏来说确实是没有用处,所以我们只关注按键点击和释放<
    ......

    >> 阅读全文

      sanyao 发布于 2007-08-26 00:40:51 | 浏览[1277] | 评论[0] | 引用[0] Trackback Ping URL
    2007-08-20[评论] [写信问候]
    3.1 AWT事件模型 

    3.1 AWT事件模型

    和早前提到过的一样,AWT有自己的事件调度线程。这个线程调度来自操作系统的所有类型的事件,如鼠标点击、键盘敲击

    AWT将把这些事件调度到哪里去?当某个组件有事件发生时,AWT就检查是否有这个事件的接收者。接收者是一个从其他对象中接收事件的对象。事件就是这样被AWT事件调度线程调度出来的。

    每种类型的事件都有一种不同的接收者,例如对于键码输入事件就有一个KeyListener接口。

    下面是事件模型处理按键的例子:

    1.    用户按键。

    2.    操作系统发送键码事件给Java运行时刻。

    3.    Java运行时刻发送事件到AWT的事件队列。

    4.    AWT事件调度线程调度事件给任何KeyListener

    5. ......

    >> 阅读全文

      sanyao 发布于 2007-08-20 18:28:30 | 浏览[2032] | 评论[2] | 引用[0] Trackback Ping URL
    2007-08-20[评论] [写信问候]
    第三章 交互与用户接口 

    第三章 交互与用户接口

    主要内容

    ?         AWT事件模型

    ?         键盘输入

    ?         鼠标输入

    ?         鼠标视角样式的鼠标移动

    ?         创建输入管理器

    ?         使用输入管理器
    ......

    >> 阅读全文

      sanyao 发布于 2007-08-20 17:34:10 | 浏览[1244] | 评论[0] | 引用[0] Trackback Ping URL
    2007-08-18[评论] [写信问候]
    2.4 简单的成果 & 2.5 小结 

    2.4 简单的成果

    正如你想象的,现在可以很容易地加入多个精灵,只要创建更多的Sprite对象,记得更新绘制每一个就可以了,如:

    for (int i=0; i<sprites.length; i++) {
        sprites[i].update(elapsedTime);
        g.drawImage(sprites[i].getImage(),
            Math.round(sprite[i].getX()),
            Math.round(sprite[i].getY()),
            null);
    }

    一件需要注意的事是精灵更新它们各自的动画,所以精灵不能共享同一个Animation对象,要不然Animation对象会被更细过多次。如果你使用很多同样的动画,你可能需要往动画中添加clone()方法来使它们更容易复制。

    ......

    >> 阅读全文

      sanyao 发布于 2007-08-18 23:50:20 | 浏览[1168] | 评论[0] | 引用[0] Trackback Ping URL
    [ 1 2 3 ]

    Powered By SmthBBS
    Powered By SmthBBS

    更新时间: 2009-02-22 19:53:59   ©All Rights Reserved    http://sanyao.blog.byr.edu.cn