Pixel Dungeon

De L'Arche
Aller à : Navigation, rechercher

Idée générale

Je suis tombé sur TinyHack, un RPG sur 9x9pixels, jouable dans un navigateur. Je me suis dit que cela pourrait être marrant d'adapter le principe sur un projet d'électronique en utilisant une matrice de pixels, un microcontrôleur et quelques boutons.

Au final je me propose de réaliser une mini-console, similaire à une GBA, avec pour écran une matrice de 8x8 pixels sur laquelle tourne un RPG similaire à TinyHack.

État de l'art

Il existe déjà des projets similaires qui ont été réalisés. Par exemple ce Super Mario sur une matrice 8x8 en utilisant un Arduino. (Kinda epic).

Un article sur Semageek présente une console de jeu minimaliste avec une petite matrice de led.

A coté de ça, il y a énormément de projets présentés sur Youtube impliquant des matrices de leds telles que celle que je compte utiliser.

Roadmap

  • Définition des solutions techniques (OK)
  • Prototypage (en cours)
    • Acquisition des composants (OK)
    • Mise en place de l'électronique (OK)
    • Display basique (OK)
    • Gestion des inputs (OK)
    • Design complet de l'architecture software et du jeu (50%)
    • Test de toutes les fonctionnalités de jeu sur un exemple minimal (25%)
    • Implémentation complète
    • Validation, corrections, optimisations
  • Version finale, stand-alone, with nice outfit
    • Modifs sur le hardware pour version standalone
    • Design de l'outfit
    • Assemblage
  • Documentation (en parallèle)
    • Général / outils utilisés
    • Hardware
    • Software

Solutions techniques

Matrice de LED : 8x8 RGB, pixels carrés (trouvée ici)

Microcontroleur : <strike>PIC 18F2550 / 4550 => Switch sur Arduino

Programmateur hardware : Microchip ICD2

Programmmateur software : MPLAB X / Piklab

Pourquoi je switch sur Arduino

J'avais choisi de travailler avec des microcontrôleurs de Microchip, d'une part parce que c'est ce sur quoi j'avais eu l'occasion de travailler, d'autre part parce que je trouvais que le microcontrôleur était plus rustique (et donc plus fun) qu'une solution "clef en main" telle que arduino. J'ai eu tort.

Les solutions de Microchip sont *merdiques*. Travailler avec un produit Microchip vous impose de travailler avec leur IDE, auxquels cas vous vous exposez à de grosses complications. Et même en travaillant avec leur IDE, vous rencontrez régulièrement des problèmes divers : bug software, bug hardware, absence de doc, absence de communauté, trop de diversité inutile dans les produits.

Lorsque l'on voit la communauté qui existe autour de l'arduino, il y aura problablement aussi des problèmes, mais il y aura clairement un endroit pour trouver la solution. D'autant plus que tout le monde, dans l'électronique DIY, se fiche aujourd'hui des microcontrôleur propriétaires : tout le monde utilise de l'arduino. Donc dans un soucis de diffusion et d'ouverture du projet, il est clairement mieux de choisir une solution "standard".

Microchip ? Never again.

Logs

So yeah, things are going much faster since I have the arduino working (and working beyond expectations) ! Basically I now have the display management fully working and I will be able to start focusing on the inputs management and even the game itself !

I've completed the final tests (i guess) for the display managements. First I a dumb display working where I can check the different colors (up to 10 different colors for now, but I can configure more). Then I started implementing a map example show below. I can now display a specific region of this map on the matrix display. I just need the input management working so I would be able to actually move all over the map using the switches.

PixelDungeonTestMap.png

So basically this is a minimal example. I've tried to put all the essential features in it (though for now only the display of it is implemented). You see a set of corridors and room (the empty space between the walls...) with some objects in it. So the hero is supposed to start at the center of the map (kind of forgot to put a pixel to represent it on this picture). On the left room, you have a monster (in red) which you have to fight, then you'd be able to activate the grey switch. The grey switch open the door for the room in the right, where you are rewarded where a gold piece in yellow, and after the corridor leading to the room at the bottom, you have a HP potion and MP potion (though i'm not sure yet how I will implement the health / magic thing for now).

This give you an idea of what the actual game will be (obviously it won't be user-friendly at all ;)) when I - hopefully - finish this project. This is not very intellectual or complicated, this isn't supposed to be. The awesomeness comes from the fact that you play this on a 8x8 pixel matrix ;). Though I've already thought about some little puzzles I could implement. Will see ;D


Gestion des interruptions

Un problème qui survient, c'est comment gérer les interruptions liés aux 6 boutons que je veux implémenter. Par chance je suis tombé sur cette librairie qui miraculeusement permet de faire des interruptions avec tous les pins du arduino, au lieu de seulement 2 de base. http://code.google.com/p/arduino-pinchangeint/ J'ai testé et ça marche, reste à savoir si ça ne pose pas de problème au niveau des performances (notamment en concurrence avec le display). Pour le moment ca semble résoudre beaucoup plus de problème que ça n'en créé.


Recently I finished setting up a rudimentary control-pad until I buy proper switches. Now, you can move the Hero-pixel around the map, and the screen re-center the view automatically to follow player's movements. I also defined walkable and solid (= non-walkable) items. For example a door will be a solid item, while a gold piece is walkable. Therefore, player's movement are no more limited to empty-tiles only, but to walkable items in general. I also implemented the first switch <-> door system, which is working properly. However the implementation of it was really quick and dirty and I need to take more time thinking about how to store item's infos properly.

--Djidane 11 octobre 2012 à 19:04 (UTC)


I've made a few progress recently. The first thing is that I now use a hardware anti-bounce system, which greatly improve the whole thing. The previous software anti-bounce system I had cause a blink on the matrix each time an interruption was made, because I had something like a sleep(200). Now there's a RC-filter on the switch, filtering high frequencies therefore preventing bounces to trigger multiple interruptions.

I've cleaned up and redesign some part of the code, using C structures. This was a few months ago. Now I realized I should really try to get things done using C++ classes, otherwise the full implementation of the game is going to be quite a mess. Hopefully this won't cause any significant gain on the execution time.

In parallel I am working on a 2D line-of-sight algorithm, in order to display only the part of the map "visually accessible" by the hero-pixel. I implemented something using Bresenham's line algorithm and need to test it to see if it's technically viable. I also have to decide if I'll keep this for the final game, since it quites change a lot of thing on the gameplay design.

The next step I plan is working on the fighting system and the AI of monster-pixels. My idea right now is that monster-pixels could make one action every, let's say, 1 seconds : either "move towards the hero" or "hit the hero" (if he's in an adjacent pixel). The hero could fight the monster by hitting it by pressing A + directional key corresponding to where's the monster, when he's in an adjacent pixel. Therefore the player would need to be quick at hitting the monster, as if he stay more than 1 second in front of it, he'll get hit.

--Djidane 11 février 2013 à 03:40 (UTC)

Code

Il est disponible sur le SVN (login/password : public/anonymous)

SVN logs :


r2 | djidane | 2012-08-02 13:04:22 +0200 (jeu. 02 août 2012) | 1 ligne

Ajout du support des inputs, redesign de l'arborescence et de l'architecture software, ajout de la doc et la schematique


r1 | djidane | 2012-07-29 01:38:56 +0200 (dim. 29 juil. 2012) | 1 ligne

Initial import


Références, documentation

Matrice de led RGB, pixels carrés

Datasheet du Pic 18F2550

Piklab sur Sourceforge

Arduino utilisé