Unable to to create media player usando o Cocos2D

3 respostas
kmunga

Estou estudando a criação de jogos pelo livro "Desenvolvendo jogos para android" do Anderson Leite, porem, apesar de estar fazendo exatamente o que o livro mostra, um erro relacionado ao som persiste.

O erro
07-21 16:52:28.216: I/jogo(916): clickou na tela.
07-21 16:52:28.216: I/Jogo(916): Clickoun no play
07-21 16:52:28.226: V/MediaPlayer(916): constructor
07-21 16:52:28.226: V/SoundPoolThread(916): beginThread
07-21 16:52:28.226: V/MediaPlayer(916): setListener
07-21 16:52:28.226: V/MediaPlayer(916): setDataSource(44, 397263, 31881)
07-21 16:52:28.236: V/SoundPoolThread(916): run
07-21 16:52:28.236: V/SoundPoolThread(916): Got message m=2, mData=1
07-21 16:52:28.236: V/MediaPlayer(916): decode(51, 461017, 31789)
07-21 16:52:28.266: E/MediaPlayer(916): Unable to to create media player
07-21 16:52:28.266: D/MediaPlayer(916): create failed:
07-21 16:52:28.266: D/MediaPlayer(916): java.io.IOException: setDataSourceFD failed.: status=0x80000000
07-21 16:52:28.266: D/MediaPlayer(916): 	at android.media.MediaPlayer.setDataSource(Native Method)
07-21 16:52:28.266: D/MediaPlayer(916): 	at android.media.MediaPlayer.create(MediaPlayer.java:849)
07-21 16:52:28.266: D/MediaPlayer(916): 	at org.cocos2d.sound.SoundEngine.playSound(SoundEngine.java:152)
07-21 16:52:28.266: D/MediaPlayer(916): 	at br.com.casadocodigo.bis.scenes.GameScene.<init>(GameScene.java:56)
07-21 16:52:28.266: D/MediaPlayer(916): 	at br.com.casadocodigo.bis.scenes.GameScene.createGame(GameScene.java:79)
07-21 16:52:28.266: D/MediaPlayer(916): 	at br.com.casadocodigo.bis.controles.MenuButtons.buttonClicked(MenuButtons.java:63)
07-21 16:52:28.266: D/MediaPlayer(916): 	at br.com.casadocodigo.bis.controles.Button.ccTouchesBegan(Button.java:43)
07-21 16:52:28.266: D/MediaPlayer(916): 	at org.cocos2d.events.CCTouchHandler.ccTouchesBegan(CCTouchHandler.java:63)
07-21 16:52:28.266: D/MediaPlayer(916): 	at org.cocos2d.events.CCTouchDispatcher.update(CCTouchDispatcher.java:305)
07-21 16:52:28.266: D/MediaPlayer(916): 	at org.cocos2d.nodes.CCDirector.onDrawFrame(CCDirector.java:646)
07-21 16:52:28.266: D/MediaPlayer(916): 	at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522)
07-21 16:52:28.266: D/MediaPlayer(916): 	at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
07-21 16:52:28.276: W/dalvikvm(916): threadid=11: thread exiting with uncaught exception (group=0x4156d2a0)
07-21 16:52:28.286: E/SoundPool(916): Unable to load sample: (null)
07-21 16:52:28.286: V/SoundPoolThread(916): Got message m=2, mData=2
07-21 16:52:28.286: V/MediaPlayer(916): decode(52, 333568, 31778)
07-21 16:52:28.286: E/AndroidRuntime(916): FATAL EXCEPTION: GLThread 2591
07-21 16:52:28.286: E/AndroidRuntime(916): java.lang.NullPointerException
07-21 16:52:28.286: E/AndroidRuntime(916): 	at org.cocos2d.sound.SoundEngine.playSound(SoundEngine.java:155)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at br.com.casadocodigo.bis.scenes.GameScene.<init>(GameScene.java:56)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at br.com.casadocodigo.bis.scenes.GameScene.createGame(GameScene.java:79)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at br.com.casadocodigo.bis.controles.MenuButtons.buttonClicked(MenuButtons.java:63)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at br.com.casadocodigo.bis.controles.Button.ccTouchesBegan(Button.java:43)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at org.cocos2d.events.CCTouchHandler.ccTouchesBegan(CCTouchHandler.java:63)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at org.cocos2d.events.CCTouchDispatcher.update(CCTouchDispatcher.java:305)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at org.cocos2d.nodes.CCDirector.onDrawFrame(CCDirector.java:646)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522)
07-21 16:52:28.286: E/AndroidRuntime(916): 	at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
07-21 16:52:28.306: E/SoundPool(916): Unable to load sample: (null)
07-21 16:52:28.306: V/SoundPoolThread(916): Got message m=2, mData=3
07-21 16:52:28.306: V/MediaPlayer(916): decode(53, 429190, 31780)
07-21 16:52:28.316: E/SoundPool(916): Unable to load sample: (null)

