Я новичок в разработке игр и попробовал 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.
Любая причина для этого?
Вы можете включать LogCat пожалуйста? – tim687
tim687: для обнаружения монеты я изменил код и вместо того, чтобы создавать тела и удалять тела при столкновении с игроком, я использовал обработчик таймера и проверял совпадения с player.collideswith (coin), и он отлично работает. Однако, я все еще не мог найти более легкое решение для преобразования координат в GLes 2-anchor center. – GoonzAks