пʼятниця, 15 березня 2013 р.

XNA\MonoGame and StartCoroutine

Everyone who uses Unity3D should know about great thing like StartCoroutine. For everybody else - it's the easy way to implement some logic that should be executed during game without pausing it. OK, time for code. Coroutinemanager
public class CoroutinesManager
{
  private readonly List<IEnumerator> _coroutines = new List<IEnumerator> ();

 public void Start(IEnumerator enumerator)
 {
  _coroutines.Add (enumerator);
 }

 public void Update()
 {
  for (int i = _coroutines.Count - 1; i >= 0; i--) 
  {
   IEnumerator enumerator = _coroutines[i];

   if(!enumerator.MoveNext())
    _coroutines.RemoveAt(i);
  }
 }
}
Example: change color in time
public class Game1 : Game
{
 readonly CoroutinesManager manager = new CoroutinesManager();
 ...
 protected override void Update (GameTime gameTime)
 {
  ...
  if (Keyboard.GetState ().IsKeyDown (Keys.Space))
   manager.Start (ChangeBackgroundColor(gameTime, 10.0f));

  manager.Update();
  ...
 }

 private IEnumerator ChangeBackgroundColor(GameTime gameTime, float duration)
 {
  float timer = 0;

  while(timer < duration)
  {
   timer += (float)gameTime.ElapsedGameTime.TotalSeconds;
   backgroundColor = Color.Lerp(Color.CornflowerBlue, Color.Green, timer / duration);
   yield return null;
  }
 }
}

понеділок, 13 серпня 2012 р.

ViewGroup.getChildStaticTransformation

Do you use method ViewGroup.getChildStaticTransformation? I know we have a new transform API, but only for android 3.0. Let me show you a short example how you can use it.


 public class MyGallery extends Gallery  
 {  
   public MyGallery(Context context)  
   {  
     super(context);  
   }  
   @Override  
   protected boolean getChildStaticTransformation(View child, Transformation t)  
   {  
     float childCenterX = child.getLeft() + child.getWidth() / 2;  
     float centerX = getWidth() / 2;  
     float scale = 1.2f - 0.8f * Math.abs(childCenterX - centerX) / centerX; // some math-magic  
     t.clear();  
     t.getMatrix().setScale(scale, scale, child.getWidth() / 2, child.getHeight() / 2);  
     return true;  
   }
}  
Result