La mejor práctica para usar Sprites en un juego usando AndEngine GLES2
Actualmente estoy teniendo referencia estática a todos mis sprites y cargando e inicializando en mi OnCreateResource mthod de SimpleBaseGameActivity, Pero ahora tengo que anular el oyente onAreaTouched en spirtes y la forma en que puedo anularlo mientras Inicializando el Sprite. Pero tengo un método estático que crea el Atlas y la región de la textura para cada sprite. Y estoy utilizando estos sprites en mi clase de escena y quiero anular onAreaTouched allí. Puedo registerTouchArea para ese sprite específico en mi escena de modo que pueda ser hecha Pero quiero substituir OnAreaTouched de una manera de modo que la reutilización del código pueda ser hecha. Aquí es cómo estoy creando y cargando actualmente sprites.
defualtCageSprite = createAndLoadSimpleSprite("bg.png", this, 450, 444);
Y este es mi método createAndLoadSimpleSprite.
- EGL trabajando en Linux pero no en Android
- Matrices OpenGL - no pueden figurar las correctas
- Procesamiento de texto Android OpenGL ES 2.0
- Escena de OpenGL con fondo transparente + widgets nativos por debajo y por encima
- ¿Cómo aprender y usar OpenGL ES 2.0? Simplemente no lo entiendo - Qn serio.
public static Sprite createAndLoadSimpleSprite(String name, SimpleBaseGameActivity activity, int width, int height) { BitmapTextureAtlas atlasForBGSprite = new BitmapTextureAtlas( activity.getTextureManager(), width, height); TextureRegion backgroundSpriteTextureRegion = BitmapTextureAtlasTextureRegionFactory .createFromAsset(atlasForBGSprite, activity, name, 0, 0); Sprite sprite = new Sprite(0, 0, backgroundSpriteTextureRegion, activity.getVertexBufferObjectManager()); activity.getTextureManager().loadTexture(atlasForBGSprite); return sprite; }
Ahora ¿Cómo puedo anular onAreaTouched para algunos sprites sin perder la reutilización del código.
- Cómo utilizar la cámara con Android OpenGL ES para trabajar?
- GLSurfaceView que muestra negro en Nexus 7 con Android 4.2
- Dibuja una imagen 2D con OpenGL ES 2.0
- Point sprite desaparece en el borde de la pantalla en mi Galaxy S4 (no en el Nexus 7)
- Android OpenGL ES: auto-corrección env-> self y NvRmChannelSubmit fallaron
- Android opengl-es-2.0 - explicación rotateM
- Aplicando textura a Cubo, textura diferente en cada cara de cubo
- LibGDX 0.9.9 - Aplicar cubemap en el entorno
¿Hay alguna razón para cargar las texturas en tiempo de ejecución? La forma normal es cargar todas las texturas requeridas en un solo atlas mientras se carga la aplicación para poder luego usarlas más tarde.
En cuanto a la reutilización del código, la idea de Todilo sobre los enums parece ser más o menos lo que necesita. Digamos, por ejemplo, que tiene dos tipos de objetos: objetos que desaparecen al tocarlos y objetos que vuelan cuando los toca. Enumerar ambas categorías y poner un código en el código de manejo de eventos táctiles que comprueba si el objeto debe desaparecer o volar.
Si no sabe lo que los objetos deben hacer en el tacto antes de ejecutar la aplicación, hay una forma más dinámica de lograr el mismo resultado. Basta con crear dos listas en tiempo de ejecución y poner una referencia al objeto en una de las listas de acuerdo a lo que el objeto debe hacer cuando se toca. A continuación, en el manejo de eventos táctiles hacer algo como esto:
if (disappearList.contains(touchedObject)) { disappear(object) } if (flyUpList.contains(touchedObject)) { flyUp(object) }
Malo AndEngine no permite a los usuarios establecer oyentes en sprites, que haría las cosas un poco más fácil.
EDIT: Explicación agregada del uso de BlackPawnTextureBuilder: Tu atlas debe ser del tipo BuildableBitmapTextureAtlas, después agregas todas las texturas como ésta
BitmapTextureAtlasTextureRegionFactory.createFromAsset(buildableAtlas, this, "image.png"));
y después de eso
try { this.buildableAtlas.build(new BlackPawnTextureBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(1)); } catch (final TextureAtlasSourcePackingException e) { Debug.e(e); }
No sé si esto funcionará para Sprites animados o no, tendrá que probarlo. Además, no hay sobrepasar onTouch, tendrá que hacerlo en el método onAreaTouched. Un ejemplo de tal condición es
if (pSceneMotionEvent.getAction() == MotionEvent.ACTION_DOWN && disappearList.contains(pTouchArea)) {disappear();}
¿Estás seguro de que no quieres más funcionalidades que sobreponer a ontouch? ¿Qué te parece la creación de una clase de heredar para sprite para aquellos que necesitan onarea para ser anulada y todas las demás necesidades.
- ¿Podemos tener INSTALL_REFERRER dos veces en una sola aplicación de Android?
- Android Apk decompilación parece fácil