2017-07-23 62 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