Page 1 sur 3

Aide Compréhension système de MAPs...

Publié : sam. 20/sept./2008 10:41
par Neveware
Bonjour

Je poste aujourd'hui ce sujet pour vous demander de l'aide et surtout essaye de m'expliquer ou de me schématiser la réalisation ou un système de MAPs....

Mon moteur RPG avance à grands pas (déplacements terminés, animations, pseudo sous le joueur, etc...) Mais je suis entrain de composer mon Système de MAPs et j'aimerais s'il vous plaît m'expliquer ou me donner une idée de comment faire une map?....

Je croit qu'il faut tout stocker dans un tableau ou une boucle du genre For x = 0 to Next

For y = 0 etc....

J'ai déjà suivi le Tutorial de comtois mais je ne suis pas assez expérimenté pour comprendre ^^.

Merci d'avance pour votre aide.

Re: Aide Compréhension système de MAPs...

Publié : sam. 20/sept./2008 12:32
par Thyphoon
Neveware a écrit :Bonjour

Je poste aujourd'hui ce sujet pour vous demander de l'aide et surtout essaye de m'expliquer ou de me schématiser la réalisation ou un système de MAPs....

Mon moteur RPG avance à grands pas (déplacements terminés, animations, pseudo sous le joueur, etc...) Mais je suis entrain de composer mon Système de MAPs et j'aimerais s'il vous plaît m'expliquer ou me donner une idée de comment faire une map?....

Je croit qu'il faut tout stocker dans un tableau ou une boucle du genre For x = 0 to Next

For y = 0 etc....

J'ai déjà suivi le Tutorial de comtois mais je ne suis pas assez expérimenté pour comprendre ^^.

Merci d'avance pour votre aide.
Actuellement j'étudie pour faire une Map en 3D ISO évolué ....
mais en attendant regarde là il y a un tres bon exemple de Cpl_Bator
http://www.purebasic.fr/english/viewtopic.php?t=19741[/code]

Re: Aide Compréhension système de MAPs...

Publié : sam. 20/sept./2008 13:00
par Neveware
Merci de ton aide mais je commence à m'en sortir un peu...

Petit screen xD :

Image

Mais c'est compliqué de visualiser le code de la map :s....

Publié : sam. 20/sept./2008 14:00
par Anonyme

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf

OpenScreen(1024,768,32,"")

Declare AfficheMap()






Repeat
  ClearScreen(0)
  ExamineKeyboard()

  AfficheMap()

  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End 

;




Procedure AfficheMap()

Restore NIVEAU

StartDrawing(ScreenOutput())
For y = 0 To 9
  For x = 0 To 9

  Read Valeur.l
  
  TAILLE_TUILLE = 64
  
  TX = (x * TAILLE_TUILLE) + ScrollX ; Si tu veut "scrollé" , change la valeur des variables.
  TY = (y * TAILLE_TUILLE) + ScrollY
  
  
  Select Valeur
    Case 1 :Box(TX,TY,TAILLE_TUILLE,TAILLE_TUILLE,$00FF00)
    Case 0 :Box(TX,TY,TAILLE_TUILLE,TAILLE_TUILLE,$00007F)
  EndSelect 


  
  Next
Next
StopDrawing()



EndProcedure







; Niveau de 10x10
DataSection
NIVEAU:
  Data.l 1,1,1,1,1,1,1,1,1,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,1,1,1,1,1,1,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,0,0,0,0,0,0,0,0,1
  Data.l 1,1,1,1,1,1,1,1,1,1
EndDataSection

Publié : sam. 20/sept./2008 14:07
par Neveware
Sa à l'air intéressant... Enfin quelque chose que je comprends :D, je te remercie et je te dit si sa marche ! ^^

Désolé double post... mais t'aurais pas une solution pour stocker dans un tableau? xD

Publié : sam. 20/sept./2008 14:32
par Anonyme
oui , mais faut bien que les données soit stoker quelque part... ici , c'est pas un fichier , mais en dur dans le programme. ( les datasection )

