zoukankan      html  css  js  c++  java
  • Starling中实现形状不规则的卷轴地图滚动

        Starling默认的显示对象都是四边形,但我们可以改变顶点位置和纹理的UV坐标,来实现不规则形状的显示,再配合动画的话,可以实现三角形卷轴地图滚动的效果。

        下面是代码实现过程:

      package test
         {
      import flash.display.Bitmap;
      import flash.geom.Point;
      import flash.geom.Rectangle;

      import starling.animation.IAnimatable;
      import starling.display.Image;
      import starling.textures.Texture;
      import starling.utils.VertexData;
      /**
      * 继承Image类,但修改第2个顶点坐标,改为三角形显示
      * 实现IAnimatable接口,控制UV坐标,实现卷轴滚动效果
      * @author shaorui
      */
      public class TrangleImage extends Image implements IAnimatable
      {
      /**向下*/
      public var direction:String = "down";
      /**
      * 根据传入的位图对象创建一个包含纹理的Image。
      * @param bitmap 位图对象
      * @return
      */
      public static function fromBitmap(bitmap:Bitmap,vetexIndex:int=1):TrangleImage
      {
        var tex:Texture = Texture.fromBitmap(bitmap);
        tex.repeat = true;
        return new TrangleImage(tex,vetexIndex);
      }
      /**@private*/
      public function TrangleImage(texture:Texture,vetexIndex:int=1)
      {
        super(texture);
      if (texture)
      {
        var frame:Rectangle = texture.frame;
        var w:Number = frame ? frame.width/2 : texture.width/2;

         var h:Number = frame ? frame.height/2 : texture.height/2;
        //重置纹理的UV坐标
        resetTexCoords(vetexIndex);
        //将第二个顶点(索引是1)移动到中心点的位置
        mVertexData.setPosition(vetexIndex,width*0.5,height*0.5);
        //因为只需要显示整个纹理1/4的区域,索引将宽度和高度都除以2
        width = w;
        height = h;
       onVertexDataChanged();
      }
      else
      {
        throw new ArgumentError("Texture cannot be null");
      }
      }
      /**设置纹理的UV坐标为整个纹理左下角1/4的区域*/
      private function resetTexCoords(vetexIndex:int):void
      {
        mVertexData.setTexCoords(0, 0.0, 0.5);
        mVertexData.setTexCoords(1, 0.5, 0.5);
        mVertexData.setTexCoords(2, 0.0, 1.0);
        mVertexData.setTexCoords(3, 0.5, 1.0);
        if(vetexIndex == 1)
        mVertexData.setTexCoords(1, 0.25, 0.75);//注意这个点,因为是三角形,这个点也在1/4区域的中心点上
        else if(vetexIndex == 2)
        mVertexData.setTexCoords(2, 0.25, 0.75);
      }
      /**时间驱动的动画*/
      public function advanceTime(time:Number):void
      {
      //将4个点的UV坐标累加或累减,实现动画效果
        for (var i:int = 0; i < 4; i++)
        {
          var cp:Point = this.getTexCoords(i);
          if(direction == "down")
          this.setTexCoords(i,new Point(cp.x+0.001,cp.y-0.001));
        else
          this.setTexCoords(i,new Point(cp.x-0.001,cp.y+0.001));
        }
      }

      }
      }

         使用方式:

      [Embed(source="../assets/bg.jpg")]
      protected const bgClass:Class;
      var img:TrangleImage = TrangleImage.fromBitmap(new bgClass() as Bitmap);
      addChild(img);
      Starling.juggler.add(img);
      img = TrangleImage.fromBitmap(new bgClass() as Bitmap,2);
      img.direction = "up";
      addChild(img);
      Starling.juggler.add(img);

           

  • 相关阅读:
    7.18学习日志
    7.16学习日志
    5 Things They Never Tell You About Making iPhone Apps
    MantisBT
    25款实用的桌面版博客编辑器
    【转】如何学会600多种编程语言
    开发者如何提升和推销自己
    CleanMyMac 1.10.8
    VMWARE FUSION 6 KEY
    cocos2dx shader
  • 原文地址:https://www.cnblogs.com/atong/p/2853549.html
Copyright © 2011-2022 走看看