将鼠标悬停在 DPAD 上有时会使角色朝一个方向无限移动

2023-12-02

我的游戏中有一个 DPAD,当玩家按住左 DPAD 时,如果他将触摸移动到向上 DPAD 并让我们走,玩家会继续向左方向前进。

如果您按住 a 方向,则它也会起作用,假设向上继续按住,但移开向上 DPAD,有时您可能会继续朝该方向前进。

我试图防止这种情况发生:

  • 在方向点击时,触发器会检查您是否处于运动状态,或者 已经走向不同的方向
  • 设置碰撞来强制这些变量变为 false;又名, 你撞到了什么东西,inMotion = false,等等

这就是我能想到的关于如何解决这个问题的全部内容。

另外,我使用了很多变量进行检查,是否最好将我的函数更改为返回布尔值,或者这种方式可以吗?只是好奇。

游戏类

package 
{
    import flash.display.MovieClip;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    public class Game extends MovieClip
    {
        public var area1:Boolean = true;
        public var area2:Boolean = false;
        public var area3:Boolean = false;

        public var player1:Boolean = true;
        public var player2:Boolean = false;

        public var upWalkspeed:Number = -5;
        public var downWalkspeed:Number = 5;
        public var leftWalkspeed:Number = -5;
        public var rightWalkspeed:Number = 5;

        public var inMotion:Boolean = false;
        public var goingUp:Boolean = false;
        public var goingDown:Boolean = false;
        public var goingLeft:Boolean = false;
        public var goingRight:Boolean = false;

        public var playerPosKeeper_mc:MovieClip = new mc_PlayerPosKeeper();

        public var up_dpad:MovieClip = new dpad_Up();
        public var down_dpad:MovieClip = new dpad_Down();
        public var left_dpad:MovieClip = new dpad_Left();
        public var right_dpad:MovieClip = new dpad_Right();
        public var menu_dpad:MovieClip = new dpad_Menu();
        public var run_dpad:MovieClip = new dpad_Menu();

        public var barrierRoof1_game:MovieClip = new game_BarrierRoof();
        public var barrierRoof2_game:MovieClip = new game_BarrierRoof();
        public var barrierSide1_game:MovieClip = new game_BarrierSide();
        public var barrierSide2_game:MovieClip = new game_BarrierSide();

        public var StageCollisions:Array = new Array(barrierRoof1_game, barrierRoof2_game, barrierSide1_game, barrierSide2_game);
        // fix MC goes after not before ||| public var player1States:Array = new Array(mc_P1D1,mc_P1D2,"mc_P1L1","mc_P1L2","mc_P1R1","mc_P1R2","mc_P1U1","mc_P1U2");

        public function Game()
        {
            trace("SUCCESS | Constructed Game Class");

            var aMove:Movement = new Movement(this);
            addChild(aMove);

        }
    }
}

动作类

