【问题标题】:Drawing Line Effect on Touch Like Fruit Ninja or Veggie Samurai in And Engine在 And Engine 中像水果忍者或素食武士一样在触摸上绘制线条效果
【发布时间】:2015-05-07 17:28:37
【问题描述】:

我想在 AndEngine 中画一条线,其效果类似于 Fruit Ninja 或 Veggie Samurai。 谁能帮我?并给出示例代码?

【问题讨论】:

  • 您尝试过这样做吗?如果是这样,你有麻烦吗?
  • 是的,我尝试通过使用线条图来做到这一点......但我开始知道它不是线条画它的图像绘图......我有 iphone 代码,但我不知道如何转换它进入 Android 代码。
  • 你能找到解决这个问题的方法吗?那么请与我们分享一些知识。

标签: android andengine


【解决方案1】:

也许,我迟到了,但希望这对其他人有帮助。

    @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】:

    我认为你必须使用点粒子效果并使用画线算法来创建点之间的线。使用粒子绘制的线代表更多的现实,粒子也代表动态的方式,因此您可以破坏它。进一步你可以问。 编辑:对于粒子生成,您可以使用此代码

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

    对于线算法,你可以使用这个

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

    【讨论】:

    • 你能给我任何java代码示例吗?还是 Andengine 的例子?
    • 非常感谢....但请提供更多指导。假设我有一个包含 x,y 点的数组。我将如何调用上述算法以及粒子系统函数如何连接到线算法?我的意思是它叫什么名字?
    • 您必须为函数提供每对 (x,y) 坐标,并且您必须在 onManageUpdate() 方法中进行管理。首先你必须使用 generateParticles() 方法创建粒子,你必须调用一次,在更新方法中你必须通过提供适当的 x,y 坐标来调用 drawLine 方法。
    • 好的,非常感谢我尝试...如果有任何问题,我会再次打扰您
    • 如果您找到答案,则必须标记为正确,以便为社区成员提供鼓励和指导
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多