Esta mañana he hecho una pequeña prueba en PowerBuilder: un Snake completamente jugable usando únicamente un DataWindow, sin imágenes, sin gráficos externos y sin controles de terceros.
La implementación la ha ido generando Claude Code a partir de la idea y del enfoque que yo quería probar.
La idea del juego me ha surgido después de ver Minefield DataWindow Game, un Buscaminas hecho en PowerBuilder, que me ha parecido una forma muy curiosa de usar un DataWindow como superficie visual. A partir de ahí me he planteado hacer lo mismo, pero con un Snake.
Primera versión
La primera versión que he montado funcionaba así:
-
Un DataWindow (
dw_snake) con un único detail band como “pantalla” - Una cuadrícula lógica de 31×21
- La serpiente almacenada en arrays de coordenadas
-
Un
Timercada 0.12s -
Control de dirección desde el evento
Key
El renderizado se hacía destruyendo y recreando rectángulos en cada tick mediante Modify().
Funcionaba, pero tenía dos problemas claros:
- Parpadeo
- Demasiado trabajo por frame
La mejora
Después me he encontrado con Three Simple Games de René Ullrich en Appeon CodeExchange, que incluye también una versión de Snake hecha con DataWindow.
De ese ejemplo he tomado la idea clave que mejora mucho el enfoque:
- No recrear rectángulos continuamente, sino crearlos una sola vez y hacer que su estado dependa de los datos.
Versión refactorizada
La versión final trabaja así:
- Una fila por cada fila del tablero
-
Una columna
cellstipochar() -
Cada carácter representa una celda:
-
0= vacío -
1= cuerpo -
2= cabeza -
9= comida
-
Al abrir la ventana, se crean una sola vez los rectángulos (cell_1..cell_31) y se enlazan a expresiones del DataWindow para controlar:
- visibilidad
- color
De esa forma, en cada tick ya no hace falta reconstruir visualmente todo.
Ahora solo se actualizan unas pocas celdas con SetItem():
- nueva cabeza
- antigua cabeza → cuerpo
- cola → vacío
Resultado:
- sin flicker (parpadeo)
- mucho menos trabajo por tick
- movimiento bastante más fluido
También he añadido un pequeño guard (ib_intimer) para evitar reentradas del Timer.
Código
La demo se queda en solo dos archivos:
-
w_snake.srw -
dw_snake.srd
Descarga
¡Nos vemos en el próximo artículo! Y recuerda: en PowerBuilder, los límites solo están en nuestra imaginación. 🚀
Comentarios
Publicar un comentario