qeqe’s development story

First of all, english is not my main language, so if you are a spanish speaker, you might rather read this spanish version, if you are not a spanish speaker… well… i am really sorry about the grammatical-heresy you are about to read ^^’

I am sleepy.. it’s 1:25 am. 16 hours ago I started to develop the undo and the reset of the levels. 12 hours ago, I decided to make a teaser, and started to design the levels. 1 hour ago I finished recording the teaser’s gameplay. 31 minutes ago i finished doing the last modifications to the executable. 20 minutes ago, i created the qeqe’s itch.io page, and finished uploading the youtube video. 3 minutes ago, i decided to write this blog entry, and not to go to sleep until it is done XD

The year was 2014, I was offered to be part of a gamedev team on the GGJ2014 as an artist. We developed “Dónde estás Pepe?”, and our team was elected as the local winner, besides of that, i was not happy with the result. I am a programmer, not an artist… I love to code! but the times i can be a programmer on a gamedeving team are really scarce .__. so, after the GGJ2014, i decided it: “I am going to learn to be a programmer of videogames”.

I already knew how to code, but I only coded algorithms, printing and reading from the console. By then, i didn’t know to code on javascript. When i was a kid, i used to play games from newgrounds all the time, so I decided to develop games for web with phaser.

I spent a whole year spanking my head on the desk, trying to learn phaser, and every time I found a problem, i didn’t know if the problem was because of my lack of knowledge on javascript, or because of my noobness on phaser, or because of a bug on phaser, or because of a bug on my logic D’: those were harsh months.

Three months remaining for the GGJ2015 I decided to make my first game: a global warming game as a global game jam warming, which is a game about global warming that i made as a warming for the global game jam XD

but.. what about qeqe? well…

The original game of qeqe was SpiderDog. I created qeqe, because i wanted to learn to play with gravity in platform games. So i decided to make a game about a dog that could climb the walls and the roofs, just like a spider! but in order to achieve that, i needed to learn to use tilemaps.

As it was only a game created with the objective of teaching myself to play with gravity in games, i really didn’t focused much on the art… I made a dog with sticks lol.

I had a really good time learning to use tilemaps… so i decided to let qeqe dig holes on the tilemaps, so he could modify it’s environment.

I developed an algorithm that made the borders of the dirt to smartly fit depending on it’s neighbors, so that the dirt doesn’t looked like overlapped every time qeqe made a hole. And that was it! qeqe was able to make holes on the tilemap.

It was kind of boring though. Qeqe needed a motivation for making holes… is there a better motivation for a dog to make holes than finding bones? well… that’s how the bones were born.

But… if the bones are hidden, then qeqe is gonna have a hard time finding them… and that’s how the bone tracking was born XD

I think it took me 3 or 2 weeks to develop qeqe. I really didn’t put a lot of effort on him, but every time i make my friends play my games, qeqe is the game they like the most!

and that’s why i decided to continue it’s development, so more people can enjoy it :D

so, if you want to play the teaser, plase, download it from here: https://vengadoravg.itch.io/qeqe

And if you get stuck on the teaser, there is a little walkthrough i made: https://youtu.be/W1NdabKynNY

aaaand if you want to play SpiderDog, (the original version of qeqe) you can do so right here: http://vengadoravg.github.io/qeqe/index.html

as qeqe is released under the GPLv3.0, you can also explore it’s source code and clone the project! https://github.com/VengadoraVG/qeqe

Well… it is already 2:30 am, and i am really, really sleepy now… so… good nights~!

La historia de qeqe

Estoy con algo de sueño… es la 1:25 am. Hace 16 horas comencé a programar el undo y reset de niveles. Hace 12 horas me decidí a hacer un teaser y comencé a diseñar los niveles. Hace 1 hora terminé de grabar el gameplay del teaser de qeqe, hace 31 minutos terminé de hacer las últimas modificaciones al ejecutable. Hace 20 minutos creé su página en itch.io y subí el video a youtube. Hace 3 minutos, me decidí a escribir esta entrada de blog, y no irme a dormir hasta que esté terminada XD

Era el 2014, y me ofrecieron participar como artista en un equipo de gamedevs para el GGJ2014. Fue allí cuando nació “Dónde estás Pepe”, en esa ocasión nuestro equipo resultó ganador! pero yo no estaba conforme, yo soy una programadora, no una artista… me encanta programar! pero las ocasiones en las que realmente puedo desempeñar ese rol son muy contadas .__. así que, después del GGJ2014 lo decidí: “voy a aprender a programar videojuegos”.

