2011-12-24 15 views
9

Estoy planeando crear un juego simple usando la etiqueta HTML5 <canvas> y compilar el código en una aplicación nativa usando Phonegap, pero el problema es que canvas usan coordenadas que no son relativas al tamaño de eso, así que 20,20 en una pantalla de 960x640 es diferente en una de 480x800.Trabajando con lienzo en diferentes tamaños de pantalla

Así que quiero saber cómo trabajar con un <canvas> (que estará en pantalla completa) en diferentes tamaños de pantalla.

Respuesta

17

Así que quiero saber cómo trabajar con un (que será en pantalla completa) en diferentes tamaños de pantalla.

Este es un problema común que tiene una resolución bastante fácil. A menudo, esto se hace separando las coordenadas del lienzo duro de lo que a veces se llama coordenadas "modelo".

Realmente depende de cómo esté organizado el código, pero supongo que el juego tiene algo de altura y ancho para el mundo que ocupa la mayor parte o la totalidad de la pantalla. Las dos proporciones de aspecto de las pantallas a las que se dirige son 1.5 y 1.666, por lo que querrá atender al más pequeño

Así que realmente querrá hacer su juego en un conjunto de coordenadas "modelo" que no tienen relación con la pantalla o el tamaño del lienzo. Dado que solo está orientando dos tamaños de pantalla, las coordenadas de su modelo pueden ser de 960x640, ya que esa es la menor de las dos proporciones de aspecto. No tiene que ser así. En su lugar, podría ser 100x50 para las coordenadas de su modelo. Pero en este ejemplo usaremos 960x640 como coordenadas de nuestro modelo.

Internamente, nunca utilizará otra cosa que estas coordenadas del modelo. Nunca piensas en otras coordenadas al hacer tu juego.

Cuando el tamaño de la pantalla es 960x640 no tendrá que cambiar nada en absoluto ya que es una asignación 1: 1, que es conveniente.

Luego, cuando el tamaño de la pantalla es realmente de 800x480, cuando llegue el momento de dibujar en la pantalla, querrá traducir todas las coordenadas del modelo por (3/4), por lo que el juego se realizará y usará internamente 960x480, pero se dibujará en el área de (720x480). También querrá tomar cualquier mouse o entrada táctil y multiplicarlo por (4/3) para convertir las coordenadas de la pantalla en coordenadas del modelo.

Esta traducción puede ser tan fácil como llamar al ctx.scale(3/4, 3/4) antes de dibujar todo.

Por lo tanto, ambas plataformas tendrán un código que está escrito asumiendo que el juego tiene un tamaño de 960x640. La única vez que las coordenadas del modelo se convierten en coordinadas de pantalla es cuando se dibuja en el lienzo (que es de un tamaño diferente) y se convierten las coordenadas del mouse/touch del lienzo en coordenadas del modelo.

Si eso te parece confuso, puedo intentar hacer una muestra.

+0

obras ctx.scale pero hace un poco borrosa mapas de bits (incluso escalar hacia abajo). La solución para esto sería tener diferentes conjuntos de imágenes para cada resolución (rango), ¿verdad? – Ixx

+0

¿Por qué toda esta escala explícita? Use el ancho/alto en el HTML para establecer el tamaño de su "modelo", y use esas coordenadas sin escala en todas partes. Luego use CSS para hacer que el tamaño físico de su coincida con la pantalla. El navegador se ocupará internamente de todas las escalas (incluso cuando cambie la orientación del teléfono inteligente), haciendo que parezca que siempre tiene acceso a todo el tamaño de coordenadas de su modelo. Lo único que tiene que escalar explícitamente son las coordenadas de entrada del mouse, que se tecleará en el tamaño físico de la pantalla en lugar del tamaño del modelo . –

1

Dado que tiene solo 2 tamaños de pantalla, puede tener 2 lienzos diferentes (y su lógica detrás) con diferentes tamaños.
Si no te gusta esta solución, creo que solo puedes usar tamaños en% en lugar de dimensión absoluta en píxeles. Por último pero no menos importante, intente establecer diferentes valores en la metaetiqueta.

4

Uso innerWidth/innerHeight de window objeto:

canvas.height = window.innerHeight; 
canvas.width = window.innerWidth; 

Se va a auto-ajuste cualquier pantalla; ¡debe probar la compatibilidad de plataforma cruzada/pantalla!

Además, en lugar de utilizar predefinidos x,y coordina, usar algo como esto:

var innerWidth = window.innerWidth; 
x = innerWidth/3; 
Cuestiones relacionadas