Cómo expulsar virus en el SDK de Corona

imagen

$google = "We don't allow apps that lack reasonable sensitivity towards or capitalize on a natural disaster, atrocity, conflict, death, or other tragic event";
mysql_query("UPDATE cvirus_users SET winners = winners+19, message='$google' WHERE imea='$imea' ");

Sin pánico chicos, ¡el artículo no es contagioso! Además, su autor murió el año pasado. No hay nada que hacer en el próximo mundo, excepto escribir y publicar juegos por ti mismo.

No más de 7 usuarios por día son cortados en juegos nuevos. Ninguno de ellos puede superar la barra mágica. Los demonios también se ríen: ¿Débil hacer un juego para que más de 7 personas se adhieran a él? Decir mil?

Tuve que intentarlo.

¿Cómo surgió la idea?


Esta vez no en el baño, sino en el proceso de desarrollo. Dos juegos nuevos eran juegos de cartas, uno: BlockOut II tridimensional (recuerdan los veteranos), tres más en bloques (yatzee y doodo) y, atención, un par de rompecabezas para la batalla de emoticones contra los virus de la corona.

Las dos últimas ideas nacieron gracias a las pegatinas animadas que me envió el bot de Telegram. Emoticones escondidos de virus graciosos en ellos.

En uno de los juegos apareció un error, que al principio me sorprendió, luego me hizo reír, y luego resultó ser una buena aplicación de un género desconocido. Conclusión: escribe descuidadamente, bots.

Motor


Han pasado aproximadamente 3 años desde que me enganché al Corona SDK. Logré escribir juegos tridimensionales e incluso estaba en el personal de la compañía, pero en 2018 todos los mocasines se dispersaron y el motor pasó a código abierto. Permítame recordarle que el Corona SDK es un motor multiplataforma 45 (ver valor hexadecimal) para todos los teléfonos móviles, computadoras de escritorio y HTML5.

Mirar dentro
, , , . : 11- iPhone . Xcode->Window->Devices->Drug and Drop.

Sí, caballeros, el motor es muy inteligente para el desarrollo, el prototipo del juego se realiza en un par de horas, luego tantos días de molienda y el producto está listo. A modo de comparación, la publicación en Habré tomó dos veces tres veces cuatro veces más tiempo.

Arte


Repito, tomé las imágenes de las pegatinas animadas en el Telegrama; allí se almacenan en formato tgs, de hecho, se renombró gzip, se descomprimió en un archivo json y se ve así:

