rodrigolopezpeker

GTileMap2 (fix camera zoom & rotation)

Jul 29th, 2013
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package {
  2.     import com.genome2d.components.GCamera;
  3.     import com.genome2d.components.renderables.GTile;
  4.     import com.genome2d.components.renderables.GTileMap;
  5.     import com.genome2d.core.GNode;
  6.     import com.genome2d.g2d;
  7.  
  8.     use namespace g2d;
  9.  
  10.     public class GTileMap2 extends GTileMap {
  11.  
  12.         public function GTileMap2(p_node: GNode) {
  13.             super(p_node);
  14.         }
  15.  
  16.         override public function getTileAt(p_x: Number, p_y: Number, p_camera: GCamera = null): GTile {
  17.             if (p_camera == null) p_camera = node.core.defaultCamera;
  18.  
  19.             var czoom: Number = p_camera.zoom;
  20.  
  21.             p_x -= p_camera.rViewRectangle.x + p_camera.rViewRectangle.width / 2;
  22.             p_y -= p_camera.rViewRectangle.y + p_camera.rViewRectangle.height / 2;
  23.  
  24.             var mapHalfWidth: Number = _iTileWidth * _iWidth * .5;
  25.             var mapHalfHeight: Number = _iTileHeight * _iHeight * (_bIso ? .25 : .5);
  26.  
  27.             mapHalfWidth *= czoom;
  28.             mapHalfHeight *= czoom;
  29.  
  30.             var firstX: Number = -mapHalfWidth + (_bIso ? _iTileWidth / 2 : 0);
  31.             var firstY: Number = -mapHalfHeight + (_bIso ? _iTileHeight / 2 : 0);
  32.  
  33.             var tx: Number = ( p_camera.cNode.cTransform.nWorldX - cNode.cTransform.nWorldX ) * czoom + p_x;
  34.             var ty: Number = ( p_camera.cNode.cTransform.nWorldY - cNode.cTransform.nWorldY ) * czoom + p_y;
  35.  
  36.             // adjust camera rotation.
  37.             var ang: Number = Math.atan2(ty, tx) - p_camera.cNode.cTransform.nWorldRotation;
  38.             var dist: Number = Math.sqrt(tx * tx + ty * ty);
  39.             tx = Math.cos(ang) * dist;
  40.             ty = Math.sin(ang) * dist;
  41.  
  42.             var indexX: int = (tx - firstX) / ( _iTileWidth * czoom );
  43.             var indexY: int = (ty - firstY) / ( _iTileHeight * czoom );
  44.  
  45.             if (indexX < 0 || indexX >= _iWidth || indexY < 0 || indexY >= _iHeight) return null;
  46.             return _aTiles[indexY * _iWidth + indexX];
  47.         }
  48.     }
  49. }
Advertisement
Add Comment
Please, Sign In to add comment