je ne vais pas te donner la soluce , à toi de trouvé comment mettre les donné de la datasection dans un tableau quelquonque.

indice :

Code : Tout sélectionner

dim MaMap(9,9)

Publié : sam. 20/sept./2008 16:04
par Neveware
En fait j'ai déjà essayé tout sa... mais j'ai mit tellement de variables que je sait plus où j'en suit...

Si le joueur se déplace de +1 en X , sa le déplace virtuellement mais pas sur la map... alors on déplace la MAP de +1 (deplacement_map_x = deplacement_map_x + 1) puis c'est là le hic, si je veux déplacer la map... il faut que je déplace tout les tiles, donc les coordonnées des tiles doivent être deplacement_map_x et deplacement_map_y mais les coordonnées des tiles n'existent pas...

ENFIN BREF VOUS COMPRENEZ MON PROBLEME XD

Publié : sam. 20/sept./2008 16:30
par Anonyme
non, j'ai rien compris.
qu'est ce que t'appelle un déplacement virtuel ?? les coordonnées des tuiles et du perso n'ont rien a voir , la seule chose qu'il on en commun c'est le scrolling si il y en a...

Publié : sam. 20/sept./2008 16:35
par Neveware
Je sait mais déplacement virtuel c'est à dire que la variable position_joueur_x elle seule est changée, mais le joueur ne se déplace pas, c'est la map qui bouge.

Ensuite, je sait que c'est le Scroll qui se déplace... mais forcément si on déplace la map on est obligé d'en déplacer tout les tiles!

J'vous montre mon problème :

En gros Map_position_x et Map_position_y sont les variables, les scrolls de la map si vous préférez, donc si je veux placer un tile je fais :

Code : Tout sélectionner

