Page 1 sur 1

Haaaaaaaaarg put<BIP !> de scrolling

Publié : lun. 04/oct./2004 12:43
par Thyphoon
Bon je vous explique
Je cherche a faire un scrolling d'un decore ! Le personnage se deplace sur l'ecran mais des que Xperso>500 le decore scroll et des que Xperso<140 ça scroll dans l'autre sens. Mais je veux que si on arrive au bout du decore le Xperso ne reste pas bloqué a 500 ou 140
Au debut ça me paraissait super simple et puis là je m'arrache les cheveux voici le code :
Il vous faut juste 2 images en 640 par 480 et une autre en 32x32 par exemple qui representera le perso ! et changé le lien vers ses images au debut du code lorsque je charge les sprites....
Dite moi se qui cloche....merci
Thy

Code : Tout sélectionner

#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 0 ;Mod developpement

;- Init DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf
If #Mode_initSp = 0 Or #Mode_initSp = 1
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$)
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0)
Else
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ )
EndIf
UsePNGImageDecoder()
TransparentSpriteColor(-1, 255, 0, 255)
Dim Bloc(4,50,30)
Dim Map(100,100)
Global Map
Global Map_X
Global Map_Y
Global Bloc
Global Bloc_X
Global Bloc_Y
Global Perso_X
Global Perso_Y
Perso_X=320
Perso_Y=200

Map(0,0)=600
Map(1,0)=601
Map(2,0)=0
Map(3,0)=0
Map(4,0)=601
Map(0,1)=600
Map(0,2)=600
Map_X=0
Map_Y=0



; chargement des sprites
LoadSprite(1,"data/sprite/hd01.bmp",0)
LoadSprite(600,"data/level/000-b.png",0)
LoadSprite(601,"data/level/002-b.png",0)
;CreateSprite(600,640,480,0)
;CreateSprite(601,640,480,0)

