首页 > 其他分享 >Starling常见问题解决办法

Starling常见问题解决办法

时间:2023-01-05 17:04:54浏览次数:39  
标签:解决办法 常见问题 setTexCoords width Starling var new bird stage


​​Starling常见问题解决办法​​


来自:​​智慧 + 毅力 = 无所不能​​

 

1、Android设备上阻止用户按下后退后的行为

侦听按键事件



Starling常见问题解决办法_Image



//阻止后退行为
view.stage.addEventListener(KeyboardEvent.KEY_UP,keyboardHandler);
/**
* 当用户按下后退,强制程序关闭
*/
protected function keyboardHandler(event:KeyboardEvent):void
{
if(event.keyCode == Keyboard.BACK)
{
event.preventDefault();
event.stopPropagation();
NativeApplication.nativeApplication.exit();
}
}



Starling常见问题解决办法_Image



怎么让程序只能横着,不能竖着。但是可以翻转

首先在XML设置中,不要启动landscape模式,就是像下面这样注释掉就可以:

 



<!--<aspectRatio>landscape</aspectRatio>-->



然后打开允许自动翻转:



<autoOrients>true</autoOrients>



然后在应用启动之后,用代码设置为横屏模式:



stage.setOrientation(StageOrientation.ROTATED_LEFT);



然后侦听屏幕翻转事件,阻止不需要的模式:



Starling常见问题解决办法_Image



//only support landscape mode
stage.addEventListener(StageOrientationEvent.ORIENTATION_CHANGING, onOrientationChanging );
/**only support landscape mode*/
private function onOrientationChanging(event:StageOrientationEvent):void
{
// If the stage is about to move to an orientation we don't support, lets prevent it
// from changing to that stage orientation.
if(event.afterOrientation == StageOrientation.UPSIDE_DOWN || event.afterOrientation == StageOrientation.DEFAULT )
event.preventDefault();
}



Starling常见问题解决办法_Image



Starling屏幕自适应方法
首先获得手机屏幕的宽高,也就是你要显示的范围的大小
//竖屏
// private var screenWidth:int = stage.fullScreenWidth;
// private var screenHeight:int = stage.fullScreenHeight;
//横屏
private var screenWidth:int = stage.fullScreenHeight;
private var screenHeight:int = stage.fullScreenWidth;
注意的是横屏和竖屏宽高赋值要调转
2>获得1个长方形的显示空间的对象
private var viewPort:Rectangle = new Rectangle(0, 0, screenWidth, screenHeight)
把要显示的starling初始化时候把长方形对象插入到第三个参数
  myStarling = new Starling(MainGame,stage,viewPort);
设置starling中要显示画面的大小
myStarling.stage.stageWidth = 480;
   myStarling.stage.stageHeight = 320;


完成!

 

3、两个手机应用可以互相调用吗

在使用Adobe AIR进行移动应用开发的时候,我们或许会有这样的需求:假如我们开发的是两个应用(A和B),同时安装到手机上,那么能否在A中呼叫B并传递参数呢(或者反过来B操作后,再把参数返回给A)。

目前AIR还没有直接呼叫某个APP的API,但我们可以使用手机特有的特性来实现。可以使用ANE,借助原生代码来实现,也可以使用自定义的URI来实现。具体教程参见:

Adobe AIR研究小组:Adobe AIR移动App的互相调用实现方式

更新:在Adobe AIR 3.5 beta中已经原生添加了这个特性

4、AIR移动应用对图标尺寸的要求是什么?

答:主要是看发布平台对图标的尺寸要求,以目前应用最广泛的iOS和Android平台的要求为准,我们应该准备的图片尺寸是:

  • Android: 24*24,32*32,36*36,48*48,72*72
  • iOS: 29*29,48*48,57*57,58*58,72*72,96*96,114*114,144*144,512*512

5、AIR for iOS应用如何限定最低系统版本

答:如果您的应用使用到了最新的iOS系统才支持的功能,就必须在应用中做一些限定了,防止不符合条件要求的系统安装了应用而导致无法运行。

方式是在XML配置中增加:



<key>MinimumOSVersion</key>
<string>5.0.1</string>



