Corrigindo menu móvel no WordPress


document.addEventListener('DOMContentLoaded', function() {
    new navMenu('primary');
    new navMenu('woo');
});

Se você também não abre o menu do blog no iOS/Android há vários anos em seu blog WordPress ao usar o tema Seedlet, basta adicionar:
Fechando o arquivo wp-content/themes/seedlet/assets/js/primary-navigation.js na função, próximo à janela de assinatura padrão addEventListener ‘load’.

Number 2

Comrades, I take pride in projects that were created on the basis of Flame Steel Framework 1 and specifically on Flame Steel Engine 1, namely Death-Mask, Cube Art Project, since all this was conceived as a big experiment, creating a multimedia framework alone that can work on the most platforms. I think the experiment ended successfully immediately after the release of the Cube Art Project.

Now about the decisions that I came to during the development of new projects on FSFramework 1

During the development of Space Jaguar and the Space Jaguar Galaxy Bastards shooter, it became clear that the Flame Steel Framework tools were already outdated, not even having time to become at least somewhat convenient.

Therefore, I decided to develop a completely new Flame Steel Framework 2. The main decision will be to switch to my Rise 2 transpiler language, and the Component System (ECS) will no longer be used architecturally, because. it turned out to be needed only within the framework of game logic with great dynamics. For this reason, in Flame Steel Framework 2, the component system will only be possible while using the scripting languages ​​that are planned to be implemented (at least Lua and JavaScript), an interesting feature is that these languages ​​​​are dynamic in nature, so additional creation of the component system is redundant.

You can follow the development of new projects on the blog and on Gitlab:

https://gitlab.com/demensdeum/rise2

https://gitlab.com/demensdeum/flamesteelengine2

https://gitlab.com/demensdeum/flame-steel-engine-2-demo-projects

https://gitlab.com/demensdeum/space-jaguar-action-rpg

https://gitlab.com/demensdeum/space-jaguar-galaxy-bastards

Características do RPG de ação Space Jaguar

O primeiro artigo sobre o jogo em desenvolvimento, Space Jaguar Action RPG. Neste artigo irei descrever o recurso de jogabilidade do Jaguar – Características.

Muitos RPGs usam um sistema de estatísticas de personagem estático, como as estatísticas de DnD (Força, Constituição, Destreza, Inteligência, Sabedoria, Carisma) ou Fallout – S.P.E.C.I.A.L (Força, Percepção, Vigor, Carisma, Inteligência, Destreza, Sorte ).

No Space Jaguar, pretendo implementar um sistema dinâmico de características, por exemplo, o personagem principal do jogo Jag no início tem apenas três características – – Domínio de uma lâmina (meio sabre), operações obscuras (fazer negócios no mundo do crime), habilidades desonestas (arrombar fechaduras, roubar). Durante o jogo, os personagens serão dotados e privados de características dinâmicas no âmbito do módulo de jogo, todas as verificações serão feitas com base no nível de determinadas características necessárias para uma determinada situação de jogo. Por exemplo, Jag não conseguirá vencer uma partida de xadrez se não tiver a característica de jogar xadrez, ou não tiver nível suficiente para passar no teste.

Para simplificar a lógica das verificações, cada característica recebe um código de 6 dígitos em letras inglesas, um nome e uma descrição. Por exemplo, para possuir uma lâmina:

bladeFightingAbility.name = "BLADFG"; 
bladeFightingAbility.description = "Blade fighting ability"; 
bladeFightingAbility.points = 3;

Перед стартом игрового модуля можно будет просмотреть список публичных проверок необходимых для прохождения, также создатель может скрыть часть проверок для создания интересных игровых ситуаций.

Ноу-хау? Будет ли интересно? Лично я нахожу такую систему интересной, позволяющей одновременно обеспечить свободу творчества создателям игровых модулей, и возможность переноса персонажей из разных, но похожих по характеристикам, модулей для игроков.

Animação esquelética (Parte 2 – hierarquia de nós, interpolação)

Continuo descrevendo o algoritmo de animação do esqueleto conforme ele é implementado no Flame Steel Engine.

Como o algoritmo é o mais complexo de todos que implementei, podem aparecer erros nas notas sobre o processo de desenvolvimento. No artigo anterior sobre esse algoritmo, cometi um erro; o array de ossos é transferido para o shader para cada malha separadamente, e não para o modelo inteiro.

Hierarquia de nós

Para que o algoritmo funcione corretamente é necessário que o modelo contenha uma conexão entre os ossos entre si (gráfico). Vamos imaginar uma situação em que duas animações são reproduzidas simultaneamente – – pule e levante a mão direita. A animação de salto deve levantar o modelo ao longo do eixo Y, enquanto a animação de levantar o braço deve levar isso em consideração e subir com o modelo enquanto ele salta, caso contrário o braço permanecerá no lugar por conta própria.

Descreveremos a conexão dos nós para este caso – o corpo contém a mão. Ao elaborar o algoritmo, o gráfico ósseo será lido, todas as animações serão levadas em consideração com as conexões corretas. Na memória do modelo, o gráfico é armazenado separadamente de todas as animações, apenas para refletir a conectividade dos ossos do modelo.

Interpolação na CPU

No último artigo descrevi o princípio de renderização de animação esquelética – “matrizes de transformação são transferidas da CPU para o shader a cada quadro de renderização.”

Cada quadro de renderização é processado na CPU; para cada osso da malha, o mecanismo recebe a matriz de transformação final usando interpolação de posição, rotação e zoom. Durante a interpolação da matriz óssea final, uma passagem é feita através da árvore de nós para todas as animações de nós ativos, a matriz final é multiplicada pelas matrizes pai e, em seguida, enviada para renderização ao sombreador de vértice.

Os vetores são usados ​​para interpolação de posição e a ampliação é usada para rotação, porque; eles são muito fáceis de interpolar (SLERP), ao contrário dos ângulos de Euler, e também são muito fáceis de representar como uma matriz de transformação.

Como simplificar a implementação

Para facilitar a depuração do vertex shader, adicionei uma simulação do vertex shader na CPU usando a macro FSGLOGLNEWAGERENDERER_CPU_BASED_VERTEX_MODS_ENABLED. O fabricante de placas de vídeo NVIDIA possui um utilitário para depurar código de shader Nsight, talvez ele também possa simplificar o desenvolvimento de algoritmos complexos de shader de vértices/pixels, mas nunca consegui testar sua funcionalidade. A simulação na CPU foi suficiente.

No próximo artigo pretendo descrever a mistura de múltiplas animações e preencher as lacunas restantes.

Fontes

https://www.youtube.com/watch?v= f3Cr8Yx3GGA

RPG de ação 3D do Jaguar Espacial

Faz muito tempo que não anuncio novos projetos) O próximo projeto em que estou começando a trabalhar – RPG de ação 3D chamado Space Jaguar Uma história em cenário de ficção científica sobre um cara durão chamado Jag e sua difícil aventura em busca de seu pai desaparecido. Haverá gráficos 3D no Flame Steel Engine (ou possivelmente em qualquer outro popular), utilizando desenvolvimentos de projetos anteriores (Death Mask, Cube Art Project), um enredo de comédia com muitas referências, batalhas arcade e chefes. Não estou pronto para falar sobre a data de lançamento da versão completa; pretendo lançar o jogo em partes.

Repositório do projeto:
https://gitlab.com/demensdeum/space-jaguar-action-rpg

