[jeu] load Map (et autres questions)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[jeu] load Map (et autres questions)

Message par blendman »

re bonjour, c'est encore moi :).

J'aurai quelques questions de "débutants" :

Le scrolling

J'ai regardé ce tutoriel sur le scrolling : http://www.purebasic.fr/french/viewtopi ... riel#p8097
J'ai aussi regardé plusieurs exemples de scrolling postés sur ce forum ;).

Pour réaliser mon scrolling, sur mon petit test de jeu2D, pour le moment, je déplace tous les objets, sauf l'objet central (le personnage joueur qui se trouve au centre de la caméra ou écran).

La méthode n'est donc sans doute pas la bonne. Je voulais savoir s'il était possible de créer une sorte de "caméra" et de déplacer uniquement celle-ci (le personnage central serait plus ou moins "lié" à cette caméra) J'ai bien vu qu'il existait des fonctions de camera, mais je pense qu'elles sont à utiliser pour les 3D, et non 2D.

Après, il est possible que je dois placer les éléments dans un tableau et déplacer ce tableau, c'est ça ? OU il existe une autre méthode pour faire du scrolling 2D , dans le cadre d'un jeu de type 2D iso (pas de la vraie iso, juste sur les images).

Load/save (game[, map..)/b]
Avec les tutoriaux, j'ai réussi à ouvrir un fichier texte simple et à l'afficher.

Mais je me demandai comment faire la chose suivante :
- imaginons que je souhaite ouvrir un fichier texte dans le quel j'ai mis des informations pour charger une map, par exemple

Code : Tout sélectionner

arbre,1,150,256
plante,2,123,685
le 1er mot est le type de sprite à afficher : arbre, ou plante..
le 1er chiffre et le N° du sprite : pour la première ligne, cela donnerait arbre1.png
les 2 derniers chiffres seraient les coordonnées , donc le sprite1 aurait pour image arbre1.png et serait en (150,256) et le sprite2 aurait pour image plante2.png et serait en (123,685)

Bien sur le texte peut être écrit d'une autre manière comme un fichier ini, ou autre chose :

Code : Tout sélectionner

[obj1]
sprite=arbre
numero =1
x= 150
y=256
Pour informations : je n'utilise pas de tileset, malgrè cela j'ai commencé à lire le tutoriel de Comtois sur les RPG2D (http://www.games-creators.org/wiki/Pure ... Les_cartes), mais je n'utilise pas de tableaux pour placer les sprites, ils peuvent être n'importe où sur la carte (de 4000*4000 environ).

Je me demandai donc comment je pouvais faire cela : charger ce fichier et placer chaque "objet" (ou structure) à l'endroit précis.

Si vous avez une petite idée, cela m'intéresse ;).
Dernière modification par blendman le lun. 09/mai/2011 10:27, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

et ce que je t'ai donner là sans un merci ne gère pas le scrolling ?

http://www.purebasic.fr/french/viewtopi ... 1&start=45

mais je n'utilise pas de tableaux pour placer les sprites, ils peuvent être n'importe où sur la carte (de 4000*4000 environ).
Tu fait comment alors? comment compte tu connaitre la position de tel ou tel objet ? sa m'intrigue.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: quelques questions : scrolling, load/save game

Message par blendman »

G-Rom a écrit :et ce que je t'ai donner là sans un merci ne gère pas le scrolling ?

http://www.purebasic.fr/french/viewtopi ... 1&start=45
Merci pour ton exemple, mais chez moi, il ne marche pas : ligne 122 [erreur] : accès mémoire invalide : (erreur de lecture à l'adresse 376)

visiblement l'erreur est sur la ligne 122 (ExamineKeyboard())

EDIT : je suis sous XP, version complète de purebasic (acheté avant-hier :))
mais je n'utilise pas de tableaux pour placer les sprites, ils peuvent être n'importe où sur la carte (de 4000*4000 environ).
Tu fait comment alors? comment compte tu connaitre la position de tel ou tel objet ? sa m'intrigue.
au temps pour moi, j'utilise un tableau, car je fais le tri de mon Z-order avec :).
Je voulais dire que je n'utilise pas un tableau en 2 dimension, gérant des cases, pour l'affichage des sprites ;)
j'utilise un tableau en 1 dimension, chaque contenant le sprite_index, le x, le y, et d'autres informations sur ce sprite.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: quelques questions : scrolling, load/save game

Message par Cool Dji »

Salut Blendman,

Toutes les réponses à tes questions sont sur le forum.
Commence par un bout :
- le scrolling relatif avec ton personnage au milieu.

Programme un algo avec une seule tuile. Fais en sorte que ton personnage puisse de déplacer et que le décor suive le déplacement.

