2017-07-23 56 views
0

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

这是我想管理环境:

这是一个海岛,我要开发的一部分,这是一个粗糙的画面,但你的想法,它将继续向左侧。这是我希望它滚动的地方。

我是一个疯狂的尝试做到这一点?这甚至有可能吗?任何意见将有所帮助!谢谢!

回答

1

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

  1. 将您的地图放入容器中。
  2. 设置X & Y上你感兴趣的事件坐标(字符 到达地图的边缘,点击一个按钮,等...)
  3. 在顶部的图层(在这种情况下,您的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; 
} 
+0

我不认为我会想过直到现在才使用口罩!感谢您的帮助! :) –

+0

有没有办法让这个在AS2中工作?我试图转向AS3,但很快意识到_global不再存在,意味着我将不得不使用该功能来更改每个swf。我将最终将文件移到AS3,但是,暂时来说,有没有办法在AS2中运行这个文件?再次感谢! –

+0

如果在AS2中有办法做到这一点,这是我的知识之外。几乎所有你在AS2中做的事情都有AS3中的模拟,但由于AS3更强大的特性,反之亦然。然而,如果你所做的只是使用_global来存储变量,你可以创建自己的(无论是在你自己的文档代码中,还是在静态类中)。例如: 'var _global:Object = {};' '_global.myVar =“Hello World!”;' 'trace(_global.myVar);' – Atriace