Desenvolvimento de jogos para ZX Spectrum em C

Esse post bobo é dedicado ao desenvolvimento de um jogo para o antigo computador ZX Spectrum em C. Vamos dar uma olhada no bonitão:

Iniciou a produção em 1982 e foi produzido até 1992. Características técnicas da máquina: processador Z80 de 8 bits, 16-128kb de memória e outras extensões, como o chip de som AY-3-8910.

Como parte da competição Yandex Retro Games Battle 2019 para esta máquina, escrevi um jogo chamado Interceptor 2020. Como não tive tempo de aprender linguagem assembly para o Z80, resolvi desenvolvê-lo em C. Como conjunto de ferramentas, escolhi um conjunto pronto – z88dk, que contém compiladores C e diversas bibliotecas auxiliares para agilizar a implementação de aplicações para o Spectrum. Ele também suporta muitas outras máquinas Z80, como MSX e calculadoras Texas Instruments.

A seguir, descreverei meu voo superficial sobre a arquitetura do computador, o conjunto de ferramentas z88dk, e mostrarei como consegui implementar a abordagem OOP e usar padrões de design.

Recursos de instalação

A instalação do z88dk deve ser realizada de acordo com o manual do repositório, porém, para usuários do Ubuntu, gostaria de destacar um recurso – Se você já possui compiladores para Z80 instalados a partir de pacotes deb, então você deve removê-los, já que z88dk os acessará da pasta bin por padrão devido à incompatibilidade das versões do compilador do conjunto de ferramentas, você provavelmente não conseguirá compilar nada.< /p>

Olá, mundo

Escrever Hello World é muito fácil:

#include 

void main()
{
    printf("Hello World");
}

É ainda mais fácil compilar um arquivo tap:

zcc +zx -lndos -create-app -o helloworld helloworld.c

Para rodar, use qualquer emulador ZX Spectrum com suporte a arquivo tap, por exemplo online:
http://jsspeccy.zxdemo.org/

Desenhe na imagem em tela cheia

tl;dr As imagens são desenhadas em blocos, blocos de tamanho 8×8 pixels, os próprios blocos são incorporados na fonte Spectrum e, em seguida, a imagem é impressa como uma linha a partir dos índices.

A biblioteca de saída de sprites e blocos sp1 produz blocos usando UDG. A imagem é traduzida em um conjunto de UDGs (blocos) individuais e depois montados na tela usando índices. Deve ser lembrado que UDG é usado para exibir texto, e se sua imagem contiver um conjunto muito grande de blocos (por exemplo, mais de 128 blocos), você terá que ir além dos limites do conjunto e apagar o Spectrum padrão fonte. Para contornar essa limitação, utilizei uma base de 128 – 255 simplificando as imagens, deixando a fonte original no lugar. Sobre simplificar as imagens abaixo.

Para desenhar imagens em tela cheia você precisa se munir de três utilitários:
Gimp
img2spec
png2c-z88dk

Existe uma maneira para verdadeiros homens ZX, verdadeiros guerreiros retrô, é abrir um editor gráfico usando a paleta Spectrum, conhecendo os recursos de saída da imagem, prepará-la manualmente e carregá-la usando png2c-z88dk ou png2scr.< /p>

A maneira mais fácil – pegue uma imagem de 32 bits, mude o número de cores para 3-4 no Gimp, edite-a levemente e importe-a para img2spec para não trabalhar com restrições de cores manualmente, exporte png e converta-a em um array C usando png2c- z88dk.

Lembre-se de que, para uma exportação bem-sucedida, cada bloco não pode conter mais de duas cores.

Como resultado, você receberá um arquivo h que contém o número de blocos únicos, se houver mais de ~128, simplifique a imagem no Gimp (aumente a repetibilidade) e execute o procedimento de exportação sobre um novo .

Após a exportação, você literalmente carrega a “fonte” dos blocos e imprime o “texto” dos índices dos blocos na tela. Abaixo está um exemplo da “classe” de renderização:

// грузим шрифт в память
    unsigned char *pt = fullscreenImage->tiles;

    for (i = 0; i < fullscreenImage->tilesLength; i++, pt += 8) {
            sp1_TileEntry(fullscreenImage->tilesBase + i, pt);
    }

    // ставим курсор в 0,0
    sp1_SetPrintPos(&ps0, 0, 0);

    // печатаем строку
    sp1_PrintString(&ps0, fullscreenImage->ptiles);

Desenhando sprites na tela

A seguir descreverei um método para desenhar sprites de 16×16 pixels na tela. Não cheguei na animação e na mudança de cores, porque… É trivial que já nesta fase, presumo, tenha ficado sem memória. Portanto, o jogo contém apenas sprites monocromáticos transparentes.

Desenhamos uma imagem png monocromática 16×16 no Gimp, depois usando png2sp1sprite a traduzimos em um arquivo assembly asm, em código C declaramos arrays do arquivo assembly e adicionamos o arquivo na fase de montagem.< /p>

Após a etapa de declaração do recurso sprite, ele deve ser adicionado na tela na posição desejada, segue abaixo um exemplo do código da “classe” do objeto do jogo:

    struct sp1_ss *bubble_sprite = sp1_CreateSpr(SP1_DRAW_MASK2LB, SP1_TYPE_2BYTE, 3, 0, 0);
    sp1_AddColSpr(bubble_sprite, SP1_DRAW_MASK2,    SP1_TYPE_2BYTE, col2-col1, 0);
    sp1_AddColSpr(bubble_sprite, SP1_DRAW_MASK2RB,  SP1_TYPE_2BYTE, 0, 0);
    sp1_IterateSprChar(bubble_sprite, initialiseColour);

A partir dos nomes das funções você pode entender aproximadamente o significado de – aloque memória para o sprite, adicione duas colunas 8×8, adicione uma cor para o sprite.

A posição do sprite é indicada em cada quadro:

sp1_MoveSprPix(gameObject->gameObjectSprite, Renderer_fullScreenRect, gameObject->sprite_col, gameObject->x, gameObject->y);

Emulando OOP

Não existe sintaxe para OOP em C. O que você deve fazer se ainda quiser? Você precisa conectar sua mente e ser iluminado pela ideia de que não existe equipamento OOP; em última análise, tudo se resume a uma das arquiteturas de máquina, na qual simplesmente não existe o conceito de objeto e outras abstrações associadas a ele.< /p>

Esse fato me impediu por muito tempo de entender por que OOP é necessário, por que é necessário usá-lo se no final tudo se trata de código de máquina.

Porém, após trabalhar no desenvolvimento de produtos, descobri as delícias desse paradigma de programação, principalmente, é claro, flexibilidade de desenvolvimento, mecanismos de proteção de código, com abordagem correta, reduzindo entropia, simplificando o trabalho em equipe. Todos os benefícios acima decorrem de três pilares – polimorfismo, encapsulamento, herança.

Vale ressaltar também a simplificação da resolução de questões relacionadas à arquitetura de aplicações, pois 80% dos problemas de arquitetura foram resolvidos por cientistas da computação no século passado e descritos na literatura sobre padrões de projeto. A seguir, descreverei maneiras de adicionar sintaxe semelhante a OOP em C.

É mais conveniente tomar estruturas C como base para armazenar dados de uma instância de classe. Claro, você pode usar um buffer de bytes, criar sua própria estrutura para classes, métodos, mas por que reinventar a roda? Afinal, já estamos reinventando a sintaxe.

Dados da turma

