2012-03-14 135 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));