首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >localToGlobal Adobe

localToGlobal Adobe
EN

Stack Overflow用户
提问于 2012-10-10 20:50:25
回答 1查看 286关注 0票数 0

构建Adobe应用程序--似乎与localToGlobal有问题。我一直在跟踪这个来设置我的应用程序的多屏幕大小:

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

但我的localToGlobal似乎总是遇到问题。我在“缩放和对中接口”部分中使用了大部分代码,我的应用程序正在适当地调整应用程序的大小。

我已经转换了所有的localToGlobal调用,并将新的标度值乘以x和y,但是没有得到所需的结果。它在最初的iPhone 4/4s分辨率上仍然工作得很好,但是在3gs分辨率上测试--我的行交叉口不起作用--这特别使用了localToGlobal代码来确定。

以下是呼叫本地点的代码:

代码语言:javascript
复制
var p:Point = localToGlobal(_lineStart);
p = parent.globalToLocal(p);
p.x *= GameHolderSun.scaleValue;
p.y *= GameHolderSun.scaleValue;

return p;

确定交叉口:

代码语言:javascript
复制
var p:Point = determineLineIntersection(_laser.get2ndLastPoint(), _laser.getLastPoint(), _reflectors[i].lineStart, _reflectors[i].lineEnd);
if(p != null){
    _laser.addNewLinePoint(p, _reflectors[i].rotation);
}

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

代码语言:javascript
复制
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;
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-10 23:53:08

我相信你的问题是新闻部,至少如果你正在设置applicationDPIStage值并不补偿新闻部的强制更改。

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

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

2)你自己负责新闻部的变更。这样做比较简单。对于使用localToGlobal,我认为这是您必须做的。

代码语言:javascript
复制
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可以是任何数字,只要它没有根据DPI的变化进行调整。

希望这能有所帮助。7月份,我在一块石头上拼命想弄清楚为什么我的stage.stageWidth和stage.stageHeight值是不正确的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12828114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档