Comment éjecter des virus sur le SDK Corona

image

$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' ");

Pas de panique les gars, l'article n'est pas contagieux! De plus, son auteur est décédé l'an dernier. Il n'y a rien à faire dans le prochain monde, sauf pour écrire et publier des jeux vous-même.

Pas plus de 7 utilisateurs par jour sont découpés dans de nouveaux jeux. Aucun d'eux n'est capable de surmonter la barre magique. Les démons rient aussi, - Faible de faire un jeu pour que plus de 7 personnes s'y tiennent? Dites mille?

Je devais essayer.

Comment est venue l'idée


Pas dans la salle de bain cette fois, mais dans le processus de développement. Deux nouveaux jeux étaient des jeux de cartes, un BlockOut II en trois dimensions (les vétérans s'en souviennent), trois autres sur des blocs (yatzee et doodo) et, attention, quelques casse-tête pour la bataille des émoticônes contre les virus de la couronne.

Les deux dernières idées sont nées grâce aux autocollants animés qui m'ont été envoyés par le bot Telegram. Les émoticônes se cachaient de virus amusants.

Dans l'un des jeux, un bug a rampé, ce qui m'a d'abord étonné, puis m'a fait rire, puis il s'est avéré être une bonne application d'un genre inconnu. Conclusion - écrivez négligemment, les bots.

Moteur


Cela fait environ 3 ans que je suis devenu accro au SDK Corona. J'ai réussi à y écrire des jeux en trois dimensions et je faisais même partie du personnel de l'entreprise, mais en 2018, tous les mocassins étaient dispersés, et le moteur est devenu open-source. Permettez-moi de vous rappeler que le SDK Corona est un moteur multiplateforme 45 (voir valeur hexadécimale) pour tous les téléphones mobiles, ordinateurs de bureau et HTML5.

Regarde à l'intérieur
, , , . : 11- iPhone . Xcode->Window->Devices->Drug and Drop.

Oui, messieurs, le moteur est très intelligent pour le développement, le prototype du jeu se fait en quelques heures, puis autant de jours de broyage et le produit est prêt. A titre de comparaison, la publication sur Habré a pris deux fois trois fois quatre fois plus de temps.

Art


Je le répète, j'ai pris les photos des autocollants animés dans le télégramme - là, ils sont stockés au format tgs, en fait, il est renommé gzip, il est décompressé dans un fichier json et ressemble à ceci:

{"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"

En toute hâte, j'ai commencé à inventer mon propre programme de rendu json, mais, après m'être brûlé, j'ai craché sur Internet. Et j'ai reçu en réponse un bot de télégramme #GIF Export Bot, qui convertit les autocollants tgs en un fichier GIF. Mon Dieu, quel âge j'ai, je me souviens des GIF et toujours aussi petits ... Chaque GIF stocke environ 100-200 images de 512x512. GIMP.app est lancé sur le GIF, puis l' échelle, la transformation , eh bien, vous savez, l'essentiel n'est pas de rester bloqué sur l'édition de l' art ...

image

C'est l'un des caractères négatifs. Coronovirus - putain de ... (c) Slepakov.

Jeu et physique


Le SDK Corona possède un moteur box2D magique et incroyable. Regardez comment le terrain de jeu et les co-virus sont écrits dessus

 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() 

--     

 

Fondamentalement, je n'ai rien à ajouter à ce morceau de code - vous comprenez tous.

Idée de jeu elle-même


Rappelez-vous le hit Panda ? Là (dans le domaine de la gravité), les pandas et la maman séparent les cubes colorés. Ils doivent être tués (cubes, pas ours), mais ils se multiplient méchamment comme les têtes d'une hydre Lirnean et ne veulent pas rejoindre le gang Panda.

Panda Gangs
. .

Ainsi, les cubes colorés de ce jeu sont situés sur une grille régulière orthogonale uniforme. Il y a environ cinq ans, Panda était un best-seller, même je lui ai écrit un remix de Hex Rabbit. Sur la même grille, uniquement hexagonale et avec les mêmes pandas, seuls des lapins. J'ai été surpris que les lapins soient toujours conduits - sept (bon sang!) Personnes.

Et si tu vérifies?
, Apple .

Des lapins hexagonaux ont ensuite été peints pour moi par l'artiste Andryukha Chesnokov. Un brillant souvenir pour lui. Bien qu'il soit vivant, Dieu merci, continuez.

Donc? Dites-moi, pourquoi avez-vous besoin d'un filet dans ce jeu de panda? Retirez-le, ajoutez de la physique. Nous remplaçons les cubes maléfiques par des carrés octogonaux (pardonnez-moi le professeur Ponomarev et la géométrie analytique) et transformons la bande de pandas en koloboks.
Co-virus contre co-pubis.
C'est indécent, mais drôle. Je conduis des koloboks pour la deuxième semaine, j'attends quand je suis fatigué. Grâce à l'auto-isolement, assez de temps.

Déboguer la physique


Corona a une fonction correspondante pour le débogage de la physique, comme celle-ci

 physics.setDrawMode( "debug" )  
 

Dans ce mode, les éléments du monde physique sont schématiquement représentés.En

image

passant, il y avait un jambage - les parois en verre étaient initialement placées pas très haut (trois écrans) et à certains niveaux les petits pains sont tombés. Je me demandais - où sont-ils allés? Vole probablement encore au centre de la Terre ... Bien que non, très probablement ils ont déjà volé en tenant compte de la résistance de l'air K_ {air} = 0,75.

Désactiver le mode débogage

--  physics.setDrawMode( "debug" )  
 

et nous obtenons de l'art,

image

je vous l'avoue, en tant qu'artiste à un artiste - j'ai limité l'animation des sprites à deux images - a ajouté le clignotement des héros, et je vais bien. Laissez Kisa Vorobyaninov dessiner, personnellement, je passe.

Éditeur de niveau


Les boutons de l'écran de sélection de niveau ont été dessinés par moi-même, dans le style des coronavirus.

image

Initialement, il a déterminé 12 niveaux, pensant augmenter progressivement le nombre de co-virus et de lapins sur le tableau noir, qui sont des #anobolics.

Il a raisonné comme ceci:
Sur les deux premiers niveaux, seuls 2 types de méchants vivent. Le vert est le DMB le plus dangereux (c).
Sur les deux prochains - plus compliqués, 3 types de méchants vivent.
Ensuite - 4 espèces.
Cinq - la planète ne peut pas être sauvée.
Sh (G) est - un impossible.

Avec plaisir, je me suis précipité pour déboguer le jeu et après 24 heures, j'ai remarqué l'ennui aux niveaux avec 5 ou 6 types de monstres. C'est difficile à penser.

Que faire? Oh, j'ai pris les skis, je suis sorti, je suis revenu, j'ai remplacé les skis par des bâtons et j'ai couru dans la forêt. À la 19e minute de la course, le cerveau a commencé et je me suis soudain rendu compte - j'ajouterais des bâtons horizontaux au terrain de jeu! Par type de partitions en open-space . L' espace ouvert est donc une boue rare dans la vie, mais dans un jeu, c'est normal.

Les choses se sont passées - tout respirait, chaque niveau a commencé à montrer son caractère, son pouls et sa température. Vous vérifiez aussi! Je veux dire, la température ... Le nombre de terrains de jeu dans ce réglage, vous savez, est infini. Mais en comptant. Je me suis limité à une douzaine de niveaux et j'ai attiré un fils de cancre de troisième année au débogage, mettant l'un des cinquième iPhone dans sa main. Et il est content, il y a quelque chose à faire dans la leçon vidéo.

Voila, les leçons sont faites, les niveaux sont débogués et nommés lieux de la planèteUne terre où je me sentais bien.

Et ce serait bien de sauver ces endroits . Maintenant je ne plaisante pas.

Plus de géométrie


Qui a dit que les héros du jeu étaient des octogones? J'ai ajouté des carrés, des hexagones, des cercles, des pentagones. En l'honneur des professeurs Dubrovsky, Mishchenko et Fomenko. Diff La géométrie des virus a considérablement changé l'humeur du jeu. Voir par vous-même.

image

Et vous pouvez faire des koloboks carrés. Pain folklorique russe et ne le tolérera pas.

image

Oh! Où sont passés les virus? Supprimé ... Google prend le sérieux brutal du mot virus, infecté, guéri ... J'ai dû éditer les métadonnées, les co-virus sont devenus des monstres colorés , tout le monde est mort , essayez à nouveau , etc.

Parallel a remplacé les télégrammes. Eh, eh, pardonne Pavel Durov, l'ironie et le rire ne sauveront pas le monde.

Des erreurs, ennuyées sans elles


Box2D s'est parfois écrasé par erreur dans la fonction onGlobalCollision. Surtout sur les vrais appareils, c'est-à-dire les iPhones. C'est drôle, mais je n'ai pas un seul Android dans la maison, et l'application est dans Google Play ...

Le code a l'air extrêmement simple, mais il se casse comme une fille.

J'éteins le son - il ne se casse pas. La fille sort-elle sourde?

Nous regardons le code:


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

Vous voyez, dans la fonction onGlobalCollision, j'attrape les collisions de koloboks et je perds 2 types de sons des collisions. Ainsi, à certains niveaux, le sinus était égal à deux , plus de 500 objets sont entrés en collision en même temps (ou en même temps? Grishkovets). À ce moment rare, lors de l'appel de sons à l' intérieur d'une collision , un terrible crash se produit lors de l' exécution . <kznm! N'éteignez pas le son, non?

Comment réparer? Décidé de ne pas appeler play (sound) directement à partir de la fonction onGlobalCollisionet accumuler le nombre de collisions dans les variables boom1 et boom2. Ensuite, dans le cycle runTimeLoop (cette fonction est appelée dans le jeu 10 fois par seconde, vous ne comprenez pas pourquoi) vérifiez boom1 et boom2 et jouez le son si nécessaire.

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

L'erreur a disparu, mais le son est devenu désagréablement rythmique (c'est compréhensible, 10 fois par seconde)
Puis je viens d'entrer un bruit de retard . Un délai aléatoire de 100 millisecondes - et oppa! tout a commencé à sembler très naturel:


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
  

Magnifiquement? Qui est bien fait? Je sais, je sais, vous le feriez vous-même.

Google Play et YouTube


J'ai préparé des captures d'écran et tourné une vidéo pour youtube, l'auteur est derrière le piano. Il semble ralenti, mais je suis tel dans la vie, cela ne peut pas être résolu:


La vidéo a été enregistrée par le programme natif de pavot QuickTime.app . Pour l' Apple Store, la vidéo reçue doit être modifiée (définissez la fréquence d'images sur 30). Pour cela, j'utilise généralement l'application handBrake.app , je la recommande vivement.

