原文地址:http://bbs.mhhf.net/showtopic-361091.html
08年的文章,看来比别人晚入门很久,需要继续努力
为了完美处理玩家可能的多按键输入(比如按了3个甚至4个方向键),试了几个方法效果都不好,花了不少时间。最后还是决定先用数组缓存玩家的按键,然后再响应。 先介绍下逻辑。判断方向的基本原则:每当用户按下一个方向键,就把它的keyCode存进数组(数组里不可以有重复);每当一个方向键弹起,则把keyCode从数组里清除。若数组里只有一个键,那就是轴方向运动;两个键,两种情况:如果是复合键,就是斜方向运动;如果是一个A一个D这样一组相反键,则只响应先按的那个,物体只做轴方向运动。三个或四个键只响应数组里最先按的那一组复合键,做斜方向运动。 使用数组的好处在于可以处理复杂的多按键情况(无论是玩家有意乱按还是无意多按的),大大提高手感。例如这样一组输入:先后按下A、W、D再释放A,之后按下S并释放W、D。玩家最可能的意图是,先左上走,然后改为右上,最后改为下。这样的按键手感方便但是就造成一般的if...else判断方法很难响应。因为Flash里始终只不断给出最后一个键按下的消息,新的按键消息会不断把以前的按键消息“冲”掉。而且同时按3个或4个键在if...else里判断很麻烦,即使建立了类似AisDown这样的变量来追踪以前的按键。而使用有序且不重复的数组则可以解决这些问题。 逻辑完成了,就开始动手了。这里以ASDW为例。ASDW的keyCode分别为65、83、68、87。比较巧的是,代表x轴的keyCode都是6x,代表y轴的都是8x,这个在后面的判断有用。复合按键代表的斜方向可以由两键keyCode相加得到。由此代表8个方向的数值如下图: 画一个在8个方向都有若干帧运动动画的MC,将每个方向的第一帧设置标签名“D方向数”(如向右下方运动的帧标签为“D151”),再在每个方向的最后一帧写上gotoAndPlay(“D方向数”),好让在该方向的运动动画连续播放。如下图: 画完之后把这个MC链接好,让AS可以使用。我给它导出的类名为Dir。这样动画的准备工作就做好了。开个AS文件定义Dir。为它加两个成员dirx和diry,再给它加一个ENTER_FRAME的侦听函数,让Dir在每一帧进入的时候在x和y轴方向都分别以dirx和diry递增。 新建一个类来专门负责侦听方向键。我这个类目前叫dirSemiFinal2,有四个成员:man、dirArr、step和cur。man是Dir类的一个实例,是舞台上走的小人(目前是箭头);dirArr是存放按键的数组;step和cur是步长和小人的当前运动方向。 函数onDirEvent负责侦听ASDW四个键。若是有键按下了,先检查数组里有没有存,存过了就什么都不做,直接返回;没有就存进去。有键弹起了,就从数组清除。数组若是被存取了,则调用setDir函数来分析存取后的数组,判断是否需要更改小人的运动方向。 原则很简单:只响应数组里最先按的那一个键或那一组复合键。这样是不是只需要判断数组里的第一个键或找出第一组复合键的方向,并让小人在该方向运动就行了呢?差不多是的,只是还有一个小麻烦。 要更改小人的运动状态有两个工作要做:一是改动它的dirx和diry,让它真正动起来,这个没问题。二是调用对应的gotoAndPlay(“D方向数”),让小人播放在该方向上走的动画。这样问题就来了:如果存取后的数组表示的运动方向和之前一样(例如按了A再按D,或按了AWD释放D),函数就不应该再调用gotoAndPlay()了,否则会造成小人的行走动画还没放完就又从头开始放了。所以实际写代码的时候除了找出当前小人应有的运动方向,还要再验证一下小人是不是已经在这个方向上运动了,如果是的话,直接返回就行了。 另外还有一个地方要注意:小人停止运动后的指向也需要支持8方向。这需要用到Timer类。当玩家释放第二按键之后开始计时,人物先暂时维持在斜方向运动。若在一定时间内将第一按键也释放了,则视为两键同时释放,人物停留在斜方向。若时间到达之后第一按键没有释放,则视为玩家改斜向为直向运动,人物开始轴向运动。目前暂定这个延迟时间为50ms。短了手感不好;长了斜转直反应慢,画面流畅性和手感亦大降。 详细的setDir函数代码比较复杂比较长,这里就不螯述了,有需要的朋友可以读读,注释都写得很明白了。^-^
|
分享到:
相关推荐
在AS3(ActionScript 3)中实现“八方行走”功能是游戏开发中的一个基本概念,特别是2D角色扮演游戏或者模拟类游戏。这个功能允许玩家控制的角色可以在八个不同的方向上移动,即上、下、左、右以及四个对角线方向。...
`Direction`类在此示例中扮演了重要的角色,主要用于处理用户输入的方向,并通过触发事件来控制坦克的移动及炮塔的旋转等操作。具体而言: 1. **创建方向对象**: - `var dirTank:Direction = new Direction(stage...
《Rpg游戏引擎(全)带横版演示》是一款基于Flash Builder 4.6开发环境构建的角色扮演游戏(RPG)引擎,集成了完整的横版游戏展示功能。该资源旨在为开发者提供一个强大的工具,帮助他们快速创建具有横版场景的游戏...
在本文中,我们将深入探讨如何使用ActionScript 3(AS3)实现ARPG(动作角色扮演游戏)中的角色移动。ActionScript 3是Flash Professional中用于创建动态内容的主要编程语言,尤其适用于开发2D游戏和交互式应用程序...
在游戏开发中,A*寻路算法常用于控制角色或单位自动寻找目标的路径,例如在策略游戏中控制军队移动、在沙盒游戏中让NPC智能寻路。同时,A*算法也可应用于其他领域,比如网络路由优化、物流配送路径规划等。 总结来...
通过阅读和分析这些代码,我们可以更深入地理解如何用AS实现真实的物理模拟。 总的来说,"AS模拟小球的斜面碰撞"涉及到物理原理的应用、向量运算、反三角函数的运用以及优化碰撞处理以避免不必要的振荡。这不仅要求...
Math类在AS中扮演着关键角色,它提供了一系列预定义的数学函数和常量,使得开发者能够轻松地处理复杂的数学运算,从而实现动态、交互式且视觉效果丰富的动画和游戏。对于初学者而言,掌握Math类的基础知识不仅是学习...
这种视角在许多经典的角色扮演游戏(RPG)中被广泛采用,如《塞尔达传说》和《最终幻想》系列。实现这样的地图通常需要考虑以下几个关键点: 1. **坐标系统转换**:在2D游戏中,我们通常使用笛卡尔坐标系,其中x轴...
几何结构在图形编程中扮演着关键角色,本章探讨了如何在AS3中处理点、矩形和矩阵。 - **几何结构基础知识**:提供几何学的基本概念,包括点、线、矩形和变换矩阵。 - **使用Point对象**:介绍`Point`类的使用,以及...
在游戏编程中,2D向量扮演着重要角色: 1. **位置和运动**:游戏对象的位置通常由2D向量表示,通过更新这些向量,可以模拟物体的移动。 2. **碰撞检测**:通过比较两个向量的相对位置和大小,可以判断游戏对象是否...
粒子特效在现代的数字艺术和游戏开发中扮演着重要的角色,它能够创建出动态、丰富的视觉效果,如火焰、烟雾、水流等。今天我们将深入探讨一个名为“Perlin Pixels”的粒子特效,通过分析其源码和工具,了解如何在...
这个工具在游戏开发过程中扮演着至关重要的角色,确保团队成员能够协同工作,高效地追踪和更新项目资源,避免版本冲突和数据丢失。在"unity_asset_server-2.0.1"这个压缩包中,包含的主要文件是"unityassetserver2-0...
通过对PS One主板上关键芯片的详细分析,我们可以看到这些芯片各自扮演着不同的角色,共同支撑起了这款经典游戏机的强大功能。从声音处理到图像渲染,再到系统管理与存储,每一个环节都离不开精密设计与高性能芯片的...
《演员-关键方法:从论文到代码》 在人工智能领域,强化学习(Reinforcement Learning, RL)是一种让智能体...通过不断迭代和优化,Actor-Critic方法在游戏控制、机器人控制、自然语言处理等多个领域都有广泛的应用。