Exemplo de campos de dados de “classe” do GameObject:

struct GameObjectStruct {
    struct sp1_ss *gameObjectSprite;
    unsigned char *sprite_col;
    unsigned char x;
    unsigned char y;
    unsigned char referenceCount;
    unsigned char beforeHideX;
    unsigned char beforeHideY;
};
typedef struct GameObjectStruct GameObject;

Salve nossa classe como “GameObject.h”, faça #include “GameObject.h” no lugar certo e use-a.

Métodos de classe

Levando em consideração a experiência dos desenvolvedores da linguagem Objective-C, a assinatura de um método de classe serão funções em escopo global, o primeiro argumento será sempre a estrutura de dados, seguido dos argumentos do método. Abaixo está um exemplo de “método” da “classe” GameObject:

void GameObject_hide(GameObject *gameObject) {
    gameObject->beforeHideX = gameObject->x;
    gameObject->beforeHideY = gameObject->y;
    gameObject->y = 200;
}

A chamada do método é semelhante a esta:

GameObject_hide(gameObject);

Construtores e destruidores são implementados da mesma maneira. É possível implementar um construtor como alocador e inicializador de campo, mas prefiro controlar a alocação e inicialização de objetos separadamente.

Trabalhando com memória

Gerenciamento manual de memória do formulário usando malloc e free agrupados em macros novas e de exclusão para corresponder ao C++:

#define new(X) (X*)malloc(sizeof(X))
#define delete(X) free(X)

Para objetos que são usados ​​por várias classes ao mesmo tempo, o gerenciamento de memória semi-manual é implementado com base na contagem de referências, à imagem e semelhança do antigo mecanismo ARC do Objective-C Runtime:

void GameObject_retain(GameObject *gameObject) {
    gameObject->referenceCount++;
}

void GameObject_release(GameObject *gameObject) {
    gameObject->referenceCount--;

    if (gameObject->referenceCount < 1) { sp1_MoveSprAbs(gameObject->gameObjectSprite, &Renderer_fullScreenRect, NULL, 0, 34, 0, 0);
        sp1_DeleteSpr(gameObject->gameObjectSprite);
        delete(gameObject);
    }
}

Assim, cada classe deve declarar o uso de um objeto compartilhado usando reter, liberando propriedade por meio de release. A versão moderna do ARC usa chamadas automáticas de retenção/liberação.

Som!

O Spectrum possui um tweeter capaz de reproduzir música de 1 bit; os compositores da época conseguiam reproduzir nele até 4 canais de som simultaneamente.

O Spectrum 128k contém um chip de som separado AY-3-8910, que pode reproduzir música rastreada.

Uma biblioteca é oferecida para usar o tweeter no z88dk

O que resta aprender

Eu estava interessado em conhecer o Spectrum, implementar o jogo usando o z88dk e aprender muitas coisas interessantes. Ainda tenho muito que aprender, por exemplo, o montador Z80, pois ele me permite usar toda a potência do Spectrum, trabalhar com bancos de memória e trabalhar com o chip de som AY-3-8910. Espero participar da competição no próximo ano!

Links

https://rgb.yandex
https://vk.com/sinc_lair
https://www.z88dk.org/forum/

Código fonte

https://gitlab.com/demensdeum/ zx-projects/tree/master/interceptor2020

Máscara Mortal Beta Selvagem

O jogo Death-Mask entra em status de beta público (wild beta)
A tela do menu principal do jogo foi redesenhada, foi adicionada uma visão da zona azul do labirinto tecnológico, com uma música agradável de fundo.

Em seguida, pretendo retrabalhar o controlador de jogo, adicionar movimentos suaves como nos jogos de tiro antigos, modelos 3D de caixas, armas, inimigos de alta qualidade, a capacidade de passar para outros níveis do labirinto tecnológico não apenas através de portais ( elevadores, portas, quedas por buracos no chão, buracos nas paredes), acrescentarei um pouco de variedade ao ambiente do labirinto gerado. Também trabalharei no equilíbrio do jogo.
A animação do esqueleto será adicionada como uma fase de polimento antes do lançamento.< /p>

O bom, o mau e o feio Singleton

Nesta nota descreverei minha experiência e a experiência de meus colegas ao trabalhar com o padrão Singleton (Singleton na literatura estrangeira), enquanto trabalhava em vários projetos (bem-sucedidos e não tão bem-sucedidos). Descreverei por que pessoalmente acho que esse padrão não pode ser usado em lugar nenhum e também descreverei quais fatores psicológicos na equipe influenciam a integração desse antipadrão. Dedicado a todos os desenvolvedores caídos e aleijados que estavam tentando entender por que tudo começou com um dos membros da equipe trazendo um cachorrinho fofo, fácil de manusear, que não requer cuidados e conhecimentos especiais para cuidar dele, e terminou com a fera criada tomar seu projeto como refém, requer cada vez mais horas de trabalho e consome os nervos do usuário, seu dinheiro e cria números absolutamente monstruosos para avaliar a implementação de coisas aparentemente simples coisas.


Wolf in sheep’s clothing by SarahRichterArt

A história se passa em um universo alternativo, todas as coincidências são aleatórias…

Acaricie o gato em casa com Cat@Home

Toda pessoa às vezes na vida tem um desejo irresistível de acariciar um gato. Analistas de todo o mundo prevêem que a primeira startup que criou um aplicativo para entrega e aluguel de gatos se tornará extremamente popular e em um futuro próximo será comprada pelo Moogle por trilhões de dólares. Logo isso acontece – um cara de Tyumen cria o aplicativo Cat@Home e logo se torna um trilionário, a empresa Moogle obtém uma nova fonte de lucro e milhões de pessoas estressadas têm a oportunidade de peça um gato para sua casa para passar mais roupas e se acalmar.

Ataque dos Clones

Um dentista extremamente rico de Murmansk, Alexey Goloborodko, impressionado com um artigo sobre Cat@Home da Forbes, decide que também quer ser astronomicamente rico. Para atingir esse objetivo, através de seus amigos, ele encontra uma empresa de Goldfield – que é a cidade de Goldfield. Wakeboard DevPops, que fornece serviços de desenvolvimento de software, encomenda a eles o desenvolvimento de um clone Cat@Home.

Time vencedor

O projeto se chama Fur&Pure, confiado a uma talentosa equipe de desenvolvimento de 20 pessoas; A seguir, vamos nos concentrar em uma equipe de desenvolvimento móvel de 5 pessoas. Cada membro da equipe recebe sua parte do trabalho, munido de ágil e scrum, a equipe conclui o desenvolvimento no prazo (em seis meses), sem bugs, lança o aplicativo na iStore, onde é avaliado em 5 por 100.000 usuários, há muitos comentários sobre o quão bom é o aplicativo, quão excelente é o serviço (afinal, universo alternativo). Os gatos estão passados, o aplicativo está liberado, tudo parece estar indo bem. Porém, Moogle não tem pressa em comprar uma startup por trilhões de dólares, porque não só gatos, mas também cachorros já apareceram no Cat@Home.

O cachorro late, a caravana segue em frente

O proprietário do aplicativo decide que é hora de adicionar cães ao aplicativo, solicita uma avaliação à empresa e recebe aproximadamente pelo menos seis meses para adicionar cães ao aplicativo. Na verdade, o aplicativo será escrito do zero novamente. Durante esse período, o Moogle adicionará cobras, aranhas e porquinhos-da-índia ao aplicativo, e o Fur&Pur receberá apenas cães.
Por que isso aconteceu? A falta de arquitetura de aplicação flexível é a culpada por tudo; um dos fatores mais comuns é o antipadrão Singleton.