package 
{
    import flash.display.Stage;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.TouchEvent;
    import flash.net.dns.AAAARecord;
    import flash.ui.Multitouch;
    import flash.ui.MultitouchInputMode;


    public class Movement extends MovieClip
    {
        public function Movement(main:Game)
        {
            trace("SUCCESS | Constructed Movement Class");

            addChild(main.playerPosKeeper_mc);
            main.playerPosKeeper_mc.x = 384;
            main.playerPosKeeper_mc.y = 46;

            addChild(main.up_dpad);
            main.up_dpad.x = 55;
            main.up_dpad.y = 336;

            addChild(main.down_dpad);
            main.down_dpad.x = 57;
            main.down_dpad.y = 432;

            addChild(main.left_dpad);
            main.left_dpad.x = 19;
            main.left_dpad.y = 372;

            addChild(main.right_dpad);
            main.right_dpad.x = 118;
            main.right_dpad.y = 372;

            addChild(main.menu_dpad);
            main.menu_dpad.x = 61;
            main.menu_dpad.y = 377;

            addChild(main.run_dpad);
            main.run_dpad.x = 684;
            main.run_dpad.y = 369;

            addChild(main.barrierRoof1_game);
            main.barrierRoof1_game.x = 0;
            main.barrierRoof1_game.y = 0;

            addChild(main.barrierRoof2_game);
            main.barrierRoof2_game.x = 0;
            main.barrierRoof2_game.y = 470;

            addChild(main.barrierSide1_game);
            main.barrierSide1_game.x = 0;
            main.barrierSide1_game.y = 0;

            addChild(main.barrierSide2_game);
            main.barrierSide2_game.x = 790;
            main.barrierSide2_game.y = 0;

            Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

            main.up_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, upBeginInput);
            main.down_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, downBeginInput);
            main.left_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, leftBeginInput);
            main.right_dpad.addEventListener(TouchEvent.TOUCH_BEGIN, rightBeginInput);

            // Maybe add diagnol direction buttons in the future?;


            //  !!  NOTE  !!
            //  Use some sort of value, maybe a return or a variable to sync up animations
            // to if the player is moving, in the future

            // Movement Directions

            // Start of UP Movement
            function upBeginInput(e:TouchEvent):void
            {
                main.inMotion = true;
                main.goingUp = true;
                main.goingDown = false;
                main.goingLeft = false;
                main.goingRight = false;
                main.up_dpad.addEventListener(TouchEvent.TOUCH_END, upEndInput);
                addEventListener(Event.ENTER_FRAME,sendUpMovement);
            }
            function upEndInput(e:TouchEvent):void
            {
                main.inMotion = false;
                main.goingUp = false;
                main.up_dpad.removeEventListener(TouchEvent.TOUCH_END, upEndInput);
                removeEventListener(Event.ENTER_FRAME,sendUpMovement);
            }
            function sendUpMovement():void
            {
                if (main.inMotion == true && main.goingUp == true && main.goingDown == false && main.goingLeft == false && main.goingRight == false)
                {
                    movePlayer(0, main.upWalkspeed);
                }
                else
                {
                }
            }
            // End of UP Movement



            // Start of DOWN Movement
            function downBeginInput(e:TouchEvent):void
            {
                main.inMotion = true;
                main.goingUp = false;
                main.goingDown = true;
                main.goingLeft = false;
                main.goingRight = false;
                main.down_dpad.addEventListener(TouchEvent.TOUCH_END, downEndInput);
                addEventListener(Event.ENTER_FRAME,sendDownMovement);
            }
            function downEndInput(e:TouchEvent):void
            {
                main.inMotion = false;
                main.goingDown = false;
                main.down_dpad.removeEventListener(TouchEvent.TOUCH_END, downEndInput);
                removeEventListener(Event.ENTER_FRAME,sendDownMovement);
            }
            function sendDownMovement():void
            {
                if (main.inMotion == true && main.goingUp == false && main.goingDown == true && main.goingLeft == false && main.goingRight == false)
                {
                    movePlayer(0, main.downWalkspeed);
                }
                else
                {
                }
            }
            // End of DOWN Movement



            // Start of LEFT Movement
            function leftBeginInput(e:TouchEvent):void
            {
                main.inMotion = true;
                main.goingUp = false;
                main.goingDown = false;
                main.goingLeft = true;
                main.goingRight = false;
                main.left_dpad.addEventListener(TouchEvent.TOUCH_END, leftEndInput);
                addEventListener(Event.ENTER_FRAME,sendLeftMovement);
            }
            function leftEndInput(e:TouchEvent):void
            {
                main.inMotion = false;
                main.goingLeft = false;
                main.left_dpad.removeEventListener(TouchEvent.TOUCH_END, leftEndInput);
                removeEventListener(Event.ENTER_FRAME,sendLeftMovement);
            }
            function sendLeftMovement():void
            {
                if (main.inMotion == true && main.goingUp == false && main.goingDown == false && main.goingLeft == true && main.goingRight == false)
                {
                    movePlayer(main.leftWalkspeed, 0);
                }
                else
                {
                }
            }
            // End of LEFT Movement



            // Start of RIGHT Movement
            function rightBeginInput(e:TouchEvent):void
            {
                main.inMotion = true;
                main.goingUp = false;
                main.goingDown = false;
                main.goingLeft = false;
                main.goingRight = true;
                main.right_dpad.addEventListener(TouchEvent.TOUCH_END, rightEndInput);
                addEventListener(Event.ENTER_FRAME,sendRightMovement);
            }
            function rightEndInput(e:TouchEvent):void
            {
                main.inMotion = false;
                main.goingRight = false;
                main.right_dpad.removeEventListener(TouchEvent.TOUCH_END, rightEndInput);
                removeEventListener(Event.ENTER_FRAME,sendRightMovement);
            }
            function sendRightMovement():void
            {
                if (main.inMotion == true && main.goingUp == false && main.goingDown == false && main.goingLeft == false && main.goingRight == true)
                {
                    movePlayer(main.rightWalkspeed, 0);
                }
                else
                {
                }
            }
            // End of RIGHT Movement


            function movePlayer(movementX:Number, movementY:Number):void
            {
                var originalX:Number = main.playerPosKeeper_mc.x;
                var originalY:Number = main.playerPosKeeper_mc.y;
                main.playerPosKeeper_mc.x +=  movementX;
                if (checkCollision())
                {
                    main.playerPosKeeper_mc.x = originalX;
                }
                main.playerPosKeeper_mc.y +=  movementY;
                if (checkCollision())
                {
                    main.playerPosKeeper_mc.y = originalY;
                }
            }

            function checkCollision():Boolean
            {
                for each (var StageCollisions:MovieClip in main.StageCollisions)
                {
                    if (main.playerPosKeeper_mc.hitTestObject(StageCollisions))
                    {
                        return true;
                        main.inMotion = false;
                        main.goingUp = false;
                        main.goingDown = false;
                        main.goingLeft = false;
                        main.goingRight = false;
                    }
                }
                return false;
            }
        }
    }
}

