Como ejetar vírus no Corona SDK

imagem

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

Sem caras em pânico, o artigo não é contagioso! Além disso, seu autor morreu no ano passado. Não há nada para fazer no próximo mundo, exceto escrever e publicar jogos, você sabe onde.

Não mais que 7 usuários por dia são cortados em jogos novos. Nenhum deles é capaz de superar a barra mágica. Os demônios também riem: - Fraco em fazer um jogo para que mais de 7 pessoas se apeguem a ele? Diga mil?

Eu tive que tentar

Como surgiu a ideia


Não no banheiro desta vez, mas no processo de desenvolvimento. Dois novos jogos eram jogos de cartas, um - BlockOut II tridimensional (lembram-se os veteranos), mais três em blocos (yatzee e doodo) e, atenção, alguns quebra-cabeças para a batalha de emoticons contra os vírus da coroa.

As duas últimas idéias nasceram graças aos adesivos animados enviados pelo bot do Telegram. Emoticons escondidos de vírus engraçados neles.

Em um dos jogos, surgiu um bug, o que me surpreendeu a princípio, depois me fez rir, e acabou sendo uma boa aplicação de um gênero desconhecido. Conclusão - escreva descuidadamente, bots.

Motor


Faz cerca de 3 anos desde que fui fisgado no Corona SDK. Consegui escrever jogos tridimensionais e até estava na equipe da empresa, mas em 2018 todos os sapatos estavam dispersos e o motor foi para o código aberto. Deixe-me lembrá-lo de que o Corona SDK é um mecanismo de plataforma cruzada 45 (consulte o valor hexadecimal) para todos os telefones celulares, desktops e HTML5.

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

Sim, senhores, o motor é muito inteligente para o desenvolvimento, o protótipo do jogo é feito em algumas horas e, em seguida, há muitos dias de moagem e o produto está pronto. Para comparação, a publicação em Habré levou duas vezes três vezes quatro vezes mais.

Arte


Repito, tirei as fotos dos adesivos animados no Telegram - lá eles são armazenados no formato tgs, na verdade, ele é renomeado como gzip, é descompactado em um arquivo json e tem a seguinte aparência:

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

À pressa, comecei a inventar meu próprio programa para renderizar json, mas, depois de me queimar, cuspi na Internet. E recebi em resposta um bot de telegrama #GIF Export Bot, que converte tgs-stickers em um arquivo GIF. Deus, quantos anos eu tenho, lembro de GIFs e ainda é tão pequeno ... Cada GIF armazena cerca de 100-200 quadros de 512x512 em tamanho. O GIMP.app é lançado no GIF, então a escala, transforma , bem, você sabe, o principal é não ficar preso na edição da arte ...

imagem

Esse é um dos personagens negativos. Coronovírus - foda-se ... (c) Slepakov.

Jogo e física


O Corona SDK possui um mecanismo box2D mágico e incrível. Veja como o campo de jogo e os co-vírus estão escritos nele

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

--     

 

Basicamente, não tenho nada a acrescentar a esse pedaço de código - todos vocês entendem.

Idéia do jogo em si


Lembra do hit Panda ? Lá (no campo da gravidade), ursos panda e mamãe separam cubos coloridos. Eles precisam ser mortos (cubos, não ursos), mas eles se multiplicam como as cabeças de uma hidra Lirneana e não querem se juntar à gangue Panda.

Panda Gangs
. .

Portanto, os cubos coloridos neste jogo estão localizados em uma grade regular ortogonal uniforme. Cerca de cinco anos atrás, Panda era um best-seller, até eu escrevi um remix de Hex Rabbit para ela. Na mesma grade, apenas hexagonal e com os mesmos pandas, apenas coelhos. Fiquei surpreso que os coelhos ainda estão sendo conduzidos - sete (maldição!) Pessoas.

E se você verificar?
, Apple .

Coelhos hexagonais então pintaram para mim pelo artista Andryukha Chesnokov. Memória brilhante para ele. Embora ele esteja vivo, graças a Deus, siga em frente.

Assim? Diga-me, por que você precisa de uma rede neste jogo de panda? Leve embora, adicione física. Substituímos os cubos malignos por quadrados octogonais (perdoe-me Professor Ponomarev e geometria analítica) e transformamos a gangue de pandas em koloboks.
Co-vírus contra co-púbis.
É indecente, mas engraçado. Eu dirijo koloboks pela segunda semana, espero quando estou cansado. Graças ao auto-isolamento, tempo suficiente.

Depurar física


Corona tem uma função correspondente para depurar física, como esta

 physics.setDrawMode( "debug" )  
 

Nesse modo, os elementos do mundo físico são representados esquematicamente:

imagem

a propósito, houve um batente - as paredes de vidro foram inicialmente colocadas não muito altas (três telas) e, em alguns níveis, os pães caíram. Eu me perguntava - para onde eles foram? Provavelmente ainda voam para o centro da Terra ... Embora não, provavelmente eles já voaram levando em consideração a resistência do ar K_ {air} = 0,75.

