2012-10-10 224 views
0

構建Adobe AIR應用程序 - 似乎與localToGlobal有關。我一直在關注這個設置我的應用程序的多個屏幕尺寸:localToGlobal Adob​​e AIR

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

但我似乎總是在運行與我的localToGlobal的問題。我已經使用了「縮放和居中接口」部分中的大部分代碼,我的應用正在適當調整應用大小。

我已經轉換了所有的localToGlobal調用,並將新的比例值乘以x和y,但沒有得到所需的結果。它仍然可以在原始的iPhone 4/4s分辨率下正常工作,但是我的Line Intersections的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; 
    } 

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

回答

2

我相信你的問題是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); 

高度建議你創建一個實用程序類,並扔到(也許靜態)功能,你將有可能最終常常使用它這一點。 X var可以是任何數字,只要它不針對DPI更改進行調整即可。

希望有所幫助。我試圖找出爲什麼我的stage.stageWidth和stage.stageHeight值在7月份不正確的情況下在我的頭上搖了搖頭。

+1

實際上,您可以通過使用this.root.scaleX – Exort

+0

獲取舞臺的DPI縮放比例因爲某些原因,我的mx.core不包含FlexGlobals:S – Lagoo87

+0

我在Flex SDK 4.6.0上 – Lagoo87