2015-01-29 6 views
0

저는 게임 개발을 처음 접했고 AndEngine을 통해 레이싱 게임을 만들려고했습니다. 내 스프라이트 (자동차)가 동전과 충돌하면 소리가 나고 사라집니다.
타일링 된 맵 편집기를 사용하여 동전 오브젝트를로드했습니다.
지도와 x 축을위한 xml을 생성하는 바둑판 식 배열 편집기의 좌표계가 반전됩니다. 나는 tmxExtension이이 변환을 처리 할 것이라고 생각했습니다. 지금까지 각 객체 위치를 계산하고 위치를 수정하기 위해 XML 편집기에서 위치를 변경했습니다. 다른 쉬운 방법이 있습니까? 나는 동전 충돌 그러나 모든 동전 '충돌이 감지되지 Andengine 코인 픽업 nullpointer 예외

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); 
       } 
      } 
     } 
    } 
} 

을 관리하기 위해 접촉 리스너를 사용, 또한

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); 



    } 
} 

: 여기

지도를로드하는 내 코드입니다. 그 때문에 null 포인터를 얻습니다. 그래서 catch를 포함 시켰습니다.
이유가 무엇인가요?

+0

logcat을 포함시킬 수 있습니까? – tim687

+0

tim687 : 동전 감지를 위해 내가 코드를 변경하고 시체를 만들고 플레이어와의 충돌시 시체를 제거하는 대신 타이머 핸들러를 사용하여 player.collideswith (동전)와 충돌을 확인하고 완벽하게 작동합니다. 그러나, 나는 여전히 GLes 2-anchor center에서 좌표 변환을위한 더 쉬운 해결책을 찾지 못했습니다. – GoonzAks

답변

0

충돌을 확인하기 위해 별도의 timerhandler를 만드는 대신에 onManagedUpdate에서이 모든 작업을 수행하십시오.