0
我是AndEngine的新手,並且有點麻煩。我想在畫面周圍拖動一個精靈,當手指從精靈中擡起時,讓物體落到屏幕的底部。每次觸摸屏幕(但不是精靈)時,都會創建一個新的精靈。我試圖結合PhysicsExample創建形狀,每次你觸摸,然後讓它們落下,TouchDragExample可以讓你在屏幕上拖動一個精靈。我留下的是一個精靈,在最後精靈所在的位置創建並立即移動到屏幕所在的位置。每個精靈都有自己的「引力場」或其他東西。他們不會掉下來,但他們儘可能遠離彼此。另外,當創建我的紋理區域時,我將圖像留在點(0,0)處。如何將圖像加載到紋理區域,但沒有將其顯示到屏幕上?我的代碼如下:在AndEngine中,如何拖動未被觸摸時會掉落的物體?
public class TestGFXActivity extends SimpleBaseGameActivity implements IAccelerationListener, IOnSceneTouchListener{
/** Called when the activity is first created. */
private Camera camera;
private static final int Camera_Width = 512;
private static final int Camera_Height = 512;
int centerX, centerY;
private BitmapTextureAtlas backgroundTextureAtlas;
private ITextureRegion backgroundTextureRegion, circleTR;
private PhysicsWorld mPhysicsWorld;
private Scene scene;
private static final FixtureDef FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f);
@Override
public EngineOptions onCreateEngineOptions() {
// TODO Auto-generated method stub
camera = new Camera(0,0,Camera_Width,Camera_Height);
EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED,
new FillResolutionPolicy(), camera);
return engineOptions;
}
@Override
protected void onCreateResources() {
// TODO Auto-generated method stub
backgroundTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(),
512,512,TextureOptions.DEFAULT);
backgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "bluelavabackground2.png",0,0);
circleTR = BitmapTextureAtlasTextureRegionFactory.createFromAsset(backgroundTextureAtlas, this, "bubble2.png",0,0);
backgroundTextureAtlas.load();
}
@Override
protected Scene onCreateScene() {
this.mEngine.registerUpdateHandler(new FPSLogger());
centerX = (int) ((Camera_Width - this.backgroundTextureRegion.getWidth())/2);
centerY = (int) ((Camera_Height - this.backgroundTextureRegion.getHeight())/2);
scene = new Scene();
this.scene.setOnSceneTouchListener((IOnSceneTouchListener) this);
scene.setBackground(new Background(1,1,1));
this.mPhysicsWorld = new PhysicsWorld(new Vector2(0, SensorManager.GRAVITY_EARTH), false); //Sets x and y acceleration
final VertexBufferObjectManager vertexBufferObjectManager = this.getVertexBufferObjectManager();
final Rectangle ground = new Rectangle(0, Camera_Height - 2, Camera_Width, 2, vertexBufferObjectManager);
final Rectangle roof = new Rectangle(0, 0, Camera_Height, 2, vertexBufferObjectManager);
final Rectangle left = new Rectangle(0, 0, 2, Camera_Height, vertexBufferObjectManager);
final Rectangle right = new Rectangle(Camera_Height - 2, 0, 2, Camera_Width, vertexBufferObjectManager);
final FixtureDef wallFixtureDef = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, ground, BodyType.StaticBody, wallFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, roof, BodyType.StaticBody, wallFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, left, BodyType.StaticBody, wallFixtureDef);
PhysicsFactory.createBoxBody(this.mPhysicsWorld, right, BodyType.StaticBody, wallFixtureDef);
this.scene.attachChild(ground);
this.scene.attachChild(roof);
this.scene.attachChild(left);
this.scene.attachChild(right);
this.scene.registerUpdateHandler(this.mPhysicsWorld);
final Sprite background = new Sprite(centerX,centerY,this.backgroundTextureRegion, getVertexBufferObjectManager());
scene.attachChild(background);
return scene;
}
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
final Sprite face;
final Body body;
if(this.mPhysicsWorld != null) {
if(pSceneTouchEvent.isActionDown()) {
face = new Sprite(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), this.circleTR, this.getVertexBufferObjectManager()) {
@Override
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
this.setPosition(pSceneTouchEvent.getX() - this.getWidth()/2, pSceneTouchEvent.getY() - this.getHeight()/2);
return true;
}
};
body = PhysicsFactory.createCircleBody(this.mPhysicsWorld, face, BodyType.DynamicBody, FIXTURE_DEF);
face.setScale((float) .25);
scene.attachChild(face);
scene.registerTouchArea(face);
scene.setTouchAreaBindingOnActionDownEnabled(true);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(face, body, true, true));
return true;
}else if(pSceneTouchEvent.isActionDown()){
scene.setTouchAreaBindingOnActionDownEnabled(false);
}
}
return false;
}
@Override
public void onAccelerationAccuracyChanged(AccelerationData pAccelerationData) {
// TODO Auto-generated method stub
}
@Override
public void onAccelerationChanged(AccelerationData pAccelerationData) {
final Vector2 gravity = Vector2Pool.obtain(pAccelerationData.getX(), pAccelerationData.getY());
this.mPhysicsWorld.setGravity(gravity);
Vector2Pool.recycle(gravity);
}
public void onResumeGame() {
super.onResumeGame();
this.enableAccelerationSensor(this);
}
public void onPauseGame() {
super.onPauseGame();
this.disableAccelerationSensor();
}
}