As classes

Classe principal
package br.com.casadocodigo.bis.scenes;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.sound.SoundEngine;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGRect;

import android.util.Log;
import br.com.casadocodigo.bis.R;
import br.com.casadocodigo.bis.config.Assets;
import br.com.casadocodigo.bis.engines.GameButtons;
import br.com.casadocodigo.bis.engines.Meteor;
import br.com.casadocodigo.bis.engines.MeteorsEngine;
import br.com.casadocodigo.bis.engines.Player;
import br.com.casadocodigo.bis.engines.Shoot;
import br.com.casadocodigo.bis.interfaces.MeteorsEngineDelegate;
import br.com.casadocodigo.bis.interfaces.ShootEngineDelegate;
import br.com.casadocodigo.bis.objetos.Score;
import br.com.casadocodigo.bis.screens.ScreenBackground;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenWidth;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenHeight;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenResolution;

public class GameScene extends CCLayer implements MeteorsEngineDelegate, ShootEngineDelegate{
	
	private ScreenBackground background;
	
	private MeteorsEngine meteorsEngine;
	
	private CCLayer meteorsLayer;
	private CCLayer playerLayer;
	private Player player;
	private CCLayer shootLayer;
	private CCLayer scoreLayer;
	
	
	private ArrayList<Meteor> meteorsArray;	
	private ArrayList<Player> playerArray;	
	private ArrayList<Shoot> shootArray;
	
	private Score score;


		
	private GameScene() {
		//sons
		preloadCache();
		SoundEngine.sharedEngine().playSound(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.music, true);
		this.background=new ScreenBackground(Assets.BACKGROUND);
		this.background.setPosition(
				screenResolution(CGPoint.ccp(screenWidth()/2.0f, screenHeight()/2.0f)));
		this.addChild(background);
		this.meteorsLayer=CCLayer.node();
		this.addChild(this.meteorsLayer);
		this.playerLayer=CCLayer.node();
		this.addChild(this.playerLayer);
		GameButtons gameButtonsLayer = GameButtons.gameButtons();
		gameButtonsLayer.setDelegate(this);
		this.addChild(gameButtonsLayer);	
		this.shootLayer=CCLayer.node();
		this.addChild(this.shootLayer);
		this.scoreLayer=CCLayer.node();
		this.addChild(this.scoreLayer);
		this.addGameObjects();
	}
	
	public static CCScene createGame(){
		CCScene scene = CCScene.node();
		GameScene layer = new GameScene();
		scene.addChild(layer);		
		return scene;
	}

	@Override
	public void createMeteors(Meteor meteor) {
		this.meteorsLayer.addChild(meteor);
		meteor.setDelegate(this);
		meteor.start();		
		this.meteorsArray.add(meteor);
	}
	
	public void addGameObjects() {
		this.meteorsArray= new ArrayList<Meteor>();
		this.meteorsEngine=new MeteorsEngine();
		this.player = new Player();
		this.playerLayer.addChild(this.player);
		this.shootArray=new ArrayList<Shoot>();
		this.playerArray=new ArrayList<Player>();
		this.playerArray.add(this.player);
		this.player.setDelegate(this);
		this.score=new Score();
		this.scoreLayer.addChild(this.score);
	}
	
	@Override
	public void onEnter() {
		// TODO Auto-generated method stub
		super.onEnter();
		this.schedule("checkHits");
		this.startEngines();
	}
	
	public void startEngines() {
		this.addChild(this.meteorsEngine);
		this.meteorsEngine.setDelegate(this);
	}

	@Override
	public void createShoot(Shoot shoot) {
		this.shootLayer.addChild(shoot);		
		shoot.setDelegate(this);
		shoot.start();		
		this.shootArray.add(shoot);
		System.out.println("quantidade de balas " + this.shootArray.size());
		System.out.println("quantidade de meteoros " + this.meteorsArray.size());
	}
	
	public boolean shoot(){
		player.shoot();
		return true;
	}
	
	public void moveRight(){
		player.moveRight();
	}
	
	public void moveLeft(){
		player.moveLeft();
	}
	
