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
[code]
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);
}
}[/code]
[code]
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);
}
}[/code]
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);
}
}
[code]
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));
}
}[/code]