Flash SWF 中的 WASD 移动

WASD movement within a Flash SWF

所以,我打算在我的 CPPS 内建一个大房间,但是,我发现需要将多个房间连接在一起有点烦人。我想知道我是否可以增加链接在一起的房间的大小并使用 WASD 滚动它。

这是我要管理的环境:

这是我要开发的岛屿的一部分,这是一张粗略的图片,但你会认为它会继续向左延伸。这就是我希望它滚动的地方。

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

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

  1. 将地图放入容器中。
  2. 根据您感兴趣的事件设置 X 和 Y 坐标(角色 到达地图边缘,点击按钮等...)
  3. 顶部的层(在本例中是您的 UI)位于您的容器上方。 如果你有其他项目没有覆盖你的世界地图,你会添加一个 通过设置 myContainer.mask = myShape
  4. 屏蔽容器

为了好玩,我继续写了一个示例,您可以 运行 在一个干净的项目中。这应该演示地图平移概念。试试你的 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;
}