在开始调试行为之前,您需要了解什么是算法方法。您有 4 段相似的代码,它们在一些小细节上有所不同,使您的整个脚本太长、不可读且难以管理。这是指南:

var isMoving:Boolean;
var Direction:Point = new Point;
var Buttons:Array = [Up, Down, Left, Right];

// Subscribe all buttons for the same handlers and behaviors.
for each (var aButton:InteractiveObject in Buttons)
{
    aButton.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
    aButton.addEventListener(MouseEvent.MOUSE_OUT, onUp);
    aButton.addEventListener(MouseEvent.MOUSE_UP, onUp);
}

function onDown(e:MouseEvent):void
{
    // Figure which button was pressed.
    switch (e.currentTarget)
    {
        case Up:
            Direction.x = 0;
            Direction.y = -1;
            break;

        case Down:
            Direction.x = 0;
            Direction.y = 1;
            break;

        case Left:
            Direction.x = -1;
            Direction.y = 0;
            break;

        case Up:
            Direction.x = 1;
            Direction.y = 0;
            break;
    }

    // Now start moving Hero into the Direction.
    if (!isMoving)
    {
        isMoving = true;
        addEventListener(Event.ENTER_FRAME, onFrame);
    }
}

function onFrame(e:Event):void
{
    Hero.x += Direction.x;
    Hero.y += Direction.y;
}

function onUp(e:MouseEvent):void
{
    // If any of buttons is released or mouse out, stop moving Hero.
    removeEventListener(Event.ENTER_FRAME, onFrame);

    Direction.x = 0;
    Direction.y = 0;

    isMoving = false;
}

