2012-03-14 137 views
4

我想在用户交换屏幕时显示一个三角形条。我不知道如何与AndEngine做到这一点,使用粒子系统或使用精灵或使用三角地带的算法中......添加视觉以下手指轻扫,三角形条像水果忍者Andengine

我还没有写任何代码,因为我打的是什么做的。我正在上传图片,请分享您的想法。

triangle strip

更新

有人做这在iPhone,但不幸的是我不熟悉的语言的语法,请帮助我理解的算法中的代码https://github.com/hiepnd/CCBlade

**我想要的效果** fruit ninja effect

完整的Android项目下载

http://www.andengine.org/forums/resources/complete-runnable-project/1301

我做了这个代码,但不能得到预期的效果...我用

package org.az.algo.examples; 

import javax.microedition.khronos.opengles.GL10; 

import org.anddev.andengine.engine.Engine; 
import org.anddev.andengine.engine.camera.Camera; 
import org.anddev.andengine.engine.options.EngineOptions; 
import org.anddev.andengine.engine.options.EngineOptions.ScreenOrientation; 
import org.anddev.andengine.engine.options.resolutionpolicy.RatioResolutionPolicy; 
import org.anddev.andengine.entity.particle.ParticleSystem; 
import org.anddev.andengine.entity.particle.emitter.RectangleParticleEmitter; 
import org.anddev.andengine.entity.particle.initializer.AlphaInitializer; 
import org.anddev.andengine.entity.particle.initializer.ColorInitializer; 
import org.anddev.andengine.entity.particle.initializer.GravityInitializer; 
import org.anddev.andengine.entity.particle.initializer.RotationInitializer; 
import org.anddev.andengine.entity.particle.modifier.AlphaModifier; 
import org.anddev.andengine.entity.particle.modifier.ColorModifier; 
import org.anddev.andengine.entity.particle.modifier.ExpireModifier; 
import org.anddev.andengine.entity.scene.Scene; 
import org.anddev.andengine.entity.scene.Scene.IOnSceneTouchListener; 
import org.anddev.andengine.entity.sprite.Sprite; 
import org.anddev.andengine.entity.util.FPSLogger; 
import org.anddev.andengine.input.touch.TouchEvent; 
import org.anddev.andengine.opengl.texture.TextureOptions; 
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; 
import org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; 
import org.anddev.andengine.opengl.texture.region.TextureRegion; 

import android.view.ViewGroup.MarginLayoutParams; 
import android.widget.Toast; 


public class ParticleSystemSimpleExample extends BaseExample { 
    // =========================================================== 
    // Constants 
    // =========================================================== 

    private static final int CAMERA_WIDTH = 720; 
    private static final int CAMERA_HEIGHT = 480; 

    // =========================================================== 
    // Fields 
    // =========================================================== 

    private Camera mCamera; 
    private BitmapTextureAtlas mBitmapTextureAtlas; 
    private TextureRegion mParticleTextureRegion; 
    private BitmapTextureAtlas mBitmapTextureAtlasStreak; 
    private TextureRegion mStreadTextureRegion; 

    private Sprite[] mSprite = new Sprite[20]; 
    private int mIndex = 0; 

    // =========================================================== 
    // Constructors 
    // =========================================================== 

    // =========================================================== 
    // Getter & Setter 
    // =========================================================== 

    // =========================================================== 
    // Methods for/from SuperClass/Interfaces 
    // =========================================================== 