	//captura a posição e bordas do objeto
	public CGRect getBoarders(CCSprite object){
		CGRect rect = object.getBoundingBox();
		CGPoint point = rect.origin;
		CGRect cgRect = CGRect.make(point.x, point.y,
				rect.size.width,rect.size.height);
		return cgRect;
		
	}
	//checa colisao
	public boolean checkRadiusHitsOfArray(List<? extends CCSprite> array1,
			List<? extends CCSprite> array2,GameScene gameScene, String hit){
		boolean result=false;
		System.out.println(array1.size());
		for(int i = 0; i < array1.size();i++){
			System.out.println("numero de meteoros" +i);
			//pega o objeto do primeiro array
			CGRect rect1 = getBoarders(array1.get(i));
			for(int j = 0; i < array2.size();i++){
				System.out.println("numero de shoots " +j);
				//pega objeto do segundo array
				CGRect rect2 = getBoarders(array2.get(j));
				//verifica colisao
				if(CGRect.intersects(rect1, rect2)){
					Log.i("jogo", "Colisao detectada: "+hit);
					result=true;
					Method method;
					try {
						method=GameScene.class.getMethod(hit,
								CCSprite.class,CCSprite.class);
						method.invoke(gameScene, array1.get(i),array2.get(j));
					}catch(SecurityException e1){
						e1.printStackTrace();
					}catch(NoSuchMethodException e2){
						e2.printStackTrace();
					}catch(IllegalAccessException e3){
						e3.printStackTrace();
					}catch(IllegalArgumentException e4){
						e4.printStackTrace();
					}catch(InvocationTargetException e5){
						e5.printStackTrace();
					}
				}
			}
		}
		return result;
	}
	
	public void meteoroHit(CCSprite meteor,CCSprite shoot) {
		this.score.increase();
		((Meteor) meteor).shooted();
		((Shoot) shoot).explode();

	}
	
	private void playerHit(CCSprite meteor, CCSprite player) {
		((Meteor)meteor).shooted();
		((Player)player).explode();
	}
	
	//em tempo em tempo verifica se há colisoes
	public void checkHits(float dt) {
		this.checkRadiusHitsOfArray(this.meteorsArray,
				this.shootArray, this, "meteoroHit");
		this.checkRadiusHitsOfArray(this.meteorsArray,
				this.playerArray,this, "playerHit");
	}

	@Override
	public void removeMeteor(Meteor meteor) {
		this.meteorsArray.remove(meteor);
		
	}

	@Override
	public void removeShoot(Shoot shoot) {
		this.shootArray.remove(shoot);
		
	}
	
	private void preloadCache() {
		SoundEngine.sharedEngine().preloadEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.shoot);
		SoundEngine.sharedEngine().preloadEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.bang);
		SoundEngine.sharedEngine().preloadEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.over);
		

	}
	
	

}
package br.com.casadocodigo.bis.engines;

import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCScaleBy;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.sound.SoundEngine;
import org.cocos2d.types.CGPoint;

import br.com.casadocodigo.bis.R;
import br.com.casadocodigo.bis.config.Assets;
import br.com.casadocodigo.bis.interfaces.ShootEngineDelegate;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenWidth;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenHeight;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenResolution;

public class Shoot extends CCSprite {
	
	private ShootEngineDelegate delegate;
	
	float positionX,positionY;
	
	public Shoot(float positionX, float positionY) {
		super(Assets.SHOOT);
		this.positionX = positionX;
		this.positionY = positionY;
		setPosition(this.positionX, this.positionY);
		this.schedule("update");
	}
	
	public void update(float dt){
		positionY += 2;
		this.setPosition(screenResolution(CGPoint.ccp(positionX, positionY)));
	}


	public void setDelegate(ShootEngineDelegate delegate) {
		this.delegate = delegate;
	}
	
	public void start() {
		SoundEngine.sharedEngine().	playEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.shoot);

	}
	
	public void explode() {
		//remove array
		this.delegate.removeShoot(this);
		//para o agendamento
		this.unschedule("update");
		//cria efeitos
		float dt=0.2f;
		CCScaleBy a1 = CCScaleBy.action(dt, 2f);
		CCFadeOut a2 = CCFadeOut.action(dt);
		CCSpawn s1 = CCSpawn.actions(a1, a2);
		//funçao a ser executada depois do efeito
		CCCallFunc c1 = CCCallFunc.action(this, "removeMe");
		//roda efeito
		this.runAction(CCSequence.actions(s1, c1));
	}
	
	public void removeMe() {
		this.removeFromParentAndCleanup(true);
	}

}
package br.com.casadocodigo.bis.engines;

