Il n’y a que Miku

Le résultat du travail sur la bibliothèque FSGL avec OpenGL ES et le code :

Ensuite, je décrirai comment tout a été programmé, divers problèmes intéressants ont été résolus.

Tout d’abord, nous allons initialiser le contexte OpenGL ES, comme je l’ai écrit dans le post précédent. De plus, nous ne considérerons que le rendu et une brève description du code.

La Matrix vous surveille

Cette figure de Miku dans la vidéo est constituée de triangles. Pour dessiner un triangle dans OpenGL, vous devez spécifier trois points avec les coordonnées x, y, z. en coordonnées 2D du contexte OpenGL.
Puisque nous devons dessiner une figure contenant des coordonnées 3D, nous devons utiliser une matrice de projection. Nous devons également faire pivoter, zoomer ou faire tout ce que nous voulons faire avec le modèle. À cette fin, la matrice de modèle est utilisée. Il n’y a pas de concept de caméra dans OpenGL ; en fait, les objets tournent autour d’une caméra statique. Pour cela, une matrice de vues est utilisée.

Pour simplifier la mise en œuvre d’OpenGL ES – il ne contient pas de données matricielles. Vous pouvez utiliser des bibliothèques qui ajoutent des fonctionnalités manquantes, par exemple GLM.

Shaders

Afin de permettre au développeur de dessiner n’importe quoi, et de quelque manière que ce soit, OpenGL ES doit implémenter des vertex et fragment shaders. Le vertex shader doit recevoir les coordonnées de rendu en entrée, effectuer des transformations à l’aide de matrices et transmettre les coordonnées à gl_Position. Fragment ou pixel shader – dessine déjà la couleur/texture, applique une superposition, etc.

J’ai écrit des shaders en GLSL. Dans mon implémentation actuelle, les shaders sont intégrés directement dans le code de l’application principale sous forme de chaînes C.

Tampons

Le vertex buffer contient les coordonnées des sommets (vertices) ; ce tampon contient également les coordonnées pour la texturation et d’autres données nécessaires aux shaders. Après avoir généré le vertex buffer, vous devez lier le pointeur aux données du vertex shader. Cela se fait avec la commande glVertexAttribPointer, où vous devez spécifier le nombre d’éléments, un pointeur vers le début des données et la taille du pas qui sera utilisé pour parcourir le tampon. Dans mon implémentation, la liaison des coordonnées de sommet et des coordonnées de texture pour le pixel shader est effectuée. Cependant, il convient de dire que le transfert des données (coordonnées de texture) vers le fragment shader s’effectue via le vertex shader. Pour y parvenir, les coordonnées sont déclarées en utilisant variant.

Pour qu’OpenGL sache dans quel ordre dessiner les points des triangles – vous aurez besoin d’un tampon d’index (index). Le tampon d’index contient le numéro de sommet dans le tableau ; en utilisant trois de ces indices, un triangle est obtenu.

Textures

Vous devez d’abord charger/générer une texture pour OpenGL. Pour cela j’ai utilisé SDL_LoadBMP, la texture est chargée depuis un fichier bmp. Cependant, il convient de noter que seuls les BMP 24 bits conviennent et que les couleurs qu’ils contiennent ne sont pas stockées dans l’ordre RVB habituel, mais en BGR. Autrement dit, après le chargement, vous devez remplacer le canal rouge par un bleu.
Les coordonnées de texture sont spécifiées au format UV< /a>, c’est-à-dire qu’il vous suffit de transférer deux coordonnées. La sortie de texture est effectuée dans le fragment shader. Pour ce faire, vous devez lier la texture dans un fragment shader.

Rien de plus

Puisque, selon nos instructions, OpenGL dessine de la 3D à la 2D – puis pour implémenter la profondeur et sélectionner des triangles invisibles – vous devez utiliser l’élimination et un tampon de profondeur (Z-Buffer). Dans mon implémentation, j’ai réussi à éviter la génération manuelle du tampon de profondeur à l’aide de deux commandes : glEnable(GL_DEPTH_TEST); et sélections glEnable(GL_CULL_FACE);
Assurez-vous également de vérifier que le plan proche de la matrice de projection est supérieur à zéro, car vérifier la profondeur avec un plan proche nul ne fonctionnera pas.

Rendu

Pour remplir le tampon de vertex, le tampon d’index avec quelque chose de conscient, par exemple le modèle Miku, vous devez charger ce modèle. Pour cela, j’ai utilisé la bibliothèque assimp. Miku a été placé dans un fichier au format Wavefront OBJ, chargé à l’aide de assimp, et la conversion des données d’assimp en tampons de sommets et d’index a été implémentée.

Le rendu s’effectue en plusieurs étapes :

  1. Faire pivoter Miku à l’aide de la rotation de la matrice du modèle
  2. Effacer l’écran et le tampon de profondeur
  3. Dessiner des triangles à l’aide de la commande glDrawElements.

Prochaine étape – Implémentation du rendu en WebGL à l’aide d’Emscripten.

Code source :
https://github.com/demensdeum/OpenGLES3-Experiments/tree/master/8-sdl-gles-obj-textured-assimp-miku
Modèle :
https://sketchfab.com/models/7310aaeb8370428e966bdcff414273e7

 

Projetez-le

Après avoir dessiné une théière rouge en 3D, je considère qu’il est de mon devoir de décrire brièvement comment cela se fait.

L’OpenGL moderne ne dessine pas en 3D, il dessine uniquement des triangles, des points, etc. en coordonnées d’écran 2D.
Pour générer au moins quelque chose en utilisant OpenGL, vous devez fournir un vertex buffer, écrire un vertex shader, ajouter toutes les matrices nécessaires (projection, modèle, vue) au vertex shader,associer toutes les données d’entrée à le shader, appelez la méthode de rendu en OpenGL. Est-ce que ça a l’air simple ?