O que há de errado?

Para encomendar um gato em casa o consumidor precisa criar um pedido e encaminhá-lo para o escritório, onde o escritório irá processá-lo e enviar um entregador com o gato, o entregador já receberá o pagamento pelo serviço.
Um dos programadores decide criar uma classe “Cat Application” com os campos necessários, traz esta classe para o espaço global da aplicação através de um singleton. Por que ele está fazendo isso? Para economizar tempo (economizando meia hora), porque é mais fácil tornar um aplicativo público do que pensar na arquitetura do aplicativo e usar injeção de dependência. Então outros desenvolvedores pegam esse objeto global e vinculam suas classes a ele.
Por exemplo, todas as telas acessam o objeto global “Cat Request” e mostrar dados do aplicativo. Como resultado, esse aplicativo monolítico é testado e lançado.
Tudo parece estar bem, mas de repente aparece um cliente com a necessidade de adicionar solicitações de cães ao aplicativo. A equipe começa a avaliar freneticamente quantos componentes do sistema serão afetados por essa mudança. Ao final da análise, verifica-se que é necessário refazer de 60 a 90% do código para ensinar a aplicação a aceitar não apenas “Request For Cat” mas também “Pedido de Cachorro”, já é inútil avaliar a adição de outros animais nesta fase, para dar conta de pelo menos dois.

Como prevenir o singleton

Primeiro, na fase de levantamento de requisitos, indique explicitamente a necessidade de criar uma arquitetura flexível e extensível. Em segundo lugar, vale a pena realizar uma revisão independente do código do produto paralelamente, com pesquisa obrigatória dos pontos fracos. Se você é um desenvolvedor e adora singletons, sugiro que recupere o juízo antes que seja tarde demais, caso contrário, noites sem dormir e nervos em frangalhos serão garantidos. Se você estiver trabalhando em um projeto legado que possui muitos singletons, tente se livrar deles ou do projeto o mais rápido possível.
Você precisa mudar do antipadrão de objetos/variáveis ​​globais singletons para injeção de dependência – o padrão de design mais simples no qual todos os dados necessários são fornecidos a uma instância de uma classe no estágio de inicialização, sem necessidade adicional de serem vinculados ao espaço global.

Fontes

https://stackoverflow. com/questions/137975/what-is-so-bad-about-singletons
http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/
https://blog.ndepend.com/singleton-pattern-costs/

Engrenagens de moagem

Oh musa, como às vezes é difícil te pegar.
O desenvolvimento de Death-Mask e frameworks relacionados (Flame Steel Core, Game Toolkit, etc.) está suspenso por vários meses para decidir sobre a parte artística do jogo, música, som e jogabilidade.
Planos – criar um editor para o Flame Steel Game Toolkit, escrever um intérprete para scripts de jogos (baseado na sintaxe Rise), implementar o jogo Death-Mask para tantas plataformas quanto possível.
A fase mais difícil foi ultrapassada – na prática, foi comprovada a possibilidade de escrever seu próprio motor de jogo multiplataforma, seu próprio IDE e um conjunto de bibliotecas.
Estou passando para a fase de criação de um projeto realmente bem pensado e interessante, fique ligado.

Vencemos Malevich, Black Squares OpenGl

Malevich chega periodicamente a qualquer desenvolvedor no OpenGL. Isso acontece inesperadamente e com ousadia, você apenas inicia o projeto e vê um quadrado preto em vez de uma renderização maravilhosa:

Hoje descreverei por que motivo fui visitado por um quadrado preto, os problemas encontrados por causa dos quais o OpenGL não desenha nada na tela e às vezes até torna a janela transparente.

Use ferramentas

Para depurar o OpenGL, duas ferramentas me ajudaram: renderdoc e Death-Mask O que não mostra nada na tela (apenas um quadrado). Ao usar chroot e montagem em 16.10 i recebo uma assembléia de trabalho do jogo com gráficos .

Parece que algo quebrou no Ubuntu 18.04

ldd mostrou a linkka às bibliotecas idênticas sdl2, gl. Dirigindo uma construção não trabalhadora no RenderDoc, vi lixo na entrada do shader do vértice, mas precisava de uma confirmação mais sólida. Para entender a diferença entre os binarticos, eu os dirigi através do Apitrace . A comparação de lixeiras me mostrou que a assembléia em uma nova ubunta quebra o programa das perspectivas no OpenGL, na verdade enviando lixo lá:

Matrizes se reúnem na biblioteca GLM. Depois de copiar o GLM de 16.04 – Recebi a construção do jogo novamente. O problema foi a diferença na inicialização de uma única matriz no GLM 9.9.0, é necessário indicar claramente o argumento MAT4 (1.0F) nele no construtor. Tendo mudado a inicialização e escrevendo O autor da biblioteca, eu comecei a fazer testes para fsgl . No processo de escrita que encontrei falhas no FSGL, as descrevo ainda mais.

Determine quem está na vida

Para o trabalho correto com o OpenGL, você precisa voluntariamente à força solicitar o contexto de uma determinada versão. Então, ele procura SDL2 (você precisa colocar a versão estritamente antes de inicializar o contexto):


 sdl_gl_seettrtribute (sdl_gl_context_major_version,  3 );
Sdl_gl_settribute (sdl_gl_context_minor_version, 2 );
Sdl_gl_settribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

Por exemplo, o renderDoc não funciona com contextos abaixo de 3.2. Gostaria de observar que, depois de alternar o contexto , há uma alta probabilidade de ver a mesma tela preta . Por que?

Como o contexto do OpenGL 3.2 deve exigir a presença de buffer VAO , sem o qual 99% dos drivers gráficos não funcionam. Adicione fácil:


 glgenvertexarrays ( 1 ,  &  vao);
Glbindvertexaray (VAO);

Não durma, congele

Também encontrei um problema interessante no Kubuntu, em vez de um quadrado preto, fui exibido transparente e, às vezes, tudo era renderizado corretamente. Encontrei a solução para esse problema no Stack Overflow:
https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes

O código de renderização do teste FSGL também estava presente Sleep (2s) ; Então, no Xubuntu e Ubuntu, recebi a renderização correta e enviei o pedido para dormir, mas no Kubuntu recebi uma tela transparente em 80% do lançamento do golfinho e 30% dos lançamentos e terminais. Para resolver esse problema, adicionei a renderização em cada quadro, após uma pesquisa do SDLEVENT, conforme recomendado na documentação.

Código de teste:
https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/

Fale com o motorista

OpenGL suporta o canal de comunicação entre o aplicativo e o driver, para ativá-lo, você precisa ativar os sinalizadores GL_DEBUG_OUTPUT, GL_DEBUG_OUTPUT_SYNCHRONUS, Afixar o aviso GLDebugMessagEntrol e tie the callback através de .
Um exemplo de inicialização pode ser tomado aqui:
https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp

Não tenha medo, veja crescer