import java.util.Random;

import org.cocos2d.actions.instant.CCCallFunc;
import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCScaleBy;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.sound.SoundEngine;
import org.cocos2d.types.CGPoint;

import br.com.casadocodigo.bis.R;
import br.com.casadocodigo.bis.interfaces.MeteorsEngineDelegate;

import static br.com.casadocodigo.bis.config.DeviceSettings.screenWidth;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenHeight;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenResolution;

public class Meteor extends CCSprite {
	
	private float x,y;
	private MeteorsEngineDelegate delegate;
	
	public Meteor(String image) {
		super(image);
		x = new Random().nextInt(Math.round((screenWidth())));
		y = screenHeight();
	}
	
	public void start() {
		this.schedule("update");
	}
	
	public void update(float dt){
		y -= 1;
		this.setPosition(CGPoint.ccp(x, y));
	}


	public void setDelegate(MeteorsEngineDelegate delegate) {
		this.delegate = delegate;
	}
	
	public void shooted() {
		SoundEngine.sharedEngine().playEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.bang);
		SoundEngine.sharedEngine().pauseSound();
		this.delegate.removeMeteor(this);
		this.unschedule("upadate");
		float dt = 0.2f;
		//diminui o meteoro
		CCScaleBy a1 = CCScaleBy.action(dt, 0.5f);
		//efeito fade
		CCFadeOut a2 = CCFadeOut.action(dt);
		CCSpawn s1 = CCSpawn.actions(a1, a2);
		CCCallFunc c1 = CCCallFunc.action(this, "removeMe");
		this.runAction(CCSequence.actions(s1, c1));
	}	
	
	public void removeMe() {
		this.removeFromParentAndCleanup(true);
	}

}
package br.com.casadocodigo.bis.engines;

import org.cocos2d.actions.interval.CCFadeOut;
import org.cocos2d.actions.interval.CCScaleBy;
import org.cocos2d.actions.interval.CCSequence;
import org.cocos2d.actions.interval.CCSpawn;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.sound.SoundEngine;

import br.com.casadocodigo.bis.R;
import br.com.casadocodigo.bis.config.Assets;
import br.com.casadocodigo.bis.interfaces.ShootEngineDelegate;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenWidth;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenHeight;
import static br.com.casadocodigo.bis.config.DeviceSettings.screenResolution;

public class Player extends CCSprite{
	
	float positionX =  screenWidth()/2;
	float positionY = 50;
	private ShootEngineDelegate delegate;
	
	public Player() {
		super(Assets.NAVE);
		setPosition(positionX, positionX);
	}
	
	public void setDelegate(ShootEngineDelegate delegate){
		this.delegate=delegate;
	}
	
	public void shoot(){
		this.delegate.createShoot(new Shoot(positionX,positionY));
	}
	
	public void moveLeft(){
		if(positionX > 30){
			positionX -=10;
		}
		setPosition(positionX, positionY);
	}
	
	public void moveRight(){
		if(positionX < screenWidth() -30){
			positionX += 10;
		}
		setPosition(positionX, positionY);
	}
	
	public void explode() {
		//this.unschedule("update");
		SoundEngine.sharedEngine().playEffect(
				CCDirector.sharedDirector().getActivity(),
				br.com.casadocodigo.bis.R.raw.over);
		float dt=0.2f;
		CCScaleBy a1 = CCScaleBy.action(dt, 2f);
		CCFadeOut a2 = CCFadeOut.action(dt);
		CCSpawn s1 = CCSpawn.actions(a1, a2);
		this.runAction(CCSequence.actions(s1));
	}

}

3 Respostas

weliton_salgado

Estou com o mesmo problema. Alguém pode ajudar?

kmunga

Amigo, o erro é bem bobo, porem não me recordo agora, darei uma olhada quando chegar em casa.

Mas se tu esta cansado de ter que se matar para encontrar referencias do cocos2d para Java e estiver disposto a aprender outra framework, te indico o libgdx ( http://libgdx.badlogicgames.com/documentation.html ), ele é um pouco mais complicado, porem a vasta quantidade de referencias, tutoriais, exemplos, tudo feito especialmente em Java e para Android acaba se tornando mais negocio.

De qualquer modo se tiver tempo vejo qual a solução deste problema em questão.

weliton_salgado

Obrigado amigo, vou dar uma olhada assim que possivel neste framework. Valeu.

Criado 21 de julho de 2013
Ultima resposta 26 de set. de 2013
Respostas 3
Participantes 2