Pico-8 Zine 1 Español
Pico-8 Zine 1 Español
Pico-8 Zine 1 Español
HACK-run-learn
share-love-play
code-create-draw
make-design-BE
think-write-break
participate-retry
modify-dream-try-
PICO-8 es un fanzine hecho por y para usuarios de PICO-8.
El título está usado usado con el permiso de Lexaloffle Games LLP.
Para más información: www.pico-8.com
Contacto: @arnaud_debock
Ilustración portada: @dotsukiHARA
Traducción: @irenens_
2
Breve historia de PICO-8
Saludos, lectores de fanzine. Mi nombre es zep, o Joseph White en
la vida real. Soy el autor de PICO-8, y me alegré mucho cuando
supe sobre esta publicación. Al tratarse de la edición # 1, pensé
que sería apropiado dar en primer lugar unas pinceladas sobre cómo
surgió PICO-8.
3
Herramientas y Editores
Cuando empecé a emprender la tarea de crear juegos enteros no
sabía qué tipo de herramientas existían para hacer gráficos, y
no se me ocurrió mirar. Se convirtió en una especie de ritual al
inicio de cada proyecto reescribir un editor de sprites, mapper,
editor de sonido, o cualquier otra herramienta que requiriese cada
nuevo juego.
Éste hábito acabó manifestándose como poido (“pointy Dough”) -- un
editor de propósito general creado en casa al comienzo de Lexal-
offle. Contaba con modos de edición de sprites, paletas, modelos,
mapas uv, animación esquelética, audio, y más adelante incorporó
un sintetizador de sonido modular y modelador voxel.
LEX500
Un avance rápido hasta 2004. Estuve haciendo Lexaloffle durante
un par de años - lancé un par de juegos de puzzle que no vendieron
muy bien, e hice pequeñas cosas por diversión para permanecer cu-
erdo mientras hacía otros trabajos para mantenerme a flote. Uno
de ellos fue un proyecto llamado LEX500 nombrado en honor a Amiga
500, aunque era realmente más como un Beeb. Tenía una resolución
de 240x240, una paleta fija de 16 colores, y arrancaba en un en-
torno de BASIC.
4
LEX500 seguía siendo sólo un montón de notas y maquetas -- en su
momento fue más bien como un ejercicio de diseño. No había mucho
que lo diferenciase de arrancar un emulador en BBC Micro, aunque
lo que sí tenía es un editor de sprites integrado. Una carac-
terística peculiar de LEX500 fue que los sprites se presentaban
directamente en el editor de código cuando los referenciabas.
Formatos visuales
Aparte de trabajar en LEX500, empecé a probar con simuladores
de pantalla en otros formatos que convertirían cualquier cosa
hecha con ellos a su propio y particular estilo visual. El prim-
ero de ellos estuvo inspirado por una combinación de la primera
demostración de Voxlap por Ken Silverman, y algunos afortunados
accidentes de raytracing que llevaron a un bloque de voxels de
64x64x32 a renderizarse como cubos. Lo usé para maquetar un juego
de aventuras llamado “Félix y el pájaro de fuego’ (abajo), el cual
acabó convirtiéndose en la base para Voxatron y Voxatron Story.
5
La otra pantalla estaba basada en vectores con un formato de color
de 2 canales: un canal para el tono y el otro para la intensidad.
Los polígonos serían transmitidos a los canales por separado y
luego convertidos a RGB al final de cada frame. Lo usé para un
prototipo de Conflux (2008) y Swarm Racer 3000.
Voxatron
Voxatron comenzó en 2010 con la intención de hacer algo con mi
pequeña pantalla voxel. Inicialmente fue sólo un juego de acción
al estilo Robotron (de ahí el nombre), pero después de ver el
éxito que tuvo el trailer en YouTube, dejé el trabajo que estaba
haciendo en aquel momento y tomé la oportunidad para dedicarme
completamente a ampliarlo y desarrollar el juego de aventura que
había imaginado. Por su insólito formato lo veía también como una
oportunidad para ofrecer una plataforma general para que otros
usuarios pudieran hacer y compartir su propio trabajo con voxel.
Poco a poco se hizo evidente que los dos proyectos tenían más en
común de lo que había previsto.
7
Como Voxatron tiene un conjunto completo de herramientas de
diseño integradas en él, parecía natural hacer lo mismo para
PICO-8, y entonces me di cuenta de por qué era tan importante.
Estuve haciendo prototipos de gráficos 2D a baja resolución con
Voxatron, y curiosamente acabé usando el 128x128 para que PICO-
8 cupiera en una sola parte de la visualización volumétrica de
Voxatron, convirtiéndolo en una plataforma viable. PICO-8 com-
partía los objetivos de Voxatron de operar como una plataforma
que podía aprovechar la Lexaloffle BBS para la distribución y
colaboración.
PICO-8 se había convertido en una destilación 2D minimalista de
Voxatron.
8
Gradualmente me fui enamorando de Lua durante el proceso, y me
deshice de la fachada de BASIC al completo.
Fantasy Console
Por lo tanto, tenía todos esos elementos que apuntaban al concepto
de una “fantasy console”: Cartuchos, herramientas de desarrollo,
una comunidad, formatos de visualización, y controles abstractos.
¡Pero todavía no podía verlo! PICO-8 inicialmente tenía “discos”
y “programas” en lugar de cartuchos - por un tiempo fue más como
un fantasy home computer, que no acababa de estar del todo bien.
-- zep
9
SQUASHY
Vamos a hacer un juego de squash, ¡al estilo del clásico juego
PONG!
Para volver al modo comando de nuevo, ¡sólo tienes que pulsar ESC
en cualquier momento en tu juego!
10
Cuando estás en modo comando, también puedes guardar el juego te-
cleando save game-name ↵.
11
-- paddle
padx=52
pady=122
padw=24
padh=4
function movepaddle()
if btn (0) then
padx-=3
elseif btn(1) then
padx+=3
end
end
function _update()
movepaddle()
end
function _draw()
-- clear the screen
rectfill(0,0, 128,128, 3)
12
function _draw() - -esto se ejecuta despues de UPDATE,
es donde se dibuja el juego
btn(b) -- comprueba si un boton esta apretado. el numero b significa
esto: 0 es ←, 1 es → , 2 es ↑ , 3 es ↓ , 4 es z y 5 es x
rectfill(x1,y1, x2,y2, col) -- dibuja un rectangulo en el color col
x1, y1 son las coordenadas de la esquina superior izquierda
x2,Y2 las de la esquina inferior derecha
Agrega nuevas variables arriba del todo del archivo para que sepa-
mos dónde poner la pelota:
-- ball
ballx=64
bally=64
ballsize=3
ballxdir=5
ballydir=-3
Pulsa ESC para salir del editor y el teclea RUN para ver aparecer
la pelota!
13
### Los nuevos comandos que hemos utilizado
function moveball()
ballx+=ballxdir
bally+=ballydir
end
function _update()
movepaddle()
moveball()
end
Para hacer que la pelota rebote de un lado sólo tenemos que cambi-
ar el signo de dirección de la pelota -- si la velocidad es mayor
que cero la bola se mueve hacia la derecha, y si la velocidad es
inferior a cero la bola se mueve a la izquierda.
14
Añade una nueva función después de la final de moveball()
function bounceball()
-- left
if ballx < ballsize then
ballxdir=-ballxdir
sfx(0)
end
-- right
if ballx > 128-ballsize then
ballxdir=-ballxdir
sfx(0)
end
-- top
if bally < ballsize then
ballydir=-ballydir
sfx(0)
end
end
Y llámalo desde
15
_update():
function _update()
movepaddle()
bounceball()
moveball()
end
5. Dale a la bola!
16
Si quieres, puedes hacer un sonido diferente para cuando el balón
golpea la barra y que suene eso en su lugar.
No te olvides de llamar a la función desde _update()
function _update()
movepaddle()
bounceball()
bouncepaddle()
moveball()
end
Si ejecutas esto, deberías ser capaz de mantener la pelota en la
pantalla moviendo la barra (¡aunque todavía desaparecerá si no le
das y cae por la parte inferior!)
function losedeadball()
if bally>128 then
sfx(3)
bally=24
end
end
7. ¡Marca puntos!
function bouncepaddle()
if ballx>=padx and
ballx<=padx+padw and
bally>pady then
sfx(0)
score+=10 -- incrementa la puntuacion a cada toque
ballydir=-ballydir
18
end
end
function _draw()
-- limpia la pantalla
rectfill(0,0, 128,128, 3)
-- dibuja el marcador
print(score, 12, 6, 15)
-- dibuja la barra
rectfill(padx,pady, padx+padw,pady+padh, 15)
-- dibuja la pelota
circfill(ballx,bally,ballsize,15)
end
8.VIDAS
19
Recuerda que el número de sprites es 004 en este caso!
Ahora puedes agregar una nueva variable en la parte superior del
archivo: lives=3 Y el código para dibujarlo _draw():
function _draw()
-- limpia la pantalla
rectfill(0,0, 128,128, 3)
-- dibuja el marcador
print(score, 12, 6, 15)
-- dibuja la barra
rectfill(padx,pady,
padx+padw,pady+padh, 15)
20
-- dibuja la pelota
circfill(ballx,bally,ballsize,15)
end
(¡Asegúrate de que el número de después de spr coincide con el
número del sprite que hiciste!)
function losedeadball()
if bally>128-ballsize then
if lives>0 then
-- next life
sfx(3)
bally=24
lives-=1
else
-- game over
ballydir=0
ballxdir=0
bally=64
end
end
end
----Alex MOLE
----@TheRealMolen
21
Vamos a hacer música!
Al trabajar con el PICO-8 tracker, hay dos herramientas con las
que debes sentirte cómodo.
1. El Editor SFX
22
La mitad inferior muestra tus notas, con cuatro columnas soste-
niendo ocho notas cada una.
• Columna 1: 2, 3, 5, 6, 7
• Columna 2: q, w, e, r, t, y, u, i
• Columna 3: s, d, g, h, j
• Columna 4: z, x, c, v, b, n, m
Los efectos disponibles son:
23
Personalmente, yo no uso este modo debido a su falta de precisión
sobre los números del tracker, así que no puedo decir mucho al
respecto.
2. El Editor de patrones
En el editor de patrones puedes organizar las secuencias que has
hecho en el editor de sfx para hacer canciones.
Todas las funcionalidades del editor SFX se mantienen en el edi-
tor de patrón.
24
Además, hay:
1.Lista de patrones con cuatro puntos de colores cada uno en re-
presentación de las secuencias seleccionadas.
2.El comportamiento del patrón actual. Empezar bucle, hacer bucle
de nuevo y detenerlo.
3. Las secuencias individuales del patrón seleccionado.
Cada patrón tiene capacidad para cuatro.
3. Haz Música
Ahora que conoces las funcionalidades del tracker de PICO-8,
puedes empezar a hacer alún chiptune alocado.
25
• Un bajo con octava 0-1, un medio a alto lead con octava 1/3 y
la batería son una buena base para un sonido completo.
• Juega con varias combinaciones de efectos, instrumentos, oc-
tavas, volumen y frecuencias. Cambia la velocidad predeterminada
de tus canciones. Puedes hacer loops de batería tremendos dándole
una alta velocidad y notas alejadas entre sí...
4. Reproducción de música
playing =0
music( 0)
function _update ()
end
function _draw ()
cls()
print(“Track” ..PLaying)
end
26
siguiente línea sólo será visible una vez.
Gracias por leerme, espero haber podido ayudar a entender las pis-
tas de audio un poco mejor. Si tienes alguna pregunta más, twit-
teame a @pizzamakesgames.
--Feliks Balzer
27
28
@bitmOO console design
29
TREN DE JUGUETE
Siempre me encantó ver los trenes de juguete de mi abuelo sil-
bar en sus raíles, estoy trabajando en un juego de tren algo más
complicado en este momento, pero me decidí a tratar de aportar
algo más simple a esta revista, en la misma línea.
El mapa
Vamos a empezar con el método _init (), que se ejecuta cada vez
que utilizamos el comando RUN (o CTRL-R, o CMD-R).
Piensa en ello como una puesta a punto para el juego.
function _init()
cls()
switch_state=0
train={{64,8},{72,8},{80,8}}
end
30
Lo realmente útil sobre _INIT() es que se puede ejecutar de nuevo
en cualquier momento y se restablece el juego. Así que trata de
poner todo lo importante en él. En este caso sólo tengo dos vari-
ables, SWITCH_STATE y TRAIN. SWITCH_STATE sólo me dice si el inter-
ruptor para el tren está activado (1) o desactivado (0). Siempre
queremos empenzar con el tren desactivado para que el jugador
tenga la satisfacción de activarlo. Y luego TRAIN es una tabla,
que es básicamente una lista de listas. Cada par de valores es una
lista de dos elementos que representan un segmento del tren. El
primer valor es la posición X, y el segundo valor es la posición
Y. Como ves habrá tres segmentos en este tren, pero puedes añadir
tantos como quieras. Sólo ten cuidado cuando los posiciones. Ver-
emos por qué en un momento.
function move_segment(s,dir)
spd=dir*2
if(s[2]==8) --Arriba
then
if(s[ 1]==112) -- arriba derecha
then
s[2]+=spd
else
s[ 1]+=spd
end
else
if(s [ 1]==112) --derecha
then
if(s [2]==112) --abajo derecha
then
s[ 1]-=spd
else
s[ 2]+=spd
end
else
if(s[ 2]==112) --abajo
then
if(s[ 1]==8) --abajo
s[ 2]-=spd
31
else
s[ 1]-=spd
end
else
if(s [ 1]==8) -- left side
then
if(s [ 2]==8) --top left
then
s[ 1]+=spd
else
s[ 2]-=spd
end
end
end
end
end
end
32
function adv_switch()
if(switch_state<1)
then
switch_state+=1
else
switch_state=0
end
end
Esta función mueve el interruptor a la siguiente posición (viene
de ADV-ances, en inglés). Puedes usar esto para gestionar tantos
estados de conmutación como quieras, simplemente aumentando el
número en el IF. Tener 1 en el IF nos permite tener dos estados de
conmutación, 2 permitiría tres estados, etc. ¡Diferentes estados
podrían hacer cosas muy diferentes!
function move_train()
for t in all(train)
do
move_segment(t,switch_state)
end
end
33
function _update()
if(btnp(4))
then
adv_switch()
end
move_train()
end
La función _UPDATE como ya se ha visto en una lección anterior,
se ejecuta cada vez que se actualiza de juego (30 veces por se-
gundo). La función BTNP comprueba si un botón determinado está
siendo pulsado, en este mismo momento, y esperará unos fotogramas
antes de activarse de nuevo si el botón se mantiene pulsado. Así
que puedes utilizarlo muy cuidadosamente para interruptores. Al
presionar el botón 4 del Jugador 1 (generalmente Z) llamará al
método ADV_SWITCH que se muestra arriba, y encenderá el interrup-
tor. MOVE_TRAIN es algo que queremos ejecutar si se está presiona-
do o no un botón, por lo que lo ponemos fuera del bloque IF...END.
function draw_train()
local len=count(train)
for t=1,len
do
if(t==1)
then
sprite=11
else
if(t==len)
then
sprite=13
else
sprite=12
end
end
spr(sprite,train[t][1],train[t][2])
end
end
Ahora tenemos hacer que se visualice el tren. Esta suele ser la
parte más fácil, es sólo un poco más desordenada aquí porque
34
yo quería tener segmentos especiales al principio y final. Esta
vez utilizamos un tipo bucle diferente FOR, que comienza con T
a 1, y continúa, añadiendo uno cada vez, hasta que T es igual
a la longitud de la lista TREN. Esto nos permite no sólo hacer
cosas con cada segmento, sino también saber fácilmente en qué
lugar del listado nos encontramos. En este caso, el primer seg-
mento / elemento de la lista es el último segmento del tren, por
lo que queremos poner un sprite un poco más aburrido. El último
elemento de la lista es el primer segmento del tren, por lo que
podríamos hacer uno que sea más interesante. Y todos los de en
medio tendrán el mismo sprite.
function draw_switch()
if(switch_state==1)
then
sspr(0,16,16,16,56,56,16,16)
else
sspr(64,16,16,16,56,56,16,16)
end
end
35
Sprites
36
bueno porque se puede cambiar en cualquier momento el sprite 02 y
al instante ver el cambio en todos los mapas.
Deberes:
- Existe al menos una forma de mejorar la función MOVE_SEGMENT.
Trata de hacerla más pequeña.
- Ahora que has organizado lo anterior, desordénalo un poco
tratando de hacer que el tren vaya para otro lado.
- Probablemente podrías añadir una tercera posición en el inter
ruptor para hacer que el tren arranque,
se detenga y dé marcha atrás.
- Trata de hacer el tren vaya más lento antes de que se detenga,
en vez de que lo haga de golpe. Podrías incluso variar la
velocidad cuando se enciende.
- Cambia cualquiera (o todos) los sprites para cambiar la sensación
del juego, o ¡simplemente para que se vea mejor!
¿Para qué otras cosas podrías utilizar la misma mecánica pero con
diferentes elementos visuales?
¡Gracias por leer! Espero que haya sido educativo. ¡Si te ha gus-
tado y especialmente si has hecho algo interesante usando éste
juego como base no dudes en contactar!
Saludos,
James (PROGRAM_IX)
Puedes encontrar la versión original aquí:
http://www.lexaloffle.com/bbs/?tid=2253
37
GEODEZIK
@aliceffekt
http://xxiivv.com
frame = 0
function _update()
frame += 1
-- loop at f127
function _draw()
rectfill(0,0,127,127,0)
i=0
while( i < 20) do
e = (i * 0.5)
line(0,(frame*e),127-(frame*e),0,7)
line((frame*e),127,0,(frame*e),7)
line(127,127-(frame*e),(frame*e),127,7)
line(127-(frame*e),0,127,127-(frame*e),7)
i += 1
end
end
38
Partículas de Humo
Por Mozz http://mozz.itch.io/
1.Hacer la partícula
Al hacer humo debes pensar en las variables que necesitarás más
adelante y sobre qué quieres tener control el momento de crear-
lo. Para este ejemplo decidí que para establecer los valores xy
iniciales quería, el color del humo, y el tamaño inicial de la
partícula de humo.
Estas variables van en los parámetros de la función. El resto
de las variables de la función mantendrán el valor actual de la
partícula en x e y, así como las variables que controlarán la
física más tarde en el programa. La letra d delante de una vari-
able es la abreviatura matemática para delta, o “un cambio en”.
Así dx sería “el cambio en x” y fijará la velocidad de la partícu-
la en esa dirección. Esto te ayudará más adelante a recordar lo
que cada variable es.
39
local s = {}
s.x=x
s.y=y
s.col=col
s.width = init_size
s.width_final = init_size + rnd(3)+1
s.t=0
s.max_t = 30+rnd(10)
s.dx = (rnd(.8).4)
s.dy = rnd(.05)
s.ddy = .02
add(smoke,s)
return s
end
function _init()
smoke = {}
cursorX = 50
cursorY = 50
color = 7
end
2.Mover la partícula
Ahora que tenemos una función que añadirá una partícula de humo al
juego, tenemos que definir cómo se mueve. En move_smoke, cambiare-
mos los valores x e y de la partícula en función de las variables
que nos propusimos cuando lo creamos. A cada paso de move_smoke,
primero se comprueba si la partícula ha alcanzado su vida máxi-
ma, si es así quítala de “smoke”. Luego aumentamos el ancho de la
partícula si estamos dentro de los 15 pasos anteriores al final
de su vida (sin que exceda la variable width_final). Luego apli-
camos los valores dx y dy, así como ddy (que define la gravedad)
para futuras ejecuciones del dy. En _update decidí crear sólo una
partícula de humo en cada paso llamando a make_smoke, sólo para
testeo. El programa comprueba también si se ha pulsado una de las
flechas del teclado y cambia los valores de “cursorX” y “cursorY”
basado en el input del jugador. Usamos esos valores para deter-
minar dónde creamos nuevas partículas. El color se ajusta al azar
cuando se presiona “button 1”.
function move_smoke(sp)
40
if (sp.t > sp.max_t) then
del(smoke,sp)
end
if (sp.t > sp.max_t15) then
sp.width +=1
sp.width = min(sp.width,sp.width_final)
end
sp.x = sp.x + sp.dx
sp.y = sp.y + sp.dy
sp.dy= sp.dy+ sp.ddy
sp.t = sp.t + 1
end
function _update ()
foreach(smoke, move_smoke)
if btn(0,0) then cursorX=1 end
if btn(1,0) then cursorX+=1 end
if btn(2,0) then cursorY-=1 end
if btn(3,0) then cursorY+=1 end
if btn(4,0) then color = flr(rand(16)) end
make_smoke(cursorX,cursorY,rnd(4),color)
end
3. Dibujar la partícula
41
function draw_smoke(s)
circfill(s.x, s.y,s.width, s.col)
end
function _draw()
cls()
foreach(smoke, draw_smoke)
end
4.Pasos adicionales
42
¡Bienvenido a PICO 8!
@terrycavanagh
CELESTE
Comentario del autor:
“Hemos utilizado prácti-
camente todos nuestros re-
cursos para esto. 8186/8192
código, todo el spritemap,
todo el mapa, y 63/64 soni-
dos. ¡Háznos saber lo que
piensas! “
Uno de los grandes de PICO
8. Si sólo vas a probar un
juego PICO-8, que sea éste.
http://www.lexaloffle.com/
bbs/?tid=2145
Un juego minimalista de
plataformas con una histo-
ria que cuenta con cuatro
finales. Un gran ejemplo de
lo que puede hacerse real-
mente bien bajo las limita-
ciones de PICO 8.
http://www.lexaloffle.com/
bbs/?tid=1919
43
PAT Shooter
Comentario del autor:
cuando se le preguntó “¿Qué
significa P.A.T.? “:” Nada.
En realidad yo esperaba na-
die va a preguntar “.
http://www.lexaloffle.com/
bbs/?tid=1867
Transdimensional
Butterfly
http://www.lexaloffle.com/
bbs/?tid=2109
44
The Tower of Archeos
Comentario del autor:
“Consigue llegar hasta la
8ª planta para luchar con-
tra Archeon.”
Un rompecabezas fantásti-
camente diseñado, por el
prolífico Benjamin Soule
(quién también escribió PAT
shooter y otros juegos de
PICO-8).
http://www.lexaloffle.com/
bbs/?tid=1907
Tempest
Comentario del autor:
“No se podría considerar
juego aún, pero pretende
convertirse en un juego de
aventura / sim / supervi-
vencia. Pasándomelo muy
bien con este proyecto! “
Construye un refugio y
encuentra comida para
sobrevivir. Aún no está
terminado, ¡pero es muy
prometedor!
http://www.lexaloffle.com/
bbs/?tid=2186
45
WORMWORMWORMWORM
Comentario del autor:
“INSPIRADO POR ‘DIARY OF UNSPOKEN TRUTHS’,
‘ARTISTA’, Y ‘YO, ROBOT’, por NIALL, MI-
CHAEL, Y UNO MISMO”
PICO-8 ha sido una muy buena fuente para el
glitch art. Éste es particularmente bueno!
http://www.lexaloffle.com/bbs/?tid=2006
mtrx
Comentario del autor:
“Una pintura con ruido en funcionamiento
eterno”
¿Disfrutaste WORM, pero te pareció que
tenía demasiada interacción y vocales?
¡Prueba MTRX de jph!
http://www.lexaloffle.com/bbs/?tid=1936
http://www.lexaloffle.com/bbs/?tid=2166
46
The Adventures of Jelpi
(en modo corrupto):
[Demo del juego incluída]
47
Más cosas interesantes:
=-=-=-
Bounce
http://www.lexaloffle.com/
Thopter Escape
http://www.lexaloffle.com/ bbs/?tid=1947
bbs/?tid=2196
Sumo Pico
Puzzle Cave: http://www.lexaloffle.com/
Raiders of the Lost Pota- bbs/?tid=2191
to:
http://www.lexaloffle.com/
bbs/?tid=2039
PICO-8