Neste post falarei sobre minhas desventuras com ponteiros inteligentes shared_ptr. Depois de implementar a geração do próximo nível em meu jogo Death-Mask, notei uma memória vazar . Cada novo nível proporcionou um aumento de + 1 megabyte na RAM consumida. É Obviamente que alguns objetos permaneceram na memória e não a liberaram. Para corrigir este facto, foi necessário implementar a correcta implementação de recursos quando o nível se encontra sobrecarregado, o que aparentemente não foi feito. Como usei ponteiros inteligentes, havia várias opções para resolver esse problema, a primeira envolvia a revisão manual do código (longa e enfadonha), enquanto a segunda envolvia pesquisar os recursos do depurador lldb e do código-fonte libstdc++ para a possibilidade de rastreamento automático contra alterações.

Na Internet, todos os conselhos se resumiam a revisar manualmente o código, corrigi-lo e bater-se com chicotes depois de encontrar a linha de código problemática. Também foi proposta a implementação de um sistema próprio para trabalhar com memória, como fazem todos os grandes projetos desenvolvidos desde as décadas de 90 e 2000, antes da chegada dos ponteiros inteligentes no padrão C++11. Tentei usar pontos de interrupção no construtor de uma cópia de todos os shared_ptrs, mas depois de vários dias nada de útil aconteceu. Houve uma ideia de adicionar log à biblioteca libstdc++, mas os custos de mão de obra acabaram sendo monstruosos.


Cowboy Bebop (1998)

A solução me ocorreu de repente na forma de rastrear alterações na variável privada shared_ptr – use_count. Isso pode ser feito usando watchpoints embutidos no lldb. Depois de criar um shared_ptr via make_shared, as alterações no contador no lldb podem ser rastreadas usando a linha:
.

assistir definir var camera._M_refcount._M_pi->_M_use_count

Onde a “câmera” este é um objeto shared_ptr cujo estado do contador precisa ser rastreado. Claro, os aspectos internos do shared_ptr irão variar dependendo da versão do libstdc++, mas o princípio geral pode ser entendido. Após instalar o watchpoint, iniciamos os aplicativos e lemos o stacktrace de cada alteração do contador, depois olhamos o código (sic!), encontramos o problema e corrigimos. No meu caso, os objetos não foram liberados das tabelas de cache e das tabelas lógicas do jogo. Espero que este método ajude você a lidar com vazamentos ao trabalhar com shared_ptr e ame ainda mais essa ferramenta de memória. Boa depuração.

Visão de Jogos #3

A terceira edição de uma coluna não permanente sobre jogos Games Vision.

Observer (PC e consoles, Bloober Team) – horror cyberpunk dos valentes poloneses. Um filme de terror curto e muito atmosférico estrelado por Rutger Hauer. Como fã de cyberpunk, gostei de absolutamente tudo no jogo. Enigmas não muito difíceis, falhas encantadoras do personagem principal, jogabilidade com momentos calmos misturados com ação, capacidade de literalmente mergulhar nas memórias dos mortos, um enredo no estilo Ghost in the Shell + muitas referências à cultura pop Sci-Fi. Dos pontos negativos – muitas falhas, às vezes parece que devido à sua abundância é impossível jogar, também alguns jogadores ficaram furiosos com elementos específicos de terror que eram tão assustadores que não conseguiam continuar jogando.
Avaliação: 8/10

Paradigma (Windows/OS X, Jacob Janerka) – uma busca que consegue parodiar e rir de tudo ao mesmo tempo. Há o ridículo da URSS, da América, do gênero quest, do glam rock, dos consoles antigos, das pessoas, dos monumentos, do pessoal de TI, dos cones, dos computadores, das mulheres, das crianças, dos pais, dos artistas, do amor, dos cientistas, da indústria de jogos, dos próprios jogadores e #8211; Em geral, é impossível listar tudo. Enredo absolutamente imprevisível, atmosfera e arte absurdas, enigmas não particularmente difíceis. O jogo possui bugs e travamentos raros, alguns momentos e piadas são um pouco previsíveis e nada originais.
Avaliação: 9/10

Late Shift (PC e consoles, CtrlMovie Ltd) – filme interativo. Lamento muito que uma ideia basicamente boa tenha sido implementada tão mal. Tudo está ruim – enredo, falta de atores estelares, atuação, congelamentos constantes na versão para PC, variabilidade quase zero (ilusória). É completamente incompreensível como foi possível lançar um jogo com tantos problemas na década de 2010, porque na verdade é um reprodutor de vídeo comum, o jogo inteiro poderia ter sido postado na Internet, por exemplo no YouTube, mas em vez disso eles usaram Unity e conseguiu quebrar um mecanismo de jogo tão poderoso. O fórum oficial do Steam é dedicado a correções, hotfixes, soluções alternativas, etc. Há um desastre técnico, falta de suporte ao usuário, todos os testes acontecem diretamente nos jogadores. Comprei ótimas críticas e depoimentos.
Avaliação: 3/10

Sabre-Plus C++ IDE

Comecei a desenvolver meu próprio IDE para C++ – Sabre-Plus. As principais ideias do novo IDE – seja simples, rápido e *útil* no desenvolvimento. No momento, o código-fonte está disponível sob a licença MIT no GitHub. Qt é usado para trabalhar com a UI. No futuro pretendo transferir todo o desenvolvimento relacionado ao C++ para o Sabre-Plus – A Máscara da Morte definitivamente será migrada. Mais detalhes sobre os pontos:

  • Simples – está planejado não adicionar mais do que o necessário – por exemplo, não contêm clientes de controle de origem, terminais integrados e coisas semelhantes. A funcionalidade é focada apenas na edição de código e análise de erros. O código do editor deve ser dividido em classes simples que façam sua parte do trabalho corretamente (modo Unix)
  • Rápido – diz respeito tanto à base de código IDE quanto ao comportamento do próprio editor. Todas as ações no IDE devem ser o mais rápidas possível, mesmo aquelas muitas vezes longas e complexas como a criação/importação de projetos.
  • Ajudando – análise de erros típicos ao escrever e compilar código. Correção de erros e avisos mediante solicitação do usuário. O plano é adicionar uma análise do aplicativo construído em uma plataforma específica e exibir informações de ajuda sobre a instalação das bibliotecas e componentes necessários.

Para construir o editor para seu sistema operacional, você precisa instalar o Qt 5 SDK, baixar o código IDE do repositório, abrir o arquivo Saber-Plus.pro no Qt Creator e executar a compilação:

https://github.com/demensdeum/saberplus

Machado de batalha de aço flamejante

A partir de hoje estou começando a desenvolver um editor para o framework de jogos – Machado de batalha de aço flamejante.

O editor permite que você edite cenas para a estrutura do jogo Flame Steel Game Toolkit.
Escolhi a relativamente nova linguagem Kotlin baseada em Java para testá-la em condições de combate.

Você pode acompanhar o processo no repositório:
https://github.com/demensdeum/FlameSteelBattleAxe

Núcleo de Aço Flamejante

Captura de tela da versão mais recente de Death Mask:

Parece um milhão de dólares, né?

< /blockquote>

Renomear, dividir

A biblioteca Flame Steel Engine foi renomeada para Flame Steel Core, o Game Toolkit foi dividido em bibliotecas SDL, Panda3D (Desktop) e Web (ThreeJS). Se houver esferas de aço disponíveis para montagem usando as bibliotecas Flame Steel, você deverá primeiro selecionar e montar as que você precisa.

Github:

https://github.com/demensdeum/Death-Mask
https://github.com/demensdeum/FlameSteelCore
https://github.com/demensdeum/FlameSteelEngineGameToolkit
https://github.com/demensdeum/FlameSteelEngineGameToolkitDesktop

Obsoleto:

