exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Source pour faire les Undos successifs sur une map Mar 17 Jan 2012 - 7:24 | |
| Bonjour Pour ne pas que quelqu'un ré-invente la roue, je place là mon source permettant de placer des images (personnages ou autres) sur la map et de rétablir la zone modifiée de la map par un bouton "Undo" au cas où on se trompe, possibilité de revenir 30 coups en arrière. Les variables et objets déclarés : - Code:
-
' Choix de la taille de map dim taille% dim maxtaille%
' Déclaration des variables utilisées par les boucles dim y% dim x%
' Déclaration des variables dim sav_index% dim element$ dim cible$ dim numero% dim sel% dim nl$ dim type$ dim x_sav%(30) dim y_sav%(30) dim debutX% dim debutY% dim L% dim H%
' Initialisation des variables sel%=0 : ' 0=pas de sélection d'un élément en cours... sav_index%=0 :' index des éléments placés sur map pour le tableau des X et Y.
' Dimension de la fenêtre de l'éditeur width 0,800 height 0,640 border_normal 0
' Création des objets "systeme" : picture 1 :' La zone où s'affichera la map. picture 2 :' Le menu de l'éditeur picture 3 :' Le bouton (image) Undo list 9 : ' La liste des éléments du type choisi image 10 :' Image invisible, sert à copier un élément vers la map image 12 :' Image pour sauver les placements successifs (undo). dlist 14 :' Liste des X des 30 dernières images placées dlist 15 :' Liste des Y des 30 dernières images placées
' Evenement sur ces objets "systemes" on_click 1, place on_click 3, replace on_click 9, clickliste Routine "place", Cette routine est appelée quand on clique sur la map. - Code:
-
' Place sur la map l'élément cliqué dans l'objet list. place: 2D_target_is 1 if (sel%=1) :' Place l'élément sur la map seulement si on en a sélectionné un. x%=int(mouse_X_position(1)/18)*18 y%=int(mouse_Y_position(1)/18)*18 pret%=1 debutX%=x%+1:' le 1 sert a placer l'image au centre de la case et pas au bord. debutY%=y%+1:' Idem que précédemment. ' sauve la zone dans un fichier 2D_image_copy 12,debutX%,debutY%,debutX%+L%,debutY%+H% ' Sauve X et Y de la case cliquée dans un tableau des X et un tableau des Y. item_add 14,debutX%:' Sauve X dans le tableau des X item_add 15,debutY%:' Sauve Y dans le tableau des Y sav_index%=count(14) if (sav_index%<1) then sav_index%=1 fichier$="ia_temp\"+str$(sav_index%)+".bmp" file_save 12,fichier$ sauvees%=sauvees%+1 ' charge l'image de l'élément choisi et la place sur la map cible$=type$+"\"+element$+str$(numero%)+".bmp" file_load 10,cible$ 2D_image_paste 10,debutX%,debutY% end_if return
Routine "clickliste" est appelée par le click sur la liste des éléments à placer. - Code:
-
' Sert à définir si la liste des éléments a été cliquée clickliste: numero%=item_index(9) sel%=1 return
Routine "replace", Cette routine est appelée quand on clique sur le bouton "Undo" - Code:
-
' Replace les zones de map sauvegardées replace: ' Recharge les fichiers images en sens inverse de leur numéro à ' la position lue dans les tableaux nommés x_sav et y_sav. sav_index%=count(14) if ((sav_index%>0) and (sav_index%<=30)) fichier$="ia_temp\"+str$(sav_index%)+".bmp" file_load 12,fichier$ debutX%=item_read$(14,sav_index%) debutY%=item_read$(15,sav_index%) 2D_image_paste 12,debutX%,debutY% item_delete 14,sav_index% item_delete 15,sav_index% position 13,position(13)+1 : ' Progress_bar indique le niveau de Undo <30 end_if return
Routine "nettoie" est appelée par le bouton "sauver la map". - Code:
-
' Efface du disque dur les images sauvées par le undo ' Efface du disque dur les images sauvegardées par le undo ' Et remet à zéro tous les compteurs et index de liste nettoie: for i%=1 to sauvees% fichier$="ia_temp\"+str$(i%)+".bmp" if (file_exists(fichier$)=1) then file_delete fichier$ next i% sel%=0 sav_index%=0 pret%=0 sauvees%=0 position 13,0 clear 14 clear 15 return
Pour générer la Grille de la map, utilisez le générateur de grille fourni dans le forum, car il crée des cases (de grille) de 18x18 quand on indique un pas de 16, c'est pour permettre que l'image de 16x16 se place bien au centre de la case de 18x18. Voilà si jamais quelqu'un veut plus de détails sur un point précis du code parce qu'il compte utiliser ce source, alors je répondrais. POST MIS A JOUR Le 18 Janvier 2012
Dernière édition par exdragon le Mer 18 Jan 2012 - 8:38, édité 5 fois | |
|
exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Re: Source pour faire les Undos successifs sur une map Mar 17 Jan 2012 - 7:55 | |
| Avant de placer un élément sur la map, la zone où la souris clique est sauvegardée sous forme d'image sur disque dur sous le nom :
"\io_temp\"+type$+sav_index%+".bmp"
Où : - io_temp : Est le dossier recevant les images du UNDO - sav_index : Est le numéro d'index d'un Dlist qui stocke les positions des images placées sur la map. Il y a un Dlist numéro 14 pour les positions X des images et un Dlist numéro 15 pour les positions Y des images, ils ont tous deux le même index, qui est sav_index%. - Type$ : C'est le type d'élément placé sur la map (perso, batiment, objet...) car chaque type est un dossier où sont rangés les éléments de ce type.
Effacer du disque dur une image, peut se faire juste après la ligne où on replace l'image sur la map, mais je trouve que ça pourrait faire un lag (dû notamment à l'antivirus) au moment où on clique sur Undo. Donc la solution la meilleure, plus propre et sans lags, est d'effacer toutes les images du disque placées par le undo, et le faire seulement au moment où on sauve la map.
POST MIS A JOUR Le 18 Janvier 2012
Dernière édition par exdragon le Mer 18 Jan 2012 - 8:33, édité 5 fois | |
|
exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Re: Source pour faire les Undos successifs sur une map Mar 17 Jan 2012 - 10:21 | |
| Petite correction de la routine "place" du premier post. Tout est ok | |
|
exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Re: Source pour faire les Undos successifs sur une map Mer 18 Jan 2012 - 3:14 | |
| UP de mise à jour :
La première version (avant mise à jour) avait un gros bug^^
Tout est OK dans tous ces posts ci-dessus !
| |
|
exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Re: Source pour faire les Undos successifs sur une map Mer 18 Jan 2012 - 8:06 | |
| Mise à jour derniere et définitive de la routine "place" dans le premier post. Tout est OK, je place sur la map un élément que je choisi dans une liste (c'est l'objet 9), l'image sous lui a été sauvegardée pour un éventuel Undo, possibilité de 30 Undo successifs, le progress_bar en signale le niveau. Voilà pour la contribution, j'espère que ça sera utile à quelqu'un, car pourquoi se crever avec des détails qui nous font perdre des heures quand on a le code tout fait par un collègue^^
Suis là pour des questions au cas où^^ ou par mp. Je ne livre pas le source de l'éditeur complet pour le moment, mais je pense que ce sera faisable^^ Ce n'est que le générateur de carte ici, le moteur de jeu est à faire... D'ailleurs un générateur de cartes tout simple, devinez quoi....c'est le notepad | |
|
Contenu sponsorisé
| Sujet: Re: Source pour faire les Undos successifs sur une map | |
| |
|