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 Shapedraw
DuraciónVive hasta que destruyes la entidadUn fotograma
PosiciónPosición, rotación y escala de la entidadCoordenadas de mundo que tú pasas
CosteUna entidad completa: transform, capa, almacenamiento de componentesUnos pocos quads en el búfer del fotograma
Útil paraObjetos del juego: naves, muros, interfaz fijaGeometrí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.

ArgumentoTipoDescripción
x1, y1floatPunto inicial, en coordenadas de mundo.
x2, y2floatPunto final.
colortuplaColor de la línea. Blanco opaco por defecto.
widthfloatGrosor 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.

ArgumentoTipoDescripción
pointstupla o FloatBufferSecuencia plana (x1, y1, x2, y2, …), no una lista de pares.
colortuplaColor de la línea. Blanco opaco por defecto.
widthfloatGrosor en píxeles.
closedboolSi 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.

ArgumentoTipoDescripción
x, yfloatPosición de la esquina.
width, heightfloatTamaño en píxeles.
filltuplaColor interior. Omítelo para no rellenar.
stroketuplaColor del contorno. Omítelo para no trazarlo.
stroke_widthfloatGrosor 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.

ArgumentoTipoDescripción
x1, y1, x2, y2, x3, y3floatLos tres vértices.
filltuplaColor interior. Omítelo para no rellenar.
stroketuplaColor del contorno. Omítelo para no trazarlo.
stroke_widthfloatGrosor 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.

ArgumentoTipoDescripción
x, yfloatPosición del centro.
radiusfloatRadio en píxeles.
filltuplaColor interior. Omítelo para no rellenar.
stroketuplaColor del contorno. Omítelo para no trazarlo.
stroke_widthfloatGrosor del contorno.
segmentsintSegmentos 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 draw van en update(). Desde start() 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 camera o 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.