https://github.com/demensdeum/FlameSteelEngineGameToolkitSDL
https://github.com/demensdeum/FlameSteelEngineGameToolkitWeb

Hacking quântico RSA

Outro dia escrevi minha implementação do algoritmo de criptografia de chave pública RSA. Também fiz um hack simples desse algoritmo, então queria escrever uma breve nota sobre esse assunto. A resistência à violação do RSA é baseada em um problema de fatoração. Fatoração… Que palavra terrível…

Não é tão assustador assim

Na verdade, na primeira etapa da criação das chaves, pegamos dois números aleatórios, mas os números só devem ser divisíveis por si mesmos e um – Números primos.
Vamos chamá-los de p e q. A seguir devemos obter o número n = p *q. Ele será usado para geração adicional de chaves, as chaves, por sua vez, serão usadas para criptografar e descriptografar mensagens. Na versão final da chave privada e pública, o número n será transferido sem alterações.
Digamos que temos uma das chaves RSA e uma mensagem criptografada em mãos. Retiramos o número n da chave e iniciamos o hack.

Fatorar n

Fatoração – decomposição de um número em fatores primos. Primeiro, retiramos o número n da chave (em chaves reais você pode fazer isso usando openssl), digamos n = 35. Depois, fatoramos isso em fatores simples n = 35 = 5 * 7, este é e existem nossos p e q. Agora você pode regenerar as chaves usando o p, q recebido, descriptografar a mensagem e criptografá-la garantindo a visibilidade do autor original.

Qubits não são tão simples

É realmente possível quebrar qualquer RSA tão facilmente? Na verdade, não, os números p, q são considerados deliberadamente grandes, de modo que a tarefa de fatoração em computadores clássicos leva muito tempo (10 anos até certo ponto)< br/>Porém, usando o algoritmo quântico de Shor, é possível fatorar um número em um tempo muito curto. No momento, artigos sobre esse tema informam o momento de multiplicar um determinado número, ou seja, praticamente instantaneamente. Para que o algoritmo de Shor funcione, é necessário implementar computadores quânticos com grande número de qubits. Em 2001, a IBM fatorou o número 15 usando 7 qubits. Portanto, teremos que esperar muito tempo por esse momento, quando já teremos mudado para algoritmos de criptografia pós-quântica.

Toque curto

Peter Shore fala sobre seu algoritmo de fatoração

Para testar o algoritmo de Shor em um simulador quântico, você pode instalar ProjectQ, seus exemplos incluem uma implementação de shor.py que permite fatorar um número inserido pelo usuário. No simulador, o tempo de execução é deprimente, mas parece ser uma simulação divertida e lúdica do funcionamento de um computador quântico.

Artigos:
http://www.pagedon.com/rsa-explained-simply/my_programming/
http://southernpacificreview.com/2014/01/06/rsa-key-generation-example/
https://0day.work/how-i-recovered-your-private-key-or-why-small-keys-are-bad/

Implementação Python do RSA:
https://github.com/demensdeum/RSA-Python

Russian Quantum Hack and Number Generator

[Translation may be, some day]

Эта заметка увеличит длину вашего резюме на 5 см!

Без лишних слов о крутости квантовых компьютеров и всего такого, сегодня я покажу как сделать генератор чисел на реальном квантовом процессоре IBM.
Для этого мы будем использовать всего один кубит, фреймворк для разработки квантового ПО для python – ProjectQ, и 16 кубитовый процессор от IBM, онлайн доступ к которому открыт любому желающему по программе IBM Quantum Experience.

Установка ProjectQ

Для начала у вас должен быть Linux, Python и pip. Какие либо инструкции по установке этих базовых вещей приводить бесполезно, т.к. в любом случае инструкции устареют через неделю, поэтому просто найдите гайд по установке на официальном сайте. Далее устанавливаем ProjectQ, гайд по установке приведен в документации. На данный момент все свелось к установке пакета ProjectQ через pip, одной командой: python -m pip install –user projectq

Ставим кубит в суперпозицию

Создаем файл quantumNumberGenerator.py и берем пример генератора бинарного числа из документации ProjectQ, просто добавляем в него цикл на 32 шага, собираем бинарную строку и переводим в 32-битное число:

import projectq.setups.ibm
from projectq.ops import H, Measure
from projectq import MainEngine
from projectq.backends import IBMBackend

binaryString = ""

eng = MainEngine()

for i in range(1, 33):

 qubit = eng.allocate_qubit()

 H | qubit

 Measure | qubit

 eng.flush()

 binaryString = binaryString + str(int(qubit))

 print("Step " + str(i))

number = int(binaryString, 2)

print("\n--- Quantum 32-Bit Number Generator by demensdeum@gmail.com (2017) ---\n")
print("Binary: " + binaryString)
print("Number: " + str(number))
print("\n---")

Запускаем и получаем число из квантового симулятора с помощью команды python quantumNumberGenerator.py

Незнаю как вы, но я получил вывод и число 3974719468:

--- Quantum 32-Bit Number Generator by demensdeum@gmail.com (2017) ---

Binary: 11101100111010010110011111101100
Number: 3974719468

---

Хорошо, теперь мы запустим наш генератор на реальном квантовом процессоре IBM.

Хакаем IBM

Проходим регистрацию на сайте IBM Quantum Experience, подтверждаем email, в итоге должен остаться email и пароль для доступа.
Далее включаем айбиэмовский движок, меняем строку eng = MainEngine() -> eng = MainEngine(IBMBackend())
В теории после этого вы запускаете код снова и теперь он работает на реальном квантовом процессоре, используя один кубит. Однако после запуска вам придется 32 раза набрать свой email и пароль при каждой аллокации реального кубита. Обойти это можно прописав свой email и пароль прямо в библиотеки ProjectQ.

Заходим в папку где лежит фреймворк ProjectQ, ищем файл с помощью grep по строке IBM QE user (e-mail).
В итоге я исправил строки в файле projectq/backends/_ibm/_ibm_http_client.py:

email = input_fun('IBM QE user (e-mail) > ') -> email = "quantumPsycho@aport.ru"

password = getpass.getpass(prompt='IBM QE password > ') -> password = "ilovequbitsandicannotlie"

Напишите свой email и password со-но.

После этого IBM будет отправлять результаты работы с кубитом онлайн прямо в ваш скрипт, процесс генерации занимает около 20 секунд.

Возможно в дальнейшем я доберусь до работы квантового регистра, и возможно будет туториал, но это не обязательно.
Да прибудет с вами запутанность.

Статья на похожую тему:
Introducing the world’s first game for a quantum computer

Por que criar um motor de jogo em 2017?

Muitas pessoas me perguntam: por que criar um motor de jogo em 2017? Afinal, já existem tantas soluções prontas e gratuitas no mercado.

Preparei um artigo separado com uma visão geral do mercado atual de desenvolvimento de jogos, descrevendo os motivos que me levaram a criar o Flame Steel Engine:

Reasons to Make New Game Engine in 2017

Linda e vazia

Você acorda de manhã, sua mãe prepara uma refeição para você, seu pai lhe dá dinheiro para comprar Snickers e leva você para a escola. Você estuda em uma escola boa e rigorosa, sem valentões. Você é um excelente aluno. Você tem vários tutores em disciplinas para as quais não tem predisposição. Há um quadro de honra pendurado em sua escola, no qual você deve estar, junto com suas notas, de preferência no topo. Seu futuro é brilhante. todos os dias eles te dão presentes, doces, roupas da moda descoladas. Tudo parece bem, mas você entende como essa vida realmente é chata. Não há sentimento de luta, cada passo é predeterminado, planejado com vários anos de antecedência.

