Afficher sprite aléatoirement

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Afficher sprite aléatoirement

Message par Zorro »

poshu a écrit : Pourquoi faire le select?

voici la portion de code concerné :

Code : Tout sélectionner

 RandomizeArray(dd())
            For spr=0 to 3
               de=dd(spr)
               select de
                  case 1
                  x=0:y=0
                  case 2
                  x=100:y=0
                  case 3
                  x=0:y=100
                  case 4
                  x=100 :y=100
               EndSelect
               DisplayTransparentSprite(spr, x, y)
            Next spr
ceci me permet de mettre toujours
le sprite numero xxxx se trouvant dans la case 1 de mon tableau au coordonées : x=0:y=0
le sprite numero xxxx se trouvant dans la case 2 de mon tableau au coordonées : x=100:y=0
etc ....

le "RandomizeArray(dd())" melange l'id des sprites en mettant leur numero dans les case du tableau,au hasard
a chaque fois, jamais au meme endroit dans les cases du tableau

donc a chaque boucle j'affiche le sprite xxx dont la numero se trouve dans la case 1 du tableau toujours a la meme coordonée
c'est la variable "de" qui recupere le numero du sprite a afficher
ce system me garantissait que le meme sprite ne puisse pas etre a plusieurs endroit dans l'affichage
j'affiche toujours les cases 0 a 3 du tableau, mais le contenu des cases, elles ont changées a chaque appel du timer

c'est un choix de conception, rien de plus :)
pis j'aime bien les Select-case-endselect :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Afficher sprite aléatoirement

Message par poshu »

Pas de soucis. Bon, le truc important à comprendre, c'est que j'ai rarement la bonne approche quand je commence un projet, donc ce que j'écris ici, c'est ce que je ferai "pour commencer"; rien ne dit que je ne changerai pas des trucs au fur et à mesure.

1) la découpe :
Ca tu l'as, à part que le code est pas au point : on peut partir du principe que si tu copy-paste la même fonction plus de 10 fois, c'est toujours mieux d'écrire une boucle. En l’occurrence, ici, tu aura besoin de deux boucles imbriquées, une pour X et une pour Y. Profites en pour placer les ID des sprites dans un tableau 2D qui a la même taille que ton taquin (4 * 4 sur ton exemple). Aussi, pour que ton taquin fonctionne, il ne faut pas oublier que tu dois supprimer une case dans un coin!

2) Le mélange :
Là, c'est le plus dur, parce que random le tableau peut donner un puzzle insoluble. Idéalement, il faut une boucle de X (où X est la difficulté), dans laquelle tu "simules" des mouvements. En gros : tu prends la case vide, tu prends une case adjacente et tu inverses leur état.

3) l'affichage :
il suffit de réutiliser la même boucle que le découpage, mais dans le sens inverse : une boucle x et une boucle y imbriquées, qui regardent si il y a un sprite dans le tableau, et qui l'affiche le cas échéant.

4) l’interactivité :
à chaque instant, il y a au maximum 4 cases déplaçables : celles qui sont en contact avec la case vide. Si tu détecte un clic sur une de ses cases, tu inverses sa position avec la case vide.

Voila comment je m'y prendrai.

@Zorro

Code : Tout sélectionner

RandomizeArray(dd())
DisplayTransparentSprite(dd(0), 0, 0)
DisplayTransparentSprite(dd(1), 100, 0)
DisplayTransparentSprite(dd(2), 0, 100)
DisplayTransparentSprite(dd(3), 100, 100)
Autant je suis pour l'utilisation des boucles et des switchs quand c'est utile, autant là ça rajoute vraiment beaucoup de code pour pas grand chose :p
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Afficher sprite aléatoirement

Message par Zorro »

@Poshu
a ma decharge, en principe, souvent lorsque j'apporte une solution
je programme "scolaire"
je ne cherche pas l'optimisation , du moins pas dans un premier temps :)

Merci :)

de plus ....
je ne savais pas que c'etait pour un puzzle , sinon, je n'aurai meme pas procedé ainsi ..
j'aurai fait l'algo de melange en utilisant le meme algo d'echange de piece (piece<>case_vide)...

et comme un film a l'envers .... on part du puzzle fini (image decoupée), et on echange les pieces de l'image pour obtenir un "melange" ce qui aurai meme pu faire l'objet d'une cinematique... a montrer au joueur avant le jeux
le principe est simple , il faut apprendre au sprites a "aimer" le vide.. de sorte que le premier sprite qui "voit" une case vide, il aille dessus :)

pour laisser ensuite l'utilisateur refaire le puzzle ... :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Afficher sprite aléatoirement

Message par venom »

Merci pour vos conseil / suggestion. J'en prend note.

C'est vrai que le premier topic ne précisé pas qu'il s'agissait d'un jeu de puzzle.

@dobro
Tu verrais donc plus l'image fini qui via un algo se mélange devant le joueur pour ajouté une animation. C'est bien sa ?

Je vous tiens au courant de l'avancement.
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Afficher sprite aléatoirement

Message par Ar-S »

Tu peux même simplement créer une liste chainée qui lierait une datasection;
ça te permettrai de mettre différent puzzle

puzzle1:
datas.i 1,2,3,4,5,6,7,8,9 .... 50,52 pour un puzzle de 52 pièces

Puzzle2:
datas.s 1,2,3 etc 60,61,62 pour le second de 62 pièces

Ainsi tu crée une liste avec le contenu du 1er puzzle et tu la randomize.

Au level 2 tu vides ta liste et tu te sers de Puzzle2:

Simple. :D
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Afficher sprite aléatoirement

Message par Zorro »

venom a écrit : @dobro
Tu verrais donc plus l'image fini qui via un algo se mélange devant le joueur pour ajouté une animation. C'est bien sa ?

Je vous tiens au courant de l'avancement.
oui !

en fait il te faut d'abords coder la découpe de l'image en carré regulier (tuille)

puis l’insertion d'une partie noire ...(en retirant une tuille d'image.... ou en laissant un espace dessous)

et c'est cette tuille noire que tu "deplaces" dans l'image
par echange de sa place avec la tuille de sa destination ....

ce qui du coup melange l'image ...

du coup tu aura l'algo de déplacement d'une tuille (portion) d'image contigue a la partie noire

je parle bien de "Tile Sliding Puzzle"
https://www.youtube.com/watch?v=xZhkJSpbOLE

le deplacement doit etre aléatoire pour le melange
il suffit de decider ou va aller la tuille noire , 'haut,bas,gauche,droite' pour effectuer l'echange avec la tuile image qui va bien
n'oubliant pas d'ajouter un teste de sortie du cadre ....
car si la tuille noire est contre le coté gauche , il faut soit qu'elle (monte ou descende( si c'est possible) ou aille a droite

un simple teste de cadrage suffit :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
venom
Messages : 3071
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Afficher sprite aléatoirement

Message par venom »

Merci pour vos conseils a tous, comme d'habitude, il y a l'embarras du choix :) c'est sa qui est cool. Je prend note de vos suggestions. Je vous tiens informer sur l'avancement.

Je risque de vous ré interpellés :lol: :wink:





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre