AS3 Увеличение и уменьшение в полноэкранном режиме для отзывчивой функциональности - PullRequest
0 голосов
/ 21 февраля 2019

Код 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');
    }
}
...