Repeat

  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  ExamineMouse()
  
  If KeyboardPushed(#PB_Key_Up)
  Perso_Y=Perso_Y-1
EndIf

If KeyboardPushed(#PB_Key_down)
  Perso_Y=Perso_Y+1
EndIf

If KeyboardPushed(#PB_Key_right)
  Perso_X=Perso_X+5
EndIf

If KeyboardPushed(#PB_Key_left)
  Perso_X=Perso_X-5
EndIf
 
Map_X=Int(Perso_X/32/20)
Map_Y=Int(Perso_Y/32/15) 
Bloc_X=Int(Perso_X/32)
Bloc_Y=Int(Perso_Y/32)

Perso_XT=Perso_X-Map_X*640
Perso_YT=Perso_Y-Map_Y*480

If Perso_XS>500
  Decor_X=499-Perso_XT
  t=500-Perso_XS

EndIf 

If Perso_XS<140 And Perso_XS<>0
  Decor_X=140-Perso_XT

EndIf

Perso_XS=Perso_XT+Decor_X
Perso_YS=Perso_YT+Decor_Y



; on affiche le fond d'ecran
DisplaySprite(Map(Map_x,Map_y),Decor_X,Decor_Y)
If Decor_X<0 And Map(Map_X+1,Map_Y)<>0 :DisplaySprite(Map(Map_x+1,Map_y),Decor_X+640,Decor_Y):EndIf 
If Decor_X>0 And Map_X>0:DisplaySprite(Map(Map_x-1,Map_y),Decor_X-640,Decor_Y):EndIf

;on affiche le personage
DisplaySprite(1,Perso_XS,Perso_YS) 

StartDrawing(ScreenOutput())
                    ;- FPS:
                    If Val(FormatDate("%ss", Date())) = sek
                      FPS + 1
                    Else
                      FPS$ = Str(FPS)
                      FPS = 0
                    EndIf
                    sek = Val(FormatDate("%ss", Date()))
                    
                    
                    DrawingMode(1)
                    FrontColor(255, 255, 255)
                    Locate(1, 1)
                    DrawText("FPS: " + FPS$)
                    Locate(1,20)
                    DrawText("Map("+Str(Map_X)+","+Str(Map_Y)+") Bloc("+Str(Bloc_X)+","+Str(Bloc_Y)+") Perso("+Str(Perso_XS)+","+Str(Perso_YS)+")  Decor("+Str(Decor_X)+","+Str(Decor_Y)+")")
                    
                 StopDrawing()


  FlipBuffers()
If #Mode_initSp = 0 Or #Mode_initSp = 1
While WindowEvent() : Wend ; evite le plantage clic gauche
EndIf 
Until KeyboardPushed(#PB_Key_Escape)  

Publié : lun. 04/oct./2004 14:38
par Le Soldat Inconnu

Code : Tout sélectionner

If Perso_XS>500 
  Decor_X=499-Perso_XT 
  t=500-Perso_XS 

EndIf 

If Perso_XS<140 And Perso_XS<>0 
  Decor_X=140-Perso_XT 

EndIf
c'est pas ça le problème ?
tu regarde la position du perso pour corriger la position de la carte qui va engendrer la position du perso.
Drole de bouclage ?

Moi, j'aurai fait comme ça :
- on part de la position générale du perso.
- on calcul la position d'affichage du perso
- si le perso est situer avant 140 pixels sur l'écran et que l'on est pas au bord de la carte (donc si il reste plus de 140 pixels de carte à gauche du perso)
- on corrige la position du perso pour la mettre à 140 et on déplace la carte de Xperso-140 vers la gauche
idem pour supérieur à 500
- sinon, si on est au bord de la carte, on ne corrige pas la position 'affichage du perso et on ne déplace pas la carte

Publié : lun. 04/oct./2004 14:45
par Thyphoon
Merci soldat inconnu :P de t'être penché sur mon pb !
Le pb c'est que lorsque je passe d'un tableau a un autre
et bien j'ai un gros decalage(Sacade ?) mais pas tout le temps !
pour voir le problème utilise cette fois si ce code
Et avec les fleches gauche droite amène ton sprite d'abord tout a gauche puis tout a droite et cela plusieur fois car ça se comporte bizarement ...Au lieu que les tableau arrive fluidement il y a un truc...
ça fait 2 jours que je suis dessus et je comprendspas ...j'en ai même mal a ma tête ...pourtant c'est simple juste des adition et des soustractions Mais là je pige plus...j'ai pourtant suivit tout les sujet du forum a propos de scrolling mais rien a faire... :?

Code : Tout sélectionner

#Window = 0 
#Width = 640 
#Height = 480 

#Mode_initSp = 0 ;Mod developpement 

;- Init DirectX 
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0) 
  CloseWindow(#Window) : End 
EndIf 
If #Mode_initSp = 0 Or #Mode_initSp = 1 
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$) 
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0) 
Else 
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ ) 
EndIf 
UsePNGImageDecoder() 
TransparentSpriteColor(-1, 255, 0, 255) 
Dim Bloc(4,50,30) 
Dim Map(100,100) 
Global Map 
Global Map_X 
Global Map_Y 
Global Bloc 
Global Bloc_X 
Global Bloc_Y 
Global Perso_X 
Global Perso_Y 
Perso_X=320 
Perso_Y=200 

Map(0,0)=600 
Map(1,0)=601 
Map(2,0)=0 
Map(3,0)=0 
Map(4,0)=601 
Map(0,1)=600 
Map(0,2)=600 
Map_X=0 
Map_Y=0 



; chargement des sprites 
LoadSprite(1,"data/sprite/hd01.bmp",0) 
LoadSprite(600,"data/level/000-b.png",0) 
LoadSprite(601,"data/level/002-b.png",0) 
;CreateSprite(600,640,480,0) 
;CreateSprite(601,640,480,0) 

Repeat 

  ClearScreen(0, 0, 0) 
  ExamineKeyboard() 
  ExamineMouse() 
  
  If KeyboardPushed(#PB_Key_Up) 
  Perso_Y=Perso_Y-1 
EndIf 

If KeyboardPushed(#PB_Key_down) 
  Perso_Y=Perso_Y+1 
EndIf 

If KeyboardPushed(#PB_Key_right) 
  Perso_X=Perso_X+5 
EndIf 

If KeyboardPushed(#PB_Key_left) 
  Perso_X=Perso_X-5 
EndIf 
  
Map_X=Int(Perso_X/32/20) 
Map_Y=Int(Perso_Y/32/15) 
Bloc_X=Int(Perso_X/32) 
Bloc_Y=Int(Perso_Y/32) 

Perso_XT=Perso_X-Map_X*640 
Perso_YT=Perso_Y-Map_Y*480 

If Perso_XS>500 
  Decor_X=499-Perso_XT 
  t=500-Perso_XS 

EndIf 

If Perso_XS<140 And Perso_XS<>0 
  Decor_X=140-Perso_XT 

EndIf 

Perso_XS=Perso_XT+Decor_X 
Perso_YS=Perso_YT+Decor_Y 



; on affiche le fond d'ecran 
DisplaySprite(Map(Map_x,Map_y),Decor_X,Decor_Y) 
If Decor_X<0 And Map(Map_X+1,Map_Y)<>0 :DisplaySprite(Map(Map_x+1,Map_y),Decor_X+640,Decor_Y):EndIf 
If Decor_X>0 And Map_X>0:DisplaySprite(Map(Map_x-1,Map_y),Decor_X-640,Decor_Y):EndIf 

;on affiche le personage 
DisplaySprite(1,Perso_XS,Perso_YS) 

StartDrawing(ScreenOutput()) 
                    ;- FPS: 
                    If Val(FormatDate("%ss", Date())) = sek 
                      FPS + 1 
                    Else 
                      FPS$ = Str(FPS) 
                      FPS = 0 
                    EndIf 
                    sek = Val(FormatDate("%ss", Date())) 
                    
                    
                    DrawingMode(1) 
                    FrontColor(255, 255, 255) 
                    Locate(1, 1) 
                    DrawText("FPS: " + FPS$) 
                    Locate(1,20) 
                    DrawText("Map("+Str(Map_X)+","+Str(Map_Y)+") Bloc("+Str(Bloc_X)+","+Str(Bloc_Y)+") Perso("+Str(Perso_XS)+","+Str(Perso_YS)+")  Decor("+Str(Decor_X)+","+Str(Decor_Y)+")") 
                    
                 StopDrawing() 


  FlipBuffers() 
If #Mode_initSp = 0 Or #Mode_initSp = 1 
While WindowEvent() : Wend ; evite le plantage clic gauche 
EndIf 
Until KeyboardPushed(#PB_Key_Escape)  

Publié : lun. 04/oct./2004 17:09
par comtois
Thyphoon , si tu pouvais proposer un code prêt à tester , sans avoir à se demander quelle taille font les sprites , sans avoir à les créer soi même , ça permettrait peut-être , je dis bien peut-être que d'autres se penchent sur le problème :)

Ou alors au moins proposer en lien les sprites que tu utilises .

Publié : lun. 04/oct./2004 17:47
par Thyphoon
tu as raison comtois... :P en vérité les graphique n'on pas pour l'instant d'interet mais voilà un code qui marche de lui même
mon problème est dans la transition d'un tableau a l'autre. Comme j'essayais de l'expliquer je veux que mon sprite lui ne bouge pas lorsqu'il arrive a x<140 ou x>500 et que ce soit le decore qui scroll ! Sauf si on arrive au bout du decore a ce moment là le sprite peu aller jusqu'a 0 ou jusqu'a 640 !
Voilà j'éspère que vous pourrez m'aider car je vous avoue que je suis a mon 3ème Aspro aujoud'hui ....

Code : Tout sélectionner


#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 0 ; Mod developpement

;- Init DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf
If #Mode_initSp = 0 Or #Mode_initSp = 1
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$)
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0)
Else
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ )
EndIf
UsePNGImageDecoder()
TransparentSpriteColor(-1, 255, 0, 255)
Dim Bloc(4, 50, 30)
Dim Map(100, 100)
Global Map
Global Map_X
Global Map_Y
Global Bloc
Global Bloc_X
Global Bloc_Y
Global Perso_X
Global Perso_Y
Perso_X = 320
Perso_Y = 200

Map(0, 0) = 600
Map(1, 0) = 601
Map(2, 0) = 0
Map(3, 0) = 0
Map(4, 0) = 601
Map(0, 1) = 600
Map(0, 2) = 600
Map_X = 0
Map_Y = 0



; chargement des sprites
;LoadSprite(1, "data/sprite/hd01.bmp", 0)
;LoadSprite(600, "data/level/000-b.png", 0)
;LoadSprite(601, "data/level/002-b.png", 0)

CreateSprite(1, 32, 32)
StartDrawing(SpriteOutput(1))
  Circle(16, 16, 16, RGB(255, 128, 255))
StopDrawing()
CreateSprite(600, 640, 480, 0)
StartDrawing(SpriteOutput(600))
  Box(0, 0, 50, 480, RGB(255, 0, 0))
  Box(0, 220, 640, 40, RGB(255, 0, 0))
StopDrawing()
CreateSprite(601, 640, 480, 0)
StartDrawing(SpriteOutput(601))
  Box(590, 0, 50, 480, RGB(0, 255, 0))
  Box(0, 220, 640, 40, RGB(0, 255, 0))
StopDrawing()


Repeat
  
  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  ExamineMouse()
  
  If KeyboardPushed(#PB_Key_Up)
    Perso_Y = Perso_Y - 1
  EndIf
  
  If KeyboardPushed(#PB_Key_down)
    Perso_Y = Perso_Y + 1
  EndIf
  
  If KeyboardPushed(#PB_Key_right)
    Perso_X = Perso_X + 5
  EndIf
  
  If KeyboardPushed(#PB_Key_left)
    Perso_X = Perso_X - 5
  EndIf
  
  Map_X = Int(Perso_X / 32 / 20)
  Map_Y = Int(Perso_Y / 32 / 15)
  Bloc_X = Int(Perso_X / 32)
  Bloc_Y = Int(Perso_Y / 32)
  
  Perso_XT = Perso_X
  Perso_YT = Perso_Y
  
  If Perso_XT < 140
    Decor_X = (140 - Perso_XT)
  EndIf
  If Perso_XT > 500
    Decor_X = (500 - Perso_XT)
  EndIf
  Perso_XS = Perso_XT + Decor_X
  Perso_YS = Perso_YT + Decor_y
  
  ; on affiche le fond d'ecran
  DisplaySprite(Map(Map_x, Map_y), Decor_X, Decor_Y)
  If Decor_X < 0 And Map(Map_X + 1, Map_Y) <> 0 : DisplaySprite(Map(Map_x + 1, Map_y), Decor_X + 640, Decor_Y) : EndIf
  If Decor_X > 0 And Map_X > 0 : DisplaySprite(Map(Map_x - 1, Map_y), Decor_X - 640, Decor_Y) : EndIf
  
  ; on affiche le personage
  DisplaySprite(1, Perso_XS, Perso_YS)
  
  StartDrawing(ScreenOutput())
    ;- FPS:
    If Val(FormatDate("%ss", Date())) = sek
      FPS + 1
    Else
      FPS$ = Str(FPS)
      FPS = 0
    EndIf
    sek = Val(FormatDate("%ss", Date()))
    
    
    DrawingMode(1)
    FrontColor(255, 255, 255)
    Locate(1, 1)
    DrawText("FPS: " + FPS$)
    Locate(1, 20)
    DrawText("Map(" + Str(Map_X) + "," + Str(Map_Y) + ") Bloc(" + Str(Bloc_X) + "," + Str(Bloc_Y) + ") Perso(" + Str(Perso_XS) + "," + Str(Perso_YS) + ")  Decor(" + Str(Decor_X) + "," + Str(Decor_Y) + ")")
    
  StopDrawing()
  
  
  FlipBuffers()
  If #Mode_initSp = 0 Or #Mode_initSp = 1
    While WindowEvent() : Wend ; evite le plantage clic gauche
  EndIf
Until KeyboardPushed(#PB_Key_Escape)

Publié : lun. 04/oct./2004 20:39
par Thyphoon
le mieu que j'ai réussi a faire c'est de remplacé

Code : Tout sélectionner

 Perso_XT = Perso_X
part

Code : Tout sélectionner

 Perso_XT = Perso_X-Map_X*640
Mais j'ai une grosse sacade toujours au passage d'un tableau a l'autre... :( depuis les je suis sur ce problème je n'ose pas compter les heures je retombe tout le temps sur les même phénomène... et le mieux que j'arrive a faire c'est ça !
Pour tester le code utiliser la fleche de gauche et droite du clavier pour bouger le sprite... Si quelqu'un a le truc pour eviter ce decrochage....
Je sais que le decrochage est de 360 pixels...et toute les solutions que j'ai trouvé ne marche si Map_X= nimportequoi :?

Publié : lun. 04/oct./2004 23:18
par nico
J'ai repris ton code et supprimer quelques lignes pour faire quelque chose de simple (si on peut dire) de manière à partir sur une base qui fonctionne, j'espère que ça pourra t'aider:

Code : Tout sélectionner

#Window = 0 
#Width = 640 
#Height = 480 

#Mode_initSp = 0 ; Mod developpement 

;- Init DirectX 
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0) 
  CloseWindow(#Window) : End 
EndIf 
If #Mode_initSp = 0 Or #Mode_initSp = 1 
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$) 
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0) 
Else 
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ ) 
EndIf 
UsePNGImageDecoder() 
TransparentSpriteColor(-1, 255, 0, 255) 
Dim Bloc(4, 50, 30) 
Dim Map(100, 100) 
Global Map 
Global Map_X 
Global Map_Y 
Global Bloc 
Global Bloc_X 
Global Bloc_Y 
Global Perso_X 
Global Perso_Y 
Perso_X = 320 
Perso_Y = 200 

Map_X = 0 
Map_Y = 0 

maptest1=600
maptest2=601


;Creation du personnage
CreateSprite(1, 32, 32) 
StartDrawing(SpriteOutput(1)) 
Circle(16, 16, 16, RGB(255, 128, 255)) 
StopDrawing()

;Creation du map1 
CreateSprite(600, 640, 480, 0) 
StartDrawing(SpriteOutput(600)) 
Box(0, 0, 50, 480, RGB(255, 0, 0)) 
Box(0, 220, 640, 40, RGB(255, 0, 0)) 
StopDrawing()

;Creation du map2 
CreateSprite(601, 640, 480, 0) 
StartDrawing(SpriteOutput(601)) 
Box(590, 0, 50, 480, RGB(0, 255, 0)) 
Box(0, 220, 640, 40, RGB(0, 255, 0)) 
StopDrawing() 


Repeat 
  
  ClearScreen(0, 0, 0) 
  ExamineKeyboard() 
  ExamineMouse() 
  
  If KeyboardPushed(#PB_Key_Up) 
    Perso_Y = Perso_Y - 1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Down) 
    Perso_Y = Perso_Y + 1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Right)  
    If Perso_X > 500
        If Decor_X > -640
          Decor_X = (Decor_X-5)
        Else
            If Perso_X < 640-5-32
              Perso_X = Perso_X + 5
            EndIf 
        EndIf 
    Else
      Perso_X = Perso_X + 5
    EndIf 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    If Perso_X < 140 
        If Decor_X < 0
          Decor_X = (Decor_X+5)
        Else
            If Perso_X > 0+5
              Perso_X = Perso_X - 5 
            EndIf 
        EndIf 
    Else
      Perso_X = Perso_X - 5 
    EndIf
  EndIf 
  
  ; on affiche le fond d'ecran 
  DisplaySprite(maptest1, Decor_X, Decor_y) 
  DisplaySprite(maptest2, Decor_X+640, Decor_y)
  
  ; on affiche le personnage  
  DisplaySprite(1, Perso_X, Perso_Y)
   
  StartDrawing(ScreenOutput()) 
  ;- FPS: 
  If Val(FormatDate("%ss", Date())) = sek 
    FPS + 1 
  Else 
    FPS$ = Str(FPS) 
    FPS = 0 
  EndIf 
  sek = Val(FormatDate("%ss", Date())) 
  
  DrawingMode(1) 
  FrontColor(255, 255, 255) 
  Locate(1, 1) 
  DrawText("FPS: " + FPS$) 
  Locate(1, 20) 
  DrawText("Map(" + Str(Map_X) + "," + Str(Map_Y) + ") Bloc(" + Str(Bloc_X) + "," + Str(Bloc_Y) + ") Perso(" + Str(Perso_X) + "," + Str(Perso_Y) + ")  Decor(" + Str(Decor_X) + "," + Str(Decor_y) + ")") 
  
  StopDrawing() 
  
  
  FlipBuffers() 
  If #Mode_initSp = 0 Or #Mode_initSp = 1 
    While WindowEvent() : Wend ; evite le plantage clic gauche 
  EndIf 
Until KeyboardPushed(#PB_Key_Escape) 

Publié : mar. 05/oct./2004 4:27
par Thyphoon
Merci Nico ! :P

C'est bon visuellement mais pas techniquement !
Je m'explique !
2 petites choses cloche
-Il faut que les coordonées du perso soit les coordonées réell de la map entière ! or là si visuellement c'est bon au lieu que le perso soit a 640*2 au bout des 2 images il n'est qu'a 605 pixel !
-Deuxièmement avec ce système la map est fixe (2 image) Or normalement elle utilise un tableau Map(x,y)
ou bien entendu tu arrives au bord du tableau lorsque Map(Map_x+1,Map_y)=0 ou lorsque Map(Map_x-1,Map_y)=0 ou si Map_X=0

Une fois que ça marchera horizontalement je transposerais le système verticalement et ça me permettra d'avoir des decor énorme Mais si le tableau de la map fait est de 6 par 4 (Map(6,4) tout en bas du tableau mon perso doit être au resolution 6*640 pour X et 4*480 pour Y

En tout cas c'est vraiment sympa de t'être penché dessus... :wink: En tout cas moi qui croyait que ce scrolling ça serait fait en 10 minutes....ba je me suis fait avoir. Si j'ammais tu y arrive n'hesite pas moi je continue de chercher ... :P

Publié : mar. 05/oct./2004 11:40
par nico
Moi, je serais toi, je recommencerais l'écriture du code pour y aller doucement comme je le fais pour t'aider. Le problème, c'est que bien que je comprenne ce que tu cherches à faire ; je ne peux avoir les idées constructives de ce jeu puisque toi seul en est l'auteur.

Je ne peux aller plus loin:

Code : Tout sélectionner

#Window = 0 
#Width = 640 
#Height = 480 

#Mode_initSp = 0 ; Mod developpement 

;- Init DirectX 
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0 
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0) 
  CloseWindow(#Window) : End 
EndIf 
If #Mode_initSp = 0 Or #Mode_initSp = 1 
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$) 
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0) 
Else 
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ ) 
EndIf 
UsePNGImageDecoder() 
TransparentSpriteColor(-1, 255, 0, 255) 
Dim Bloc(4, 50, 30) 
Dim Map(100, 100) 
Global Map 
Global Map_X 
Global Map_Y 
Global Bloc 
Global Bloc_X 
Global Bloc_Y 
Global Perso_X 
Global Perso_Y 
Global Perso_Map_x,Perso_Map_y

Map(0,0)=600 
Map(1,0)=601 
Map(2,0)=0 
Map(3,0)=0 
Map(4,0)=601 
Map(0,1)=600 
Map(0,2)=600 

Map_X=0 
Map_Y=0 

Perso_X = 320 
Perso_Y = 200 

Perso_Map_x=Perso_X 
Perso_Map_y=Perso_Map_y

Map_X = 0 
Map_Y = 0 

;Creation du personnage 
CreateSprite(1, 32, 32) 
StartDrawing(SpriteOutput(1)) 
Circle(16, 16, 16, RGB(255, 128, 255)) 
StopDrawing() 

;Creation du map1 
CreateSprite(600, 640, 480, 0) 
StartDrawing(SpriteOutput(600)) 
Box(0, 0, 50, 480, RGB(255, 0, 0)) 
Box(0, 220, 640, 40, RGB(255, 0, 0)) 
StopDrawing() 

;Creation du map2 
CreateSprite(601, 640, 480, 0) 
StartDrawing(SpriteOutput(601)) 
Box(590, 0, 50, 480, RGB(0, 255, 0)) 
Box(0, 220, 640, 40, RGB(0, 255, 0)) 
StopDrawing() 

Repeat  
  ClearScreen(0, 0, 0) 
  ExamineKeyboard() 
  ExamineMouse() 
  
  If KeyboardPushed(#PB_Key_Up) 
    Perso_Y = Perso_Y - 1 
    Perso_Map_y = Perso_Map_y - 1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Down) 
    Perso_Y = Perso_Y + 1
        Perso_Map_y = Perso_Map_y + 1 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Right)  
    If Perso_X > 500 
      If Decor_X > -640 
        Decor_X = (Decor_X-5)
        Perso_Map_x=Perso_Map_x+5
      Else 
        If Perso_X < 640-5-32 
          Perso_X = Perso_X + 5 
          Perso_Map_x=Perso_Map_x+5
        EndIf 
      EndIf 
    Else 
     Perso_Map_x=Perso_Map_x+5
      Perso_X = Perso_X + 5 
    EndIf 
  EndIf 
  
  If KeyboardPushed(#PB_Key_Left) 
    If Perso_X < 140 
      If Decor_X < 0 
        Decor_X = (Decor_X+5)
        Perso_Map_x=Perso_Map_x-5
      Else 
        If Perso_X > 0+5 
          Perso_X = Perso_X - 5 
          Perso_Map_x=Perso_Map_x-5
        EndIf 
      EndIf 
    Else 
      Perso_X = Perso_X - 5 
      Perso_Map_x=Perso_Map_x-5
    EndIf 
  EndIf 
  
  ; on affiche le fond d'ecran 
  DisplaySprite(Map(Map_X, Map_Y), Decor_X, Decor_y) 
  If Decor_X < 0 And Map(Map_X + 1, Map_Y) <> 0 : DisplaySprite(Map(Map_X + 1, Map_Y), Decor_X + 640, Decor_y) : EndIf 
  If Decor_X > 0 And Map_X > 0 : DisplaySprite(Map(Map_X - 1, Map_Y), Decor_X - 640, Decor_y) : EndIf
  
  ; on affiche le personnage  
  DisplaySprite(1, Perso_X, Perso_Y) 
  
  StartDrawing(ScreenOutput()) 
  ;- FPS: 
  If Val(FormatDate("%ss", Date())) = sek 
    FPS + 1 
  Else 
    FPS$ = Str(FPS) 
    FPS = 0 
  EndIf 
  sek = Val(FormatDate("%ss", Date())) 
  
  DrawingMode(1) 
  FrontColor(255, 255, 255) 
  Locate(1, 1) 
  DrawText("FPS: " + FPS$) 
  Locate(1, 20) 
  DrawText("Map(" + Str(Map_X) + "," + Str(Map_Y) + ") Bloc(" + Str(Bloc_X) + "," + Str(Bloc_Y) + ") Perso(" + Str(Perso_Map_x) + "," + Str(Perso_Map_y) + ")  Decor(" + Str(Decor_X) + "," + Str(Decor_y) + ")") 
  
  StopDrawing() 
  
  
  FlipBuffers() 
  If #Mode_initSp = 0 Or #Mode_initSp = 1 
    While WindowEvent() : Wend ; evite le plantage clic gauche 
  EndIf 
Until KeyboardPushed(#PB_Key_Escape) 

Publié : mar. 05/oct./2004 11:50
par Thyphoon
Merci beaucoup Nico pour ton aide !

je crois que j'ai du recommencé tout le code depuis zero au moins 10 fois!! Je retombe toujours sur le même problème
Mais j'y arriverait un jour !
Le problème c'est que je n'arrive pas a trouver un lieu ou je peu me concentrer , sans bruit, sans interruption ....Grrrrrrrrrrrr Impossible d'être tranquille 5 minutes d'affilé !

Et je retombe toujours sur les mêmes problèmes c'est que je me fait une varibale 'a' qui est composé a partir de la varibale 'b' mais la varible 'b' est fait a partir de la variable 'a' ! Bref je m'arrache les cheuveux ...POurtant je suis certain qu'il y a une solution
Je pense que je vais prendre le problème alenvers

Publié : mer. 06/oct./2004 10:07
par Thyphoon
Youpieeeeeeeeeeeeeeeeeeeeeeeeeeeee ! J'ai enfin réussi
ça marche uniquement horizontalement mais on peu transposé le code facilement pour que ça marche Verticalement !
le Tableau Map(x,y) contient le n°du sprite a affiché
Voilà le code n'est pas super bien commenté mais si quelqu'un essay de l'utilisé qu'il n'hesite pas a me contacter...
Voilà le code !!! :D
Et comme quoi apres plusieurs jours et plusieurs nuits on finit toujours par trouver une solution ! En tout cas merci a tout ceux qui mon aidé :P

Code : Tout sélectionner

#Window = 0
#Width = 640
#Height = 480

#Mode_initSp = 0 ; lit les fichier un part un
; #Mode_initSp=1;créer en même temps les packs
; #Mode_initSp=2;lit les fichiers via le pack
ver$ = "0.001b Build 1"

;- Init DirectX
If InitSprite() = 0 Or InitSprite3D() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf
If #Mode_initSp = 0 Or #Mode_initSp = 1
  res = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar |#PB_Window_ScreenCentered, "Dark Castle Paralaxe" + ver$)
  OpenWindowedScreen(res, 0, 0, 800, 600, 0, 0, 0)
Else
  OpenScreen( #Width, #Height, 16, "Dark Castle Paralaxe" + ver$ )
EndIf
UsePNGImageDecoder()
TransparentSpriteColor(-1, 255, 0, 255)
Dim Bloc(4,50,30)
Dim Map(100,100)
Global Map
Global Map_X
Global Map_Y
Global Bloc
Global Bloc_X
Global Bloc_Y
Global Perso_X
Global Perso_Y
Perso_XT=320
Perso_YT=200

Map(0,0)=600
Map(1,0)=601
Map(2,0)=600
Map(3,0)=0
Map(4,0)=601
Map(0,1)=600
Map(0,2)=600
Map_X=0
Map_Y=0



;Creation du personnage 
CreateSprite(1, 32, 32) 
StartDrawing(SpriteOutput(1)) 
Circle(16, 16, 16, RGB(255, 128, 255)) 
StopDrawing() 

;Creation du map1 
CreateSprite(600, 640, 480, 0) 
StartDrawing(SpriteOutput(600)) 
Box(0, 0, 50, 480, RGB(255, 0, 0)) 
Box(0, 220, 640, 40, RGB(255, 0, 0)) 
StopDrawing() 

;Creation du map2 
CreateSprite(601, 640, 480, 0) 
StartDrawing(SpriteOutput(601)) 
Box(590, 0, 50, 480, RGB(0, 255, 0)) 
Box(0, 220, 640, 40, RGB(0, 255, 0)) 
StopDrawing() 


Repeat

  ClearScreen(0, 0, 0)
  ExamineKeyboard()
  ExamineMouse()

 If KeyboardPushed(#PB_Key_Up)
  Perso_YT = Perso_YT - 5
 EndIf

 If KeyboardPushed(#PB_Key_down)
   Perso_YT = Perso_YT + 5
 EndIf

 If KeyboardPushed(#PB_Key_right)
   Perso_XT = Perso_XT + 5
 EndIf

 If KeyboardPushed(#PB_Key_left)
   Perso_XT = Perso_XT - 5
 EndIf
;Debug(Str(Map(Map_X+1,Map_Y)))

If Map(Map_X+1,Map_Y)=0
Perso_Max_X=(Map_X+1)*640-140
Else
Perso_Max_X=Map_X+1*640+640
EndIf

If Perso_XT+Decor_X>500 And Perso_XT<Perso_Max_X


  Decor_X=500-Perso_XT
EndIf

If Perso_XT+Decor_X<140 And Perso_XT>140
  Decor_X=140-Perso_XT
EndIf

Perso_XS=perso_XT+Decor_X
Map_X = Int(Perso_XT / 32 / 20)
Map_Y = Int(Perso_YT / 32 / 15)
Bloc_X = Int(Perso_XT / 32)
Bloc_Y = Int(Perso_YT / 32)

 ;Perso_XT = Perso_X

 If Perso_XT>500-Decor_X
 ;Decor_X=500-perso_XT
 EndIf


 ; on affiche le fond d'ecran

 DisplaySprite(Map(Map_X, Map_Y), Decor_X+Map_X*640, Decor_Y)
 If Map(Map_X+1,Map_Y)>0:DisplaySprite(Map(Map_X+1, Map_y), Decor_X + 640+Map_X*640, Decor_Y):EndIf
 If Map_X>0:DisplaySprite(Map(Map_x-1, Map_Y), Decor_X - 640+Map_X*640, Decor_Y) :EndIf

 ; on affiche le personage
 DisplaySprite(1, Perso_XS, Perso_YS)

 StartDrawing(ScreenOutput())
   ;- FPS:
   If Val(FormatDate("%ss", Date())) = sek
     FPS + 1
   Else
     FPS$ = Str(FPS)
     FPS = 0
   EndIf
   sek = Val(FormatDate("%ss", Date()))
       DrawingMode(1)
   FrontColor(255, 255, 255)
   Locate(1, 1)
   DrawText("FPS: " + FPS$)
   Locate(1, 20)
   DrawText("Map(" + Str(Map_X) + "," + Str(Map_Y) + ") Bloc(" +Str(Bloc_X) + "," + Str(Bloc_Y) + ") Decor(" + Str(Decor_X) + "," +   Str(Decor_Y) + ")")
    Locate(1, 40)
    DrawText("persoT(" + Str(Perso_XT) + "," + Str(Perso_YT) + ") PersoS("+ Str(Perso_XS) + "," + Str(Perso_YS) + ") Perso(" + Str(Perso_X) + ","    + Str(Perso_Y) + ")")

   StopDrawing()


 FlipBuffers()
 If #Mode_initSp = 0 Or #Mode_initSp = 1
   While WindowEvent() : Wend ; evite le plantage clic gauche
 EndIf
Until KeyboardPushed(#PB_Key_Escape)