正如您所看到的,算法方法的美妙之处在于您需要以不同的方式处理only的事情need为了以不同的方式处理,在示例情况下(与您想要创建的非常相似),它是设置移动方向的块。所有按钮的其余代码都是相同的,这就是整个脚本简短易读、易于理解和管理的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将鼠标悬停在 DPAD 上有时会使角色朝一个方向无限移动 的相关文章

  • 更改 AS3 中的 TextField 选择颜色

    如何更改 ActionScript 3 中 TextField 的选择 突出显示 颜色 我有一个输入文本字段 黑色背景上有白色文本 因此 选择是不可见的 这对于可用性来说非常糟糕 谢谢 另一种方法是使用文本布局框架 特别是使用 Select
  • Actionscript 对象的属性数量

    如何获取通用 Actionscript 对象中的属性数量 如数组长度 您必须循环所有元素才能对它们进行计数 function objectLength myObject Object int var cnt int 0 for var s
  • Facebook 聊天在打开时隐藏 Flash 应用程序

    运行 Flash 应用程序时 如果我打开新的或现有的 Facebook 聊天窗口 我的 Flash 内容就会消失 我可以继续听到应用程序中播放的音乐 并且当我关闭 最小化 Facebook 聊天窗口时 我的 Flash 内容会重新出现 这是
  • 使用多个模块时优化 Flex

    我有一个 Flex 应用程序 加载时间非常重要 消费者网站 我希望能够在屏幕上显示一些内容 然后允许根据需要加载其他模块 我面临的问题是所有模块的总和比我将所有组件包含在单个 swf 文件中要大得多 原因很明显 例如 访问 Web 服务所需
  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 我应该等待 Flash Player 10.1 还是使用 Flash Lite 3 来为手机和设备开发 Flash 内容

    Adobe 将在 2010 年第一季度推出 Flash Player 10 1 这将在桌面和移动设备上提供一致的运行时 因此我假设如果它是为 Web 构建的 那么它也可以在移动设备上运行 我即将开始为手机开发基于 Flash 的应用程序 我
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch
  • 正确地将 flash.utils.Dictionary 序列化为 SharedObject

    我的 Flex 项目中有一个名为 HashMap 的便利集合类 它本质上是 flash utils Dictionary 的包装器 带有一堆便利方法和添加的 同步的 ArrayCollection 以便我可以将 HashMap 传递给需要的
  • 更改由 AS3 添加到舞台的影片剪辑中的动态文本字段不起作用?

    当我更改动态文本字段的文本值时 文本字段只是变为空白 而不显示新值 我有一个名为 game board 的 MovieClip 由 AS3 动态添加到舞台上 舞台一开始是空白的 我有另一个名为 stage 2 的 MovieClip 它作为
  • Flash Builder 条件编译变量

    我正在使用 Flash Builder 4 5 并且我想在调试和发布版本之间使用条件编译 我了解如何使用条件编译以及如何定义编译器常量 我需要的是 IDE 在调试和发布版本之间设置的预定义常量 一种在调试和发布版本之间为编译器指定不同参数的
  • 在 Javascript 中检测 Flash 文件何时完成播放

    我正在使用 Javascript 将 Flash 文件嵌入到网站中 然后需要在播放完成后将其删除 有没有办法用普通的 Javascript 来做到这一点 或者是否需要将回调类型的函数添加到 Flash 文件本身 我该如何编码 JavaScr
  • 舞台强制渲染/重绘

    通常我会监听 ENTER FRAME 事件并在每次渲染帧时执行代码 但是对于我的应用程序来说这太慢了 2 个 ENTER FRAME 事件之间的时间间隔为 40 毫秒 如果我改变帧率也没关系 那么是否可以在不监听事件的情况下强制Flash重
  • ActionScript、NetStream.Play.Failed iOS AIR 移动设备

    我正在尝试以类似于 Tiberiu Ionu Stan http stackoverflow com questions 2036107 aac mp4 not working in actionscript 3s netstream 的方
  • 如何找到 AS3 中 xml 子级的数量

    所以现场文档说这是在 XML 对象上调用 length 对于 XML 对象 此方法始终 返回整数 1 length XMLList 类的方法返回一个 对于 XMLList 对象 值为 1 仅包含一个值 我在 xml 上调用它 如下所示
  • Actionscript 3 中的外部配置文件

    我需要能够将外部配置文件加载到我的 Flex 应用程序中 我读到 只要将 mimeType 设置为 application octet stream 就可以使用嵌入 package learning import org flixel pu
  • var x:* 在动作脚本中到底意味着什么?

    搜索 var 有点棘手 因为大多数搜索引擎都找不到它 与 var Object 相比 我不清楚 var 的确切含义 我认为它可以让我在对象上设置任意属性 例如 var x myObject x nonExistantProperty 123
  • AS3:如何获取文本字段中某些文本的左上角和确切的宽度和高度?

    我们正在努力获得一个Rectangle代表文本的精确 边界TextField 尽可能准确 拍摄这张图片 利用我目前的知识 我可以检索blue上面的矩形如下所示 var textRect Rectangle new Rectangle fie
  • Flex:监听文本区域中链接上的“悬停”

    我试图找出链接何时 悬停在 显示 html 文本的文本区域中 我想知道监听光标更改类型的事件是否可能是这样 我在文档中找不到任何内容 有谁知道我可以在这里收听什么活动吗 Thanks 这是一个非常有趣的问题 根据凯的建议 我想到了一种返回A
  • 在 ActionScript 2 中处理无限/巨大的世界

    在 ActionScript 2 中 如何以最小的延迟实现无限 巨大的程序生成世界 例如 在像 泰拉瑞亚 或 我的世界 这样的游戏中 处理这样一个巨大的世界的最佳方法是什么 显然 循环遍历每个块并以这种方式移动它们是行不通的 我尝试将块放入
  • 如何进行 Flex 日期扣除和添加

    在 Flex 中 我试图进行日期扣除和添加 但找不到方法 例如 公共 var dateNow Date new Date 如何获得比现在日期早 3 个月的日期 谢谢 您可以为此使用 Date 构造函数 Date 构造函数的第一个参数采用年份

