Jawad Amjad
Jawad Amjad

Reputation: 2552

Drawing Line Effect on Touch Like Fruit Ninja or Veggie Samurai in And Engine

I want to draw a line in AndEngine with the effect of a blade similar to Fruit Ninja or Veggie Samurai. Can anyone help me? and give a sample code?

Upvotes: 0

Views: 2573

Answers (2)

Pramod
Pramod

Reputation: 1133

Maybe, I am late but hope this will help others.

    @Override
    public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {

        final float touchX = pSceneTouchEvent.getX();
        final float touchY = pSceneTouchEvent.getY();

        if (pSceneTouchEvent.isActionDown()) {
            initTrail(touchX, touchY);
            swipeGestureSprite = addSwipeSprite(touchX, touchY);
        } else if (pSceneTouchEvent.isActionMove()) {

            moveTrail(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), 0);

            if (swipeGestureSprite != null) {
                swipeGestureSprite.setX(touchX);
                swipeGestureSprite.setY(touchY);
            }
        } else if (pSceneTouchEvent.isActionUp()) {

            mScene.detachChild(this.particleSystem);

            if (swipeGestureSprite != null) {
                this.mScene.detachChild(swipeGestureSprite);
                swipeGestureSprite = null;
            }

            return true;
        }

        return false;
    }




    private void initTrail(float mX, float mY) {
        this.particleEmitter = new PointParticleEmitter(mX, mY);
        this.particleSystem = new SpriteParticleSystem(particleEmitter, 1000, 1000, 5000, this.mRibbon, this.getVertexBufferObjectManager());
        particleSystem.addParticleInitializer(new BlendFunctionParticleInitializer<Sprite>(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE));
        particleSystem.addParticleInitializer(new ExpireParticleInitializer<Sprite>(1));
        particleSystem.addParticleModifier(new ScaleParticleModifier<Sprite>(0, 1, 1, 0f));
        particleSystem.addParticleModifier(new AlphaParticleModifier<Sprite>(0, 1, 1, 0));
        this.mScene.attachChild(particleSystem);
    }


private void moveTrail(float trailX, float trailY, int count) {
        if (particleEmitter == null) {
            initTrail(trailX, trailY);
        }

        particleEmitter.setCenter(trailX, trailY);
    }

Upvotes: 1

Siddharth
Siddharth

Reputation: 4312

I think you have to use point particle effect and use line drawing algorithm in that to create line between points. Line drawn using particle represent more reality and also the particle represent the dynamic way so you can destroy it. Further you can ask. EDIT : For particle generation you can use this code

public void generateParticles(float pX, float pY) {

    pointParticleEmtitter = new PointParticleEmitter(pX, pY);

    particleSystem = new ParticleSystem(pointParticleEmtitter, maxRate,
            minRate, maxParticles, mParticleTextureRegion.deepCopy());

    particleSystem.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE);
    particleSystem.addParticleInitializer(new ColorInitializer(0.8f, 0.43f,
            0.2f));
    particleSystem.addParticleModifier(new AlphaModifier(1, 0, 0, 0.25f));
    particleSystem.addParticleModifier(new ExpireModifier(0.25f));

    gameObject.getScene().attachChild(particleSystem);

}

For Line algorithm you can use this one

public void drawLine() {
    int x;
    float y, m;

    x = (int) previousX;
    y = (int) previousY;

    m = (currentY - previousY) / (currentX - previousX);

    if (Math.round(previousX) == Math.round(currentX)) {
        if (previousY < currentY) {
            for (y = (int) previousY; y < currentY; ++y)
                pointParticleEmtitter.setCenter(previousX, y);
        } else {
            for (y = (int) previousY; y > currentY; --y)
                pointParticleEmtitter.setCenter(previousX, y);
        }
    } else {
        if (previousX < currentX) {
            for (x = (int) previousX; x < currentX; ++x) {
                y = m * (x - previousX) + previousY;
                pointParticleEmtitter.setCenter(x, y);
            }
        } else if (previousX > currentX) {
            for (x = (int) previousX; x > currentX; --x) {
                y = m * (x - currentX) + currentY;
                pointParticleEmtitter.setCenter(x, y);
            }
        }
    }
}

Upvotes: 0

Related Questions