2010-12-21 11 views
8

Necesito su consejo sobre la mejor manera de implementar un campo de juego desplazable en un juego simple. El campo consta de varias filas, con 9 celdas en cada fila. Las filas se pueden agregar y eliminar dinámicamente durante el transcurso del juego. Cada celda tiene un dígito y, opcionalmente, varias imágenes superpuestas, como selección, selector, tachado, etc. (ver la imagen a continuación). El usuario debería poder hacer clic en celdas individuales de una fila para seleccionar/deseleccionar/cruzar las celdas tocadas. En cualquier punto del juego puede haber de 0 a 3000 celdas (de 0 a alrededor de 333 filas). El campo debe desplazarse hacia arriba y hacia abajo suavemente.Decisiones de diseño/consejos para un juego simple en Android

alt text

Estaba pensando en tener un ListView con su cada fila una fila en el campo. De esa forma podría agregar/eliminar filas dinámicamente durante el juego. Sin embargo, ¿cómo exactamente debo implementar una fila: tener un mapa de bits que representa una fila, y luego cuando el usuario lo toque, obtener las coordenadas del área táctil y descubrir qué celda se vio afectada, y luego actuar sobre eso. ¿Es posible obtener las coordenadas táctiles de una fila en ListView? Si no, ¿debo colocar 9 marcadores de posición de imágenes falsas en cada fila, y luego actuar en el usuario tocando los? ¿Qué hay del rendimiento?

¿O debería tener un gran mapa de bits/lienzo que represente todo el campo, colocarlo dentro de un ScrollView y luego calcular todas las coordenadas y actualizarlo mientras el usuario interactúa con él? ¿Va a ser más rápido o más lento que ListView?

¿Alguna otra solución?

Prefiero que sea un juego de aplicación "normal", no un juego basado en bucle, ya que no creo que realmente deba volver a dibujar 30 veces por segundo.

Soy bastante nuevo en Android. Gracias por tus sugerencias.

Respuesta

4

Puede hacer fácilmente que ese tipo de configuración se ejecute rápidamente con una combinación de "bucle de juego"/vista de superficie. Eso significa que no hay ListView, solo dibujo personalizado y manejo de eventos. Afortunadamente, el manejo del evento no es tan difícil, y usted ganará más adelante porque tendrá un control mucho mayor sobre la interfaz que si hubiera ido con un montón de vistas y diseños personalizados.

Evitaría ese tutorial de www.droidnova.com, utiliza HashMaps innecesariamente, lo que solo le costará en rendimiento.

Así es como me gustaría ir al respecto:

  1. crear un objeto de mantener sus datos celulares. Para este ejemplo, usaría un objeto con una identificación (para imprimir), y una xey para dónde dibujar en la pantalla.
  2. Elija un tamaño de placa que se ajuste a su pantalla sin desplazarse, digamos 10x10. Agregarás el desplazamiento más tarde.
  3. Crea una matriz bidimensional de objetos de celda con longitudes tablero Tamaño x tablero Tamaño. Llene los objetos con la posición id y xey en la pantalla.
  4. En su onDraw personalizado, recorra cada "fila" y "columna" de su única matriz y dibuje el objeto en su valor xey almacenado.

Así que ahora tiene una grilla de objetos que se muestran en su pantalla. Ahora quiere restringir el número de filas que se muestran actualmente y agregar alguna funcionalidad para cambiar las filas visibles. Esto se hace de la siguiente manera:

  1. Durante la inicialización, configurar algunos enteros globales como mCurrentRow = 0 y mNumVisibleRows = 3. Estos son su "ventana de vista".
  2. Modifique el código de dibujo para que solo dibuje filas comenzando en mCurrentRow y terminando en mCurrentRow + mNumVisibleRows. El resultado de esto debería ser que solo verá filas de mNumVisibleRows y qué grupo de filas verá depende de a qué establezca mCurrentRow.
  3. Agregue algunos triángulos a la derecha de su dibujo de cuadrícula y haga que los eventos toque toque en esas áreas se asignen a incrementos/decrementos de mCurrentRow. Obviamente, no debe permitir que ese valor salga de sus límites de recuento de filas.
  4. Si quieres ser elegante, traza una línea entre tus triángulos para un área de desplazamiento, y asigna eventos táctiles a algo como newCurrentRow = (touch.y/canvas.height()) * boardSize;. Eso necesita algunos ajustes, pero ya entiendes.

Este enfoque tiene la desventaja de mostrar sólo un conjunto completo de filas a la vez, por lo que el desplazamiento no sería suave. Sin embargo, tienes control total sobre tu lienzo y lo que dibujas, así que con un poco más de matemática podrías implementar un mecanismo de desplazamiento uniforme que se compensaría con una altura de fila fraccionaria en la dirección y en lugar de filas enteras.

+0

Gracias Josh, tu consejo es muy útil. Ya lo estoy implementando. – Levon

1

No sé si puedes crear un juego como el que describiste con buen rendimiento. Me gustaría ver la programación básica de juegos de fichas.

Pero al evitar que los componentes de vista estándar tengan que escribir toda la lógica usted mismo requiere bastante trabajo. Cosas como el manejo de eventos de "clic" en filas diferentes deben calcularse según la posición del mosaico con respecto a la cámara del juego. Así que hay muchas cosas nuevas para aprender a desarrollar juegos en un nivel inferior.

También tiene que tomar en cuenta la renderización de su juego mediante el desarrollo de un bucle de juego que actualiza y dibuja constantemente sus fichas de un hilo de fondo para reflejar el desplazamiento/estado de su juego. Usted puede obtener mas información en los fundamentos de un bucle de juego en:

http://www.rbgrn.net/content/54-getting-started-android-game-development

Si desea obtener más información usted debe ver las siguientes notas claves del androide.

http://developer.android.com/videos/index.html#v=U4Bk5rmIpic http://developer.android.com/videos/index.html#v=7-62tRHLcHk

Aquellos que dan una muy buena penetración en el desarrollo de juegos para Andriod a un bajo nivel en el que puede ajustar para el rendimiento.

+0

Gracias por su asesoramiento y los enlaces. – Levon

Cuestiones relacionadas