Dans cet algo de scrolling, tu dois anticiper une technique qui te permette de tester les collisions entre des éléments du décor et les sprites...

Ca, beaucoup de personnes du forum peuvent le faire et tu ne risques rien à poster ton code.
Tu auras de nombreux conseils qui te permettront de bien démarrer et de poursuivre.

Toutes les questions que tu posent sont pertinentes mais prends les, les unes après les autres.
Idéalement, c'est mieux de tout prendre en compte car tu évites de défaire des algos déjà faits. Pour limiter la casse, essaye de coder des algo assez génériques que tu pourras adapter facilement lorsque tu auras des réponses précises à des questions...
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

ligne 122 [erreur] : accès mémoire invalide : (erreur de lecture à l'adresse 376)

visiblement l'erreur est sur la ligne 122 (ExamineKeyboard())

On ne doit pas avoir la même version de pb alors. 8O
Lance avec & sans déboggeur pour voir , d'autre peuvent confirmé le bug ?

http://rapidshare.com/#!download|212l3| ... man.zip|41
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: quelques questions : scrolling, load/save game

Message par Cool Dji »

G-Rom, j'arrive pas à télecharger le zip, tu peux le mettre en code dans le topic, s'il te plait ?
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

Code : Tout sélectionner

; INITIALISATION  (OPENGL SOUS LINUX !!!!)

InitSprite() : InitKeyboard()

ExamineDesktops()
Global Dw.i = DesktopWidth(0)
Global Dh.i = DesktopHeight(0)

CompilerIf #PB_Compiler_Debugger = 1
  wnd = OpenWindow(#PB_Any,0,0,Dw,Dh,"")
  OpenWindowedScreen(WindowID(wnd),0,0,Dw,Dh,1,0,0)
CompilerElse
  OpenScreen(Dw,Dh,DesktopDepth(0),"",#PB_Screen_SmartSynchronization)
CompilerEndIf



Enumeration 
  #IS_TREE  = 1
  
EndEnumeration




; CHARGEMENT DES MEDIAS

UsePNGImageDecoder()


Global grass = LoadSprite(#PB_Any,"./grass0.png")
Global tree  = LoadSprite(#PB_Any, "./tree0.png")


; L'arbre passe à la moulinette pour être "tilé"
; on fait des tranche de 64x64 pixel , se qui fait donc 16 sprites pour un arbre.

Global Dim tree_chunck.i(4,4)

DisplaySprite(tree,0,0)


For y = 0 To 3
  For x = 0 To 3
    tree_chunck(x,y) = GrabSprite(#PB_Any,x*64,y*64,64,64)
    TransparentSpriteColor(tree_chunck(x,y),$FF00FF)
  Next 
Next   

    






; CONSTANTES POUR LES REGLAGES QUI NE CHANGE PAS DURANT LE PROGRAMME

#LEVEL_LAYER  = 4
#LEVEL_SIZE_X = 128
#LEVEL_SIZE_Y = 128
#TILE_SIZE    = 64


; STOCKAGE DU NIVEAU


Global Dim Level.i(#LEVEL_LAYER,#LEVEL_SIZE_X,#LEVEL_SIZE_Y)




; Remplissage d'herbe la couche 0
For y = 0 To #LEVEL_SIZE_Y - 1
  For x = 0 To #LEVEL_SIZE_X - 1
    Level(0,x,y) = grass
  Next 
Next 

; Remplissage aléatoire d'arbre de la couche 1
For y = 0 To #LEVEL_SIZE_Y - 1
  For x = 0 To #LEVEL_SIZE_X - 1
    
    If Random(20) = 1
      Level(1,x,y) = #IS_TREE
    EndIf 
    
  Next 
Next 

; Scrolling
Global scrollX.f = 0
Global scrollY.f = 0


; Test de visibilité
Global VisX = (Dw / #TILE_SIZE) + 1
Global VisY = (Dh / #TILE_SIZE) + 1



Global FPS_LIMIT = 40

Declare Display()


CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  KeyboardMode(#PB_Keyboard_International)  
CompilerEndIf



Repeat
ClearScreen(0)
    
    
    CompilerIf #PB_Compiler_Debugger = 1
      event = WindowEvent()
    CompilerEndIf
    
    ExamineKeyboard()
    

    
    If (ElapsedMilliseconds() > CheckTime + 1000 / FPS_LIMIT) ; METHODE POUR FAIRE EXECUTER L'AFFICHAGE 
      CheckTime = ElapsedMilliseconds()                       ; A LA MEME VITESSE SUR TOUT LES PC 
      
      
      ;GESTION DU SCROLLING
      If KeyboardPushed(#PB_Key_Up)    : scrollY - 30  :  EndIf 
      If KeyboardPushed(#PB_Key_Down)  : scrollY + 30  :  EndIf   
      
      If KeyboardPushed(#PB_Key_Right) : scrollX + 30  :  EndIf 
      If KeyboardPushed(#PB_Key_Left)  : scrollX - 30  :  EndIf     
      
      If scrollX < 0 : scrollX = 0 : EndIf 
      If scrollY < 0 : scrollY = 0 : EndIf 
      
      
      MaxX = (#LEVEL_SIZE_X * #TILE_SIZE) - VisX * #TILE_SIZE
      MaxY = (#LEVEL_SIZE_Y * #TILE_SIZE) - VisY * #TILE_SIZE
      
      
      If scrollX > MaxX : scrollX = MaxX : EndIf 
      If scrollY > MaxY : scrollY = MaxY : EndIf 
      
      
      
      
      
      
      
      Display()
 
        Else
      Delay(1)
    EndIf
    
    

Until KeyboardPushed(#PB_Key_Escape)




Procedure Display()
    ClearScreen(0)  
    
    startx = (scrollX / #TILE_SIZE)  -1
    starty = (scrollY / #TILE_SIZE)  -1
    
    stopx  = startx + VisX
    stopy  = starty + VisY
    
    
    
    For y = starty To stopy
      For x = startx To stopx
        If x=>0 And y=>0 And x<#LEVEL_SIZE_X And y<#LEVEL_SIZE_Y
        SpriteID = Level(0,x,y)
          If SpriteID <> #Null
            
            PosX = (x*#TILE_SIZE) - scrollX
            PosY = (y*#TILE_SIZE) - scrollY
                        
            DisplaySprite( SpriteID , PosX  , PosY )
          EndIf
        EndIf
      Next 
    Next 
    
    
    
    ; AFFICHE TES PERSO ICI !
    
    
    
    For y = starty-2 To stopy+2
      For x = startx-2 To stopx+2
        
        
        If x=>0 And y=>0 And x<#LEVEL_SIZE_X And y<#LEVEL_SIZE_Y
        SpriteID = Level(1,x,y)
        
        If SpriteID = #IS_TREE
          
          For i = 0 To 3
            For j = 0 To 3
              
              PosX = ( (x+i)   *#TILE_SIZE) - scrollX
              PosY = ( (y+j)   *#TILE_SIZE) - scrollY
              
              
              DisplayTransparentSprite(tree_chunck(i,j) , PosX  , PosY )
              
            Next
          Next
          
        EndIf 
        EndIf
      Next 
    Next 
    
    
    
    
    
    
   
    FlipBuffers()
EndProcedure


il te faut 2 images : http://img38.imageshack.us/g/grass0.png/

- grass0.png
- tree0.png
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: quelques questions : scrolling, load/save game

Message par Cool Dji »

ok, merci G-Rom,

ça compile en mode F5 (windows 4.51) mais ya un trucs bizarre avec le découpage de l'arbre et je comprends pas de quoi ça vient.

Image

J'ai bien compris le principe du tuilage et normalement il ne devrait pas y avoir ces zones noires...
Tout est vert quand j'enlève l'affichage des arbres...
Only PureBasic makes it possible
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: quelques questions : scrolling, load/save game

Message par Backup »

j'ai pas regardé le code , mais ç'est typique
d'un probleme d'indice

a un moment les sprites herbe et arbre doivent avoir le meme numero ...

je dirai meme que l'arbre doit prendre le numero de l'herbe , vu que c'est elle qui disparait
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: quelques questions : scrolling, load/save game

Message par Cool Dji »

Yep Dobro ça doit être un truc du genre : j'ai bidouillé ses n° de sprite et des trucs changent même si ça marche pô totalement...
Mais je programme pas comme G-Rom et j'ai du mal à m'y retrouver. Je suis un peu à la rue avec la subtilité de son code et des n° de sprites. Je passe (encore) par des variables...
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

Essaye le subsystem OpenGL ou directx7 , ici sa passe sur 3 machine...

Les ID sont généré comme ca :
Global grass = LoadSprite(#PB_Any,"./grass0.png")
Global tree = LoadSprite(#PB_Any, "./tree0.png")
l'herbe a son propre tableau. donc c'est bizarre...
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

Vire le clearscreen() apres repeat pour voir , il sert à rien celui la.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

de toute facon , je me rend compte qu'avec se code codé à la va vite , qu'il ne répond pas au traitement des objets par profondeur , il y a une lacune , je vais en refaire un autre plus tard.

@+
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: quelques questions : scrolling, load/save game

Message par Cool Dji »

oui, j'avais déjà testé sans le clearscreen mais pareil.
J'ai aussi testé sans les test des options du compilateur mais pareil.
Je tente du coté du tableau des arbres en réécrivant un nouveau tableau (à ma façon) pour comprendre la tienne.
Only PureBasic makes it possible
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: quelques questions : scrolling, load/save game

Message par blendman »

G-Rom a écrit :Lance avec & sans déboggeur pour voir , d'autre peuvent confirmé le bug ?
j'ia lancé sans le débuger et ça passe. Mais avec le debuger, j'ai toujours la même erreur.
Version de pb : la 4.51 (la dernière), version complète.

Donc, j'ai regardé ton exemple (je n'avais pas vu sur l'autre sujet), et j'ai quelques remarques :
- tout d'abord, pour le moment, je n'utilise pas de tuile (tile), car j'ai fait énormément de sprites et je n'ai pas envie de tout refaire (pour l'instant). En plus, les maps que j'ai déjà élaborées et que je compte convertir pour mon jeu en pb n'utilisent pas les tiles. J'avais prévu le principe, mais je ne l'ai pas utilisé.
Il n'est pas dit que par la suite, je n'utilise pas ce système, mais pas pour le moment ;). Je vais faire ça progressivement.
- pour les arbres, je ne souhaite pas qu'ils soient "snappés" selon une grille, lié à ce tableau de tile, mais qu'on puisse les mettre partout. Donc, j'ai des arbres en (127,259) ou (563,1785) par exemple
- une autre remarque : j'ai changé la vitesse du scrolling (passée de 30 à 15 ou 10) et là, ça saccade chez moi. il faut savoir que la vitesse de déplacement du joueur sera plus proche de 10 ou 15 que de 30 ;).
- sinon, je vais étudier ton système de scrolling car visiblement tu déplaces une sorte de caméra virtuelle si j'ai bien compris (et non pas les sprites comme je le fais actuellement (mauvaise méthode j'en conviens, je dois changer ça).
Encore merci pour ton exemple, et désolé de ne pas avoir répondu dans l'autre sujet (je n'avais pas vu ta dernière réponse).

Pour le tri, Comtois m'a bien aidé, et voici le code (test) sur lequel je travaille actuellement. Bien entendu, ce code comporte sans doute des optimisations à faire, mais je débute je le rappelle ;).

Concernant le chargement de fichier ou de map
- j'ai regardé de très nombreux sujets sur le forum, et j'ai trouvé quelques exemples intéressants, mais souvent un peu complexe pour moi.

Donc, pour le moment, je me suis arrété sur cette technique-ci : l'utilisation de fichier de type *ini (ou pref) :

voici le code que j'utilise :

Code : Tout sélectionner

OpenPreferences("1.map")
PreferenceGroup("map")
nbre_obj = ReadPreferenceInteger("nbre_obj", 0)

For i =1 To 1 ;To nbre_obj
  obj.s="obj"+Str(i)
PreferenceGroup(obj)
  
x = ReadPreferenceInteger("x", 0)
y = ReadPreferenceInteger("y", 0)
Next i
  ClosePreferences()
  
  Debug nbre_obj
  Debug x
  Debug y
et le contenu de mon fichier 1.map (qui est la map N°1, par exemple) :

Code : Tout sélectionner

[map]
map = 1
lib = 1
nbre_obj = 2

[obj1]
x= 152
y=135
sprite_index = arbre1

[obj2]
x= 236
y= 685
sprite_index = arbre2
Je ne pense pas que ce soit la meilleure technique, car il est possible que la lecture d'un fichier type ini/pref soit lente, mais pour le moment, c'est la seule que j'ai réussie à utiliser.

J'avais essayé ce code de Dobro (merci au passage) :

Code : Tout sélectionner

;exemple de récupération de mots , valeurs , écrit entre virgule
; By Dobro
nb_ligne =0
If ReadFile (0, "map.txt" )
         While Eof (0) = 0
           a$=a$+ ReadString (0) ; on met tout le fichier dans une variable chaine
           nb_ligne+1 ; on compte le nombre de ligne
         Wend
         
EndIf
compt= CountString (a$, "," )+1 ;ici compt contient le nombre de ","
         ; on va utiliser stringflield() pour séparer les elements entre les virgules 
For i=1 To compt
         Debug StringField (a$,i, "," ) 
Next i

Debug nb_ligne
et le fichier texte correspondant :

Code : Tout sélectionner

arbre1,125,152,
plante3,155,352,
arbre2,532,298,
Mais je n'ai pas encore réussi à prendre chaque paramètre et les attribuer aux x,y, et sprite_index de mes "objets-sprite" (structure+tableau..). Je vais continuer d'y travailler, mais si vous avez une petite idée par exemple pour définir le x, y et sprite_index (numéro de l'image png utilisée) d'un sprite, cela m'intéresse.

En tout cas, merci pour votre aide :).
Répondre