La solution que vous cherchez est un conteneur masqué.
- Placez votre carte dans un conteneur.
- Réglez le X & coordonnée Y par un événement qui vous intéresse (caractère atteint bord de carte, en cliquant sur un bouton, etc ...)
- Les couches sur le dessus (dans ce cas, votre interface utilisateur) sont assis au-dessus de votre récipient. Si vous aviez d'autres éléments qui ne couvrent pas votre carte du monde, vous souhaitez ajouter un masque au récipient en mettant
myContainer.mask = myShape
Pour le plaisir, je suis allé de l'avant et écrit un exemple que vous pouvez exécuter dans un environnement propre projet. Cela devrait démontrer le concept de panoramique cartographique. Essayez vos clés WASD, ou déplacez simplement la souris.
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;
}
Je ne pense pas que j'aurais jamais pensé à utiliser un masque jusqu'à maintenant! Merci de votre aide! :) –
est-il un moyen d'obtenir ce travail en AS2? J'ai essayé de passer à AS3 mais je me suis rapidement rendu compte que _global n'existe plus et que je devrais changer chaque swf en utilisant cette fonctionnalité. Je vais passer mes fichiers sur AS3 finalement, cependant, pour le moment, est-il un moyen pour que cela courir en AS2? Merci encore! –
S'il y a une façon de le faire en AS2, il est en dehors de ma connaissance. À peu près tout ce que vous faites dans AS2 a un analogue en AS3, mais l'inverse est pas vrai en raison de la nature plus robuste de AS3. Cependant, si tout ce que vous faites est d'utiliser _global pour stocker les variables, vous pouvez créer les vôtres (soit dans votre propre code de document, soit dans une classe statique). Par exemple: 'var _global: Object = {};' ' _global.myVar = "Bonjour tout le monde!",' ' trace (_global.myVar);' – Atriace