É assim que me sinto quando jogo qualquer jogo da Blizzard. Vejo muitas pessoas que não conseguem jogar jogos da velha escola, não conseguem jogar algo verdadeiramente original, não estereotipado (Deadly PremonitionouPapers Please), mas todo mundo adora jogos Nevasca.

Comecei a conhecer seus jogos no PC com Starcraft. Depois do jogo selvagem e arcadeCommand & ConquistaAchei a jogabilidade muito comedida e calmante. O limite no número de unidades, me aprofundando pessoalmente nas operações micro-nano, me faz dormir. O próximo foi um jogo clicker lindo, mas vazio – um jogo clicker lindo, mas vazio. Diablo 2. Bons gráficos, níveis gerados e jogabilidade zero, um passatempo absolutamente meditativo e vazio. No entanto, meus amigos estão firmemente entrincheirados em StarCraft e Diablo. No início dos anos 2000, o alucinante Warcraft 3 foi lançado. Eu realmente gostava da empresa única naquela época. No entanto, o multijogador é muito semelhante ao Starcraft e, portanto, muito enfadonho. Em seguida veio o igualmente lindo e vazio Starcraft 2. Joguei Hearthstone f2p – este jogo é como uma máquina caça-níqueis: no começo você ganha, você tem fé em si mesmo, mas depois os desenvolvedores chegam até você com uma oferta para comprar vários baralhos pelo preço de 500 ₽. Sua habilidade não decide nada, apenas decide quanto dinheiro será gasto em decks virtuais.

Comprei recentemente Overwatch, um jogo de tiro da Blizzard. Gostei da heroína Mei, cuja arte e cosplay foram bombardeados em todas as redes sociais, como resultado, a onda geral de publicidade nas comunidades geek me levou para a costa dos jogadores de Overwatch.

Meus medos eram justificados – excelentes gráficos, diferentes heróis com vozes e habilidades próprias. Nem um único travamento durante o jogo, tudo está no nível da Blizzard. E então, quero dizer que o jogo está novamente tão polido até na jogabilidade que simplesmente não é interessante de jogar. Há uma verdadeira escassez de conteúdos interessantes. momentos inesperados, ideias arriscadas, a empresa, como sempre, pegou apenas o melhor dos últimos anos e, lapidando-o, enviou-o para conquistar o mercado, não poupando numa boa promoção.

O único jogo da Blizzard que eu realmente gostei – Rock’n’Roll Racing. Realmente existe jogabilidade, mas suspeito que isso não se deva ao desenvolvedor, mas ao editor – O Interplay provavelmente o Interplay ajudou a Blizzard a tornar o jogo algo verdadeiramente jogável.

Visão de Jogos #2

Coluna Visão de jogos volátil.
Estou escrevendo breves resenhas dos jogos que joguei recentemente

wsunhd
SIM
aka Sara is Missing (Android, Monsoon Lab) – ты находишь телефон девушки по имени Сара. Внутри телефона есть встроенный помощник IRIS, она хочет найти свою хозяйку и просит тебя ей в этом помочь. Задача понять что творилось в голове Сары из ее переписки, фоточек и видео, найти где она находится. Игра очень оригинальная и достаточно пугающая. Минус в том что нет локализации на русский и другие языки, нет версии для iOS, хотя очевидно что интерфейс игры копирует продукцию Apple (IRIS – SIRI) Также игра очень короткая.
Avaliação 7/10

unnamed
The End of The World
(Android, Sean Wenham) – игра про расставание – парня бросила девушка, теперь он бродит в поисках вина и спит под мостом, вспоминая моменты когда они были вместе. Умилительные моменты воспоминаний, грустная музыка, переход в белое, в принципе отличная игра для женской аудитории и некоторых пацанов. Мне не понравилась бюджетная графика с претензией на оригинальность (напоминает Another World Эрика Шайи), нулевой геймплей, попытки выбить из игрока слезки, предсказуемость, десять минут прохождения. Любителям ванили рекомендую.
Avaliação: 5/10

unnamed

Magnata do Lobisomem< /strong> (Android, Joe Williamson) – um jogo sobre um lobisomem que come pessoas em um parque da cidade. Os gráficos e a jogabilidade aqui são divertidos – muito divertidos. cores infantis, cores claras sem tons escuros, falta de sangue e pessoas parecendo cupcakes redondos com animações engraçadas. As rodadas são curtas e simples, os únicos inimigos são os jornalistas com câmeras. Parece, parece e toca muito divertido. Dos pontos negativos – dificuldade baixa, assistindo anúncios de cancelamento de Game Over, mecanismo de retirada de pontos marcados para redes sociais não funciona.
Avaliação: 6/10

Visão de jogos nº 1

Coluna Visão de jogos volátil.
Neste artigo escreverei breves resenhas dos jogos que joguei recentemente.

jansen

Nem pense que esse cara tem emoções, ele apenas às vezes finge que tem.

Deus Ex Mankind Divided (PC, Square Enix) – um jogo sobre o meio-humano Adam Jensen que está de férias em Praga e salvando o mundo ao longo do caminho.
Bons gráficos, altos requisitos de sistema, enredo previsível, trabalho fora do padrão de artistas – tudo isso é muito útil. tudo está aqui. O jogo oferece muitas opções de passagem, por exemplo, consegui a conquista “pacifista” por não matar ninguém durante todo o jogo, inclusive chefes.
Gostei das referências da cultura pop “The VoidWhich Binds“, “IRON MADE in China” etc. Não gostei da enorme quantidade de texto – água, todos os tipos de e-mails armazenando senhas de portas e correspondência de caracteres, o texto está absolutamente vazio e sem interesse. No momento do jogo, o jogo travava constantemente no modo DirectX 12, os salvamentos automáticos estavam quebrados e os patches pareciam ainda estar sendo lançados. Decidi não jogar o DLC porque… Já estou jogando o jogo principal há cerca de 2 semanas, tendo saído da minha vida vazia habitual.
Avaliação 8/10

slayin

Matar (Android, FDG) – um extraordinário jogo de arcade em estilo pixel para celulares. Você precisa correr e matar monstros comprando equipamentos na loja. Gostei da arte desse jogo, gostei muito da música chiptune, parece um jogo de arcade para NES, controles fáceis. O jogo em si foi decepcionante porque a jogabilidade não ocorre além de uma cena na tela e a incapacidade de se mover por um grande nível.
Avaliação 5/10

swordxolan

Espada de Xolan (Android, Alper Sarıkaya) – jogo de plataformas arcade em estilo pixel para telefones celulares. Um cavaleiro ou samurai percorre o nível e salva as pessoas das jaulas de ferro. Jogabilidade bastante interessante, controles fáceis, níveis grandes. O orçamento geral do jogo, arte barata, som barato e música maluca são decepcionantes.
Avaliação 6/10

bardstale