Por entonces, yo ya sabía programar, pero solo algoritmos, imprimiendo y leyendo datos de la consola, no sabía nada de javascript. Grandemente influenciada por los juegos que jugaba día tarde y noche en newgrounds, decidí desarrollar juegos para el navegador, y fue allí cuando conocí a phaser :D

pasé todo un año rompiéndome la cabeza, intentando aprender phaser, y cada vez que me topaba con un problema, no sabía si el problema era a causa de mi ignorancia de javascript, o a causa de mi ignorancia de phaser, o un bug de phaser, o un bug en mi código D’: fueron meses difíciles.

No fue hasta que faltaran tres meses para el GGJ2015 que me decidí a hacer mi primer juego: a global warming game as a global game jam warming, es un juego que hice como calentamiento para el global game jam del 2015.

pero… “dónde está qeqe?” XD bueno… aquí es donde entra qeqe:

El primer nombre de qeqe fue SpiderDog, y nació porque, yo quería jugar con la gravedad en phaser XD, quería hacer el juego de un perrito que pudiera trepar por las paredes como si fuera una araña… pero para lograr desarrollar eso, tenía que aprender a usar tilemaps!

Como sólamente era un juego, cuyo objetivo era que yo aprendiera a jugar con la física, no me enfoqué mucho en el arte… hice un perro de palitos jajaja.

Aprendiendo a usar tilemaps, vi que era super divertido… y pensé que sería muy divertido hacer que qeqe (por entonces spiderdog) pudiera hacer agujeros y modificar el tilemap.

Desarrollé un algoritmo, un tanto rudimentairo, para que los bordes de los tiles se acomodaran inteligentemente, y no se viera “feo” o “sobrepuesto” cada vez que hicieras un agujero en el tilemap, y listo! qeqe ya podía hacer agujeros.

Pero era medio aburrido, qeqe necesitaba un propósito para hacer agujeros… ¿y qué mejor motivación necesita un perro para hacer agujeros que encontrar huesos? bueno… así nacieron los huesos.

Pero si los huesos están ocultos, a qeqe le va a costar mucho encontrarlos… y así nació el rastreo de huesos XD

Si no recuerdo mal, desarrollar a qeqe me tomó 3 ó 2 semanas. Fue un juego rápido. Pero, siempre que le hago jugar a mis amigos mis juegos, qeqe es el juego que más les gusta!

Recientemente, en este año (2017), fuimos invitados como Ancestral Gods por Rodrigo Goyzueta a Proyecciones Animé, organizado por Anime Kai para que pudieramos mostrar nuestro trabajo :O así que decidimos preparar dos juegos para mostrarlos en exclusiva allí.

Uno de los juegos fue qeqe. Decidí hacer el port a Unity, estuve unos 3 ó 4 días peléandome con unity para que el juego se “sintiera” tal y como se sentía en su versión de phaser. Al final, lo tenía! una versión de qeqe en unity :D

Y ahora, he implementado una nueva característica: la capacidad de resetear niveles, y de deshacer tus cambios en niveles que hayas destruido.

Si quieres probar el teaser que hice, puedes descargarlo gratis de aquí: https://vengadoravg.itch.io/qeqe (aún no hay versión para mac, ni para linux… no tengo las herramientas para hacer el build, ni megas para descargar esas herramientas DX)

Si te quedas trabado, puedes ver el walkthrough aquí https://youtu.be/W1NdabKynNY

y si quieres jugar SpiderDog (la versión original de qeqe), puedes hacerlo desde aquí: http://vengadoravg.github.io/qeqe/index.html

qeqe ha sido liberado mediante la GPLv3.0 :D así que puedes explorar su código y clonar el proyecto de aquí: https://github.com/VengadoraVG/qeqe

Espero que te guste! :D y recuerda: es solo un teaser, voy a sacar nuevas versiones, y cuando lo haga, voy avisarte, escribiendo una entrada de blog ^__^

Bueno, son las 2:03 am, y me voy a dormir XD

Spritesheets con inkscape mediante layers

Cómo extrañaba programar!!! y cómo extrañaba usar linux!!!!! y ahora que tengo linux y quiero acelarar mi proceso de producción de spritesheets, encuentro la escusa perfecta para programar y usar linux XD

Este pequeño script genera un spritesheet a partir de un archivo svg que tenga los sprites tirados por todas partes en capas!

demo.png

#!/bin/bash

filename="$(echo "$1" | awk -F. '{print $1}')"
h="+"

# ¯\_(ツ)_/¯
if [[ $* == *-v* ]]
then
  h="-"
fi

# readibility counts -python zen
layerList="$(inkscape --query-all $1 | grep layer | awk -F, '{print $1}')"