Desativar o modo de depuração

--  physics.setDrawMode( "debug" )  
 

e temos arte que

imagem

eu admito, como artista para artista - limitei a animação de sprites a dois quadros - acrescentou o piscar dos heróis e sou bom. Vamos Kisa Vorobyaninov desenhar, eu pessoalmente passo.

Editor de níveis


Os botões na tela de seleção de nível foram desenhados por mim, no estilo coronavírus.

imagem

Inicialmente, ele determinou 12 níveis, pensando em aumentar gradualmente o número de co-vírus e coelhos no quadro-negro, que são #anobólicos.

Ele argumentou assim:
Nos dois primeiros níveis, apenas dois tipos de vilões vivem. O verde é o DMB mais perigoso (c).
Nos próximos dois - mais complicados, três tipos de vilões vivem.
Então - 4 espécies.
Cinco - o planeta não pode ser salvo.
Sh (G) é - um impossível.

Com prazer, corri para depurar o jogo e, após 24 horas, notei o tédio em níveis com 5 ou 6 tipos de monstros. É difícil pensar.

O que fazer? Ah, peguei os esquis, saí, voltei, troquei os esquis por paus e corri para a floresta. No 19º minuto da corrida, o cérebro começou e eu percebi abruptamente - eu adicionaria paus horizontais no campo de jogo! Por tipo de partições em espaço aberto . Portanto , o espaço aberto é um raro estrago na vida, mas em um jogo é normal.

As coisas correram - tudo estava respirando, cada nível começou a demonstrar seu caráter, pulso e temperatura. Você confere também! Quero dizer, a temperatura ... O número de campos de jogo nesse cenário, você sabe, é infinito. Mas contando. Limitei-me a uma dúzia de níveis e atraí um filho da terceira série para a depuração, colocando um dos quintos iPhone na mão. E ele está feliz, há algo a fazer na vídeo aula.

Voila, as lições são feitas, os níveis são depurados e nomeados lugares no planetaUma terra onde me senti bem.

E seria bom salvar esses lugares . Agora não estou brincando.

Mais geometria


Quem disse que os heróis do jogo são octógonos? Eu adicionei quadrados, hexágonos, círculos, pentágonos. Em homenagem aos professores Dubrovsky, Mishchenko e Fomenko. Diff A geometria dos vírus mudou acentuadamente o clima do jogo. Veja por si mesmo.

imagem

E você pode fazer koloboks quadrados. Pão folclórico russo e não vai tolerar isso.

imagem

Oh! Para onde foram os vírus? Removido ... O Google leva a seriedade brutal da palavra vírus, infectado, curado ... Eu tive que editar os metadados, os co-vírus se tornaram monstros coloridos , todos morreram , tente novamente , etc.

Paralelamente substituíram as imagens de telegrama. Perdoe Pavel Durov, a ironia e o riso não salvarão o mundo.

Erros, entediados sem eles


Às vezes, o Box2D falhava por engano na função onGlobalCollision. Especialmente em dispositivos reais, ou seja, iPhones. É engraçado, mas eu não tenho um único Android em casa e o aplicativo está no Google Play ...

O código parece extremamente simples, mas quebra como uma garota.

Eu desligo o som - ele não quebra. A menina sai surda?

Nós olhamos para o 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

Veja, na função onGlobalCollision eu pego colisões de koloboks e perco 2 tipos de sons de colisões. Então, em alguns níveis, o seno era igual a dois , mais de 500 objetos colidiram ao mesmo tempo (ou ao mesmo tempo? Grishkovets). Nesse momento raro, ao chamar sons dentro de uma colisão , ocorre um terrível acidente em tempo de execução . <kznm! Não desligue o som, certo?

Como consertar? Decidiu não chamar play (sound) diretamente da função onGlobalCollisione acumule o número de colisões nas variáveis ​​boom1 e boom2. Em seguida, no ciclo runTimeLoop (essa função é chamada no jogo 10 vezes por segundo, não entendo o porquê), verifique boom1 e boom2 e toque o som, se necessário.

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

O erro desapareceu, mas o som tornou-se desagradável rítmico (é compreensível, 10 vezes por segundo).
Então, acabei de inserir um ruído de atraso de tempo . Um atraso aleatório de 100 milissegundos - e oppa! tudo começou a parecer muito 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? Quem é bem feito? Eu sei, eu sei, você mesmo faria isso.

Google Play e YouTube


Preparei capturas de tela e gravei um vídeo para o youtube, o autor está por trás do piano. Parece mais lento, mas eu sou assim na vida, isso não pode ser corrigido:


O vídeo foi gravado pelo programa nativo de papoula QuickTime.app . Para a loja da Apple, o vídeo recebido precisa ser editado (defina a taxa de quadros para 30). Para isso, eu geralmente uso o aplicativo handBrake.app , eu recomendo.