Ok, qu’est-ce qu’un vertex buffer ? Liste des coordonnées à tracer (x, y, z)
Le vertex shader indique au GPU quelles coordonnées dessiner.
Le pixel shader indique quoi dessiner (couleur, texture, mélange, etc.)
Les matrices traduisent les coordonnées 3D en coordonnées OpenGL 2D qu’elles peuvent restituer

Dans les articles suivants, je fournirai des exemples de code et des résultats.

SDL2 – OpenGL ES

I love Panda3D game engine. But right now this engine is very hard to compile and debug on Microsoft Windows operation system. So as I said some time ago, I begin to develop my own graphics library. Right now it’s based on OpenGL ES and SDL2.
In this article I am going to tell how to initialize OpenGL ES context and how SDL2 helps in this task. We are going to show nothing.

King Nothing

First of all you need to install OpenGL ES3 – GLES 3 libraries. This operation is platform dependant, for Ubuntu Linux you can just type sudo apt-get install libgles2-mesa-dev. To work with OpenGL you need to initialize OpenGL context. There is many ways to do that, by using one of libraries – SDL2, GLFW, GLFM etc. Actually there is no one right way to initialize OpenGL context, but I chose SDL2 because it’s cross-platform solution, code will look same for Windows/*nix/HTML5/iOS/Android/etc.

To install sdl2 on Ubuntu use this command sudo apt-get install libsdl2-dev

So here is OpenGL context initialization code with SDL2:

    SDL_Window *window = SDL_CreateWindow(
            "SDL2 - OGLES",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            640,
            480,
            SDL_WINDOW_OPENGL
            );
	    

    SDL_GLContext glContext = SDL_GL_CreateContext(window);

After that, you can use any OpenGL calls in that context.

Here is example code for this article:
https://github.com/demensdeum/OpenGLES3-Experiments/tree/master/3sdl-gles
https://github.com/demensdeum/OpenGLES3-Experiments/blob/master/3sdl-gles/sdlgles.cpp

You can build and test it with command cmake . && make && ./SDLGles

Noyau en acier flamme

Capture d’écran de la dernière version de Death Mask :

On dirait un million de dollars, hein ?

< /citation de bloc>

Renommer, diviser

La bibliothèque Flame Steel Engine a été renommée Flame Steel Core, Game Toolkit a été divisée en bibliothèques SDL, Panda3D (Desktop) et Web (ThreeJS). Si des billes d’acier sont disponibles pour l’assemblage à l’aide des bibliothèques Flame Steel, vous devez d’abord sélectionner et assembler celles dont vous avez besoin.

Github :

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

Obsolète :

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

Piratage quantique RSA

L’autre jour, j’ai écrit mon implémentation de l’algorithme de chiffrement à clé publique RSA. J’ai également fait un simple hack de cet algorithme, j’ai donc voulu écrire une courte note sur ce sujet. La résistance à la falsification de RSA repose sur un problème de factorisation. Factorisation… Quel mot terrible…

Ce n’est pas si effrayant que ça

En fait, lors de la première étape de création des clés, nous prenons deux nombres aléatoires, mais les nombres ne doivent être divisibles que par eux-mêmes et un – Nombres premiers.
Appelons-les p et q. Ensuite, nous devrions obtenir le nombre n = p *q. Il sera utilisé pour la génération ultérieure de clés, les clés seront à leur tour utilisées pour crypter et déchiffrer les messages. Dans la version finale de la clé privée et publique, le numéro n sera transféré sans modification.
Disons que nous avons entre nos mains l’une des clés RSA et un message crypté. Nous retirons le numéro n de la clé et commençons le piratage.

Factoriser n

Factorisation – décomposition d’un nombre en facteurs premiers. Tout d’abord, nous extrayons le nombre n de la clé (sur les vraies clés, vous pouvez le faire en utilisant openssl), disons n = 35. Ensuite, nous le prenons en compte en facteurs simples n = 35 = 5 * 7, c’est et il y a nos p et q. Vous pouvez désormais régénérer les clés en utilisant les p, q reçus, décrypter le message et le chiffrer tout en assurant la visibilité de l’auteur d’origine.

Les qubits ne sont pas si simples

Est-il vraiment possible de briser un RSA aussi facilement ? En fait non, les nombres p, q sont délibérément grands, de sorte que la tâche de factorisation sur les ordinateurs classiques prend très longtemps (10 ans dans une certaine mesure)< br/>Cependant, grâce à l’algorithme quantique de Shor, il est possible de factoriser un nombre en très peu de temps. À l’heure actuelle, des articles sur ce sujet indiquent le temps nécessaire pour multiplier un nombre donné, c’est-à-dire pratiquement instantanément. Pour que l’algorithme de Shor fonctionne, il est nécessaire de mettre en œuvre des ordinateurs quantiques dotés d’un grand nombre de qubits. En 2001, IBM a factorisé le nombre 15 en utilisant 7 qubits. Il faudra donc attendre longtemps pour ce moment, date à laquelle nous serons passés aux algorithmes de chiffrement post-quantique.

Touchez brièvement

Peter Shore parle de son algorithme de factorisation

Pour tester l’algorithme de Shor sur un simulateur quantique, vous pouvez installer ProjectQ, ses exemples incluent une implémentation de shor.py qui vous permet de factoriser un nombre saisi par l’utilisateur. Sur le simulateur, le temps d’exécution est déprimant, mais il semble s’agir d’une simulation amusante et ludique du fonctionnement d’un ordinateur quantique.

Articles :
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/

Implémentation Python de 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

Pourquoi faire un moteur de jeu en 2017 ?

Beaucoup de gens me demandent pourquoi créer un moteur de jeu en 2017 ? Après tout, il existe déjà de nombreuses solutions prêtes à l’emploi et gratuites sur le marché.

J’ai préparé un article séparé avec un aperçu du marché actuel du développement de jeux, décrivant les raisons qui m’ont poussé à créer le Flame Steel Engine :

Reasons to Make New Game Engine in 2017

Masque mortuaire

À partir d’aujourd’hui, je commence à développer des jeux roguelike dans un environnement cyberpunk &#8211 ; Masque mortuaire.
En fait, c’était censé être le premier jeu sur le nouveau Flame Steel Engine, mais le moteur a dû être modifié avant que la 3D complète n’apparaisse.
Le titre original était « Flame Steel : Call Of The Death Mask », puis j’ai décidé de simplifier la tâche et de ne sortir qu’une partie du jeu » “Flame Steel : Zombie Night”
Cependant, l’idée de créer un projet normal à part entière me hantait, et le titre était également surchargé du nom de l’univers Flame Steel.
Pour l’inspiration visuelle, je prends le manga Biomega et < a href="http://a.co/8yUUA5i" target="_blank">Blame ! l’univers de Flame Steel lui-même est très similaire à Shadowrun dans l’espace.
Par conséquent, ne soyez pas surpris si dans ce jeu vous rencontrez un magicien extraterrestre tirant sur un loup-garou avec des balles magiques d’un revolver, précisément pointées depuis un cyber-implant dans l’œil.

Le jeu est développé sous la licence open source MIT sur GitHub, en utilisant la chaîne d’outils Flame Steel Engine et des frameworks gratuits.

GitHub :
https://github.com/demensdeum/Death-Mask

Bad Robots sur WebGL basé sur ThreeJS

Aujourd’hui, une version du jeu Bad Robots est publiée sur un moteur de rendu WebGL expérimental basé sur la bibliothèque ThreeJS.
Il s’agit du premier jeu OpenGL (WebGL) sur Flame Steel Engine.
Vous pouvez y jouer ici :
http://demensdeum.com/games/BadRobotsGL/

Le code source d’IOSystem basé sur ThreeJS est disponible ici :
https://github.com/demensdeum/FlameSteelEngineGameToolkitWeb

Porting SDL C++ Game to HTML5 (Emscripten)

[Translation may be some day]

За последний год я написал простейший движок Flame Steel Engine и набор классов для игровой разработки Flame Steel Engine Game Toolkit. В данной статье я опишу как производил портирование движка и SDL игры Bad Robots на HTML 5, с использованием компилятора Emscripten.

Установка Hello World – Emscripten

Для начала нужно установить Emscripten. Простейшим вариантом оказалось использование скрипта emsdk для Linux. На официальном сайте данный тип установки называется как “Portable Emscripten SDK for Linux and OS X“. Внутри архива есть инструкция по установке с использованием скрипта. Я производил установку в директорию ~/emsdk/emsdk_portable.

После установки emscripten нужно проверить корректность работы компилятора, для этого создаем простейший hello_world.cpp и собираем его в hello_world.html с помощью команд:

source ~/emsdk/emsdk_portable/emsdk_env.sh
emcc hello_world.cpp -o hello_world.html

После компиляции в папке появится hello_world.html и вспомогательные файлы, откройте его в лучшем браузере Firefox, проверьте что все работает корректно.

Портирование кода игры

В javascript нежелательно вызывать бесконечный цикл – это приводит к зависанию браузера. На данный момент корректная стратегия – запрашивать один шаг цикла у браузера с помощью вызова window.requestAnimationFrame(callback)

В Emscripten данное обстоятельство решено с помощью вызова:

emscripten_set_main_loop(em_callback_func func, int fps, int simulate_infinite_loop);

Таким образом, нужно изменить код игры для корректного вызова метода emscripten. Для этого я сделал глобальный метод GLOBAL_fsegt_emscripten_gameLoop, в котором вызываю шаг цикла игрового контроллера. Главный игровой контроллер также вынесен в глобальную видимость:

#ifdef __EMSCRIPTEN__

void GLOBAL_fsegt_emscripten_gameLoop() {

GLOBAL_fsegt_emscripten_gameController->gameLoop();

}
#endif

Также для обработки специфических для Emscripten моментов, нужно использовать макрос __EMSCRIPTEN__.

Ресурсы и оптимизация

Emscripten поддерживает ресурсы и сборку с оптимизацией.

Для добавления изображений, музыки и прочего, положите все файлы в одну папку, например data. Далее в скрипт сборки добавьте:

emcc <файлы для сборки> –use-preload-plugins –preload-file data

Флаг –use-preload-plugins включает красивый прелоадер в углу экрана, –preload-file добавляет указанный ресурс в файл <имя проекта>.data
Код постоянно останавливался с ошибками доступа к ресурсам, пока я не включил оба этих флага. Также стоит заметить что для корректного доступа к ресурсам, желательно запускать игру на https (возможно и http) сервере, или отключить защиту локального доступа к файлам в вашем браузере.

Для включения оптимизации добавьте флаги:

-s TOTAL_MEMORY=67108864 -O3 -ffast-math

TOTAL_MEMORY – оперативная память в байтах(?) необходимая для корректной работы игры. Вы можете использовать флаг для динамического выделения памяти, но тогда часть оптимизаций работать не будет.

Производительность

Код javascript из C++ работает гораздо медленнее, даже со включенными оптимизациями. Поэтому если ваша цель это разработка для HTML5, то приготовьтесь к ручной оптимизации алгоритмов игры, паралелльному тестированию, также к написанию javascript кода вручную в особо узких местах. Для написания javascript кода используется макрос EM_ASM. Во время реализации рейкастера на emscripten, мне удалось добиться повышения fps с 2-4 до 30 с помощью прямого использования методов canvas.drawImage, в обход обертки SDL->Canvas, что почти приравнялось к написанию всего на javascript.

Поддержка SDL

На данный момент почти не работает SDL_TTF, поэтому отрисовка шрифта для Game Score в BadRobots очень проста. SDL_Image, SDL_Mixer работают корректно, в mixer я проверил только проигрывание музыки.

Исходный код Flame Steel Engine, Flame Steel Engine Game Toolkit, игры Bad Robots:

https://github.com/demensdeum/BadRobots
https://github.com/demensdeum/FlameSteelEngine
https://github.com/demensdeum/FlameSteelEngineGameToolkit

Статья на эту тему:

https://hacks.mozilla.org/2012/04/porting-me-my-shadow-to-the-web-c-to-javascriptcanvas-via-emscripten/

Mauvais robots – Jeu HTML5

Le premier jeu sur le Flame Steel Engine.

http://demensdeum.com/games/BadRobots/BadRobots.html

Tirez sur tous les robots sur l’écran !

Auteurs :

Animation de robots – http://opengameart.org/content/xeon-ultimate-smash-friends
Musique – Tueurs Kevin MacLeod (incompetech.com)

Code source :

https://github.com/demensdeum/BadRobots
https://github.com/demensdeum/FlameSteelEngine
https://github.com/demensdeum/FlameSteelEngineGameToolkit

Prototype Flame Steel Zombie Night (mis à jour)

Première version de Flame Steel Zombie Night pour Windows :

FlameSteelZombieNightPrototype2

Vous pouvez courir, tirer, gagner des points. Tirez avec la souris, courez en avant et en arrière en utilisant les flèches du clavier.
Il s’agit d’un prototype du premier jeu sur Flame Steel Engine, avec une base de code unique pour plusieurs plates-formes.

Beau et vide

Tu te lèves le matin, maman te prépare un repas, papa te donne de l’argent pour des Snickers et t’emmène à l’école. Vous étudiez dans une bonne école stricte, sans intimidateurs. Vous êtes un excellent étudiant – Vous disposez de plusieurs tuteurs dans des matières pour lesquelles vous n’êtes pas prédisposé. Il y a un tableau d’honneur accroché dans votre école, sur lequel vous devez figurer, avec vos notes, idéalement tout en haut. Votre avenir est brillant – chaque jour, ils vous offrent des cadeaux, des bonbons, des vêtements cool et à la mode. Tout semble bien, mais vous comprenez à quel point une telle vie est ennuyeuse. Il n’y a pas de sentiment de lutte, chaque étape est prédéterminée, planifiée plusieurs années à l’avance.

C’est ce que je ressens lorsque je joue à un jeu de Blizzard. Je vois beaucoup de gens qui ne peuvent pas jouer à des jeux old school, qui ne peuvent pas jouer à quelque chose de vraiment original, sans formule (Deadly Premonition ou Papers Please), mais tout le monde aime les jeux. Blizzard.

J’ai commencé à me familiariser avec leurs jeux sur PC avec Starcraft. Après le sauvage et l’arcadeCommand & ConquérirJ’ai trouvé le gameplay très mesuré et apaisant. La limite du nombre d’unités, me plonger dans les opérations micro-nano m’endort personnellement. Ensuite, il y a eu un jeu de clicker magnifique mais vide : Diablo 2. De bons graphismes, des niveaux générés et un gameplay nul, un passe-temps absolument méditatif et vide. Cependant, mes amis sont fermement ancrés dans StarCraft et Diablo. Au début des années 2000, l’époustouflant Warcraft 3 est sorti. J’aimais beaucoup cette entreprise unique à l’époque. Cependant, le multijoueur est très similaire à Starcraft et donc très ennuyeux. Vient ensuite le tout aussi beau et vide Starcraft 2. J’ai joué au f2p Hearthstone – ce jeu est comme une machine à sous, au début vous gagnez, vous avez confiance en vous, mais ensuite les développeurs vous proposent d’acheter plusieurs jeux au prix de 500 roubles. Votre compétence ne décide de rien, elle décide seulement du montant d’argent dépensé sur les decks virtuels.

J’ai récemment acheté Overwatch, un jeu de tir de Blizzard. J’ai aimé l’héroïne Mei, dont l’art et le cosplay ont été bombardés sur tous les réseaux sociaux, en conséquence, la vague générale de publicité dans les communautés de geek m’a jeté sur le rivage des joueurs Overwatch.

Mes craintes étaient justifiées – d’excellents graphismes, des héros différents avec leurs propres voix et capacités. Pas un seul crash pendant le jeu, tout est au niveau Blizzard. Et donc, je tiens à dire que le jeu est encore une fois tellement raffiné, même dans le gameplay, qu’il n’est tout simplement pas intéressant à jouer. Il y a une réelle pénurie de contenus intéressants. moments inattendus, idées risquées, l’entreprise, comme toujours, n’a pris que le meilleur des années passées et, en le peaufinant, l’a envoyé conquérir le marché, sans lésiner sur une bonne promotion.

Le seul jeu Blizzard que j’ai vraiment aimé – Courses de rock’n’roll. Il y a vraiment du gameplay, mais je soupçonne que cela n’est pas dû au développeur, mais à l’éditeur – Interplay a très probablement aidé Blizzard à rendre le jeu vraiment jouable.

Vision des jeux #2

Colonne Vision des jeux volatile.
J’écris de courtes critiques des jeux auxquels j’ai joué récemment

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

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

unnamed

Magnat du loup-garou< /strong> (Android, Joe Williamson) – un jeu sur un loup-garou qui mange les gens dans un parc de la ville. Les graphismes et le gameplay ici sont amusants – des couleurs enfantines, des couleurs claires sans tons sombres, un manque de sang et des gens ressemblant à des cupcakes ronds avec des animations amusantes. Les rounds sont courts et simples, les seuls ennemis sont les journalistes équipés de caméras. Cela sonne, regarde et joue très amusant. Parmi les inconvénients – difficulté faible, regarder des publicités pour annuler Game Over, le mécanisme de retrait des points marqués sur les réseaux sociaux ne fonctionne pas.
Note : 6/10

Vision des jeux #1

Colonne Vision des jeux volatile.
Dans cet article, j’écrirai de courtes critiques des jeux auxquels j’ai joué récemment.

jansen

Ne pensez même pas que ce type a des émotions, il fait juste parfois semblant d’en avoir.

Deus Ex Mankind Divided (PC, Square Enix) – un jeu sur Adam Jensen, à moitié humain, en vacances à Prague et sauvant le monde en cours de route.
De bons graphismes, des exigences système élevées, une intrigue prévisible, des travaux d’artistes non standard – c’est tout. tout est ici. Le jeu offre de nombreuses options de passes, par exemple, j’ai réussi à obtenir le succès “pacifiste” pour ne tuer personne pendant toute la partie, y compris les boss.
J’ai aimé les références à la culture pop “The VoidWhich Binds“, “IRON MADE in Chine” etc. Je n’ai pas aimé l’énorme quantité de texte – de l’eau, toutes sortes d’emails stockant les mots de passe des portes et la correspondance des personnages, le texte est absolument vide et sans intérêt. Au moment de la lecture, le jeu plantait constamment en mode DirectX 12, les sauvegardes automatiques étaient interrompues et des correctifs semblaient toujours en cours de publication. J’ai décidé de ne pas jouer au DLC parce que… Cela fait déjà environ 2 semaines que je joue au jeu principal, étant sorti de ma vie vide habituelle.
Note 8/10

slayin

Tuer (Android, FDG) – un jeu d’arcade extraordinaire en style pixel pour téléphones mobiles. Vous devez courir et tuer des monstres en achetant du matériel dans le magasin. J’ai aimé l’art de ce jeu, j’ai vraiment aimé la musique chiptune, cela ressemble à un jeu d’arcade pour NES, des commandes faciles. Le jeu lui-même a été décevant car le gameplay ne se déroule pas plus loin qu’une scène à l’écran et l’impossibilité de se déplacer dans un grand niveau.
Note 5/10

swordxolan

Épée de Xolan (Android, Alper Sarıkaya) – jeu de plateforme d’arcade en style pixel pour téléphones mobiles. Un chevalier ou un samouraï parcourt le niveau et sauve les gens des cages de fer. Un gameplay assez intéressant, des commandes faciles, de grands niveaux. Le budget global du jeu, les illustrations bon marché, le son bon marché, la musique en boucle sont décevants.
Note 6/10

bardstale

Le Barde’ s Tale(Android, inXile entertainment) – remaster d’action RPG pour téléphones mobiles. Un RPG hors standard avec des scènes et des dialogues amusants. Sur le disque du jeu, il était écrit « retournez le disque pour voir quelque chose de terrible », et au dos il y avait une face miroir du disque. J’ai raté ce jeu sur PC à cause de Neverwinter Nights, mais maintenant je peux y jouer sur mon mobile dans le bus. Pour un joueur moderne, il y a clairement un manque de points sur où aller et quoi faire, mais c’est pourquoi j’aime les jeux old school, il faut vraiment y jouer. Il n’est pas non plus possible de sauvegarder à tout moment, ce qui est essentiel pour un jeu mobile. La musique, l’art, j’aime tout, mais je trouve les commandes actuelles sur l’écran du téléphone peu pratiques. Et bien sûr, ce n’est pas un nouveau jeu, mais simplement une réédition sur plateformes mobiles, ce que je considère personnellement comme un gros inconvénient.
Note 7/10

Diluer l’ECS


Commission: Mad Scientist by Culpeo-Fox on DeviantArt

Dans cet article, je décrirai grossièrement le modèle ECS et mon implémentation dans le Flame Steel Engine Game Toolkit. Le modèle Entity Component System est utilisé dans les jeux, incl. sur le moteur Unity. Chaque objet du jeu est une essence remplie de composants.  Pourquoi est-ce nécessaire s’il y a de la POO ?
Puis de modifier les propriétés, le comportement, l’affichage des objets directement pendant le déroulement du jeu. De telles choses ne se trouvent pas dans les applications du monde réel ; la dynamique de modification des paramètres, des propriétés des objets, de l’affichage et du son est plus caractéristique des jeux que des logiciels de comptabilité.


Nous n’avons pas passé de bananes

Disons que nous avons un cours de banane dans notre jeu. Et le concepteur du jeu voulait que les bananes soient utilisées comme armes. Disons que dans l’architecture actuelle, les bananes n’ont rien à voir avec les armes. Faire d’une banane une arme ? Fabriquer tous les objets comme des armes ?
ECS propose une solution à ce problème urgent : Tous les objets du jeu doivent être constitués de composants. Auparavant, Banana était la classe Banana, nous allons maintenant la créer, ainsi que tous les autres objets, la classe Entity, en leur ajoutant des composants. Disons qu’une banane se compose désormais des composants suivants :

  1. Composant de position (coordonnées dans le monde du jeu : x, y, z)
  2. Composant de rotation (coordonnées x, y, z)
  3. Composant calorique d’une banane (le personnage principal ne doit pas trop grossir)
  4. Composant image banane

Nous ajoutons maintenant un nouveau composant pour toutes les bananes, qui est un indicateur indiquant qu’elles peuvent être utilisées comme une arme – ; Composant d’arme. Désormais, lorsque le système de jeu voit qu’un joueur s’est approché d’une banane, il vérifie la présence d’un composant d’arme sur la banane, et si c’est le cas, il arme le joueur avec une banane.
Dans mon jeu Flame Steel Call Of The Death Mask, le motif ECS est utilisé partout. Les objets sont constitués de composants et les composants eux-mêmes peuvent contenir des composants. En général, diviser l’objet < – > le composant manque dans mon implémentation, mais c’est même un plus.

screenshot_2016-09-24_14-33-43

Le fusil de chasse dans cette capture d’écran est un composant du joueur, et en même temps, le deuxième fusil de chasse est simplement suspendu sur la carte du jeu comme un objet ordinaire.
Dans cette capture d’écran, deux systèmes sont en cours d’exécution : moteur de rendu de scène et moteur de rendu d’interface. Le moteur de rendu de scène fonctionne avec le composant d’image de fusil de chasse sur la carte, le moteur de rendu d’interface fonctionne avec le composant d’image de fusil de chasse dans les mains du joueur.

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

Architecture de la boîte à outils du jeu Flame Steel Engine

Aujourd’hui, je vais parler de l’architecture de la boîte à outils pour le développement de jeux Flame Steel Engine Game Toolkit.
Flame Steel Engine Game Toolkit vous permet de créer des jeux basés sur Flame Steel Engine :
flamesteelgametoolkitschematics

Toutes les classes du Flame Steel Engine commencent par le préfixe FSE (Flame Steel Moteur ), etFSEGT (Fà flammeSmoteurEmoteurG strong>ame Ttoolkit) pour la boîte à outils.
La scène de jeu, les objets et les boutons sont tous des sous-classes de FSEObject et doivent se trouver dans la classe FSEGTGameData. Chaque FSEObject doitimplémenter l’interface FSESerialize, cela vous permettra de sauvegarder/charger les données du jeu et de fournir un mécanisme de sauvegarde.
La classe FSEController fonctionne avec les objets de la classe FSEObject. La boîte à outils comporte une classe de contrôleur de scène de jeu de base : FSEGTGameSceneController, vous pouvez hériter de cette classe pour implémenter votre logique de jeu.
IOSystem est un objet de l’interface FSEGTIOSystem, cette interface contient FSEGTRenderer, FSEGTInputController, FSEGTUIRenderer. fort>.FSEGTIOSystem doit implémenter un moteur de rendu, recevoir les données du clavier, des joysticks (périphériques d’entrée) et fournir le rendu des éléments d’interface pour systèmes d’entrées/sorties de cette plateforme.
Actuellement, un moteur de rendu a été implémenté, un contrôleur de clavier basé sur la bibliothèque SDL, il est disponible dans le FSEGTIOSDLSystem

Flame Steel Engine Raycaster Demo
Flame Steel Engine Raycaster Demo

Il est prévu à l’avenir de créer un IOSystem basé sur OpenGL, la classe s’appellera FSEGTIOGLSystem . Si vous souhaitez créer un IOSystem basé sur n’importe quelle plate-forme, vous devez utiliser l’interface FSEGTIOSystem et implémenter le moteur de rendu FSEGTRenderer, FSEGTInputController pour cela. plateforme .

Code source de Flame Steel Engine, boîte à outils, jeu :
https://github.com/demensdeum/FlameSteelCallOfTheDeathMask

Unity, pourquoi Wasteland 2 ne fonctionne-t-il pas sur mon Ubuntu ?

Je suis fier de soutenir le jeu Wasteland 2. Aujourd’hui, je voulais le lancer sur Ubuntu, mais je n’ai pas pu. Cependant, après une heure de recherche sur Google, tout s’est bien passé. Il s’avère que Unity a de sérieux problèmes avec Linux, mais en utilisant certaines béquilles, le jeu peut être lancé :

ulimit -Sn 65536~/.local/share/Steam/steamapps/common/Wasteland\ 2\ Director\'s\ Cut/Linux/WL2

Recette d’ici :
https://forums.inxile-entertainment.com/viewtopic.php?t=15505

Flame Steel : Courrier Quick Eyes

Son nom était Revil et son surnom était Quick Eyes. Les amis de l’acolyte l’appelaient Shustryak. Enfant agile et élevé dans la rue, il sait toujours ce qui est intéressant et de qui il peut l’obtenir. Pour cela, il a gagné le respect du milieu criminel d’Alterra – 14.
Il se trouvait maintenant à l’intérieur de l’entrepôt de Native Farm United. Il y avait d’énormes conteneurs autour, une odeur de produits pharmaceutiques.
– Pourquoi t’es-tu levé ? Prenez-le et partez.
L’employé a dit en grondant, il avait l’air nerveux, bougeait d’un pied sur l’autre, il était clair qu’il avait très peur. Ma chemise est mouillée de sueur.
– Je viens du service de sécurité.
Le visage de l’employé pâlit et il chancela encore plus.
– Et maintenant ?
– Au sol – les mains derrière la tête !
L’employé fronça les sourcils, prit une profonde inspiration et baissa la main. Nimble Eyes a senti que quelque chose n’allait pas – on dirait qu’il cherchait une arme à feu. Revil l’étourdit d’un coup porté à son visage insolent, son corps tomba devant lui avec fracas.
– J’ai demandé du bien…
Après avoir fouillé le commis, Revil a trouvé un inhalateur ordinaire utilisé par les asthmatiques à la place du pistolet. Il a également trouvé une carte d’accès aux secteurs des laboratoires de l’entreprise. C’était une trouvaille très chanceuse.
Le gang des Toxic Brothers l’a envoyé récupérer une cargaison de substances illégales – il s’est rendu compte qu’il n’était pas autorisé à le faire. endofamille. Mais Revil ne se souciait pas des Frères et de leur toxicité, il était là pour une autre raison… destiné à tirer son ticket porte-bonheur.
Les portes de l’ascenseur se sont ouvertes, Shustryak a choisi l’étage indiqué sur le plan – quarante-deuxième. L’ascenseur avançait lentement. Revil réfléchissait à ce qu’il ferait dans le secteur des laboratoires. Il connaissait les systèmes de sécurité sophistiqués, les systèmes intelligents de vérification d’identité, l’analyse des ondes cérébrales, etc.

Revil by Inc
Revil par Inc

Il n’était pas seul ici ; un employé de la société Lorian a accepté de l’aider à provoquer une panne du système, ce qui permettrait à Revil de disposer de dix minutes pour réaliser ses plans.
Au trente-troisième étage, l’ascenseur s’est arrêté et un bruit sourd s’est fait entendre au-dessus de la tête de Revil. quelque chose a atterri avec fracas sur le toit de l’ascenseur.
L’agile tendit la main vers le pistolet, mais à ce moment-là, des tentacules métalliques percèrent le toit de l’ascenseur. Ils l’ont empêtré, un bruit de grincement a été entendu et le toit de l’ascenseur a été tourné vers l’extérieur. Le visage d’une jeune fille le regardait à travers le trou, – yeux vides et froids, sur le sol du visage se trouve une plaque métallique avec des indicateurs rouges clignotants, volontairement non cachée sous la peau.
– Avant de mourir, dis-moi pourquoi tu es venu ici ?
L’agile ne pouvait plus bouger, les tentacules d’acier le serraient de plus en plus, et bientôt il ne pourrait plus respirer.
– Je suis venu pour ce qui m’appartient de droit !
Un sourire satisfait apparut sur le visage de la jeune fille. Les indicateurs clignotaient alternativement en vert et en rouge…

Flame Steel : L’appel du masque de la mort

Aujourd’hui, j’annonce trois projets à la fois ! Wow !
Le premier projet – la plate-forme de base pour le développement d’applications multiplateformes Flame Steel Engine. Deuxième projet – un ensemble de bibliothèques pour la plateforme de base Flame Steel Game Toolkit, destinée au développement de jeux. Et le troisième projet – un jeu avec des niveaux générés dans un décor cyber-fantastique Flame Steel: Call of The Death Mask.
L’original est disponible sous licence MIT, les ressources du jeu seront disponibles sous différentes licences (vérifiez chaque fichier séparément)

Lien vers Github (C++, Eclipse) :
https://github.com/demensdeum/FlameSteelCallOfTheDeathMask

Me perdre

“Vous ne pouvez pas devenir maître de tout” – Des phrases comme celle-là me font toujours rire. Tout le monde tombe dans ce piège de la spécialisation. utilisateurs, programmeurs, patrons, clients. “Je le veux comme Microsoft/Apple/Google”, “Pourquoi ne faisons-nous pas simplement un iPhone russe ?”, “Pourquoi n’est-ce pas comme dans Word /uber/photoshop ?” – Toute personne impliquée de quelque manière que ce soit dans l’informatique a entendu ces phrases. Ces phrases, répétées sur les lèvres de différentes personnes, semblent encore plus drôles.

Je vais vous demander, lecteur – pourquoi as-tu besoin d’une autre Parole ? Pourquoi avez-vous besoin d’un autre Uber ? Pourquoi avez-vous besoin d’un autre Photoshop ? Pourquoi avez-vous besoin « d’être comme un iPhone » ?
Pourquoi vous attachez-vous aux interfaces et à l’approche d’une seule entreprise ? Pourquoi vous qualifiez-vous de fan uniquement des produits Apple/Google/Microsoft ? Pourquoi ne pouvez-vous pas ouvrir votre esprit à des approches alternatives pour résoudre les problèmes, pourquoi ne voulez-vous pas être plus productif ?

De nombreux utilisateurs de Microsoft n’ont pas aimé la façon dont l’entreprise a décidé que tout le monde devait passer à Windows 10. Les gens critiquent les interfaces peu pratiques de l’iPhone, les pannes du système lors des mises à jour, les modifications de conception dont ils n’ont pas besoin, mais ils continuent à l’utiliser. parce qu’ils y sont tellement habitués et qu’ils ont un “iPhone” ; il a un statut dans la société moderne.

Parfois, il semble que si on demandait à Microsoft/Apple/Google d’abandonner leurs propres enfants en échange de continuer à travailler avec leurs produits, alors en raison du fort attachement à ces produits, les gens abandonneraient facilement leurs enfants.

/p>

Ne soyez pas eux, ne vous attachez pas à un seul produit, recherchez des options alternatives. Une fois, on m’a proposé de développer un système pour les agents immobiliers, avec une interface sur Microsoft Excel, et il y a eu également des offres pour développer un système de « tableau blanc interactif » sur Microsoft PowerPoint. Lorsque j’ai demandé pourquoi Microsoft en particulier, ils m’ont répondu qu’ils étaient « tellement habitués » ; lorsque j’ai demandé si ces sociétés disposaient de logiciels sous licence Microsoft, ils m’ont répondu de manière évasive, en disant que si nécessaire, ils le feraient… alors ils l’achèteront.

Lecteur, je vous invite à étudier les facettes du monde informatique, au moins brièvement. Si vous n’avez utilisé que Microsoft Windows toute votre vie, essayez Apple OS X ou Linux. Si vous utilisez uniquement un iPhone, essayez d’utiliser la dernière version d’Android pendant au moins une semaine. Dès l’instant où vous passez du côté d’une seule entreprise, en vous fermant aux produits des autres, à ce moment-là vous vous perdez. Lui-même, en tant que personne capable de décider elle-même de ce qu’il veut, en tant que personne capable de choisir l’outil le plus pratique et le plus productif pour résoudre un problème spécifique.

Les programmeurs d’une seule plateforme – un autre casse-tête pour moi personnellement et, je crois, pour l’industrie informatique dans son ensemble. Les développeurs qui créent des applications qui exportent uniquement au format *.doc ou uniquement au format *.pdf, les développeurs qui sont liés à une seule base de données commerciale obsolète (par exemple, IBM Informix ou Dieu nous en préserve, Firebird), à un seul type de matériel (tous ces programmes qui ne fonctionnent pas pour x86 sur Android), bien sûr, je comprends que vous êtes « habitués », mais les gars, il est temps de changer.

Dans mon travail, j’utilise souvent des outils impopulaires mais très pratiques. Un des exemples – Il a fallu réduire la résolution et compresser environ 100 photos pour un téléchargement rapide via 3G et une sortie sur l’iPad. Ce jour-là, j’ai entendu l’une des phrases les plus typiques  : “Nous devrons convertir toutes les photos manuellement dans *Photoshop* vers la forme souhaitée”. Elle m’a semblé drôle parce que… J’imaginais une personne qui refaire manuellement, comme un serviteur de Dieu, toutes ces 100 photos dans Photoshop, ou essayer de les automatiser grâce à un mécanisme intégré. Le point ici est précisément que la personne est tellement attachée à Photoshop qu’elle ne soupçonnait même pas l’existence d’un ensemble d’outils gratuits et ouverts comme ImageMagick. ImageMagick vous permet de faire beaucoup de choses avec des images vectorielles et raster, notamment en étant idéal pour résoudre un problème avec 100 images en 5 minutes.

Soyez maître de tout, étudiez, essayez, ne devenez pas l’esclave d’une entreprise spécifique.

Les assistants du Père Noël 16 bits

J’ai reçu un message par email :
“Hé, nous ouvrons un game jam rétro ici – bibitjam3 !!! Vous devriez faire un jeu sur une plateforme rétro 8-16 bits !!!”
Bah ! C’est mon rêve d’enfant – créer un jeu pour Sega Mega Drive Two.
Eh bien, j’ai essayé de fabriquer un jouet, et j’ai même réussi :
rqr
J’ai appelé le jeu « Red Queen’s Knead ». L’histoire est – “La Reine Rouge a été jetée dans un labyrinthe mortel, elle va maintenant tuer tout le monde sur son chemin vers la liberté.”
Vous pouvez vous promener, attaquer la chose verte aux yeux rouges, ouvrir des coffres au trésor et vous déplacer de scène en scène.
Il s’agit bien sûr du « niveau d’essai » ; faites au moins quelque chose pour le shogi et pour la compétition.
J’utilise la boîte à outils SGDK – compilateur pour Motorola 68k basé sur GCC, bibliothèques pour travailler avec le matériel Sega Mega.
Maintenant, je comprends que c’était vraiment difficile – créer des jeux il y a 20 ou 30 ans. Par exemple, chaque tuile – doit être divisé en morceaux de 8 x 8 pixels et dessiné en morceaux un par un. De plus, la palette de chaque carreau ne doit pas dépasser 16 couleurs ! Maintenant, bien sûr, c’est beaucoup plus facile.
Bien sûr, vous devez créer un moteur de jeu, de son et graphique pour le jeu, tel qu’il est actuellement.
Vous pouvez jouer à Red Queen en utilisant l’émulateur Sega Genesis et la ROM du jeu :
http://demensdeum.com/games/redQueenRampageSegaGenesis/RedQueenRampage.zip
Si vous souhaitez voir les sources :
http://demensdeum.com/games/redQueenRampageSegaGenesis/RedQueenRampageSource.zip

Tutoriel : Créer un jeu sur Android. Nous tordons la terre. Rajawali

Au commencement, Dieu a créé le ciel et la terre.

C’est la deuxième vidéo dans laquelle nous créons un jeu pour Android. Bougons la terre !
Contactez-moi si vous avez des questions ou si vous souhaitez ajouter quelque chose à ce cours.
Vidéo basée sur l’article Configuration de base et amp; Sphère (Maven) :
http://www.clintonmedbery.com/basic-rajawali3d-tutorial-for-android/

Moteur Rajawali : https://github.com/Rajawali/Rajawali

Plan, commandes, liens :
1. Installez les VirtualBox Invité Ajouts

sudo apt-get install dkmssudo apt-get install linux-headers-$(uname -r)

2. Ajouter la bibliothèque Rajawali au projet
Fichierbuild.gradle (Projet : Demon’s Cave)
Ajouter mavenCentral() < /span>vers la section buildscript/repositories
Ajoutez
maven { url< /span> “https://oss.sonatype.org/content/repositories/snapshots/” } vers la section tous les projets/dépôts

Fichier build.gradle (Module : app)
Ajoutez une compilez ‘org.rajawali3d:rajawali:1.0.306-SNAPSHOT@aar& #8217 ; vers la section dépendances

3. Créez une classe Renderer, initialisez la scène, ajoutez une sphère et faites tourner !
Code source de la classe Renderer.java :
https://github.com/clintonmedbery/RajawaliBasicProject/blob/master/app/src/main/java/com/clintonmedbery/rajawalibasicproject/Renderer.java

4. Ajoutez la classe Renderer à MainActivity
Code source MainActivity.java :
https://github.com/clintonmedbery/RajawaliBasicProject/blob/master/app/src/main/java/com/clintonmedbery/rajawalibasicproject/MainActivity.java

Texture du sol :
http://www.clintonmedbery.com/wp-content/uploads/2015/04/earthtruecolor_nasa_big.jpg