echo "$layerList" |
  awk -v file="$filename" -v h="$h" '
    {system("inkscape " file ".svg -i " $1 " -j -C --export-png /tmp/" file "-" $1 ".png")} 

    END{system("convert " h "append /tmp/" file "-*.png " file ".png")}

    END{system("rm /tmp/" file "-*.png")}'

Primero, consigue el id de los layers de inkscape,  y los pone en una lista. Itera sobre esta lista, para generar imágenes temporales de cada una de las capas, y luego, usando imagemagick, las concatena, horizontal o verticalmente.

Hice un repo donde voy a ir colando scripts de bash para game development… tal vez lo abandone igual que el resto de mis proyectos lol XD pero… tal vez no o__O igual, si alguien quiere descargar el código, pueden clonarlo desde aquí: https://github.com/VengadoraVG/bash-for-gamedevs

me lo lees?

El español tiene muchas variantes. Considerando que, tal y como descubrió Chomsky, el idioma es el primer puzzle que resolvemos, la forma en la que hablamos el español da muchas pistas sobre la forma en la que pensamos.

El español boliviano es muy diferente al español que hablamos allá en Guatemala, y no solo es por el acento, existen muchas diferencias sintácticas! Consideremos, por ejemplo, la palabra “pero”: en Guatemala, se usa sólamente como conector y al principio de la oración que está conectando:

– Levántate! es hora de ir al colegio
-> pero no quiero ir :'(

En cambio, un boliviano hablaría este diálogo así:

– Levántate! es hora de ir al colegio
-> pero! :'(
o también: no quiero ir, pero :'(

En bolivia la palabra “pero” es como una queja, como una palabra que puede ser usada de manera aislada de la escusa.

Encuentro estas diferencias muy interesantes, porque el español boliviano está fuertemente influenciado por sus ancestros nativos. Entendiendo estas diferencias, podemos darnos cuenta de cosas que nuestros ancestros consideraban tan importantes, usuales y naturales, como para necesitar crear un sonido para expresarlas con frecuencia.

Nosotros heredamos estos modos de hablar, tal y como se hereda una herramienta, y estas ideas ancestrales persisten en nosotros y nos permiten transmitir sentimientos complejos que, de no ser por la “corrupción” del lenguaje original, se habrían perdido para siempre.

Pero mi “corrupción del lenguaje” favorita, es la anteposición de “me” a ciertas oraciones imperativas. Por ejemplo: “me lo vas a cuidar”, “me lo vas a llevar”, “me lo vas a dar comida”.

En las oraciones imperativas, observamos a tres actores principales: el que recibe la orden “el oyente”, el que da la orden “el autor” y la acción que se comanda, le llamaremos “la orden”.

Yo veo a esta corrupción del lenguaje, sintácticamente hablando, como si la orden fuera propiedad del autor, y da a conocer un lazo afectivo entre el autor y la orden, que hacen que el oyente transfiera un poco del aprecio que siente por el autor hacia la orden.

Es como decirle, de una forma corta: “es mío, así que cuídalo”, o “hazlo por mi”, o “ya sea que decidas obedecer o desobedecer mi orden, también me va a afectar a mi, de una forma personal.”.

Podría nombrar otra gran cantidad de diferencias sintácticas entre el español que yo hablaba en Guatemala, y el español que hablamos aquí, pero sólamente quería compartir mis experiencias con esta última corrupción del lenguaje, así que… es todo… Chau, se me van a cuidar!

Sobre la censura gubernamental

colegial.png

Un gobierno que censura información con la escusa de proteger a sus ciudadanos de información falsa es, por definición, un gobierno deficiente.

Por un lado, si la información censurada fuera verdadera, quiere decir que el gobierno miente. Por lo tanto, el gobierno es corrupto y descarado, dispuesto a atropellar las libertades individuales de sus ciudadanos con fines egoístas.

Por otro lado, si la información censurada es realmente falsa, quiere decir que el gobierno no confía en que sus ciudadanos tengan la madurez intelectual como para discernir entre lo verdadero y lo falso.

Este último escenario es también aterrador, ya que da indicios de que el gobierno no se preocupa por que sus ciudadanos tengan acceso a educación de calidad, ya sea por descuido, o porque es más fácil gobernar a ciudadanos iletrados.

Cuando el internet no era real

Yo soy de esa generación en la que el internet era un club secreto, protegido por un aura friki y escondido por el temor al rechazo, alimentado por la soledad y fortificado por el anonimato.

