Dimensiones de pantalla que se calculan incorrectamente
Recientemente he estado tratando de implementar mi primer juego con Android utilizando un enfoque similar al LunarLander infame. Estoy haciendo los gráficos sin la ayuda de un motor de juego, y que parece ser la parte más complicada de la empresa hasta el momento.
El problema
Estoy determinando el ancho de la pantalla, y enviando esa información en un algoritmo que determina el número máximo de imágenes que se pueden renderizar horizontalmente dado el ancho y algunos otros valores de margen (vea calculateMaxBeadsInWidth()
abajo). Sin embargo, las matemáticas parecen no coincidir con los valores calculados por el algoritmo. Básicamente, es determinante que sólo X
cantidad de imágenes se puede mostrar, cuando en realidad X + 2
imágenes pueden ser fácilmente visualizadas en la pantalla.
- Cómo reanudar MediaPlayer en Android después de presionar el botón de inicio y volver a abrir la aplicación
- Extraño problema de rendimiento con Galaxy Tab
- SurfaceView se retrasa si está en ScrollView
- Ajuste de una vista previa de la cámara a un SurfaceView más grande que la pantalla
- End SurfaceView y GameThread al salir de la aplicación
Los Cálculos
He analizado muchas salidas de depuración que muestran que el ancho real de la pantalla es de 800 pixels
, y el ancho de la imagen es de 44 pixels
. Por lo tanto, dado que el margen es de 100 pixels
( 50 pixels
en el extremo izquierdo y 50 pixels
en el extremo derecho), que deja 700 pixels
para trabajar. Ahora, el floor(700 / 44) = 15
, por lo que sólo se muestran 15 imágenes. Pero hay claramente espacio para más (ver fotos)!
El código
Mi algoritmo:
private int calculateMaxBeadsInWidth() { float eff_width = screenWidth - (BOARD_MARGIN_HORIZONTAL * 2); return (int) (eff_width / bead_width); }
Tenga en cuenta que el valor de BOARD_MARGIN_HORIZONTAL
es 50.0f
.
Algunas fotos
Esto es lo que está produciendo mi algoritmo:
Sin embargo, como se puede ver, es obvio que fácilmente podría encajar al menos 2 bolas más hacia el final de las líneas (a la derecha). Por ejemplo, esta imagen muestra lo que sucede cuando código duro el número de cuentas en una fila a dos más que el algoritmo está produciendo:
Aquí está la imagen con los márgenes detallados con líneas rojas. Como se puede ver todavía hay mucho espacio:
Información suplementaria
Estoy probando esta aplicación en Google Nexus 7.
Estoy utilizando getResources().getDisplayMetrics().widthPixels;
Para obtener el ancho de la pantalla. Tal vez el problema es aquí?
Mi pregunta
¿Hay algunos valores de resolución que no estoy tomando en consideración aquí que están afectando los resultados? ¿Por qué se calcula esto de manera tan inexacta?
¡Si usted necesita más información que alegremente la proporcionará, cualquier ayuda sería apreciada grandemente!
- ¿Puedo usar lockCanvas () en onPreviewFrame callback?
- Android: FPS bajo que dibuja muchos mapas de bits en una vista de superficie
- Anular onDraw () o draw ()?
- El nuevo procesamiento de gms.maps.MapView se retrasa un poco cuando está en un ListView?
- Android Surfaceview Crash sin salida de error
- Programación con SurfaceView y estrategia de hilos para el desarrollo de juegos
- SurfaceView onMeasure () no estableció la dimensión medida llamando setMeasuredDimension ()
- Android SurfaceView causando parpadeo de la pantalla
Sus márgenes son el valor equivocado. Has subido imágenes de tamaño completo, pero si dibujas líneas verticales @ 50px y 750px, intersecan el área de dibujo. Por lo tanto, usted está utilizando el valor equivocado en sus cálculos, o en otro lugar que está dibujando en lo que se supone que es el margen.
- Animación de transición entre actividades con AnimationSet
- Facebook auth dialog return La página que solicitó no fue encontrada en lugar de redireccionar de nuevo a mi actividad?