首页 > 解决方案 > 如何阻止精灵在半空中跳跃?动作脚本 3/Flash Pro CC 2015

问题描述

我是一名初学者 Flash/AS3 程序员,我有一个非常复杂的问题。如何防止精灵在半空中跳跃?我已经看到与“半空中的精灵/跳跃”相关的另一个问题,但我个人无法弄清楚如何在 AS3 中做到这一点。感谢您的任何回复。代码:

public class DocumentMain extends MovieClip {
    private var _vx: Number;
    import flash.utils.Timer;
    import flash.ui.Keyboard;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    private var _vy: Number;
    public function DocumentMain() {
        // constructor code
        _vx = 0;
        _vy = 0
        _startMarker.visible = false;
        this.addEventListener("enterFrame", a);
        stage.addEventListener("keyDown", b);
        stage.addEventListener("keyUp", c);
        _windows.addEventListener("enterFrame", handleCollision);
        
        function handleCollision( e:Event ):void
        {
        {
                var collisionWall:Boolean = false;
                if (wall.hitTestObject(_windows)) {
                    collisionWall = true;
                }
                if (collisionWall) {
                    while (collisionWall) {
                        _windows.x += 0.1; 
                        collisionWall = false;
                        if (wall.hitTestObject(_windows)) {
                        collisionWall = true;
                         }
                    }
                    _vx = 0;
                }
        }
    }
        function a(e:Event):void {
            _vy += 2;
            _windows.x += _vx;
            _windows.y += _vy;
            
            
            if (_vy > 0) {
                if (_windows.y > stage.stageHeight) {
                    _windows.x = _startMarker.x;
                    _windows.y = _startMarker.y;
                    _vy = 0;
                }
                
            else {
                var collision:Boolean = false;
                if (ground.hitTestObject(_windows)) {
                    collision = true;
                }
                if (collision) {
                    while (collision) {
                        _windows.y -= 0.1; 
                        collision = false;
                        if (ground.hitTestObject(_windows)) {
                        collision = true;
                         }
                    }
                    _vy = 0;
                }
                
            }
        }
    
    }
        
        function b(e:KeyboardEvent):void {
            var step:uint = 5
              switch (e.keyCode) {
                  case 37:
                      _windows.rotationY = -180;
                      _vx = -7;
                  break;
                  
                  case 39:
                      _windows.rotationY = 0;
                      _vx = 7;
                  break;
                  
                    case 38:
                     
                      _vy = -20;
                      break;
                                
                      

                }
        } 
        
        function c(e:KeyboardEvent):void {
            switch (e.keyCode) {
                case 37:
                case 39:
                    _vx = 0;
            }
            
        }

    }
}

标签: actionscript-3flashspritegame-development

解决方案


您需要为玩家控制的精灵声明“在地面上”的条件(我希望在这里它被称为_windows),并基于该条件,让玩家使用向上键更改垂直速度,或者忽略。

您在这里有一段代码旨在处理您的函数中的地面碰撞(粗略,但从我所看到的情况来看确实有效)a(e:Event),如果与地面,设置为真。由于您的函数首先应用“重力”然后检查碰撞,因此它应该可以正确处理悬崖/斜坡以及跳跃。因此,您Boolean在游戏类中声明一个变量,例如“isOnGround”,首先将其设置为 false,然后检查与地面的碰撞,如果为 true,则将该变量设置为 true。然后,在b()函数处(“keyDown”处理程序)检查 var 是否为真,如果是,则允许跳转,因此您可以愉快地设置_vy,否则您什么也不做。

// adding only changed fragments
public class DocumentMain extends MovieClip {
    private var _isOnGround:Boolean; // the flag
    ...
        function a(e:Event):void {
            ...
                _isOnGround = false; // reset flag
                if (ground.hitTestObject(_windows)) {
                    collision = true;
                    _isOnGround = true; // we ARE on ground, rest isn't relevant here 
                }
            ...
        }       
    }
        
        function b(e:KeyboardEvent):void {
            ...
                    case 38:
                      if (_isOnGround) { // check here
                          _vy = -20;
                          _isOnGround = false; // just in case here
                      } // otherwise do nothing
                      break;

推荐阅读