2013-02-10 3 views
2

Я работаю над небольшим проектом с Andengine + Box2D.I есть персонаж игрока и земля. Круглый StaticBody и plyaer - DynamicBody. Я хочу, чтобы человек шел по земле.Физическое тело проходит через каждый

Проблема в том, что когда я перемещаю плеер, он погружается в землю. Как я могу это исправить? Я должен объяснить это фотографиями.

This is how it should be

This is what is happenning

Вот мой код:

import org.andengine.engine.camera.Camera; 
import org.andengine.engine.options.EngineOptions; 
import org.andengine.engine.options.ScreenOrientation; 
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy; 
import org.andengine.entity.scene.Scene; 
import org.andengine.entity.sprite.Sprite; 
import org.andengine.entity.util.FPSLogger; 
import org.andengine.extension.physics.box2d.PhysicsConnector; 
import org.andengine.extension.physics.box2d.PhysicsFactory; 
import org.andengine.extension.physics.box2d.PhysicsWorld; 
import org.andengine.input.touch.TouchEvent; 
import org.andengine.opengl.texture.TextureOptions; 
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; 
import  org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; 
import org.andengine.opengl.texture.region.TextureRegion; 
import org.andengine.ui.activity.SimpleBaseGameActivity; 

import com.badlogic.gdx.math.Vector2; 
import com.badlogic.gdx.physics.box2d.Body; 
import com.badlogic.gdx.physics.box2d.FixtureDef; 
import com.badlogic.gdx.physics.box2d.MassData; 
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType; 

import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Gravity; 
import android.view.Menu; 

public class BlokKirmaActivity extends SimpleBaseGameActivity { 

private EngineOptions engineOptions; 
private Camera camera; 
private Scene oyunSahne; 
private static final int CAMERA_HEIGHT = 480; 
private static final int CAMERA_WIDTH = 800; 
private PhysicsWorld physicsWorld= new PhysicsWorld(new Vector2(0,SensorManager.GRAVITY_EARTH),false); 
private FixtureDef fixDef = PhysicsFactory.createFixtureDef(1.0f, 0.0f, 1.0f); 
private BitmapTextureAtlas texYer,texKamil,texSol,texSag,texZipla; 
private TextureRegion texRegYer,texRegKamil,texRegSol,texRegSag,texRegZipla; 
private Sprite spriteYer,spriteKamil,spriteSol,spriteSag,spriteZipla; 
private Body bodyYer,bodyKamil; 
private boolean solBasilimi=false,sagBasilimi=false,ziplaBasilimi=false; 

public EngineOptions onCreateEngineOptions() { 
    camera = new Camera(0,0,CAMERA_WIDTH,CAMERA_HEIGHT); 
    engineOptions = new EngineOptions(true,ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),camera); 

    engineOptions.getTouchOptions().setNeedsMultiTouch(true); 
    engineOptions.getAudioOptions().setNeedsSound(true); 

    return this.engineOptions; 

} 

@Override 
protected void onCreateResources() { 

    texYer = new BitmapTextureAtlas(this.getTextureManager(),1024,256,TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    texKamil = new BitmapTextureAtlas(this.getTextureManager(),64,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    texSol = new BitmapTextureAtlas(this.getTextureManager(),128,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    texSag = new BitmapTextureAtlas(this.getTextureManager(),128,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    texZipla = new BitmapTextureAtlas(this.getTextureManager(),128,128,TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    texYer.load(); 
    texKamil.load(); 
    texSol.load(); 
    texSag.load(); 
    texZipla.load(); 

    texRegYer = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.texYer, this, "gfx/oyunyer.png",0,0); 
    texRegKamil = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.texKamil, this, "gfx/kamil.png",0,0); 
    texRegSol = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.texSol, this, "gfx/sol.png",0,0); 
    texRegSag = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.texSag, this, "gfx/sag.png",0,0); 
    texRegZipla = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.texZipla, this, "gfx/zipla.png",0,0); 

} 

