pyxen.draw
El módulo draw dibuja formas directamente en la pantalla durante un solo fotograma.
Llámalo desde update(); lo que dibujes se borra al final del fotograma, así que lo vuelves
a dibujar en el siguiente o desaparece.
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 y nada persiste: no hay ninguna entidad que conservar ni nada que destruir.
¿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 | Un fotograma |
| 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 |
| Útil para | Objetos del juego: naves, muros, interfaz fija | Geometría procedural, depuración en pantalla, barras de interfaz, estelas |
Usa Shape cuando la cosa es algo de tu juego. Usa draw cuando estés pintando la imagen
de algo que ya controlas por tu cuenta.
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.