Servidor, de jeito nenhum sem ele


O interesse no jogo é alimentado pela competição à distância. Os melhores resultados são armazenados no servidor. Masterhost é uma dor à parte, por que diabos eles são ...

Ok, esqueça o insulto ... No servidor eu guardo os melhores resultados do dia e classifico os jogadores. Os jogadores, é claro, querem ser os primeiros e levar a Copa.

Toda meia-noite (fuso horário do MSK), a tabela de pontuações mais altas no servidor é redefinida e o dia em que King se transforma em um Pumpkin noturno. Você transforma Kings em bergers ... Boa música.

O vencedor do dia vai para o Hall of Fame, uma nova batalha segue para a próxima Copa.

Como o backend?

Criou 4 tabelas mysql: cvirus_users, cvirus_events, cvirus_today, cvirus_ticks.
A tabela cvirus_ticks possui apenas uma entrada e dois campos de marcação e dia.

UPD . Agora eu percebi que o campo de tick é supérfluo.

A cada meia-noite, a entrada na tabela é comparada com a data atual e atualizada da seguinte forma.

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

Depois que o script é acionado, todos os resultados dos jogadores são registrados na tabela de cvirus_today com a atualizados carrapato tag . Portanto, a tabela cvirus_today armazena os registros dos jogadores classificados por dia. Os perdedores podem ver quem se tornou o vencedor nos dias anteriores.

É interessante observar a geografia dos usuários - para isso, retiro o endereço IP dele a partir da solicitação do jogador, identifico o endereço em api.wipmania.com , em troca recebo o nome de domínio do país (por exemplo, RU ou UA) e mostro a bandeira RU.PNG ou UA.PNG em frente ao nome do jogador. Em alguns jogos, a geografia dos usuários é impressionante e instigante. Mas não vamos entrar em sonhos de viagem (que tipo de geografia está no modo de auto-isolamento?!), Mas veja o exemplo do php como transformar ip -> country

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

Não permitimos aplicativos com falta de sensibilidade razoável ou capitalização de um desastre natural, atrocidade, conflito, morte ou outro evento trágico.

Este não sou eu, este é o Google-UFO ...

Lista de links usados


Enquanto isso, no jogo do Google de N-th 12º espera dia verificar o meu pobre jogo. Apenas um - sem host, sem publicidade, sem suporte. Mas eu não choro. Já substitui palavras, imagens e sons. E, graças ao Google, ficou melhor, além disso, corrigi algumas irregularidades.
Então, o resultado é um jogo no Google Play. Sem anúncios e sem preço. Há muito tempo entendo que o tempo dos solitários casuais se foi.

No entanto, lembre-se, filho, você não pode fornecer links para download ? E então você se transforma em um Pinóquio maligno, duas vezes um canalha (um canalha + um canalha) e um vilão, certo?

Link para download
! ?!

Sim, quem simplesmente não me baniu, não se sabe o que - o Google baniu, a Apple - baniu, o Habr - baniu duas vezes ... Às vezes havia.

Mas não estou desanimado - estou sentado em casa, consertando um fogão, comendo trigo sarraceno. Para que comprou tanto?

HTML5 salva todos


- Deixe-me, mas e a versão h t ml5? Onde está a gloriosa plataforma cruzada? - exclama o leitor atento.

E esteja certo, o Github está na mão dele.

Deixe-me lembrá-lo que no Github cada usuário tem a oportunidade de manter um site gratuito - passei essa chance para a versão web do jogo .
Eu aviso, o d-design é antigo, sem censura. Nervoso (e sem humor), por favor, não corra.

Diga-me, sábios
, remote web- ( ) - . , .htaccess Access-Control-Allow-Origin: papabubadiop.imtqy.com, . — , .

Eu quase esqueci! Houve outro erro no navegador. Ao iniciar o jogo no Safari, ele recebeu uma dúzia de mensagens / avisos idênticos

libpng warning: iCCP: CRC error

O erro não é crítico (você pressiona OK dez vezes e reproduz), mas desagradável. A Internet alega que o editor de imagens do GIMP é o culpado. É livre de b e salva arquivos PNG com a soma de verificação incorreta da paleta de cores. As dicas online não ajudaram
desmarque o envelope
- não, não funciona.

Ele corrigiu o problema estupidamente - ele abriu todos os arquivos PNG no aplicativo Preview (aplicativo de sistema Mac OS para visualizar e editar todos os tipos de arquivos), fez Flip duas vezes e fechou. Todas as imagens são salvas novamente no formato correto.

Talvez alguns leitores possam ter outros bugs, bem, eu não sou santo HelloWorld , eu codigo de forma rápida e descuidada.
Escreva sobre erros nos comentários, vamos.

Epílogo


Desejo a sua família boa saúde. Para você, o leitor - paciência.

PS Todos os erros de digitação - intencional, não escreva em PM.

All Articles