@Override 
protected Scene onCreateScene() { 
    this.mEngine.registerUpdateHandler(new FPSLogger()); 
    this.oyunSahne = new Scene(); 
    this.oyunSahne.registerUpdateHandler(physicsWorld); 

    spriteYer = new Sprite(0,355,texRegYer,getVertexBufferObjectManager()); 
    spriteKamil = new Sprite(220,50,texRegKamil,getVertexBufferObjectManager()){ 

     protected void onManagedUpdate(float pSecondsElapsed){ 
      if(solBasilimi==true){ 
       bodyKamil.setLinearVelocity(-10, 0); 
      } 
      if(sagBasilimi==true){ 
       bodyKamil.setLinearVelocity(10, 0); 
      } 

     } 

    }; 

    spriteSol = new Sprite(100,50,texRegSol,getVertexBufferObjectManager()){ 

     public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { 

      if(pSceneTouchEvent.isActionDown()){ 
       solBasilimi=true; 
      } 
      if(pSceneTouchEvent.isActionUp()){ 
       solBasilimi=false; 
      } 

      return true; 
     } 
    }; 

    spriteSag = new Sprite(300,50,texRegSag,getVertexBufferObjectManager()){ 

     public boolean onAreaTouched(TouchEvent pSceneTouchEvent,float pTouchAreaLocalX, float pTouchAreaLocalY) { 

      if(pSceneTouchEvent.isActionDown()){ 
       sagBasilimi=true; 
      } 
      if(pSceneTouchEvent.isActionUp()){ 
       sagBasilimi=false; 
      } 
      return true; 

     } 
    }; 

    spriteZipla = new Sprite(600,50,texRegZipla,getVertexBufferObjectManager()){ 

     public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) { 

      if(pSceneTouchEvent.isActionDown()){ 
       bodyKamil.setLinearVelocity(0,-20); 

      } 
      if(pSceneTouchEvent.isActionUp()){ 
       bodyKamil.setLinearVelocity(0,0); 
      } 
      return true; 
     } 
    }; 

    bodyYer = PhysicsFactory.createBoxBody(physicsWorld, spriteYer, BodyType.StaticBody, fixDef); 
    this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteYer, bodyYer,true,false)); 
    bodyKamil = PhysicsFactory.createBoxBody(physicsWorld, spriteKamil, BodyType.DynamicBody, fixDef); 
    this.physicsWorld.registerPhysicsConnector(new PhysicsConnector(spriteKamil, bodyKamil,true,false)); 



    MassData massData1 = bodyKamil.getMassData(); 
    massData1.mass= 75; 
    bodyKamil.setMassData(massData1); 

    this.oyunSahne.attachChild(spriteYer); 
    this.oyunSahne.attachChild(spriteKamil); 
    this.oyunSahne.attachChild(spriteSol); 
    this.oyunSahne.attachChild(spriteSag); 
    this.oyunSahne.attachChild(spriteZipla); 

    this.oyunSahne.registerTouchArea(spriteSol); 
    this.oyunSahne.registerTouchArea(spriteSag); 
    this.oyunSahne.registerTouchArea(spriteZipla); 

    return this.oyunSahne; 
} 


} 
+0

Вам нужно включить в свой вопрос дополнительную информацию, чтобы избежать ее закрытия. Включение ссылки на внешний сайт не является хорошей заменой для публикации полного вопроса. – Perception

+0

Я редактирую свой пост. – Zapdos

+0

Итак, никто не получил идеи, или я не мог объяснить свою проблему хорошо? – Zapdos

ответ

0

Вероятнее всего, это связано с размером вашей физике тела или формы отличается от вашего спрайта. Я не знаю, какой простой способ его изменить. Возможно, вам нужно создать свою собственную форму для спрайта. Но вот хороший инструмент для создания отладки box2d для вас. Используя это, вы можете получить схему своего физического тела. Here is the link

его очень проста в использовании просто включить проект в библиотеку, то просто добавьте строку кода

mScene.attachChild(new Box2dDebugRenderer(mPhysicsWorld)); 

Теперь все ваши физики тела будут отображаться с контуром, Помните этот будет reduse ваш FPS, но очень полезно для отладки.

+0

благодарю вас за ответ, но я не смог найти ссылку для загрузки. Кстати, в нем говорится, что Box2dDebugRenderer устарел. Есть ли какая-нибудь более новая версия? – Zapdos

+0

Извините за плохую ссылку отредактировал сообщение и добавил новую ссылку на копию pastebin и воспользовался ею :) –