pyxen.draw
El módulo draw dibuja formas directamente en la pantalla, fotograma a fotograma.
Llámalo desde update(): lo que dibujas pertenece a ese fotograma y el siguiente empieza
vacío, así que lo vuelves a dibujar en cada fotograma mientras deba verse.
from pyxen import *
def update():
draw.circle(64, 64, 20, fill=(1, 0.2, 0.3, 1))
draw.line(0, 0, 128, 128, color=(1, 1, 1, 1))
No se crea nada: no hay ninguna entidad que conservar ni nada que destruir. El depurador con viaje en el tiempo guarda lo que dibujó cada fotograma: cuando pausas y retrocedes por los fotogramas, cada uno muestra sus formas tal como se vieron durante la partida.
¿draw o un componente Shape?
Pyxen ofrece las mismas primitivas dos veces. En pantalla son idénticas y solo se diferencian por su duración.
| Componente Shape | draw | |
|---|---|---|
| Duración | Vive hasta que destruyes la entidad | Cada fotograma lo vuelve a dibujar |
| Posición | Posición, rotación y escala de la entidad | Coordenadas de mundo que tú pasas |
| Coste | Una entidad completa: transform, capa, almacenamiento de componentes | Unos pocos quads en el búfer del fotograma |
| Depurador | Listado e inspeccionado como entidad | Visible en cada fotograma al que vuelves |
| Útil para | Objetos del juego: naves, muros, interfaz fija | La imagen del estado de tu juego: estelas, superposiciones, barras de interfaz |
Usa Shape cuando la cosa es algo de tu juego. Usa draw cuando estés pintando la imagen
de un estado que tus entidades ya guardan: mantén ese estado en entidades y componentes, donde
el depurador y el Inspector lo ven, y dibújalo en cada fotograma.
Colores
Cada argumento de color acepta una tupla (r, g, b, a) con componentes de 0.0 a 1.0, o
un Color.
draw.rect(10, 10, 40, 20, fill=(1, 0, 0, 1)) # rojo opaco
draw.rect(10, 40, 40, 20, fill=(1, 0, 0, 0.35)) # rojo al 35 %
Las formas rellenas no dibujan nada por defecto. draw.rect, draw.triangle y
draw.circle empiezan con fill y stroke totalmente transparentes, así que una llamada
que no pase ninguno es invisible: es la sorpresa más frecuente con este módulo. draw.line
y draw.polyline, en cambio, usan blanco opaco por defecto y siempre se ven.
Funciones
draw.line(x1, y1, x2, y2, color=(1,1,1,1), width=1)
Una línea recta entre dos puntos.
| Argumento | Tipo | Descripción |
|---|---|---|
x1, y1 | float | Punto inicial, en coordenadas de mundo. |
x2, y2 | float | Punto final. |
color | tupla | Color de la línea. Blanco opaco por defecto. |
width | float | Grosor en píxeles. Vale 1 por defecto. |
def update():
draw.line(0, 64, 128, 64, color=(0.3, 1, 0.5, 1), width=2)
draw.polyline(points, color=(1,1,1,1), width=1, closed=False)
Una serie de segmentos unidos.
| Argumento | Tipo | Descripción |
|---|---|---|
points | tupla o FloatBuffer | Secuencia plana (x1, y1, x2, y2, …), no una lista de pares. |
color | tupla | Color de la línea. Blanco opaco por defecto. |
width | float | Grosor en píxeles. |
closed | bool | Si es True, une el último punto con el primero. |
def update():
draw.polyline((10, 10, 40, 60, 80, 20, 110, 70),
color=(1, 0.8, 0.2, 1), width=2)
Los puntos van planos a propósito: es la forma que ya tiene un FloatBuffer, de modo que un
trazado calculado una vez puede pasarse tal cual a draw.polyline en cada fotograma, sin
reconstruirlo.
draw.rect(x, y, width, height, fill=None, stroke=None, stroke_width=1)
Un rectángulo alineado con los ejes. x, y es su esquina, no su centro.
| Argumento | Tipo | Descripción |
|---|---|---|
x, y | float | Posición de la esquina. |
width, height | float | Tamaño en píxeles. |
fill | tupla | Color interior. Omítelo para no rellenar. |
stroke | tupla | Color del contorno. Omítelo para no trazarlo. |
stroke_width | float | Grosor del contorno. Vale 1 por defecto. |
def update():
# Una barra de vida: fondo oscuro, relleno vivo, contorno fino.
draw.rect(4, 4, 60, 6, fill=(0.1, 0.1, 0.1, 1))
draw.rect(4, 4, 60 * health / max_health, 6, fill=(0.2, 1, 0.4, 1))
draw.rect(4, 4, 60, 6, stroke=(1, 1, 1, 0.5))
draw.triangle(x1, y1, x2, y2, x3, y3, fill=None, stroke=None, stroke_width=1)
Un triángulo que pasa por tres puntos.
| Argumento | Tipo | Descripción |
|---|---|---|
x1, y1, x2, y2, x3, y3 | float | Los tres vértices. |
fill | tupla | Color interior. Omítelo para no rellenar. |
stroke | tupla | Color del contorno. Omítelo para no trazarlo. |
stroke_width | float | Grosor del contorno. |
def update():
draw.triangle(64, 20, 84, 60, 44, 60, fill=(1, 1, 0.3, 1))
draw.circle(x, y, radius, fill=None, stroke=None, stroke_width=1, segments=12)
Un círculo alrededor de un punto central.
| Argumento | Tipo | Descripción |
|---|---|---|
x, y | float | Posición del centro. |
radius | float | Radio en píxeles. |
fill | tupla | Color interior. Omítelo para no rellenar. |
stroke | tupla | Color del contorno. Omítelo para no trazarlo. |
stroke_width | float | Grosor del contorno. |
segments | int | Segmentos rectos que aproximan la curva. Vale 12 por defecto. |
Un círculo es en realidad un polígono. Doce segmentos ya parecen redondos en tamaños pequeños; súbelo para círculos grandes y bájalo cuando quieras un polígono visible.
def update():
draw.circle(64, 64, 24, fill=(0.2, 0.4, 1, 1), segments=32)
draw.circle(64, 64, 30, stroke=(1, 1, 1, 0.4), segments=32)
Notas
- Las llamadas a
drawvan enupdate(). Desdestart()dibujan un único fotograma y luego desaparecen. - El dibujo usa coordenadas de mundo, así que la cámara lo mueve. Para una interfaz que se
quede fija, dibuja en relación a
camerao mantén la interfaz en una cámara que no se mueva. - Todo lo dibujado en un fotograma queda por encima de los sprites dibujados en ese fotograma.