• 积少成多Flash(7) ActionScript 3.0 交互之鼠标事件和键盘事件


    [索引页]
    [源码下载]


    积少成多Flash(7) - ActionScript 3.0 交互之鼠标事件和键盘事件


    作者:webabcd


    介绍
    演示使用 Flash ActionScript 3.0 来监听用户的键盘事件和鼠标事件,并对其作相应的处理
    • 键盘事件 - 在 flash.events.KeyboardEvent 类下。只有两个事件类型 KeyboardEvent.KEY_DOWN 和 KeyboardEvent.KEY_UP 。
    • 鼠标事件 - 在 flash.events.MouseEvent 类下。常用的事件类型有 MouseEvent.MOUSE_DOWN, MouseEvent.DOUBLE_CLICK, MouseEvent.MOUSE_UP, MouseEvent.MOUSE_OVER, MouseEvent.MOUSE_MOVE 和 MouseEvent.MOUSE_OUT 等。


    1、处理键盘事件
    做 4 个只有两帧的 MovieClip 并放到 UI 上,分别用于提示上/下/左/右键的按键情况,默认情况下显示第一帧,当用户按下了对应的键时则显示第二帧。这 4 个 MovieClip 的名称分别为 btnUp, btnDown, btnLeft, btnRight
    再在 UI 上画一个物体,由于显示用户的键盘事件(上/下/左/右)所产生的结果
    Main.as
    package
    {
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.display.MovieClip;
        import flash.ui.Keyboard;
        import flash.events.MouseEvent;
        
        public class Main extends MovieClip
        
    {
            
    // 保存用户是否按下了上/下/左/右键
            public var isUp:Boolean = false;
            public 
    var isDown:Boolean = false;
            public 
    var isLeft:Boolean = false;
            public 
    var isRight:Boolean = false;
            
            
    // 每次 ENTER_FRAME 物体所需移动的距离
            public var step:Number = 5;
            
            public 
    function Main()
            
    {
                
    // 设置四个用于显示方向的 MovieClip 的初始状态为停在第一帧
                btnUp.stop();
                btnDown.stop();
                btnLeft.stop();
                btnRight.stop();            
                
                
    // 处理按键的按下、放开事件(在舞台上侦测该事件)
                stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressHandler);
                stage.addEventListener(KeyboardEvent.KEY_UP, keyReleaseHandler);
                
    // 用于响应按键事件的 ENTER_FRAME
                this.addEventListener(Event.ENTER_FRAME, enterFrameHandlerForKeyboard);
            }

            
            protected 
    function keyPressHandler(event:KeyboardEvent):void
            
    {
                
    // 检测用户按下的键
                switch (event.keyCode)
                
    {
                    
    case Keyboard.UP: 
                        isUp 
    = true;
                        btnUp.gotoAndStop(
    2);
                        block.rotation 
    = 0;
                        
    break;
                        
                    
    case Keyboard.DOWN: // 按的是“下”键
                        isDown = true// 保存用户的按键信息。即用户正在按“下”键
                        btnDown.gotoAndStop(2); // 用于显示方向“下”的 MovieClip 停到第二帧
                        block.rotation = 180// 物体旋转 180 度
                        break;
                        
                    
    case Keyboard.LEFT:
                        isLeft 
    = true;
                        btnLeft.gotoAndStop(
    2);
                        block.rotation 
    = 270;
                        
    break;
                        
                    
    case Keyboard.RIGHT:
                        isRight 
    = true;
                        btnRight.gotoAndStop(
    2);
                        block.rotation 
    = 90;
                        
    break;
                }

            }

            
            protected 
    function keyReleaseHandler(event:KeyboardEvent):void
            
    {
                
    // 检测用户放开的键
                switch( event.keyCode )
                
    {
                    
    case Keyboard.UP: // 按的是“上”键
                        isUp = false// 保存用户的按键信息。即用户已经不再按“上”键了
                        btnUp.gotoAndStop(1); // 用于显示方向“上”的 MovieClip 停到第一帧
                        break;
                        
                    
    case Keyboard.DOWN:
                        isDown 
    = false;
                        btnDown.gotoAndStop(
    1);
                        
    break;
                        
                    
    case Keyboard.LEFT:
                        isLeft 
    = false;
                        btnLeft.gotoAndStop(
    1);
                        
    break;
                        
                    
    case Keyboard.RIGHT:
                        isRight 
    = false;
                        btnRight.gotoAndStop(
    1);
                        
    break;
                }

            }

            
            protected 
    function enterFrameHandlerForKeyboard(event:Event):void
            
    {
                
    // 根据用户的按键情况。将物体向上/下/左/右移动指定的距离
                if (isLeft) 
                
    {
                    block.x 
    -= step;
                }

                
    if (isRight) 
                
    {
                    block.x 
    += step;
                }

                
    if (isUp) 
                
    {
                    block.y 
    -= step;
                }

                
    if (isDown) 
                
    {
                    block.y 
    += step;
                }

            }

        }

    }


    2、处理鼠标事件
    在 UI 上画一个物体,由于显示用户的鼠标事件所产生的结果,即该物体会向用户在舞台上所单击的位置移动
    Main.as
    package
    {
        import flash.events.Event;
        import flash.events.KeyboardEvent;
        import flash.display.MovieClip;
        import flash.ui.Keyboard;
        import flash.events.MouseEvent;
        
        public class Main extends MovieClip
        
    {
            
    // 鼠标单击位置的坐标
            public var targetX:Number = 0;
            public 
    var targetY:Number = 0;
            
    // 物体是否再向鼠标单击的位置移动
            public var moving:Boolean = false;
            
            
    // 每次 ENTER_FRAME 物体所需移动的距离
            public var step:Number = 5;
            
            public 
    function Main()
            
    {
                
    // 处理鼠标的按下事件(在舞台上侦测该事件)
                stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
                
    // 用于响应鼠标按下事件的 ENTER_FRAME
                this.addEventListener(Event.ENTER_FRAME, enterFrameHandlerForMouse);
            }

            
            protected 
    function mouseDownHandler(event:MouseEvent):void
            
    {
                
    // 当用户在舞台上按下鼠标后,获取鼠标的坐标
                targetX = event.stageX;
                targetY 
    = event.stageY;
                
                
    // 物体正在向鼠标单击的位置移动
                moving = true;
            }
            

            protected 
    function enterFrameHandlerForMouse(event:Event):void
            
    {
                
    if (moving)
                
    {
                    
    // 计算物体在 X 方向和 Y 方向上分别需要移动的距离
                    var offsetX:Number = block.x - targetX;
                    
    var offsetY:Number = block.y - targetY;
                    
                    
    // 计算物体需要旋转的角度
                    var targetRotation:Number = -Math.atan2(offsetX, offsetY) / (Math.PI / 180);
                    block.rotation 
    = targetRotation;
                    
                    
    if( Math.sqrt((offsetX*offsetX) + (offsetY*offsetY)) > step )
                    
    {
                        
    // 如果还没有移动到目标位,则继续移动指定的距离
                        block.y -= step * Math.cos(targetRotation * (Math.PI/180));
                        block.x += step * Math.sin(targetRotation * (Math.PI/180));
                    }

                    
    else
                    
    {
                        
    // 物体已经移动到鼠标所单击的位置
                        moving = false;
                    }

                }

            }

        }

    }


    OK
    [源码下载]
  • 相关阅读:
    【转】想成为为一名架构师,应该掌握哪些技术呢?
    【转】每个好架构师都是一位出色的程序员
    [LeetCode] 597. Friend Requests I: Overall Acceptance Rate 朋友请求 I: 全部的接受率
    [LeetCode]577. Employee Bonus 员工奖金
    570. Managers with at Least 5 Direct Reports 至少有5个直接汇报员工的经理
    [LeetCode] 529. Minesweeper 扫雷
    Generate Maximum revenue by selling K tickets from N windows
    [LeetCode] 311. Sparse Matrix Multiplication 稀疏矩阵相乘
    [LeetCode] 689. Maximum Sum of 3 Non-Overlapping Subarrays 三个非重叠子数组的最大和
    [LeetCode] 403. Frog Jump 青蛙跳
  • 原文地址:https://www.cnblogs.com/webabcd/p/1412853.html
Copyright © 2020-2023  润新知