Serveur, pas question sans ça


L'intérêt pour le jeu est alimenté par la compétition à distance. Les meilleurs résultats sont stockés sur le serveur. Masterhost est une douleur distincte, pourquoi diable ils sont ...

D'accord, oubliez l'insulte ... Sur le serveur, je stocke les meilleurs résultats de la journée et classe les joueurs. Les joueurs, bien sûr, veulent être les premiers et remporter la Coupe.

Chaque minuit (fuseau horaire MSK), le tableau des meilleurs scores sur le serveur est réinitialisé et le jour où King se transforme en citrouille de nuit. Vous transformez Kings en bergers ... Bonne chanson.

Le vainqueur de la journée se rend au Hall of Fame, une nouvelle bataille s'ensuit pour la prochaine Coupe.

Comment s'est passé le backend?

Création de 4 tables mysql: cvirus_users, cvirus_events, cvirus_today, cvirus_ticks.
La table cvirus_ticks n'a qu'une entrée et deux champs de jour et de coche.

UPD . Maintenant, je me suis rendu compte que le champ à cocher était superflu.

Chaque minuit, l'entrée dans le tableau est vérifiée par rapport à la date actuelle et mise à jour comme suit.

    $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 ");
    } 

Une fois le script est déclenché, tous les résultats des joueurs sont enregistrés dans le tableau de la mise à jour avec cvirus_today tique tag . Ainsi, la table cvirus_today stocke les enregistrements des joueurs triés par jour. Les perdants peuvent voir qui est devenu vainqueur les jours précédents.