En aquellos tiempos, si amenazabas a alguien con matarlo argumentando que sabías en dónde vive por algún artilugio informático, él se reiría en tu cara con un estruendoso LOL seguido de “se nota que estamos en verano”, y si alguien decía que cometería un atentado terrorista, su comentario se perdería entre otros tantos comentarios incentivando actos de odio, mismos que nunca serían materializados, pero aliviarían la ira de sus autores.

Yo pertenezco a un lugar en el que todos hablábamos tonterías, y nos reiríamos de las tonterías que los demás decían. Pertenezco a una familia intangible, inestable, virtual. Pertenezco a una comunidad de inadaptados, marginados por su timidez. Pertenezco a una hermandad que, pese a su aparente intolerancia, recibía con calidez a los newbies, una calidez que solo personas de nuestra calaña podría comprender.

Vengo de un internet en el que lo que decíamos nunca se materializaría en acciones, solamente en pensamientos, un internet en el que lo que decíamos era un reflejo real de nuestros pensamientos más profundos, y hablábamos sin miedo, porque entre frikis nos entendíamos, y nadie perdería su tiempo leyendo nuestras conversaciones. A quién le importaba por entonces lo que pensaran un montón de inadaptados?

En el mundo real, nos entristecíamos de que nadie nos entendiera, pero cuando nos juntabamos, nos enorgullecíamos de que así fuera. Entre nosotros, no existía el miedo a ser tachado de machista, racista o psicópata, porque, en el fondo, sabíamos que solo bromeábamos, pero a veces hablábamos en serio, cuestionando todos nuestros dogmas. Si alguna vez metías la pata, solamente te creabas otra identidad y comenzabas de nuevo, re-integrarse nunca era difícil.

Yo soy de esos tiempos… esos tiempos en los que el internet no era real. Pero ahora, en dónde está ese lugar? en dónde está esa gente y sus retorcidos pensamientos? en dónde quedó nuestro búnker secreto?

Sobre los hackatones…

Es difícil organizar un hackatón, hay que administrar bien el dinero, buscar jurados justos, ser imparciales, administrar bien el tiempo, y muchas otras cosas más!

Hace tiempo ya quería escribir una entrada de blog sobre este tema, pero por todo lo que ha pasado, creo que esta vez sí me animo…

Yo nunca he organizado un hackatón XD pero he participado en algunos (tal vez muy pocos)… en calidad de hackatonera, me gustaría compartir mi experiencia, dar algunos consejos a los organizadores y dar a conocer mi teoría sobre las principales causas del descontento en este tipo de eventos.

Acceso a comida, café y té (de manzanilla) de forma gratuita.

Esto es algo que abundó infinitamente durante el primer GGJ que participé (allá por el 2014, en mi opinión, este fue el mejor de los mejores hackatones en los que participé, y más adelante explico por qué).

Es importante que haya comida (al menos galletitas de agua), y café y té de forma ilimitada y gratuita, porque los hackatoneros no podemos amanecernos sin el “líquido vital”, y difícilmente nos fluye la creatividad con el estómago vacío. Tener acceso a estas cosas, nos hace sentir queridos (de esto también hablaré más adelante)

Es importante también que todos estos recursos estén centralizados en un lugar lejano. Salir de nuestra área de trabajo para ir a farmear café y galletitas, nos hace hablar con el resto de hackatoneros: se nos contagia la emoción, y se crea cierto lazo afectivo… aumenta la espectativa en el día final.

En este sentido, el hackatón del BNB (y el GGJ2014) lo hicieron muy bien.

Host y staff amigable

Esto es algo muy importante, el hackatonero debe sentirse apreciado, esto hace que se identifique con la causa, también crea un ambiente de comunidad.

Sé que hackatonear a veces es estresante por los estrechos deadlines, y por dormir en el piso, pero cuando te atienden bien, todo este estrés puede convertirse en emoción, sirviendo de combustible para el proyecto… un hackatonero malhumorado usará todo este estrés en contra de los miembros de su equipo (y quizás, también en contra del resto de equipos).

Si no confías en que tu staff puede trabajar bajo presión, o tratar bien a tus hackatoneros, es mejor que falte staff a que sobren jetas ;), sólamente, mantenlos alejados de los hackatoneros, podrían arruinar el ambiente.

A veces los organizadores se olvidan que los hackatoneros también hacen una enorme inversión al participar en los hackatones, y esperan ser tratados de forma especial, ya que están brindando su ayuda de forma gratuita.

En este sentido, el GGJ2014 también lo hizo muy bien, porque en todo momento sus organizadores se acercaban a los equipos a ver el progreso, nos sacaban fotos, se reían de nuestras bromas.

En el día final: Escúchalos y provee feedback

