Код as3, приведенный ниже, основан на этом посте: Увеличение и уменьшение AS3 там, где щелкала мышь, не при регистрации .
- Я несколько элементов, которые перемещаются в зависимости от размера сцены / экрана и работают как задумано
- Экземпляр с именем mapMC содержит изображение моей карты (увеличенное)
- Anэкземпляр с именем mapMask, действующий в качестве маски для изображения карты
- Проект работает так, как задумано во время выполнения (
ctrl + enter
) - При создании исполняемого файла и просмотре на полном экране: видимое изображение/ Область карты обрезается при увеличении (я не вижу правую сторону или нижние области).Это не похоже на проблему с регистрацией.
- При создании исполняемого файла и просмотре на полном экране: при уменьшении отображается все изображение
Я думаю, что мне нужно каким-то образом обновить функцию scaleAroundMouse новыми значениями, но я впотеря и не знаю, как закодировать эту функциональность.
Мне кажется, что я упускаю что-то очевидное и сегодня врезался в стену, пытаясь найти решение.
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import com.greensock.*; //Greensock Tweening Platform.
import com.greensock.easing.*;
//Variables
var swfStage: Stage = mainContent.stage; //define the stage
var swfWidth: int = swfStage.stageWidth;
var swfHeight: int = swfStage.stageHeight;
var mapMask = mainContent.mapMask_mc;
var mapMC = mainContent.map_seoul;
var percX: Number;
var percY: Number;
var destX: Number;
var destY: Number;
mapMask.width = stage.stageWidth;
mapMask.height = stage.stageHeight;
mapMC.width = stage.stageWidth;
mapMC.scaleY = mapMC.scaleX;
trace('mapMC = ' + mapMC.width + 'x' + mapMC.height);
trace('mapMask = ' + mapMask.width + 'x' + mapMask.height);
//swfStage.displayState = StageDisplayState.FULL_SCREEN;
swfStage.scaleMode = StageScaleMode.NO_SCALE;
swfStage.align = StageAlign.TOP_LEFT;
//detect window resize distribute items accordingly
stage.addEventListener(Event.RESIZE, resizeDisplay);
resizeDisplay(null); //called for full screen exe
function resizeDisplay(event: Event): void {
var r = mainContent;
var w: int = swfStage.stageWidth;
var h: int = swfStage.stageHeight;
// Resize the main content area
r.scaleX = r.scaleY;
//reposition or resize children of mainContent (stage)
r.an0.x = w / 2;
r.an0.y = h / 2;
r.an1.x = 40;
r.an1.y = 40;
r.an2.x = w - 40;
r.an2.y = 40;
r.an3.x = 40;
r.an3.y = h - 40;
r.an4.x = w - 40;
r.an4.y = h - 40;
r.controlBar.x = 120;
r.controlBar.y = h - 35;
//resize mainContent background MC
r.background.scaleX = w;
r.background.scaleY = h;
trace('Resized');
mapMask.width = w;
mapMask.height = h;
trace('mapMask = ' + mapMask.width + 'x' + mapMask.height);
mapMC.width = stage.stageWidth;
mapMC.scaleY = mapMC.scaleX;
}
stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove);
function mousemove(e: MouseEvent) {
if (mapMask.hitTestPoint(stage.mouseX, stage.mouseY, false)) {
if (mapMC.width > mapMask.width) { //Avoids Scrolling if image is under mask area width
percX = mapMask.mouseX / mapMask.width;
}
if (mapMC.height > mapMask.height) { //Avoids Scrolling if image is under mask area height
percY = mapMask.mouseY / mapMask.height;
}
destX = -(mapMC.width - mapMask.width) * percX;
destY = -(mapMC.height - mapMask.height) * percY;
TweenMax.to(mapMC, .5, {
x: destX,
y: destY
});
}
}
//Add listeners for the mapMC movie clip.
mapMC.doubleClickEnabled = true;
mapMC.addEventListener(MouseEvent.CLICK, increaseSize);
mapMC.addEventListener(MouseEvent.DOUBLE_CLICK, decreaseSize);
function increaseSize(e: MouseEvent): void {
stopMouseMove();
scaleAroundMouse(mapMC, .5, null, resumeMouseMove);
}
function decreaseSize(e: MouseEvent): void {
stopMouseMove();
scaleAroundMouse(mapMC, .2, null, resumeMouseMove);
}
function stopMouseMove(): void {
stage.removeEventListener(MouseEvent.MOUSE_MOVE, mousemove);
}
function resumeMouseMove(): void {
stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove);
}
function scaleAroundMouse(objectToScale: DisplayObject, scaleAmount: Number, bounds: Rectangle = null, onComplete: Function = null): TweenLite {
// scaling will be done relatively
var relScaleX: Number = scaleAmount / objectToScale.scaleX;
var relScaleY: Number = scaleAmount / objectToScale.scaleY;
// map vector to centre point within parent scope
var scalePoint: Point = objectToScale.localToGlobal(new Point(objectToScale.mouseX, objectToScale.mouseY));
scalePoint = objectToScale.parent.globalToLocal(scalePoint);
// current registered postion AB
var AB: Point = new Point(objectToScale.x, objectToScale.y);
// CB = AB - scalePoint, objectToScale vector that will scale as it runs from the centre
var CB: Point = AB.subtract(scalePoint);
CB.x *= relScaleX;
CB.y *= relScaleY;
// recaulate AB, objectToScale will be the adjusted position for the clip
AB = scalePoint.add(CB);
// set actual properties
if (bounds) {
var limits: Rectangle = new Rectangle(
bounds.x + (bounds.width - (objectToScale.width * relScaleX)),
bounds.y + (bounds.height - (objectToScale.height * relScaleY)), (objectToScale.width * relScaleX) - bounds.width, (objectToScale.height * relScaleY) - bounds.height
);
if (AB.x < limits.x) AB.x = limits.x;
if (AB.x > limits.x + limits.width) AB.x = limits.x + limits.width;
if (AB.y < limits.y) AB.y = limits.y;
if (AB.y > limits.y + limits.height) AB.y = limits.y + limits.height;
}
return TweenLite.to(objectToScale, 1, {
onComplete: onComplete,
scaleX: scaleAmount,
scaleY: scaleAmount,
x: AB.x,
y: AB.y
});
}
//MAP Zoom in/out and Panning function
stage.addEventListener(MouseEvent.MOUSE_WHEEL, zoomImage);
function zoomImage(e: MouseEvent): void {
if (e.delta > 0) {
/*mapMC.width += (mapMC.width / mapMC.height) * 50;
mapMC.height += 50;*/
scaleAroundMouse(mapMC, .5, null, resumeMouseMove);
trace('zoom in');
} else {
/*mapMC.width -= (mapMC.width / mapMC.height) * 50;
mapMC.height -= 50; */
scaleAroundMouse(mapMC, .2, null, resumeMouseMove);
//scaleAroundMouse(mapMC, .2, mapMask.getBounds(this));
trace('zoom out');
}
}