ios - 本地到全局 Adob​​e AIR

标签 ios flash apache-flex air adobe

构建 Adob​​e AIR 应用程序 - localToGlobal 似乎存在问题。我一直在关注这个以针对多种屏幕尺寸设置我的应用程序:

http://www.adobe.com/devnet/air/articles/multiple-screen-sizes.html

但我的 localToGlobal 似乎总是遇到问题。我已经使用了“缩放和居中界面”部分中的大部分代码,我的应用程序正在正确调整应用程序大小。

我已经转换了我所有的 localToGlobal 调用并将新的比例值乘以 x 和 y,但没有得到所需的结果。它在原始 iPhone 4/4s 分辨率上仍然工作正常,但在 3gs 分辨率上测试我的线交叉点不起作用,特别是使用 localToGlobal 代码来计算。

这是调用本地点的代码:

var p:Point = localToGlobal(_lineStart);
p = parent.globalToLocal(p);
p.x *= GameHolderSun.scaleValue;
p.y *= GameHolderSun.scaleValue;

return p;

确定交点:

var p:Point = determineLineIntersection(_laser.get2ndLastPoint(), _laser.getLastPoint(), _reflectors[i].lineStart, _reflectors[i].lineEnd);
if(p != null){
    _laser.addNewLinePoint(p, _reflectors[i].rotation);
}

我在网上抓取的直线交点函数:

private function determineLineIntersection(A:Point, B:Point, E:Point, F:Point,as_seg:Boolean=true):Point 
    {   
        var ip:Point;
        var a1:Number;
        var a2:Number;
        var b1:Number;
        var b2:Number;
        var c1:Number;
        var c2:Number;

        a1= B.y-A.y;
        b1= A.x-B.x;
        c1= B.x*A.y - A.x*B.y;
        a2= F.y-E.y;
        b2= E.x-F.x;
        c2= F.x*E.y - E.x*F.y;

        var denom:Number=a1*b2 - a2*b1;
        if (denom == 0) {
            return null;
        }

        ip=new Point();
        ip.x=(b1*c2 - b2*c1)/denom;
        ip.y=(a2*c1 - a1*c2)/denom;
        ip.x *= GameHolderSun.scaleValue;
        ip.y *= GameHolderSun.scaleValue;

        if(as_seg)
        {
            if(Math.pow(ip.x - B.x, 2) + Math.pow(ip.y - B.y, 2) > Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2)) return null;
            if(Math.pow(ip.x - A.x, 2) + Math.pow(ip.y - A.y, 2) > Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2)) return null;
            if(Math.pow(ip.x - F.x, 2) + Math.pow(ip.y - F.y, 2) > Math.pow(E.x - F.x, 2) + Math.pow(E.y - F.y, 2)) return null;
            if(Math.pow(ip.x - E.x, 2) + Math.pow(ip.y - E.y, 2) > Math.pow(E.x - F.x, 2) + Math.pow(E.y - F.y, 2)) return null;
        }

        return ip;
    }

希望有人能帮忙!!如果需要,我可以提供更多信息!!

最佳答案

我认为您的问题是 DPI,至少如果您正在设置 applicationDPIStage 值不补偿强制 DPI 更改。

要解决这个问题,您有两个选择:

1) 对于 stage.mouseX/mouseYstage.stageHeight/Width,您可以只使用 FlexGlobals.topLevelApplication.systemManager 属性。我相信 SystemManager 有一个 mouseX/mouseY 属性,您可以在 screen 属性中找到新的宽度/高度

2) 您自己负责 DPI 更改。这样做相对简单。对于使用 localToGlobal,我认为这是您必须要做的。

var x:Number = 200; //this number is in default DPI size
var appDPI:Number = FlexGlobals.topLevelApplication.applicationDPI;
var deviceDPI:Number = Capabilities.screenDPI; //actual DPI of device

//Adobe doesn't use the actual DPI, they use either 160, 240, or 320 
//and use ranges to determine which maps where
if ( deviceDPI < 200 ) {
    deviceDPI = 160;
}
else if ( deviceDPI >= 200 && deviceDPI < 280 ) {
    deviceDPI = 240;
}
else if ( deviceDPI >= 280 ) {
    deviceDPI = 320;
}

var newX:Number = x / ( deviceDPI / appDPI );

强烈建议您创建一个 Util 类并将其放入一个(可能是静态的)函数中,因为您最终可能会经常使用它。 X var 可以是任何数字,只要不针对 DPI 变化进行调整即可。

希望对您有所帮助。七月份时,我一直在努力弄清楚为什么我的 stage.stageWidth 和 stage.stageHeight 值不正确。

关于ios - 本地到全局 Adob​​e AIR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12828114/

相关文章:

ios - 自定义表格 View 标题的左上角和右上角

apache-flex - 使用Flex 3从SWF创建EXE而不需要AIR?

android - flash 文件没有显示在屏幕上?

python - Boxee.tv IPTV 软件是用哪种语言开发的?

windows - 使用 flex 播放来自 Windows 共享的视频

iphone - 如何更改iphone sdk中标签栏的样式

ios - 如何在 UIDatePicker 中更改日期格式

ios - XCode 中 ios 应用程序的确切构建过程是什么?

apache-flex - Flex 中数组和数组集合的区别

apache-flex - 如何在 Actionscript 3 中显示确认消息?