6、Starling中如何裁切纹理

答:通过Image.setTexCoords()方法,可以改变四边形顶点对于的纹理的UV坐标(取值范围0-1),这样可以实现对纹理的一个矩形区域的裁切。比如我们只需要显示纹理右下方1/4的区域,可以这样设置:



Starling常见问题解决办法_Image



img.setTexCoords(0,new Point(0.5,0.5));
img.setTexCoords(1,new Point(1,0.5));
img.setTexCoords(2,new Point(0.5,1));
img.setTexCoords(3,new Point(1,1));

//TIPS: Starling中两个三角形组成一个四边形,而四边形的4个顶点的索引以及其位置是:
0 1
2 3



Starling常见问题解决办法_Image



7、如何在Starling中平铺图片?

答:设置texture.repeat为true,并且设置image的UV坐标。

代码示例:



Starling常见问题解决办法_Image



var birdTex:Texture = Texture.fromBitmap(new birdBMPClass() as Bitmap);
birdTex.repeat = true;
var bird:Image = new Image(birdTex);
bird.width = 960;
bird.height = 640;
bird.setTexCoords(1, new Point(bird.width/birdTex.width, 0));
bird.setTexCoords(2, new Point(0, bird.height/birdTex.height));
bird.setTexCoords(3, new Point(bird.width/birdTex.width, bird.height/birdTex.height));
addChild(bird);



Starling常见问题解决办法_Image



 

8、如何将多个纹理合并成一个纹理?



Starling常见问题解决办法_Image



/**
* 克隆可视对象到一个图片
* @param target 可视目标对象
* @param persistent 指明纹理在经过多次绘制之后是否是持久的
* @return
*/
public static function clone(target:DisplayObject, persistent:Boolean = false):Image
{
if (!target)
{
return null;
}
var texture:RenderTexture = new RenderTexture(target.width, target.height, persistent);
if (target is DisplayObjectContainer)
{
texture.drawBundled(function():void
{
var num:int = DisplayObjectContainer(target).numChildren;
for (var i:int = 0; i < num; i++)
{
texture.draw(DisplayObjectContainer(target).getChildAt(i));
}
});
}
else
{
texture.draw(target);
}
return new Image(texture);
}



Starling常见问题解决办法_Image



 

9、如何解决Starling应用放大之后,图片之间的间隙?

答:这可能是Stage3D在纹理取样时的算法造成的。

方式1:使用TextureSmoothing.NONE。比如:



var image1:TestImage = new TestImage(sAssets.getTexture("test"));
image1.smoothing = TextureSmoothing.NONE;



方式2:设置图像显示区域的偏移量,来避免这个问题:



Starling常见问题解决办法_Image



package
{
import starling.display.Image;
import starling.textures.Texture;
import flash.geom.Point;
import flash.utils.setTimeout;

/**
* 根据缩放,自动调整尺寸的Image
*/
public class TestImage extends Image
{
public static var offset:Number = 0;

public function TestImage(texture:Texture)
{
super(texture);
if(offset>0)
{
setPositions();
}
}

private function setPositions():void
{
var w:Number = super.width+offset;
var h:Number = super.height+offset;
mVertexData.setPosition(0,0-offset,0-offset);
mVertexData.setPosition(1,w,0-offset);
mVertexData.setPosition(2,0-offset,h);
mVertexData.setPosition(3,w,h);
}

/**@override*/
override public function readjustSize():void
{
super.readjustSize();
setPositions();
}
/**@override*/
override public function setTexCoords(vertexID:int, coords:Point):void
{
super.setTexCoords(vertexID,coords);
setPositions();
}
/**@override*/
override public function set width(value:Number):void
{
super.width = value;
setTimeout(setPositions,1);
}
/**@override*/
override public function set height(value:Number):void
{
super.height = value;
setTimeout(setPositions,1);
}

}
}



Starling常见问题解决办法_Image



// 使用
if(viewPort.width>stageWidth)
TestImage.offset = 1;



 

标签:解决办法,常见问题,setTexCoords,width,Starling,var,new,bird,stage
From: https://blog.51cto.com/kenkao/5991511

相关文章