  <?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Athanazio &#187; sprite</title>
	<atom:link href="http://www.athanazio.com/tag/sprite/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.athanazio.com</link>
	<description>Nada é Simples, Mas Tudo é Possível</description>
	<lastBuildDate>Thu, 01 Dec 2011 03:47:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>android game &#8211; imagem e som</title>
		<link>http://www.athanazio.com/2009/11/21/android-game-imagem-e-som/</link>
		<comments>http://www.athanazio.com/2009/11/21/android-game-imagem-e-som/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 20:17:03 +0000</pubDate>
		<dc:creator>athanazio</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programacao]]></category>
		<category><![CDATA[.ogg]]></category>
		<category><![CDATA[.png]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[effect]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[soundtrack]]></category>
		<category><![CDATA[sprite]]></category>

		<guid isPermaLink="false">http://www.athanazio.com/?p=2315</guid>
		<description><![CDATA[Opa ! apos algumas idas e vindas no codigo, as coisas começam a se arrumar hehehehe, nesta versão já esta resolvida a exibição de imagem a partir do nome da imagem, e execução de som no formato ogg, tanto no loop como um som a partir de um evento do usuário. Apesar da recomendação do [...]]]></description>
			<content:encoded><![CDATA[<div id="HOTWordsTxt" name="HOTWordsTxt"><p><a href="http://www.athanazio.com/wp-content/uploads/2009/11/android-show-image.png"><img src="http://www.athanazio.com/wp-content/uploads/2009/11/android-show-image-450x300.png" alt="android show image" title="android show image" width="450" height="300" class="alignnone size-medium wp-image-2316" /></a><br />
Opa ! apos algumas idas e vindas no codigo, as coisas começam a se arrumar hehehehe, nesta versão já esta resolvida a exibição de imagem a partir do nome da imagem, e execução de som no formato ogg, tanto no loop como um som a partir de um evento do usuário.</p>
<p>Apesar da recomendação do SDK seja de acessar os arquivos de midia através do resource ID criado na classe R, eu estou construindo as classes usando o nome do resource para poder expandir a programação do jogo para uma lingaguem de script, e usar o java como uma camada de abstração do jogo.</p>
<p>Vamos ao codigo e alguns comentarios sobre cada um :</p>
<p><strong>GameActivity </strong>- ganhou uma nova chamada para determinar que volume o jogo vai usar, setVolumeControlStream(AudioManager.STREAM_MUSIC) assim o jogo fica com o mesmo volume que estiver acertado para a musica, alem disto o metodo onDestroy() chama o novo metodo release() da view que vai se encarregar de liberar recursos e em especial mandar os audios se calarem <img src='http://www.athanazio.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: java; title: ; notranslate">
package com.athanazio.android.showimage;

import android.app.Activity;
import android.media.AudioManager;
import android.os.Bundle;
import android.view.Window;

public class GameActivity extends Activity {
	private GameView view;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setVolumeControlStream(AudioManager.STREAM_MUSIC);

		view = new GameView(this, getResources());
		setContentView(view);
	}

	protected void onDestroy() {
		super.onDestroy();
		view.release();
	}

}
</pre>
<p><strong>GameView</strong> &#8211; usa as classes Sprite e Audio para exibir imagens e tocar audio, poucas mudanças comparando com a versão anterior.</p>
<pre class="brush: java; title: ; notranslate">
package com.athanazio.android.showimage;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

public class GameView extends View implements Runnable {

	private static final String TAG = &quot;GAME VIEW&quot;;

	private static final int INTERVAL = 10;
	private Paint cPaint;

	private boolean running = true;

	FPSCounter fps;

	private Sprite background;
	private Sprite cloud;

	private Audio soundtrack;
	private Audio touch;

	public GameView(Context context, Resources resources) {
		super(context);

		String packageName = getClass().getPackage().getName();

		background = new Sprite(resources, packageName, &quot;background&quot;);
		cloud = new Sprite(resources, packageName, &quot;cloud&quot;);
		cloud.setCenterAtMiddle();

		soundtrack = new Audio(resources, packageName, &quot;soundtrack&quot;);
		touch = new Audio(resources, packageName, &quot;cowbell&quot;);

		soundtrack.setLooping(true);
		soundtrack.play();

		cPaint = new Paint();
		setFocusable(true);
		setClickable(true);
		setLongClickable(true);

		fps = new FPSCounter();

		// Set the background
		this.setBackgroundColor(Color.WHITE);
		Log.i(TAG, &quot;game view created&quot;);

		Thread monitorThread = new Thread(this);
		monitorThread.setPriority(Thread.MIN_PRIORITY);
		monitorThread.start();
	}

	public void draw(Canvas canvas) {
		super.draw(canvas);

		background.draw(canvas);
		cloud.draw(canvas);

		cPaint.setColor(Color.WHITE);
		canvas.drawText(fps.getFPS(), 20, 20, cPaint);
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		return super.onKeyUp(keyCode, event);
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		boolean handled = false;
		Log.i(TAG, &quot;key down&quot;);
		float x = cloud.getX();
		float y = cloud.getY();

		if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
			y = y - 5;
			handled = true;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
			y = y + 5;
			handled = true;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
			x = x - 5;
			handled = true;
		} else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
			x = x + 5;
			handled = true;
		}

		cloud.move(x, y);
		return handled;
	}

	public boolean onTouchEvent(MotionEvent event) {
		cloud.setX(event.getRawX());
		cloud.setY(event.getRawY());
		Log.i(TAG, &quot;on touch&quot;);

		touch.play();
		return super.onTouchEvent(event);
	}

	public void run() {
		while (running) {
			try {
				Thread.sleep(INTERVAL);
			} catch (InterruptedException e) {
				Log.e(TAG, &quot;main loop finished&quot;);
			}
			update();
			postInvalidate();
		}
	}

	private void update() {
		fps.update();

	}

	public void release() {
		running = false;
		soundtrack.release();
		touch.release();
	}

}
</pre>
<p><strong>Sprite</strong> &#8211; esta eh responsavel por exibir imagens na tela, uma atenção especial deve ser dada ao recurso de determinar o centro da imagem, isto eh muito util para responder eventos de mouse, e por exemplo posicionar a imagem centralizada onde o usuário clicou, o método setCenterAtMiddle() calcula a posição para desenhar baseado na largura e altura da imagem. e por default o centro da imagem eh no 0,0.</p>
<pre class="brush: java; title: ; notranslate">
package com.athanazio.android.showimage;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;

