Actionscript 3 WASD在闪光SWF内的运动

Actionscript 3 WASD在闪光SWF内的运动,actionscript-3,flash,actionscript,Actionscript 3,Flash,Actionscript,因此,我打算在我的CPP中创建一个大房间,但是,我发现需要多个房间连接在一起,这有点令人讨厌。我想知道我是否可以增加链接在一起的房间的大小,并使用WASD在其中滚动 这就是我试图管理的环境: 这是我要开发的一个岛屿的一部分,这是一个粗略的画面,但你会想到它会继续向左。这就是我想要它滚动的地方 我这样做是不是疯了?这可能吗?任何评论都会有帮助!谢谢 您正在寻找的解决方案是一个屏蔽容器 将地图放在一个容器中 通过您感兴趣的事件(角色)设置X&Y坐标 到达地图边缘,单击按钮等…) 顶部的层(在本例中

因此,我打算在我的CPP中创建一个大房间,但是,我发现需要多个房间连接在一起,这有点令人讨厌。我想知道我是否可以增加链接在一起的房间的大小,并使用WASD在其中滚动

这就是我试图管理的环境:

这是我要开发的一个岛屿的一部分,这是一个粗略的画面,但你会想到它会继续向左。这就是我想要它滚动的地方


我这样做是不是疯了?这可能吗?任何评论都会有帮助!谢谢

您正在寻找的解决方案是一个屏蔽容器

  • 将地图放在一个容器中
  • 通过您感兴趣的事件(角色)设置X&Y坐标 到达地图边缘,单击按钮等…)
  • 顶部的层(在本例中为UI)位于容器上方。 如果你有其他物品没有覆盖你的世界地图,你会添加一个 通过设置myContainer.mask=myShape来屏蔽容器
  • 为了好玩,我继续写了一个例子,你可以在一个干净的项目中运行。这应该说明地图平移的概念。试试你的WASD键,或者简单地移动鼠标

    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    
    // Our container for the map.
    var container:Sprite;
    // For the sake of smoothly animating to its destination, track the X & Y coordinates.
    var destX:Number = 0;
    var destY:Number = 0;
    
    init();
    function init():void {
        // Create a backdrop (mostly for mouseMove)
        var bg:Sprite = new Sprite();
        bg.graphics.beginFill(0xFFFFFF);
        bg.graphics.lineStyle(2, 0x00);
        bg.graphics.drawRect(100, 100, stage.stageWidth - 200, stage.stageHeight - 200);
        bg.graphics.endFill();
        addChild(bg);
    
        // Our container "map"
        container = new Sprite();
        addChild(container);
    
        // Create a mask
        var m:Shape = new Shape();
        m.graphics.beginFill(0x00);
        m.graphics.drawRect(0, 0, stage.stageWidth - 200, stage.stageHeight - 200);
        m.graphics.endFill();
        m.x = m.y = 100;
        container.mask = m;
    
        // Event Listeners
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyboardMovement);
        addEventListener("mouseMove", cursorMovement);
        addEventListener("enterFrame", updateMap);
    
        // Populate the map with shapes
        for (var i:int = 0; i < 1000; i++) {
            var c:Shape = createCircle();
            container.addChild(c);
            c.x = random(0, stage.stageWidth * 2); // Random X Coordinate
            c.y = random(0, stage.stageHeight * 2); // Random Y Coordinate
        }
    }
    
    function createCircle():Shape {
        // Creates a randomly sized/colored circle
        var c:Shape = new Shape();
        c.graphics.beginFill(random(0x000000, 0xFFFFFF)); // Random Color
        c.graphics.drawCircle(0,0,random(4,20)); // Random Size
        c.graphics.endFill();
        return c;
    }
    
    function keyboardMovement(e:KeyboardEvent):void {
        var speed:int = 100
        switch (e.charCode) {
            case 115: // s:down
                speed = -speed;
            case 119: // w:up
                destY = clamp(destY + speed, -this.loaderInfo.height, 0);
                break;
            case 100: // d:right
                speed = -speed;
            case 97: // a:left
                destX = clamp(destX + speed, -this.loaderInfo.width, 0);
                break;
        }
    }
    
    function cursorMovement(e:Event):void {
        destX = -mouseX;
        destY = -mouseY;
    }
    
    function updateMap(e:Event):void {
        container.x += (destX - container.x) * 0.1;
        container.y += (destY - container.y) * 0.1;
    }
    
    function random(low:Number, high:Number):Number {
        return Math.floor(Math.random() * (1+high-low)) + low;
    }
    
    function clamp(original:Number, low:Number, high:Number):Number {
        return (original > high) ? high : (original < low) ? low : original;
    }
    
    导入flash.display.Sprite;
    导入flash.display.Shape;
    导入flash.events.Event;
    导入flash.events.KeyboardEvent;
    //我们的地图容器。
    var容器:Sprite;
    //为了平滑地设置动画到目标,请跟踪X&Y坐标。
    变量destX:Number=0;
    变量destY:Number=0;
    init();
    函数init():void{
    //创建背景(主要用于mouseMove)
    var bg:Sprite=新Sprite();
    bg.graphics.beginll(0xFFFFFF);
    bg.graphics.lineStyle(2,0x00);
    bg.graphics.drawRect(100100,stage.stageWidth-200,stage.stageHeight-200);
    bg.graphics.endFill();
    addChild(bg);
    //我们的集装箱“地图”
    容器=新精灵();
    addChild(容器);
    //创建一个掩码
    var m:Shape=新形状();
    m、 图形填充(0x00);
    m、 graphics.drawRect(0,0,stage.stageWidth-200,stage.stageHight-200);
    m、 graphics.endFill();
    m、 x=m.y=100;
    container.mask=m;
    //事件侦听器
    stage.addEventListener(KeyboardEvent.Keyu向下,键盘移动);
    addEventListener(“鼠标移动”,光标移动);
    addEventListener(“enterFrame”,updateMap);
    //用形状填充地图
    对于(变量i:int=0;i<1000;i++){
    var c:Shape=createCircle();
    容器.addChild(c);
    c、 x=随机(0,stage.stageWidth*2);//随机x坐标
    c、 y=随机(0,stage.stageHeight*2);//随机y坐标
    }
    }
    函数createCircle():形状{
    //创建随机大小/颜色的圆
    变量c:Shape=新形状();
    c、 graphics.beginll(随机(0x000000,0xFFFFFF));//随机颜色
    c、 graphics.drawCircle(0,0,随机(4,20));//随机大小
    c、 graphics.endFill();
    返回c;
    }
    功能键盘移动(e:键盘事件):无效{
    无功转速:int=100
    开关(如charCode){
    案例115://s:down
    速度=-速度;
    案例119://w:向上
    destY=夹具(destY+速度,-this.loaderInfo.height,0);
    打破
    案例100://d:对
    速度=-速度;
    案例97://a:左
    destX=夹具(destX+速度,-this.loaderInfo.width,0);
    打破
    }
    }
    函数游标移动(e:事件):无效{
    destX=-mouseX;
    destY=-mouseY;
    }
    函数更新映射(e:事件):void{
    container.x+=(destX-container.x)*0.1;
    container.y+=(destY-container.y)*0.1;
    }
    函数随机(低:数,高:数):数{
    返回Math.floor(Math.random()*(1+高-低))+低;
    }
    功能夹(原:编号、低:编号、高:编号):编号{
    返回(原始>高)?高:(原始<低)?低:原始;
    }
    
    到目前为止,我还没想过要戴口罩!谢谢你的帮助!:)有没有办法让它在AS2中工作?我尝试迁移到AS3,但很快就意识到“环球”已经不存在,这意味着我必须使用该功能更改每个swf。我最终会把我的文件移到AS3上,但是,目前,有没有办法让它在AS2上运行?再次感谢!如果在AS2中有一种方法可以做到这一点,那是我所不知道的。在AS2中所做的任何事情在AS3中都有相似之处,但由于AS3更健壮的特性,情况并非如此。但是,如果您所做的只是使用_global来存储变量,那么您可以创建自己的变量(在您自己的文档代码中,或者在静态类中)。例如:
    var\u global:Object={}
    \u global.myVar=“你好,世界!”
    跟踪(_global.myVar)尝试在“var\u global:Object={};”中添加但它仍然无法加载使房间可播放所需的文件。我假设load.swf中使用的代码是AS2,我也必须更改其中的代码,但是当我查看该文件时,我找不到_global.getCurrentEngine。谢谢你的帮助。