0

私は AndEngine が初めてで、少し問題があります。画面上でスプライトをドラッグし、スプライトから指を離すと、オブジェクトが画面の下部に落ちます。画面がタッチされるたびに(スプライトではなく)、その時点で新しいスプライトが作成されます。タッチするたびに形を作って落とす PhysicsExample と、スプライトを画面上でドラッグできる TouchDragExample を組み合わせてみました。残っているのは、最後のスプライトがあった場所にスプライトが作成され、すぐに画面がタッチされた場所に移動することです。各スプライトには、独自の「重力場」または何かがあります。倒れることはありませんが、互いにできるだけ離れた位置に配置します。また、テクスチャ領域を作成すると、ポイント (0,0) に画像が残ります。画像をテクスチャ領域に読み込み、画面に表示しないようにするにはどうすればよいですか? 私のコードは次のとおりです。

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

1 に答える 1

1

を使用してタッチエリアを登録してみてくださいonClick(not in onSceneTouchEvent)。これを行うには、を実装するだけonClickLisenerです。スプライトを落下させるには、PhysicsBoxを簡単に使用できます(重力を設定するだけです)。または、オプションで、PhysicsHandlerを作成して速度を設定することもできます。

于 2012-09-24T13:42:46.477 に答える