public class Sprite {

	private static final String TAG = &quot;GAME SPRITE&quot;;
	private Bitmap bitmap;
	private float x;
	private float y;
	private float centerX;
	private float centerY;
	private float drawX;
	private float drawY;
	private Paint paint;

	public Sprite(Resources resources, String packageName, String name) {
		String logFileName = packageName + &quot; &quot; + name;
		Log.i(TAG, &quot;loading image : &quot; + logFileName);

		int id = resources.getIdentifier(name, &quot;drawable&quot;, packageName);
		bitmap = BitmapFactory.decodeResource(resources, id);
		centerX = 0;
		centerY = 0;

		setX(0);
		setY(0);

		this.paint = new Paint();
	}

	public void draw(Canvas canvas) {
		canvas.drawBitmap(bitmap, drawX, drawY, paint);
	}

	public void move(float x, float y) {
		setX(this.x + x);
		setY(this.y + y);
	}

	public void setCenterAtMiddle(){
		centerX = bitmap.getWidth() / 2F;
		centerY = bitmap.getHeight() / 2F;
	}

	public float getX() {
		return x;
	}

	public void setX(float x) {
		this.x = x;
		drawX = this.x - centerX;
	}

	public float getY() {
		return y;
	}

	public void setY(float y) {
		this.y = y;
		drawY = this.y - centerY;
	}

}
</pre>
<p><strong>Audio</strong> &#8211; esta classe esconde a criação de um MediaPlayer para cada som que se deseja tocar, imagino que o melhor cenário seria ter uma classe para som em loop que usaria um MediaPlayer, e outra classe para efeitos sonoros que tocaria no maximo N efeitos ao mesmo tempo, mantendo menos objetos MediaPlayer na memória.</p>
<p>Mas a implementação atual mantém um MediaPlayer para cada som, observar que o resource ID é recuperado pelo nome do arquivo usando o metodo resources.getIdentifier(name, &#8220;raw&#8221;, packageName) e a partir do resource ID podemos recuperar o AssetFileDescriptor com a chamada resources.openRawResourceFd(id), of file descriptor é usado para inicializar o MediaPlayer com os detalhes necessários a execução do som.</p>
<pre class="brush: java; title: ; notranslate">
package com.athanazio.android.showimage;

import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.media.MediaPlayer;
import android.util.Log;

/**
 * Audio resources abstraction
 *
 * @author athanazio
 * @see &quot;http://developer.android.com/intl/fr/guide/topics/media/index.html&quot;
 * @see &quot;http://developer.android.com/intl/fr/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States&quot;
 */
public class Audio {

	private static final String TAG = &quot;GAME AUDIO&quot;;
	private MediaPlayer player;
	private boolean ready;
	private int id;
	private AssetFileDescriptor afd;

	/**
	 *
	 * @param resources
	 * @param context
	 * @param packageName
	 * @param name
	 *
	 */
	public Audio(Resources resources, String packageName, String name) {
		String logFileName = packageName + &quot; &quot; + name;
		Log.i(TAG, &quot;loading audio : &quot; + logFileName);

		ready = false;
		player = new MediaPlayer();

		try {
			this.id = resources.getIdentifier(name, &quot;raw&quot;, packageName);
			this.afd = resources.openRawResourceFd(id);

			Log.i(TAG, &quot;loading audio : &quot; + logFileName + &quot; id:&quot; + id);

			player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
			player.setLooping(false);
			player.prepare();

			// reset the player after completion
			player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
				public void onCompletion(MediaPlayer mp) {
					try {
						player.reset();
						player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
						player.prepare();
					} catch (Exception e) {
						Log.e(TAG, &quot;error resetting the media player&quot;);
						e.printStackTrace();
					}
				}
			});

			ready = true;

		} catch (Exception e) {
			Log.e(TAG, &quot;ERROR loading audio : &quot; + logFileName);
			e.printStackTrace();
		}
	}

	public void play() {
		if (ready) {
			player.start();
		} else {
			Log.i(TAG, &quot;the player is not ready.&quot;);
		}
	}

	public void setLooping(boolean b) {
		player.setLooping(b);
	}

	public void release() {
		player.stop();
		player.release();
	}

}
</pre>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.athanazio.com/2009/11/21/android-game-imagem-e-som/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c# xna movendo o sprite na tela</title>
		<link>http://www.athanazio.com/2009/01/10/c-xna-movendo-o-sprite-na-tela/</link>
		<comments>http://www.athanazio.com/2009/01/10/c-xna-movendo-o-sprite-na-tela/#comments</comments>
		<pubDate>Sat, 10 Jan 2009 19:45:56 +0000</pubDate>
		<dc:creator>athanazio</dc:creator>
				<category><![CDATA[games]]></category>
		<category><![CDATA[programacao]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[move]]></category>
		<category><![CDATA[sprite]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.athanazio.com/?p=1538</guid>
		<description><![CDATA[bem ainda não é quase nada, mas pelo menos os sprite esta se movendo na tela =) Tem a classe Sprite que eh uma variação da classe usada em http://www.xnadevelopment.com/tutorials/thewizard/theWizard.shtml e a classe principal do jogo em si Game1. o que acontece eh que no método update() da classe do jogo verifico o estado do [...]]]></description>
			<content:encoded><![CDATA[<div id="HOTWordsTxt" name="HOTWordsTxt"><p>bem ainda não é quase nada, mas pelo menos os sprite esta se movendo na tela =)<br />
<a href="http://www.athanazio.com/wp-content/uploads/2009/01/movendo-o-sprite.jpg"><img src="http://www.athanazio.com/wp-content/uploads/2009/01/movendo-o-sprite-384x300.jpg" alt="" title="movendo-o-sprite" width="384" height="300" class="alignnone size-medium wp-image-1539" /></a></p>
<p>Tem a classe Sprite que eh uma variação da classe usada em <a href="http://www.xnadevelopment.com/tutorials/thewizard/theWizard.shtml">http://www.xnadevelopment.com/tutorials/thewizard/theWizard.shtml</a> e a classe principal do jogo em si Game1.</p>
<p>o que acontece eh que no método update() da classe do jogo verifico o estado do teclado e de acordo com este estado chamo métodos do objeto chicken para mover pela tela.</p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using Microsoft.Xna.Framework;<br />
using Microsoft.Xna.Framework.Audio;<br />
using Microsoft.Xna.Framework.Content;<br />
using Microsoft.Xna.Framework.GamerServices;<br />
using Microsoft.Xna.Framework.Graphics;<br />
using Microsoft.Xna.Framework.Input;<br />
using Microsoft.Xna.Framework.Media;<br />
using Microsoft.Xna.Framework.Net;<br />
using Microsoft.Xna.Framework.Storage;</p>
<p>namespace ChickenMaze<br />
{<br />
    public class Game1 : Microsoft.Xna.Framework.Game<br />
    {<br />
        GraphicsDeviceManager graphics;<br />
        SpriteBatch spriteBatch;<br />
        Sprite chicken;</p>
<p>        public Game1()<br />
        {<br />
            graphics = new GraphicsDeviceManager(this);<br />
            Content.RootDirectory = &#8220;Content&#8221;;<br />
        }</p>
<p>        protected override void Initialize()<br />
        {<br />
            chicken = new Sprite(&#8220;chicken&#8221;);<br />
            base.Initialize();<br />
        }</p>
<p>        protected override void LoadContent()<br />
        {<br />
            spriteBatch = new SpriteBatch(GraphicsDevice);<br />
            chicken.LoadContent(this.Content);<br />
        }</p>
<p>        protected override void UnloadContent()<br />
        {<br />
        }</p>
<p>        protected override void Update(GameTime gameTime)<br />
        {<br />
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)<br />
                this.Exit();</p>
<p>            UpdateKeyboard(Keyboard.GetState());<br />
            base.Update(gameTime);<br />
        }</p>
<p>        public void UpdateKeyboard(KeyboardState keyboardState)<br />
        { </p>
<p>            if( keyboardState.IsKeyDown(Keys.Left)){<br />
                chicken.Left();<br />
            }</p>
<p>            if (keyboardState.IsKeyDown(Keys.Right))<br />
            {<br />
                chicken.Right();<br />
            }</p>
<p>            if (keyboardState.IsKeyDown(Keys.Down))<br />
            {<br />
                chicken.Down();<br />
            }</p>
<p>            if (keyboardState.IsKeyDown(Keys.Up))<br />
            {<br />
                chicken.Up();<br />
            }</p>
<p>        }</p>
<p>        protected override void Draw(GameTime gameTime)<br />
        {<br />
            GraphicsDevice.Clear(Color.CornflowerBlue);<br />
            spriteBatch.Begin();<br />
            chicken.Draw(spriteBatch);<br />
            spriteBatch.End();<br />
            base.Draw(gameTime);<br />
        }<br />
    }<br />
}</p>
<p>e na classe Sprite esta a carga da imagem e posicionamento da imagem na hora do desenho.</p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Text;</p>
<p>using Microsoft.Xna.Framework;<br />
using Microsoft.Xna.Framework.Content;<br />
using Microsoft.Xna.Framework.Graphics;</p>
<p>namespace ChickenMaze<br />
{<br />
    class Sprite<br />
    {<br />
        private int speed = 5;<br />
        private string assetName;</p>
<p>        public Sprite(string assetName)<br />
        {<br />
            this.assetName = assetName;<br />
        }</p>
<p>        //The current position of the Sprite<br />
        public Vector2 Position = new Vector2(0,0);</p>
<p>        //The texture object used when drawing the sprite<br />
        private Texture2D mSpriteTexture;</p>
<p>        //Load the texture for the sprite using the Content Pipeline<br />
        public void LoadContent(ContentManager theContentManager)<br />
        {<br />
            mSpriteTexture = theContentManager.Load<Texture2D>(this.assetName);<br />
        }</p>
<p>        //Draw the sprite to the screen<br />
        public void Draw(SpriteBatch theSpriteBatch)<br />
        {<br />
            theSpriteBatch.Draw(mSpriteTexture, Position, Color.White);<br />
        }</p>
<p>        public void Left()<br />
        {<br />
            Position.X -= speed;<br />
        }</p>
<p>        public void Right()<br />
        {<br />
            Position.X += speed;<br />
        }</p>
<p>        public void Down()<br />
        {<br />
            Position.Y += speed;<br />
        }</p>
<p>        public void Up()<br />
        {<br />
            Position.Y -= speed;<br />
        }</p>
<p>    }<br />
}</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.athanazio.com/2009/01/10/c-xna-movendo-o-sprite-na-tela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>c# xna, desenhando o sprite na tela</title>
		<link>http://www.athanazio.com/2009/01/06/c-xna-desenhando-o-sprite-na-tela/</link>
		<comments>http://www.athanazio.com/2009/01/06/c-xna-desenhando-o-sprite-na-tela/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 02:23:39 +0000</pubDate>
		<dc:creator>athanazio</dc:creator>
				<category><![CDATA[games]]></category>
		<category><![CDATA[programacao]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C Sharp]]></category>
		<category><![CDATA[draw]]></category>
		<category><![CDATA[hello world]]></category>
		<category><![CDATA[sprite]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.athanazio.com/?p=1510</guid>
		<description><![CDATA[arre o primeiro sprite na tela a gente nunca esquece !! olha que belo o codigo !!]]></description>
			<content:encoded><![CDATA[<div id="HOTWordsTxt" name="HOTWordsTxt"><p>arre o primeiro sprite na tela a gente nunca esquece !!<br />
<a href="http://www.athanazio.com/wp-content/uploads/2009/01/windows_game1.jpg"><img src="http://www.athanazio.com/wp-content/uploads/2009/01/windows_game1-150x150.jpg" alt="" title="windows_game1" width="150" height="150" class="alignnone size-thumbnail wp-image-1511" /></a></p>
<p>olha que belo o codigo !!</p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using Microsoft.Xna.Framework;<br />
using Microsoft.Xna.Framework.Audio;<br />
using Microsoft.Xna.Framework.Content;<br />
using Microsoft.Xna.Framework.GamerServices;<br />
using Microsoft.Xna.Framework.Graphics;<br />
using Microsoft.Xna.Framework.Input;<br />
using Microsoft.Xna.Framework.Media;<br />
using Microsoft.Xna.Framework.Net;<br />
using Microsoft.Xna.Framework.Storage;</p>
<p>namespace WindowsGame1<br />
{</p>
<p>    public class Game1 : Microsoft.Xna.Framework.Game<br />
    {<br />
        GraphicsDeviceManager graphics;<br />
        SpriteBatch spriteBatch;</p>
<p>        Vector2 mPosition = new Vector2(0, 0);</p>
<p>        Texture2D mSpriteTexture;</p>
<p>        public Game1()<br />
        {<br />
            graphics = new GraphicsDeviceManager(this);<br />
            Content.RootDirectory = &#8220;Content&#8221;;<br />
        }</p>
<p>        protected override void Initialize()<br />
        {<br />
            base.Initialize();<br />
        }</p>
<p>        protected override void LoadContent()<br />
        {<br />
            spriteBatch = new SpriteBatch(GraphicsDevice);<br />
            mSpriteTexture = this.Content.Load<Texture2D>(&#8220;alien&#8221;);<br />
        }</p>
<p>        protected override void UnloadContent()<br />
        {<br />
        }</p>
<p>        protected override void Update(GameTime gameTime)<br />
        {<br />
            // Allows the game to exit<br />
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)<br />
                this.Exit();</p>
<p>            base.Update(gameTime);<br />
        }</p>
<p>        protected override void Draw(GameTime gameTime)<br />
        {<br />
            GraphicsDevice.Clear(Color.CornflowerBlue);</p>
<p>            spriteBatch.Begin();<br />
            spriteBatch.Draw(mSpriteTexture, mPosition, Color.White);<br />
            spriteBatch.End();</p>
<p>            base.Draw(gameTime);<br />
        }<br />
    }<br />
}</p>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.athanazio.com/2009/01/06/c-xna-desenhando-o-sprite-na-tela/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