随机推荐

  • 从“int”到“char *”的转换无效

    我想编写一个程序 该程序将从文本文件中读取并使用结构存储文本文件中的内容 然后重新组合并打印出文本文件中的信息 但我遇到了问题getline 我试着写getline像这样 getline infile info name 但它不起作用 我还
  • 设置 HTML 表单文本区域的值?

    我正在使用以下内容来设置文本区域的值 br b Description b br
  • SQLite3 中的外键支持

    根据this从 2010 年开始 EnforceFKConstraints 连接字符串属性应该在 SQLite 的未来版本中实现 有谁知道开发商是否已经开始这样做了 如果没有 是否有另一种方法可以启用外键支持 而无需在每个连接上执行 PRA
  • 用于 Spring 配置的 Hibernate OGM 提供程序

    我创建了一个Java应用程序 可以使用SQL Server或Neo4j作为数据库 而无需触及应用程序层 我只需修改提供程序和连接信息 如下所示
  • 就在我以为我终于理解了 Javascript 范围的时候

    我遇到了一些事情 这说明我显然还没有明白 谁能解释一下为什么 this 的值会在下面发生变化 var MyFunc function alert this var innerFunc function alert this innerFun
  • C# - 如何确定 Type 是否为数字

    有没有办法确定给定的 Net 类型是否是数字 例如 System UInt32 UInt16 Double都是数字 我想避免使用很长的开关盒Type FullName 试试这个 Type type object GetType bool i
  • 如何在 php docker 镜像中安装 pdo 驱动程序?

    我使用作为基础php docker 容器带有标签 php 5 6 apache 我将它与基本的mysql 5 6我可以在主机上找到的图像mysql 我创建了一个数据库 并用基本值填充了一个表 然而尝试访问我的应用程序时 我得到 Fatal
  • (Git) 当当前分支中有大量更改时,将修复提交到不同分支的最实用方法是什么?

    这是场景 您正在功能分支上工作 您创建了几个新文件 移动了一些文件并更改了其他几个文件 在处理一些不是您编写的代码时 您注意到并立即修复了一个错误 或者 您注意到某个功能缺少文档 因此您可以快速为下一个开发人员添加一些专业提示 然后 您意识
  • 检测硬盘是否正在被访问

    我正在尝试制作一个非常简单的硬盘访问监视器像那些根据驱动器使用情况闪烁的嵌入式 LED 一样工作 那个 LED 确实对我很有帮助 但我使用的笔记本电脑没有它 因此 我制作了一个简单的托盘图标应用程序 但我不知道如何确定磁盘访问的变量 我搜索
  • mysql 服务器无法启动 MAMP

    我在这里读过一些答案 这些答案说当你的 mysql 服务器无法在 MAMP 中启动时 你应该运行 sudo killall 9 mysqld 我过去曾使用过它 它确实有效 但无论出于何种原因 这次它不起作用 我在日志中收到此错误消息 04
  • 如何从 ActiveRecord 中的事务中排除模型?

    我有一个特殊情况的模型 它不能成为外部事务的一部分 Outer Transaction do Inner create blah end 假设 Inner 不知道它正在被拉入哪个特定交易 我如何阻止 Inner 成为交易的一部分 例如 创建
  • 整理和重塑凌乱的数据集(重塑/收集/联合功能)?

    按照我之前的问题 R 重塑 收集功能以创建准备进行多级分析的数据集 我发现它有点复杂 我的数据集实际上比我希望的 更混乱 完整的故事如下 我有一个很大的数据集 有 240 个案例 每行都是一个病例 乳腺癌患者 在数据集末尾的某个地方 比如从
  • 对于大图像,UIImage imageNamed 是否仍然会导致 iOS 4 上的内存问题?

    我发现了几篇内存管理文章提到UIImage s imageNamed当内存中有很多大图像时会引起问题 http akosma com 2009 01 28 10 iphone memory management tips http www
  • Cocoa forControlEvents:WHATGOESHERE

    在 Cocoa Objective C 中 如果我以编程方式创建了一个按钮 我应该为我的控制事件添加什么 btnMakeChar addTarget self action selector makeChar forControlEvent
  • jQuery:删除结束标签

    有没有办法使用 jQuery 删除单个结束 HTML 标签 Example div class one div class two CONTENT div div 我必须删除最后一个 这意味着 div one 关闭后的关闭 div 标签 不
  • Dynamics 356 v9 - 将executionContext.getFormContext() 与 HTML Web 资源结合使用

    我们如何使用的任何想法executionContext getFormContext 使用 HTML 网络资源 唯一有效的方法是parent Xrm Page现在已弃用 我们仍在使用parent Xrm Page and parent Xr
  • 如何使用枚举或任何其他方式在java中构建类别的层次结构树?

    假设我们有一组类别 categories A B 再假设A包含子类别 A1 A2 A3 B包含子类别 B1 B2 此外 还有更多子类别如下 对于A1 A1a A1b 对于A2 A2a A2b 对于 A3 A3a A3b A3c 对于 B1
  • 如果上面的单元格值较低,则将单元格颜色为红色

    我需要一个用于 Google 电子表格的公式 脚本来执行此操作 如果当前单元格值高于上方单元格中的值 则当前单元格背景为红色 如果小于或等于则保留白色 如下所示 IF C34 gt B34 make background red leave
  • Android - 自定义ArrayAdapter

    有人可以帮我解决我的问题吗 我仍在尝试与DraggingListView and ArrayAdapter 现在我想实现删除元素listview通过点击 但是当我制作时 StableArrayAdapter this notifyDataS
  • 将鼠标悬停在 DPAD 上有时会使角色朝一个方向无限移动

    我的游戏中有一个 DPAD 当玩家按住左 DPAD 时 如果他将触摸移动到向上 DPAD 并让我们走 玩家会继续向左方向前进 如果您按住 a 方向 则它也会起作用 假设向上继续按住 但移开向上 DPAD 有时您可能会继续朝该方向前进 我试图