Il est intéressant d'observer la géographie des utilisateurs - pour cela, je retire son adresse IP de la demande du joueur, je grave l' adresse à api.wipmania.com , en retour, j'obtiens le nom de domaine du pays (par exemple, RU ou UA) et montre le drapeau RU.PNG ou UA.PNG en face du nom du joueur. Dans certains jeux, la géographie des utilisateurs est impressionnante et donne à réfléchir. Mais nous ne nous livrerons pas à des rêves de voyage (quel genre de géographie est en mode d'auto-isolement?!), Mais regardez l'exemple php comment transformer ip -> country

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

Nous n'autorisons pas les applications qui manquent d'une sensibilité raisonnable ou qui capitalisent sur une catastrophe naturelle, une atrocité, un conflit, la mort ou un autre événement tragique.

Ce n'est pas moi, c'est Google-UFO ...

Liste des liens utilisés


Pendant ce temps, dans le jeu Google du 12e jour d'attente, vérifiez mon pauvre jeu. Un seul - sans hôte, sans publicité, sans support. Mais je ne pleure pas. J'y ai déjà remplacé des mots, des images et des sons. Et grâce à Google, ça s'est amélioré, en plus, j'ai corrigé quelques irrégularités.
Ainsi, le résultat est un jeu sur Google Play. Aucune annonce et aucun prix. Je comprends depuis longtemps que le temps des solitaires occasionnels est révolu.

