2015-01-29 5 views
0

Я новичок в разработке игр и попробовал AndEngine построить гоночную игру. Когда мой спрайт (автомобиль) сталкивается с монетой, он играет звук и исчезает.
Я использовал редактор плиточных карт для загрузки объектов моей монеты.
Система координат в редакторе черепичной карты, которая создает xml для карты и andengine gles 2 - анкерный центр, инвертируется. Я думал, что tmxExtension будет обрабатывать это преобразование. До сих пор я вычисляю позиции каждого объекта и меняю его положение в редакторе xml, чтобы исправить позиции. Есть ли еще более простой способ?Andengine coin pickup nullpointer exception

Вот мои коды для загрузки карты:

private void createLevel() { 
    coins = new LinkedList <Sprite>(); 
    try { 

     final TMXLoader tmxLoader = new TMXLoader(activity.getAssets(), engine.getTextureManager(), 
     TextureOptions.BILINEAR_PREMULTIPLYALPHA, vbom); 

     this.mTMXTiledMap = tmxLoader.loadFromAsset("tmx/uom_map_test2.tmx"); 
    } catch (final TMXLoadException e) { 
     Debug.e(e); 
    } 

    FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); 
    Rectangle rect1 = new Rectangle(
    0, 
    0, 
    1, 
    camera.getBoundsYMax(), 
    vbom); 
    Body wall1 = PhysicsFactory.createBoxBody(physicsWorld, rect1, BodyType.StaticBody, wallFixtureDef); 
    wall1.setUserData(wall1); 

    FixtureDef wallFixtureDef2 = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f); 
    Rectangle rect2 = new Rectangle(
    1100, 
    0, 
    1, 
    camera.getBoundsYMax(), 
    vbom); 
    Body wall2 = PhysicsFactory.createBoxBody(physicsWorld, rect2, BodyType.StaticBody, wallFixtureDef2); 


    for (final TMXObjectGroup group: this.mTMXTiledMap.getTMXObjectGroups()) { 
     for (final TMXObject object: group.getTMXObjects()) { 

      if (object.getName().equals("coin")) { 
       Sprite coin = new Sprite(object.getX(), object.getY(), object.getWidth(), object.getHeight(), resourcesManager.coinTextureRegion, vbom); 
       FixtureDef coinFixtureDef = PhysicsFactory.createFixtureDef(0, 0.3f, 0.3f); 

       Body bod = PhysicsFactory.createBoxBody(physicsWorld, coin, BodyType.DynamicBody, coinFixtureDef); 
       bod.setUserData("coin"); 
       coins.add(coin); 
       coin.setUserData(bod); 

      } else if (object.getName().equals("sea")) { 
       FixtureDef seaFixtureDef = PhysicsFactory.createFixtureDef(0, 0, 0f); 
       Rectangle rect = new Rectangle(
       object.getX(), 
       object.getY(), 
       object.getWidth(), 
       object.getHeight(), 
       vbom); 

       Body bod = PhysicsFactory.createBoxBody(physicsWorld, rect, BodyType.DynamicBody, seaFixtureDef); 
       bod.setUserData("sea"); 

      } 


     } 

    } 

    /*for(TMXLayer layer : this.mTMXTiledMap.getTMXLayers()){ 
      layer.detachSelf(); 
      layer.setPosition(0,0); 
      attachChild(layer);*/ 

    for (int layerID = 0; layerID < this.mTMXTiledMap.getTMXLayers().size(); layerID++) { 
     this.mTMXTiledMap.getTMXLayers().get(layerID).detachSelf(); 
     attachChild(this.mTMXTiledMap.getTMXLayers().get(layerID)); 

     //  layer0:sea    layer1:grass    layer2:road 

     for (int i = 0; i < coins.size(); i++) { 
      this.attachChild(coins.get(i)); 
     } 

     camera.setBounds(0, 0, mTMXTiledMap.getWidth(), mTMXTiledMap.getHeight()); 
     camera.setBoundsEnabled(true); 



    } 
} 

Кроме того, я использую контакт слушатель управлять коллизиями монет

public void beginContact(Contact contact) { 
    Body a = null, b = null; 
    // TODO Auto-generated method stub 
    try { 
     a = contact.getFixtureA().getBody(); 
     b = contact.getFixtureB().getBody(); 
    } catch (NullPointerException n) { 
     //do nothing 
    } 

    if (a != null && b != null) { 

     if (a.getUserData() != null && b.getUserData() != null) { 
      if (a.getUserData().equals("player") && b.getUserData().equals("coin") || b.getUserData().equals("player") && a.getUserData().equals("coin")) { 

       if (a.getUserData().equals("coin")) { 
        removeCoins(a); 
        resourcesManager.coinCollect.play(); 
        addToScore(10); 
        showLevelCleared(); 
       } else if (b.getUserData().equals("coin")) { 
        removeCoins(b); 
        resourcesManager.coinCollect.play(); 
        addToScore(5); 
       } 
      } 
     } 
    } 
} 

Однако не столкновение всех монет обнаружено. Я получаю исключение null pointerException для тех, поэтому я включил catch.
Любая причина для этого?

+0

Вы можете включать LogCat пожалуйста? – tim687

+0

tim687: для обнаружения монеты я изменил код и вместо того, чтобы создавать тела и удалять тела при столкновении с игроком, я использовал обработчик таймера и проверял совпадения с player.collideswith (coin), и он отлично работает. Однако, я все еще не мог найти более легкое решение для преобразования координат в GLes 2-anchor center. – GoonzAks

ответ

0

Я предлагаю вместо создания отдельной timerhandler для проверки столкновения, сделать все это в onManagedUpdate