{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":180,"w":512,"h":512,"nm":"05_STAYHOME_OUT","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":3,"nm"

A toda prisa, comencé a inventar mi propio programa para renderizar json, pero, después de quemarme, escupí en Internet. Y recibí en respuesta un bot de telegramas #GIF Export Bot, que convierte tgs-stickers en un archivo GIF. Dios, cuántos años tengo, recuerdo GIF y aún tan pequeño ... Cada GIF almacena aproximadamente 100-200 cuadros de 512x512 de tamaño. GIMP.app se inicia en el GIF, luego escala, transforma , bueno, ya sabes, lo principal es no quedarse atascado en la edición del arte ...

imagen

Ese es uno de los caracteres negativos. Coronovirus - jodido ... (c) Slepakov.

Juego y física


El Corona SDK tiene un motor box2D mágico e increíble. Mire cómo se escriben en él el campo de juego y los co-virus

 physics.start() 
 physics.setGravity( 0, 0 )
 physics.addBody( downBox, "static", {shape=rect }  )
 physics.addBody( cvirus, "dynamic", {shape=octogon,  density=2, 
          friction=1, bounce=0.2 } )
 physics.setGravity( 0, 9.8 )

--  

 physics.stop() 

--     

 

Básicamente, no tengo nada que agregar a este código: todos ustedes lo entienden.

Idea del juego en sí


¿Recuerdas el golpe Panda ? Allí (en el campo de gravedad), los osos panda y mami separan cubos de colores. Necesitan ser asesinados (cubos, no osos), pero se multiplican desagradablemente como las cabezas de una hidra de Lirnean y no quieren unirse a la pandilla Panda.

Pandillas Panda
. .

Entonces, los cubos de colores en este juego están ubicados en una cuadrícula regular ortogonal uniforme. Hace unos cinco años, Panda era un éxito de ventas, incluso le escribí un remix de Hex Rabbit. En la misma cuadrícula, solo hexagonal y con los mismos pandas, solo conejos. Me sorprendió que los conejos todavía estén siendo conducidos: siete (¡maldita sea!) Personas.

¿Y si lo revisas?
, Apple .

Los conejos hexagonales me pintaron entonces por el artista Andryukha Chesnokov. Brillante recuerdo para él. Aunque está vivo, gracias a Dios, sigue adelante.

¿Entonces? Dime, ¿por qué necesitas una red en este juego de panda? Llévatelo, agrega física. Reemplazamos los cubos malvados con cuadrados octogonales (perdóneme el profesor Ponomarev y la geometría analítica) y convertimos la banda de pandas en koloboks.
Co-virus contra el co-pubis.
Es indecente, pero divertido. Conduzco koloboks para la segunda semana, me esperan cuando estoy cansado. Gracias al autoaislamiento, tiempo suficiente.

Depurar la física


Corona tiene una función correspondiente para depurar física, como esta

 physics.setDrawMode( "debug" )  
 

En este modo, los elementos del mundo físico se representan esquemáticamente.

imagen

Por cierto, había una jamba: las paredes de vidrio se colocaron inicialmente no muy altas (tres pantallas) y en algunos niveles se cayeron los bollos. Me preguntaba: ¿a dónde fueron? Probablemente todavía vuele al centro de la Tierra ... Aunque no, lo más probable es que ya hayan volado teniendo en cuenta la resistencia del aire K_ {air} = 0.75.

Desactiva el modo de depuración

--  physics.setDrawMode( "debug" )  
 

y recibimos arte,

imagen

lo admito, como artista a artista, limité la animación de sprites a dos cuadros, agregué el parpadeo de los héroes, y estoy bien. Deje que Kisa Vorobyaninov dibuje, yo personalmente - pase.

Editor de niveles


Los botones en la pantalla de selección de nivel fueron dibujados por mí, en el estilo de coronavirus.

imagen

Inicialmente, determinó 12 niveles, pensando en aumentar gradualmente el número de co-virus y conejos en la pizarra, que son #anobólicos.

Razonó así:
en los dos primeros niveles, solo viven 2 tipos de villanos. El verde es el DMB más peligroso (c).
En los siguientes dos, más complicados, viven 3 tipos de villanos.
Entonces - 4 especies.
Cinco: el planeta no se puede salvar.
Sh (G) es - un imposible.

Con placer, me apresuré a depurar el juego y después de 24 horas noté aburrimiento en niveles con 5 o 6 tipos de monstruos. Es dificil de pensar.

¿Qué hacer? Oh, tomé los esquís, salí, regresé, reemplacé los esquís con palos y corrí hacia el bosque. En el minuto 19 de la carrera, los cerebros comenzaron y me di cuenta abruptamente: ¡agregaría palos horizontales al campo de juego! Por tipo de particiones en espacio abierto . Entonces , el espacio abierto es una locura rara en la vida, pero en un juego es normal.

Las cosas salieron: todo respiraba, cada nivel comenzó a demostrar su carácter, pulso y temperatura. ¡Tú también revisas! Quiero decir, la temperatura ... El número de campos de juego en esta configuración, ya sabes, es infinito. Pero contando. Me limité a una docena de niveles y atraje a un hijo de burro de tercer grado a la depuración, poniendo uno de los cinco iPhone en su mano. Y él está feliz, hay algo que hacer en la lección en video.

Voila, las lecciones están hechas, los niveles se depuran y se nombran lugares del planetaUna tierra donde me sentía bien.

Y sería bueno salvar estos lugares . Ahora no estoy bromeando.

Más geometría


¿Quién dijo que los héroes del juego son octágonos? Agregué cuadrados, hexágonos, círculos, pentágonos. En honor a los profesores Dubrovsky, Mishchenko y Fomenko. Diferencia La geometría de los virus cambió notablemente el estado de ánimo del juego. Ver por ti mismo.

imagen

Y puedes hacer koloboks cuadrados. Pan popular ruso y no lo tolerará.

imagen

Oh! ¿A dónde fueron los virus? Eliminado ... Google toma la brutal seriedad de la palabra virus, infectado, curado ... Tuve que editar los metadatos, los co-virus se convirtieron en monstruos de colores , todos murieron , intente nuevamente , etc.

Parallel reemplazó las imágenes de Telegram. Eh, eh, perdona a Pavel Durov, la ironía y la risa no salvarán al mundo.

Errores aburridos sin ellos


Box2D a veces se bloquea por error en la función onGlobalCollision. Especialmente en dispositivos reales, es decir, iPhones. Es divertido, pero no tengo un solo Android en la casa, y la aplicación está en Google Play ...

El código parece extremadamente simple, pero se rompe como una niña.

Apago el sonido, no se rompe. ¿La niña sale sorda?

Nos fijamos en el código:


local function onGlobalCollision( event )
  if ( event.phase == "began" ) then

    local ball = event.object1
    local u, v = ball:getLinearVelocity()
    local speed = u*u + v*v
--    print( "speed: " .. speed  )
     if speed>10000 then
       if speed<20000 then
         audio.play( rockSound )
       else
         audio.play( woodenSound )
       end
    end
  end
end

Verá, en la función onGlobalCollision cojo colisiones de koloboks y pierdo 2 tipos de sonidos por colisiones. Entonces, en algunos niveles, el seno era igual a dos , más de 500 objetos colisionaron al mismo tiempo (¿o al mismo tiempo? Grishkovets). En este raro momento, cuando se escuchan sonidos dentro de una colisión , se produce un terrible choque en tiempo de ejecución . <kznm! No apagues el sonido, ¿verdad?

¿Como arreglar? Decidió no llamar a play (sonido) directamente desde la función onGlobalCollision, y acumula el número de colisiones en las variables boom1 y boom2. Luego, en el ciclo runTimeLoop (esta función se llama en el juego 10 veces por segundo, no entiendo por qué) verifica boom1 y boom2 y reproduce el sonido si es necesario.

       if boom1>0 then
          audio.play( rockSound )
          boom1=0
       end

El error desapareció, pero el sonido se volvió desagradablemente rítmico (es comprensible, 10 veces por segundo).
Luego ingresé un ruido de retardo de tiempo . Un retraso aleatorio de 100 milisegundos, ¡y oppa! todo comenzó a sonar muy natural:


local function play1()
  audio.play( rockSound )
end

local function play2()
  audio.play( woodenSound )
end

local function playSound()
  local t = math.random(100)
  if boom1>0 then
    boom1=0
    timer.performWithDelay(t, play1)
  end
  if boom2>0 then
    boom2=0
    timer.performWithDelay(t, play2)
  end
end
  

Generosamente? ¿Quién está bien hecho? Lo sé, tú mismo lo harías.

Google Play y YouTube


Preparé capturas de pantalla y grabé un video para youtube, el autor está detrás del piano. Parece lento, pero soy así en la vida, esto no se puede solucionar:


El video fue grabado por el programa nativo de amapolas QuickTime.app . Para la tienda de Apple, el video recibido debe editarse (establezca la velocidad de fotogramas en 30). Para esto, generalmente uso la aplicación handBrake.app , lo recomiendo encarecidamente.

Servidor, de ninguna manera sin él


El interés en el juego es impulsado por la competencia a distancia. Los mejores resultados se almacenan en el servidor. Masterhost es un dolor separado, por qué demonios son ...

De acuerdo, olvida el insulto ... En el servidor guardo los mejores resultados del día y clasifico a los jugadores. Los jugadores, por supuesto, quieren ser los primeros y tomar la Copa.

Cada medianoche (zona horaria MSK), la tabla de puntaje alto en el servidor se reinicia y el día King se convierte en una calabaza de noche. Conviertes a Kings en bergers ... Buena canción.

El ganador del día va al Salón de la Fama, se produce una nueva batalla para la próxima Copa.

¿Cómo fue el backend?

Creé 4 tablas mysql: cvirus_users, cvirus_events, cvirus_today, cvirus_ticks.
La tabla cvirus_ticks tiene solo una entrada y dos días y campos de marca.

UPD . Ahora me di cuenta de que el campo de marca es superfluo.

Cada medianoche, la entrada en la tabla se compara con la fecha actual y se actualiza de la siguiente manera.

    $new_day_flag = 0;
    $day = date("d");  //  
    $result = mysql_query("SELECT * FROM cvirus_ticks LIMIT 1 ");
    if ($row = mysql_fetch_array($result)) {
      $d=$row['day'];
      if ($day<>$d) {
         $new_day_flag = $day;
      }
    } 

    if ($newday <> 0) {
      mysql_query( "UPDATE cvirus_ticks SET day = '$new_day_flag', tick = tick + 1 ");
    } 

Una vez que se activa el script, todos los resultados de los jugadores se registran en la tabla cvirus_today con la etiqueta de tick actualizada . Por lo tanto, la tabla cvirus_today almacena registros de jugadores ordenados por día. Los perdedores pueden ver quién se convirtió en el ganador en días anteriores.

Es interesante observar la geografía de los usuarios: para esto extraigo su dirección IP de la solicitud del jugador, grabo la dirección en api.wipmania.com , a cambio obtengo el nombre de dominio del país (por ejemplo, RU o UA) y muestro la bandera RU.PNG o UA.PNG frente al nombre del jugador. En algunos juegos, la geografía de los usuarios es impresionante y estimulante. Pero no nos entregaremos a los sueños de viajar (¿qué tipo de geografía está en modo de autoaislamiento?), Sino veamos el ejemplo de php cómo convertir ip -> country

$ipAddress = $_SERVER['REMOTE_ADDR'];
$ipCode = file_get_contents('http://api.wipmania.com/' . $ipAddress . '?k=3g-Y6QrmGQ7');
 if (strlen($ipCode)!=2) $ipCode = 'HN';  // - )

No permitimos aplicaciones que carezcan de una sensibilidad razonable o aprovechen un desastre natural, atrocidad, conflicto, muerte u otro evento trágico.

Este no soy yo, este es Google-UFO ...

Lista de enlaces usados


Mientras tanto, en Play the Google of N-th 12th day waiting comprueba mi pobre juego. Solo uno: sin host, sin publicidad, sin soporte. Pero no lloro. Ya he reemplazado palabras, imágenes y sonidos en él. Y gracias a Google, mejoró, además, solucioné un par de irregularidades.
Entonces, el resultado es un juego en Google Play. Sin anuncios y sin precio. Hace tiempo que entiendo que el tiempo de los solitarios casuales se ha ido.

Sin embargo, recuérdame, hijo, ¿no puedes dar enlaces de descarga ? Y luego te conviertes en un malvado Pinocho, dos veces un sinvergüenza (un sinvergüenza + un sinvergüenza) y un villano, ¿verdad?

Enlace para descargar
! ?!

Sí, quién simplemente no me prohibió porque no se sabe qué: Google lo prohibió, Apple lo prohibió, Habr lo prohibió dos veces ... En ocasiones sí.

Pero no estoy desanimado: estoy sentado en casa, arreglando una estufa, comiendo trigo sarraceno. ¿Qué por comprar tanto?

HTML5 salva a todos


-Déjame, pero ¿qué pasa con la versión h t ml5? ¿Dónde está la vasta plataforma cruzada? - exclamará el atento lector.

Y tenga razón, Github está en su mano.

Permíteme recordarte que en Github cada usuario tiene la oportunidad de mantener un sitio gratuito: aproveché esta oportunidad para la versión web del juego .
Te lo advierto, d-design es viejo, sin censura. Nervioso (y sin humor), por favor no corras.

Dime chicos sabios
, remote web- ( ) - . , .htaccess Access-Control-Allow-Origin: papabubadiop.imtqy.com, . — , .

¡Casi lo olvido! Hubo otro error del navegador. Al comenzar el juego en Safari, recibió una docena de mensajes / advertencias idénticos

libpng warning: iCCP: CRC error

El error no es crítico (presionas OK diez veces y juegas), pero es desagradable. Internet afirma que el editor de imágenes GIMP es el culpable. No contiene b y guarda archivos PNG con la suma de comprobación de la paleta de colores incorrecta. Los consejos en línea no ayudaron
desmarque el sobre
No, no funciona.

Solucionó el problema estúpidamente: abrió todos los archivos PNG en la aplicación Vista previa (aplicación del sistema Mac OS para ver y editar todo tipo de archivos), hizo Flip dos veces y lo cerró. Todas las imágenes se vuelven a guardar en el formato correcto.

Quizás algunos de los lectores puedan tener otros errores, bueno, no soy santo HelloWorld , codifico rápidamente y sin cuidado.
Escribe sobre los errores en los comentarios, lo haremos.

Epílogo


Les deseo a sus familias buena salud. Para usted, el lector, paciencia.

PD Todos los errores tipográficos: intencionales, no escribas en PM.

All Articles