O Bardo’ s Tale(Android, entretenimento inXile) – remasterização de RPG de ação para celulares. Um RPG fora do padrão com cenas e diálogos engraçados. No disco do jogo estava escrito “vire o disco para ver algo terrível”, na parte de trás havia um lado espelhado do disco. Eu perdi esse jogo no PC naquela época por causa de Neverwinter Nights, mas agora posso jogá-lo no meu celular no ônibus. Para um jogador moderno, há claramente uma falta de pontos sobre onde ir e o que fazer, mas é por isso que adoro jogos da velha escola, eles realmente precisam ser jogados. Também não há capacidade de salvar em nenhum ponto, o que é fundamental para um jogo para celular. Música, arte, gosto de tudo, mas acho os controles atuais na tela do celular inconvenientes. E, claro, este não é um jogo novo, mas simplesmente um relançamento em plataformas móveis, o que pessoalmente considero um grande ponto negativo.
Avaliação 7/10

Diluindo SEC


Commission: Mad Scientist by Culpeo-Fox on DeviantArt

Neste artigo descreverei aproximadamente o padrão ECS e minha implementação no Flame Steel Engine Game Toolkit. O padrão Entity Component System é usado em jogos, incl. no motor Unity. Cada objeto no jogo é uma Essência preenchida com Componentes.  Por que isso é necessário se existe POO?
Em seguida, altere as propriedades, comportamento e exibição de objetos diretamente durante a execução do jogo. Essas coisas não são encontradas em aplicativos do mundo real; a dinâmica de alteração de parâmetros, propriedades de objetos, exibição e som é mais característica de jogos do que de software de contabilidade.


Não passamos bananas

Digamos que temos uma classe de banana em nosso jogo. E o designer do jogo queria que as bananas fossem usadas como armas. Digamos que na arquitetura atual as bananas não tenham nada a ver com armas. Fazendo de uma banana uma arma? Fazer todos os itens armas?
A ECS oferece uma solução para este problema premente – Todos os objetos do jogo devem consistir em componentes. Anteriormente banana era a classe Banana, agora faremos ela, e todos os outros objetos, a classe Entity, adicionando componentes a eles. Digamos que uma banana agora consiste nos seguintes componentes:

  1. Componente de posição (coordenadas no mundo do jogo – x, y, z)
  2. Componente de rotação (coordenadas x, y, z)
  3. Componente calórico de uma banana (o personagem principal não deve engordar muito)
  4. Componente de imagem de banana

Agora estamos adicionando um novo componente para todas as bananas, que é um sinalizador de que elas podem ser usadas como arma – Componente de arma. Agora, quando o sistema do jogo vê que um jogador se aproximou de uma banana, ele verifica a presença de um componente de arma na banana e, se isso acontecer, arma o jogador com uma banana.
No meu jogo Flame Steel Call Of The Death Mask, o padrão ECS é usado por toda parte. Os objetos são compostos de componentes e os próprios componentes podem conter componentes. Em geral, dividir o objeto < – > o componente está faltando na minha implementação, mas isso é até uma vantagem.

screenshot_2016-09-24_14-33-43

A espingarda nesta captura de tela é um componente do jogador e, ao mesmo tempo, a segunda espingarda simplesmente fica pendurada no mapa do jogo como um objeto comum.
Nesta captura de tela, há dois sistemas em execução – renderizador de cena e renderizador de interface. O renderizador de cena funciona com o componente de imagem shotgun no mapa, o renderizador de interface funciona com o componente de imagem shotgun nas mãos do jogador.

Links relacionados:
https://habrahabr.ru/post/197920/
https://www.youtube.com/watch?v=NTWSeQtHZ9M

Me perdendo

“Você não pode se tornar um mestre de tudo” – Frases como essa sempre me fazem rir. Todos caem nessa armadilha da especialização. usuários, programadores, chefes, clientes. “Eu quero isso como a Microsoft/Apple/Google”, “Por que não fazemos apenas um iPhone russo?”, “Por que não não é como no Word /uber/photoshop?” – Qualquer pessoa envolvida de alguma forma com TI já ouviu essas frases. Essas frases, repetidas pelos lábios de diferentes pessoas, soam ainda mais engraçadas.

Vou perguntar a você leitor – por que você precisa de outra palavra? Por que você precisa de outro Uber? Por que você precisa de outro photoshop? Por que você precisa “ser como um iPhone”?
Por que você se prende às interfaces e à abordagem de apenas uma empresa? Por que você se considera fã apenas dos produtos Apple/Google/Microsoft? Por que você não consegue abrir sua mente para abordagens alternativas para resolver problemas? Por que você não quer ser mais produtivo?

Muitos usuários da Microsoft não gostaram de como a empresa decidiu que todos precisavam atualizar para o Windows 10. As pessoas criticam as interfaces inconvenientes do iPhone, travamentos do sistema durante as atualizações, mudanças de design que não precisam, mas que ainda continuam a usar porque estão muito acostumados e têm um “iPhone” tem status na sociedade moderna.

Às vezes parece que se fosse pedido à Microsoft/Apple/Google que desistissem dos seus próprios filhos em troca de continuarem a trabalhar com os seus produtos, devido ao elevado apego a estes produtos, as pessoas facilmente desistiriam dos seus filhos.< /p>

Não seja eles, não se apegue a um produto, procure opções alternativas. Uma vez me ofereceram para desenvolver um sistema para corretores de imóveis, com interface em Microsoft Excel, e também houve ofertas para desenvolver um sistema de “quadro branco interativo” em Microsoft PowerPoint. Quando perguntei por que a Microsoft especificamente, eles me disseram que estavam “tão acostumados” quando perguntei se essas empresas licenciavam software da Microsoft, eles me responderam evasivamente, dizendo que se necessário, eles o fariam; então eles comprarão.

Leitor, recomendo que você estude as facetas do mundo da TI, pelo menos brevemente. Se você usou apenas o Microsoft Windows durante toda a sua vida, experimente o Apple OS X ou Linux. Se você usa apenas um iPhone, tente usar a versão mais recente do Android por pelo menos uma semana. No momento em que você passa para o lado de apenas uma empresa, fechando-se para os produtos das outras, nesse momento você se perde. Ele mesmo, como pessoa que pode decidir por si mesmo o que quer, como pessoa que pode escolher a ferramenta mais conveniente e produtiva para resolver um problema específico.

Programadores de apenas uma plataforma – outra dor de cabeça para mim pessoalmente e, acredito, para o setor de TI como um todo. Desenvolvedores que fazem aplicações que exportam apenas para *.doc ou apenas para *.pdf, desenvolvedores que estão vinculados a apenas um banco de dados comercial desatualizado (por exemplo, IBM Informix, ou Deus me livre Firebird), a apenas um tipo de hardware (todos esses programas que não funcionam para x86 no Android), é claro que entendo que vocês estão “acostumados”, mas pessoal, é hora de mudar.

No meu trabalho, costumo usar ferramentas impopulares, mas muito convenientes. Um dos exemplos – Foi necessário reduzir a resolução e compactar cerca de 100 fotos para download rápido em 3G e saída para iPad. Naquele dia ouvi uma das frases mais típicas  – “Teremos que converter todas as fotos manualmente no *Photoshop* para o formato desejado”. Ela me pareceu engraçada porque… Imaginei uma pessoa que iria refazer manualmente, como um servo de Deus, todas essas 100 fotos no Photoshop, ou tentar automatizá-las através de um mecanismo embutido. A questão aqui é justamente que a pessoa é tão apegada ao Photoshop que nem sequer suspeitou da existência de um conjunto de ferramentas gratuitas e abertas como o ImageMagick. O ImageMagick permite que você faça muitas coisas com imagens vetoriais e raster, inclusive sendo ideal para resolver um problema com 100 imagens em 5 minutos.

Seja dono de tudo, estude, experimente, não se torne escravo de uma corporação específica.