    @Override 
    public Engine onLoadEngine() { 
     Toast.makeText(this, "Touch the screen to move the particlesystem.", Toast.LENGTH_LONG).show(); 
     this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); 
     return new Engine(new EngineOptions(true, ScreenOrientation.LANDSCAPE, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), this.mCamera)); 
    } 

    @Override 
    public void onLoadResources() { 
     this.mBitmapTextureAtlas = new BitmapTextureAtlas(32, 32, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
     this.mParticleTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "gfx/particle_point.png", 0, 0); 

     this.mBitmapTextureAtlasStreak = new BitmapTextureAtlas(128, 16, TextureOptions.BILINEAR_PREMULTIPLYALPHA);  
     this.mStreadTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlasStreak, this, "gfx/streak1.png", 0, 0); 

     this.mEngine.getTextureManager().loadTextures(this.mBitmapTextureAtlas, this.mBitmapTextureAtlasStreak); 
    } 

    @Override 
    public Scene onLoadScene() { 
     this.mEngine.registerUpdateHandler(new FPSLogger()); 

     final Scene scene = new Scene(); 

//  final CircleOutlineParticleEmitter particleEmitter = new CircleOutlineParticleEmitter(CAMERA_WIDTH * 0.5f, CAMERA_HEIGHT * 0.5f + 20, 80); 
     final RectangleParticleEmitter particleEmitter = new RectangleParticleEmitter(CAMERA_WIDTH * 0.5f, CAMERA_HEIGHT * 0.5f, 5f,5f); 

//  final PointParticleEmitter particleEmitter = new PointParticleEmitter(10, 10);  
     final ParticleSystem particleSystem = new ParticleSystem(particleEmitter, 100, 100, 1000, this.mParticleTextureRegion); 
     particleSystem.setParticlesSpawnEnabled(false);  

     scene.setOnSceneTouchListener(new IOnSceneTouchListener() { 
      @Override 
      public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {    

       if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_MOVE){     

        particleSystem.setParticlesSpawnEnabled(true);     
        particleEmitter.setCenter(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); 

        mSprite[getIndex()].setPosition(pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); 
        mSprite[getIndex()].setVisible(true); 

       }else if (pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP){ 

        particleSystem.setParticlesSpawnEnabled(false); 
        hideAll(); 

       }else if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN){ 

        particleSystem.reset(); 

       } 

       return true; 
      } 
     });  

     particleSystem.addParticleInitializer(new ColorInitializer(1, 0, 0)); 
     particleSystem.addParticleInitializer(new AlphaInitializer(0)); 
     particleSystem.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE); 
//  particleSystem.addParticleInitializer(new VelocityInitializer(-2, 2, -20, -10)); 
     particleSystem.addParticleInitializer(new GravityInitializer()); 

//  particleSystem.addParticleModifier(new ScaleModifier(0.5f, 1.0f, 0, 1.5f)); 
     particleSystem.addParticleModifier(new ColorModifier(1, 1, 0, 0.5f, 0, 0, 0, 3)); 
     particleSystem.addParticleModifier(new ColorModifier(1, 1, 0.5f, 1, 0, 1, 4, 6)); 
     particleSystem.addParticleModifier(new AlphaModifier(0, 1, 0, 0.5f)); 
     particleSystem.addParticleModifier(new AlphaModifier(1, 0, 2.5f, 3.5f)); 
     particleSystem.addParticleModifier(new ExpireModifier(6, 6f)); 

     scene.attachChild(particleSystem); 


     for(int i = 0; i < mSprite.length; i++){ 
      mSprite[i] = new Sprite(-20, 0, mStreadTextureRegion); 
      mSprite[i].setVisible(false); 
      scene.attachChild(mSprite[i]); 
     } 





     return scene; 
    } 

    @Override 
    public void onLoadComplete() { 

    } 


    private int getIndex(){ 
     if(mIndex >= mSprite.length -1){ 
      mIndex = 0; 
     } 
     System.out.println("Index ........ "+mIndex); 
     return mIndex++; 
    } 

    private void hideAll(){ 
     for(int i = 0; i<mSprite.length; i++){ 
      mSprite[i].setVisible(false); 
      mSprite[i].setPosition(-CAMERA_WIDTH, 0); 
     } 
    } 
    // =========================================================== 
    // Methods 
    // =========================================================== 

    // =========================================================== 
    // Inner and Anonymous Classes 
    // =========================================================== 
} 

Image i used whit this code

图像此代码也附有

更新实现

偏效应..但在快速重击的问题..所有完整的项目都在这里上传http://www.andengine.org/forums/post31772.html#p31772

partial effect

+0

发现了另一个问题,这里是我的问题http://stackoverflow.com/questions/9715524/fast-swipe-touchevent-action-move-is-missing-y坐标 - 和 - x坐标 – 2012-03-15 07:31:47

+1

请问有没有人在这个世界上谁知道答案... – 2012-03-16 10:00:14

+1

你好算法中我一直在尝试很多关于这一点!我在你的同一个位置的人。但看到很多与水果切片深入。我认为他们不会像我们在这里所做的那样使用刀片切片图像。你有没有进一步的兄弟? – Wesley 2012-04-05 11:25:58

回答

1

这里是LibGDX的解决方案。它使用GL_TRIANGLE_STRIP。

https://github.com/mattdesl/lwjgl-basics/wiki/LibGDX-Finger-Swipe

最终溶液使用两个三角形条带和一个自定义属性texCoord,从而允许我们使用的查找纹理来实现假(但高效的)的抗混叠。更高效/灵活的抗锯齿将使用着色器和单个三角形条。顶部使用顶点属性-1.0,滑动底部使用顶点属性-1.0,提示使用1.0。然后在碎片着色器中,使用abs() - 因此0.0表示“中心”,1.0表示“边缘”。

事情是这样的:

color.a *= smoothstep(0.0, 2./thickness, 1.0-abs(vTexCoord.t));