DisplaySprite (#Chipset_file, Map_position_x, Map_position_y) ; On affiche le Tile
Sinon la map ne bougera pas si j'ai bien compris...

Et c'est là que je me perds... J'aimerais que chaque Tile ait sa coordonnée X et Y précise pour que je puisse changer chaque tileset de la map...

Voici le début de mon code pour comprendre mes variables un peu :

Code : Tout sélectionner

Enumeration

#Chipset_file

EndEnumeration

;************** SYSTEME DE MAPS - DEBUT DE LA PROGRAMMATION *****************
;-Début de la Programmation



; *************** Définition des variables **************
;-Définition des Variables

Tile_Width = 16 ; Défini la Largeur d'un Tile
Tile_Height = 16 ; Défini la Hauteur d'un Tile

Chipset_file$ = "chipset_1.png" ; Défini le chipset de la MAP.

Map_Width = 100 ; Défini la Largeur de la MAP
Map_Height = 100 ; Défini la Hauteur de la MAP


Map_position_x =New_position_Map_position_x ; Déplacement X sur l'écran...
Map_position_y = New_position_Map_position_y ; Déplacement Y sur l'écran...

Tile_x = 0 ; On défini la variable du Tile actuel X...
Tile_y = 0 ; On défini la variable du Tile actuel Y...





; ************** Chargement des Tiles du Chipset ****************
;- Chargement des Tiles

LoadSprite(#Chipset_file, "data/chipsets/" + Chipset_file$)


; ** Par la Suite, on demande la Hauteur, Largeur du tileset total **

File_chipset_Width = SpriteWidth(#Chipset_file) ; Défini la Largeur du fichier Chipset
File_chipset_Height = SpriteHeight(#Chipset_file) ; Défini la Largeur du fichier Chipset

; ** On découpe ensuite les Tiles pour les Compter **

Total_tiles_Width = File_chipset_Width / Tile_Width ; On calcule le total de tiles en Largeur.
Total_tiles_Height = File_chipset_Height / Tile_Height ; On calcule le total de tiles en Hauteur.

;** On Compte le Total des Tiles **

Total_tiles = Total_tiles_Width * Total_tiles_Height ; On obtient le total des Tiles en faisant Largeur*Hauteur


;** On calcule le total des tiles qu'il y aura sur la MAP**

Total_tiles_map_Height = Map_Height / Tile_Height ; Calcul du nombre de tiles en Largeur
Total_tiles_map_Width = Map_Width / Tile_Width ; Calcul du nombre de tiles en Hauteur

;** On calcule le total **

Total_tiles_map = Total_tiles_map_Height * Total_tiles_map_Width
Je sait que je vais embrouiller pas mal de monde et je m'en excuse mais j'ai besoin d'aide :s

Merci d'avance.

Publié : sam. 20/sept./2008 17:03
par Anonyme
Et c'est là que je me perds... J'aimerais que chaque Tile ait sa coordonnée X et Y précise pour que je puisse changer chaque tileset de la map...

Ta map est dans un tableau a 2 dimensions ?

Dim Map(100,100) ?


si oui , ta les coordonnées sous les yeux...

Map(0,0) , 0,0 c'est le premier Tile
Map(1,0) c'est le tile à droite du 1°
Map(2,0) etc...

tu vas me dire , oui mais les coordonées de l'écran ??
Simple aussi , tu connais la taille du tile ? on va dire 64.

Map(0,0 )
-> X = 0 x 64 = 0
-> Y = 0 x 64 = 0

donc le 1° tile est en 0,0


Map(1,0 )
-> X = 1 x 64 = 64
-> Y = 0 x 64 = 0

donc le 2° tile est en 64,0

Map(2,0 )
-> X = 2 x 64 = 128
-> Y = 0 x 64 = 0

donc le 1° tile est en 128,0

etc...

Publié : sam. 20/sept./2008 17:04
par Neveware
Ok je vai essayer,je vous tiens au courant!

Publié : sam. 20/sept./2008 17:08
par Neveware
J'ai essayé sa :

Code : Tout sélectionner

Dim Select_Tile.b(Map_Height, Map_Width) ; Création du Tableau aux colonnes X et Y...
Select_Tile(1,0) = DisplayTransparentSprite (#Chipset_file, Map_position_x, Map_position_y) ; On affiche le Tile
Select_Tile(1,2) = DisplayTransparentSprite (#Chipset_file, Map_position_x, Map_position_y) ; On affiche le Tile
Mais sa n'affiche qu'un tile, sûrement à cause de Map_position_x... Help svp sa va faire 8heures que je suis dessus T.T...

Publié : sam. 20/sept./2008 17:10
par Ouaf-Ouaf
Tu veux que le joueur reste toujours au centre de l'ecran, et que le monde se deplace sous ses pieds, c'est ça ?

je comprends pas trop comment tu t y prends. Faut dire que tu mets juste "len-t^te" de ton code.

Code : Tout sélectionner

For A = 0 to X_Tuiles : For b = 0 to Y_Tuiles

DisplaySprite( Map(    A + Decal_X   ,   B + Decal_Y  ), A*32, B*32 )     

Next B : Next A
??

Avec ta map dans map(X,Y), X_ et Y_Tuiles le nombre de tuiles qui tiennent à l'ecran, et Decal_X et _Y la position de l'ecran.

Le joueur tu le mets invariablement au centre.. Et tu note sa pos sur la carte avec une variable.

Que est ce qui te pose pb ? Montre tout ton code ;)

Publié : sam. 20/sept./2008 17:11
par Neveware
O.O, excuse-moi, je suis sûr que ton explication est très compréhensible, mais je débute et j'ai rien compris xD.... tu pourrais refaire le code mais avec des Commentaires de débutant à côté stp? xD

Publié : sam. 20/sept./2008 17:12
par Ouaf-Ouaf
Dim Select_Tile.b(Map_Height, Map_Width) ; Création du Tableau aux colonnes X et Y...
Select_Tile(1,0) = DisplayTransparentSprite (#Chipset_file, Map_position_x, Map_position_y) ; On affiche le Tile
Select_Tile(1,2) = DisplayTransparentSprite (#Chipset_file, Map_position_x, Map_position_y) ; On affiche le Tile
nn, faut pas faire comme ça.

Select_Tile(1,0) = 1

Ca voudras dire dans la boucle "affiche le sprite "1" "