No hay nada más feo que matarte trabajando en un proyecto durante mucho tiempo, para que después nadie te tire bola. Te deja vacío por dentro, y enojado por fuera, sin ganas de volver a hacerlo.

Yo sé que no todos los proyectos pueden ser premiados, y que algunas de las ideas que proponemos apestan n.n’ pero, se trata de darle más énfasis a las personas y no a los productos: el perdedor de hoy, podría crear el startupazo de mañana.

Es por eso que es sumamente importante darles a todos los hackatoneros el tiempo que requieran para mostrar lo que han hecho, y no destruirlos con preguntas, sino incentivar su progreso, proveer feedback positivo y negativo en proporciones iguales.

La exposición y la jornada de preguntas no debe estar enfocada a demostrarles a todos quién va a ser el ganador, debe ser orientada a darles a todos y cada uno de los equipos, un espacio para que compartan lo que han hecho, y se sientan apreciados por el trabajo que han desempeñado.

“es que es aburrido escuchar a todos los equipos”, esa es la escusa más ofensiva que un organizador puede plantear para no escuchar a sus hackatoneros… se han esforzado, se han desvelado, podrían haberse quedado en su casa, con una taza de café caliente, en su camita, viendo Star Trek… pero han decidido venir a tu evento y donarte un trozo de su tiempo libre, y ahora, como mínimo, merecen tu atención.

A veces las ideas también son muy buenas, pero el jurado no es lo suficientemente imparcial, o no conoce la tecnología expuesta, por eso…

Jurados de calidad

Los jurados deben ser imparciales… debes asegurarte de que sus juicios no estén sesgados de acuerdo a sus amistades, o hacia sus ideales (por ejemplo, es muy mala idea dejar que una feminista militante descalifique un proyecto sólamente porque no está de acuerdo con el color usado).

Deben ser conocedores, no solo del tema del hackaton, sino que también de las tecnologías que se usarán, y de los géneros que se desarrollarán

Deben ser personas pacientes y con disponibilidad de tiempo, ya que estarán presentes en la exposición final, y le debes dar tiempo a cada equipo para hablar. En ningún momento el juez debe mostrar aburrimiento, ni tratar mal a los expositores, porque recuerda: aunque es importante que surja un proyecto significativo, también es importante que los hackatoneros queden con ganas de volver a participar.

Condiciones puntuales de victoria

Aunque muchos hackatoneros participamos sólamente por amor al deporte XD conozco a varios amigos que participan porque quieren ganar… esto está bien! la competitividad sube la calidad de los proyectos presentados.

Es tremendamente descepcionante cuando te esfuerzas por ganar, y no ganas! es muy difícil eliminar por completo esta descepción, pero sí la aminora el dar condiciones puntuales sobre quién ganará el concurso.

Asegúrate de proveer categorías y delimitarlas muy claramente, y de detallar las condiciones de victoria antes del momento de inscripción, asegúrate de que los jurados conozcan y califiquen de acuerdo a estas condiciones.

Y bueno, para finalizar, siento que el GGJ 2014 fue el mejor hackatón de todos los tiempos, porque durante todo el hackatón me la pasé super feliz, los organizadores parecían un montón de geeks amantes de los videojuegos… Los expositores también parecían aficionados de los videojuegos.

No sé cómo explicarlo, tal vez estoy siendo muy subjetiva (o muy exigente con el resto de hackatones), pero me sentí en comunidad: parte de algo. Al año siguiente quería volver, quería volver a ser parte de eso.

Nomenclatura de la tabla simplex para análisis de sensibilidad según ope 1 (umsa)

Pasé una noche intentando descifrar esta tabla de cierto libro, su notación era un espagueti :v bueno… al menos el libro existe, así que no debería quejarme , supongo :’v

busqué en otros lugares, pero en ninguno encontré el método de la forma en la que enseñan en clases, si supiera el significado matemático de la tabla, podría adaptarlo… pero probablemente me falté a la clase en la que explicaban cuál era el sentido matemático de la tabla, porque no creo que siendo de ciencias puras tengamos que memorizárnosla sin saber lo que implica, o de dónde sale, así que probablemente lo han debido explicar en alguna clase a la que no fui :v

como sea… aquí está lo que pude descifrar!

nomenclatura-simplex

Para encontrar C_B, es algo así: es un vector fila. El vector de costos (c), contiene cuánto se gana (o pierde) por cada unidad X_i producida. R es un vector columna de variables, rescoldos (s_?) o básicas (x_?), e implica que la variable en R[i] es igual al número que está en X_B[i].

Entonces, C_B[i] = cero, si x_i no se encuentra en R.

C_B[i] = A[i], si x_i se encuentra en R.