Cependant, rappelez-moi, mon fils, vous ne pouvez pas donner de liens de téléchargement ? Et puis vous vous transformez en un Pinocchio diabolique, deux fois un scélérat (un scélérat + un scélérat) et un méchant, non?

Lien pour télécharger
! ?!

Oui, qui ne m'a tout simplement pas banni car on ne sait pas quoi - Google interdit, Apple - interdit, Habr - interdit deux fois ... À l'époque, il y en avait.

Mais je ne suis pas découragé - je suis assis à la maison, à réparer un poêle, à manger du sarrasin. Pourquoi acheter autant?

HTML5 sauve tout le monde


-Laissez-moi, mais qu'en est-il de la version h t ml5? Où est la multiplateforme tant vantée? - s'exclame le lecteur attentif.

Et ayez raison, Github est entre ses mains.

Permettez-moi de vous rappeler que sur Github, chaque utilisateur a la possibilité de conserver un site gratuit - j'ai passé cette chance pour la version Web du jeu .
Je vous préviens, d-design est vieux, non censuré. Nerveux (et sans humour), ne courez pas.

Dites-moi, les gars sages
, remote web- ( ) - . , .htaccess Access-Control-Allow-Origin: papabubadiop.imtqy.com, . — , .

J'ai presque oublié! Il y a eu une autre erreur de navigateur. Lors du démarrage du jeu dans Safari, il a reçu une dizaine de messages / avertissements identiques

libpng warning: iCCP: CRC error

L'erreur n'est pas critique (vous appuyez dix fois sur OK et jouez), mais désagréable. Internet affirme que l'éditeur d'images GIMP est à blâmer. Il est sans b et enregistre les fichiers PNG avec la mauvaise somme de contrôle de la palette de couleurs. Les conseils en ligne n'ont pas aidé
décocher l'enveloppe
- non, ça ne marche pas.

Il a stupidement résolu le problème - il a ouvert tous les fichiers PNG dans l'application Aperçu (application système Mac OS pour afficher et modifier tous les types de fichiers), fait Flip deux fois et l'a fermée. Toutes les images sont enregistrées de nouveau au format correct.

Peut-être que certains des lecteurs peuvent avoir d'autres bogues, eh bien, je ne suis pas saint HelloWorld , je code rapidement et négligemment.
Écrivez sur les erreurs dans les commentaires, nous le ferons.

Épilogue


Je souhaite à vos familles une bonne santé. Pour vous, le lecteur - patience.

PS Toutes les fautes de frappe - intentionnelles, n'écrivez pas en PM.

All Articles