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

孤街浪徒 提交于 2019-12-10 11:59:29

问题


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?


回答1:


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



回答2:


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


来源:https://stackoverflow.com/questions/10702328/drawing-line-effect-on-touch-like-fruit-ninja-or-veggie-samurai-in-and-engine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!