scrolling, pas satisfait...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

scrolling, pas satisfait...

Message par case »

alors voila c'est un projet que j'ai depuis pas mal de temps projet( blitz basic) et je m'y suis remis récemment en pure..; car je ne touche plus au blitz depuis un sacre moment...
il s'agit d'un moteur de rpg mais je n'arrive pas a avoir un scrolling satisfaisant.

c'est un moteur par tuiles, et j'affiche plusieurs couches sur certaines cases.

seulement voila quand je me déplace les colonnes semble avoir des traits plus epais. est-ce un problème hardware du a mon écran lcd par exemple ou est-ce un problème dans ma routine ?
pour moi je n'ai pas ce problème dans les jeux (ou bien je ne le remarque pas) mais là c'est flagrant.

j'avoue que je ne suis pas un pro de ce genre de routines en pure et sans doute il y a matière a optimisation ou procéder complétement différemment.

si quelqu'un a un meilleur résultat en terme d'affichage je suis preneur.

déplacement de cases en cases mais avec scrolling .
image des tuiles
Image

Code : Tout sélectionner

;---------------all inits
InitSprite()
InitSprite3D()
InitSound()
InitNetwork()
InitKeyboard()
UsePNGImageDecoder()
;---------------mainwindow
Global main=OpenWindow(#PB_Any,0,0,800,600,"",#PB_Window_ScreenCentered)
Global out=OpenWindowedScreen(WindowID(main),0,0,800,600,0,0,0)
Structure board_case
  List tile.i()      ; tiles a afficher dans la case  
  blocked.b          ; deplacement possible si a 0 impossible si a 1
EndStructure
;---------------load tileset
tileset=LoadImage(#PB_Any,"gfx\tiles.png")
StartDrawing(ScreenOutput())
DrawImage(ImageID(tileset),0,0)
StopDrawing()
TransparentSpriteColor(#PB_Default,$ff00ff)
tile1=GrabSprite(#PB_Any,0,0,32,32,#PB_Sprite_Texture)
tile2=GrabSprite(#PB_Any,32,0,32,32,#PB_Sprite_Texture)
tile3=GrabSprite(#PB_Any,64,0,32,32,#PB_Sprite_Texture)
tile4=GrabSprite(#PB_Any,96,0,32,32,#PB_Sprite_Texture)
tile5=GrabSprite(#PB_Any,128,0,32,32,#PB_Sprite_Texture)
;create 3D sprites
Dim spr(5)
spr(1)=CreateSprite3D(#PB_Any,tile1)
spr(2)=CreateSprite3D(#PB_Any,tile2)
spr(3)=CreateSprite3D(#PB_Any,tile3)
spr(4)=CreateSprite3D(#PB_Any,tile4)
spr(5)=CreateSprite3D(#PB_Any,tile5)
zMapSize=15
Dim board.board_case(zMapSize,zMapSize)
For x=0 To zMapSize
  For y=0 To zMapSize
    AddElement(board(x,y)\tile())
    board(x,y)\tile()=Random(1)+1
    If Random(100)<=15
      AddElement(board(x,y)\tile())
      board(x,y)\blocked=1
      board(x,y)\tile()=5
      If y-1>=0        
        Repeat
          LastElement(board(x,y-1)\tile())
          If ListIndex(board(x,y-1)\tile())<3
            AddElement(board(x,y-1)\tile())
          EndIf
        Until ListIndex(board(x,y-1)\tile())=3          
        board(x,y-1)\tile()=4
      EndIf
    EndIf
  Next  
Next
xmin=-8
ymin=-8
xmax=zMapSize-8
ymax=zMapSize-8
xv=0
yv=0
spd=2
Repeat
  WaitWindowEvent(0)  
  ;Delay(1)
  FlipBuffers()
  ExamineKeyboard()
  If KeyboardReleased(#PB_Key_Space)
    Select sens
      Case 0 ; look up
        If yy>ymin
          board(xx+8,yy+8-1)\blocked=Abs(board(xx+8,yy+8-1)\blocked-1)
        EndIf  
      Case 1 ; look right
        If xx<xmax
          board(xx+8+1,yy+8)\blocked=Abs(board(xx+8+1,yy+8)\blocked-1)
        EndIf   
      Case 2 ; look down
        If yy<ymax
          board(xx+8,yy+8+1)\blocked=Abs(board(xx+8,yy+8+1)\blocked-1)
        EndIf         
      Case 3 ; look left
        If xx>xmin
          board(xx+8-1,yy+8)\blocked=Abs(board(xx+8-1,yy+8)\blocked-1)
        EndIf              
    EndSelect    
  EndIf
  If KeyboardPushed(#PB_Key_Up) And mvv2=0 And yy>ymin And ss2=0 And ss=0
    sens=0
    If board(xx+8,yy+8-1)\blocked=0
      mvv2-spd  
      ss2=-1
    EndIf    
  EndIf 
  if keyboardpushed(#pb_key_escape)
     end
  endif
  If KeyboardPushed(#PB_Key_Down)And mvv2=0 And yy<ymax And ss2=0 And ss=0
    sens=2
    If board(xx+8,yy+8+1)\blocked=0
      mvv2+spd
      ss2=1
    EndIf
  EndIf 
  If KeyboardPushed(#PB_Key_Left) And mv2=0 And xx>xmin And ss2=0 And ss=0
    sens=3
    If board(xx+8-1,yy+8)\blocked=0
      mv2-spd
      ss=-1
    EndIf
  EndIf 
  If KeyboardPushed(#PB_Key_Right)And mv2=0 And xx<xmax And ss2=0 And ss=0
    sens=1
    If board(xx+8+1,yy+8)\blocked=0
      mv2+spd
      ss=1
    EndIf
  EndIf 
  If ss2<>0
    mvv2+SS2*spd
  EndIf
  If ss<>0
    mv2+SS*spd
  EndIf
  ClearScreen($777777)
  Start3D()
  If mv2=32
    mv2=0
    xx+1
    ss=0
  EndIf
  If mv2=-32   
    mv2=0
    If xx>xmin
      xx-1
    EndIf
    ss=0
  EndIf
  If mvv2=32
    mvv2=0
    yy+1
    ss2=0
  EndIf
  If mvv2=-32
    mvv2=0
    If yy>ymin    
      yy-1
    EndIf
    ss2=0
  EndIf
  If xx<xmin:xx=xmin:EndIf
  If yy<ymin:yy=ymin:EndIf
  If xx>zMapSize:xx=zMapSize:EndIf
  If yy>zMapSize:yy=zMapSize:EndIf
  For viewy=-1 To 20
    For viewx=-1 To 25
      If viewx+xx>=0 And viewy+yy>=0 And viewx+xx<=zMapSize And viewy+yy<=zMapSize
        FirstElement(board((viewx+xx),(viewy+yy))\tile())
        DisplaySprite3D(spr(board((viewx+xx),(viewy+yy))\tile()),(viewx)*32-mv2,(viewy)*32-mvv2)        
      EndIf
    Next
  Next
  DisplaySprite3D(spr(3),256,256)  
  For viewy=-1 To 20
    For viewx=-1 To 25
      If viewx+xx>=0 And viewy+yy>=0 And viewx+xx<=zMapSize And viewy+yy<=zMapSize
        ForEach(board((viewx+xx),(viewy+yy))\tile())
          If ListIndex(board((viewx+xx),(viewy+yy))\tile())>0
            If IsSprite3D(spr(board((viewx+xx),(viewy+yy))\tile()))
              DisplaySprite3D(spr(board((viewx+xx),(viewy+yy))\tile()),(viewx)*32-mv2,(viewy)*32-mvv2)
            EndIf
          EndIf
        Next        
      EndIf
    Next
  Next  
  Stop3D()
ForEver
ImageImage
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: scrolling, pas satisfait...

Message par Demivec »

Pour supprimer petit retard:

Code : Tout sélectionner

  If KeyboardPushed(#PB_Key_Up) And mvv2=0 And yy>yMin And ss2=0 And ss=0
    sens=0
    If board(xx+8,yy+8-1)\blocked=0
      ;mvv2-spd  
      ss2=-1
    EndIf    
  EndIf 
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  If KeyboardPushed(#PB_Key_Down) And mvv2=0 And yy<yMax And ss2=0 And ss=0
    sens=2
    If board(xx+8,yy+8+1)\blocked=0
      ;mvv2+spd
      ss2=1
    EndIf
  EndIf 
  If KeyboardPushed(#PB_Key_Left) And mv2=0 And xx>xmin And ss2=0 And ss=0
    sens=3
    If board(xx+8-1,yy+8)\blocked=0
      ;mv2-spd
      ss=-1
    EndIf
  EndIf 
  If KeyboardPushed(#PB_Key_Right)And mv2=0 And xx<xmax And ss2=0 And ss=0
    sens=1
    If board(xx+8+1,yy+8)\blocked=0
      ;mv2+spd
      ss=1
    EndIf
  EndIf 
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: scrolling, pas satisfait...

Message par blendman »

Pour une boucle de jeu, G-rom m'avait conseillé, à raison, d'utiliser un code ressemblant à ça :

Code : Tout sélectionner

 Repeat 
    If (ElapsedMilliseconds() > CheckTime + 1000 / #FPS_LIMIT)
      CheckTime = ElapsedMilliseconds() 
      ClearScreen(0)   
      ;affichage()
      ;evenement() ; lié à l'affichage déplacement perso....
      FlipBuffers() 
    Else   
      Delay(2)        
    EndIf 
   ; autre event, menu par exemple, ou boucle qui loop nécessairement
  Until quit = 1
Par contre, j'ai l'impression que ton code est bien compliqué pour un scrolling.
Tu ne peux pas faire simplement postion\x = X-camera\x ?
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: scrolling, pas satisfait...

Message par case »

en fait j'affiche plusieurs couches

parece-que certaine tiles doivent êtres au dessus du joueur et d'autres en dessous.


j'ai peut être un problème dans ma réflexion sur le sujet.

merci pour vos avis.
ImageImage
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: scrolling, pas satisfait...

Message par blendman »

case a écrit :en fait j'affiche plusieurs couches
parece-que certaine tiles doivent êtres au dessus du joueur et d'autres en dessous.
j'ai peut être un problème dans ma réflexion sur le sujet.
Tu devrais faire un "simple" y-ordering, en gros tu tries tes sprites par le Y, tu peux le faire uniquement si un personnage mobile bouge (player, pnj, mob..)

Sur 3arks/Arkeos, on fait un truc du genre :

Code : Tout sélectionner

; Ombre et Blendman, pour Arkeos/3arks
; PB 4.61
; 2012

; classement (pour gérer le depth)
Structure entite
  *pointeur 
  depth.w 
  type.a
EndStructure
Global NewList classement.entite() 

Structure Stmob
  sprite.w
  x.w
  y.w
EndStructure
Global NewList mob.Stmob()

Structure StPlayer
  sprite.w
  x.w
  y.w
EndStructure
player.StPlayer



; le tri, tu places ça dans ta boucle, avant l'affichage par exemple
ClearList(classement()); on efface la liste
; on ajoute le player
AddElement(classement())
classement()\pointeur = player
classement()\type = 1 ; tu donnes un type précis pour chaque objet à trier
classement()\depth = player\y 
; on ajoute les mobs
ForEach mob()
  AddElement(classement())
  classement()\pointeur = mob()
  classement()\type = 0
  classement()\depth = mob(i)\Position\y 
Next
; etc.. les pnj, les décors...
SortStructuredList(classement(), #PB_Sort_Ascending, OffsetOf(entite\depth), #PB_Sort_Word) 


; affichage
Start3D()

; sol, couche en dessous, chemin,etc..
ForEach classement()  
  With classement()    
    Select \type
        
      Case 0; le player
        *pt_player.StPlayer
        With *pt_player
          DisplaySprite3D(\sprite,\x,\y)
        EndWith
        
      Case 1; les mobs
        *pt_mob.Stmob = classement()\pointeur 
        With *pt_mob
          DisplaySprite3D(\sprite,\x,\y)
        EndWith
        ; etc..
    EndSelect
  EndWith
Next

   ; couche au dessus : interface, nuages, météo, etc.. 
Stop3D()

Dernière modification par blendman le ven. 20/juil./2012 7:36, modifié 1 fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: scrolling, pas satisfait...

Message par beauregard »

L'utilisation d'une liste chainée simplifie un code. Tu peux tout faire uniquement avec des sprites3D.

Tu n'es pas prudent lorsque tu initialise ton programme, plutôt ceci:

Code : Tout sélectionner

 If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0

 MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
 End 
EndIf 
La commande clearscreen... à éviter, utilise plutôt des sprites 3d. Et enfin il existe au moins deux code pour faire du clipsprite3d.
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: scrolling, pas satisfait...

Message par case »

je suis d'accord je ne suis pas prudent ;)

je n'ai pas eu trop le temps de me pencher a nouveau la dessus, merci de vos conseils :)
ImageImage
Répondre