G-Rom a écrit :Même si tu n'utilises pas des tuiles , tu ne vas pas t'amuser à afficher tout se qui en dehors de l'écran , tu devra forcement passer par un systeme de tuiles
un système de tableau par exemple ?
car effectivement, je ne comptais pas afficher ce qui n'était pas à l'écran (ou à coté)

.
Mais je n'ai pas encore réfléchi à cette technique (afficher que ce qu'il y a sur l'écran).
je reconnais qu'au niveau des graphismes c'est chiant , mais tu peut toujours utilisé un système de région ( comparable à un octree en 3d par exemple ) , si tu est sage et que tu nous fait bavé avec tes graphismes ( car il sont beau ) , je t'aide à faire tout ce que tu veut

un système de région ? je sais pas trop ce que c'est, si tu as plus d'info là-dessus, n'hésites pas
Sinon, pour ceux qui veulent tester voici un test d'affichage (je n'ai pas encore corrigé le scrolling) et j'ai un bug sur le les centres des sprites (uniquement pour les arbres 1 et 3, et je ne comprends pas trop pourquoi)
Note : Comtois m'avait corrigé le code, pour le tri et ça marcher avec un seul sprite d'arbre, mais si j'en utilise plusieurs d'arbres, ça ne marche plus, je ne sais pas pourquoi.
Code : Tout sélectionner
;{ **************** variable, constantes.****************** ..
;Eléments Windows
Enumeration
#WINDOW_MAIN
#text
#ui
EndEnumeration
; ---------------------------------------------------------------------
; NOTE :
;il faut que je change toutes ces variables globales, en une Structure,
;et ajouter à cette structures soit un tableau Dim Global,
;soit utiliser des pointeurs, pour éviter d'avoir trop de choses globales.
; ---------------------------------------------------------------------
;variable générales : taille de la vue, de la map (room), etc..
;taille de la "map" (ou Room)
Global room_width = 4000
Global room_height = 3120
; on vérifie si l'écran est suffisamment grand (pour les netbooks, pour toi, Dobro ;))
ExamineDesktops()
dw=DesktopWidth(0)
dh=DesktopHeight(0)
dc=DesktopDepth(0)
If dw<1024 Or dh<768
Global ecranX =dw
Global ecranY =dc
Else
Global ecranX = 1024
Global ecranY = 768
EndIf
; ici, on peut changer le "FPS". En dessous de 60, chez moi, ça commence à saccader
Global FPS_LIMIT = 120
Global CheckTime
Global quit = 0 ; pour quitter
;gestion de la "caméra"
; scroll pour tous les objets, sauf le centre de la vue
Global scroll_x = 0
Global scroll_y = 0
; "scroll" pour l'objet central de la vue, lorsque celui-ci se rapproche du bord de l'écran
Global scroll_centre_cam_x = 0
Global scroll_centre_cam_y = 0
Global view_centre_x = ecranX /2 ; le centre de la vue
Global view_centre_y = ecranY /2 ; le centre de la vue
Global HorBord = 60 ;bordure verticale, au dela de celle-ci le personnage ne se rapproche plus du bord, mais la "caméra" bougede l'écran
Global VertBord = 40 ;bordure verticale, au dela de celle-ci le personnage ne se rapproche plus du bord, mais la "caméra" bougede l'écran
; vitesse de déplacement du personnage
Global vitesse = 2 ;* FPS_LIMIT/120
;}
;{ **************** Structures ****************************
Structure objet
Sprite.l
x.l
y.l
newposition_x.l
newposition_y.l
centre_x.l
centre_y.l
EndStructure
Global nombre_arbre = 200
Global Dim tableau_obj.objet(nombre_arbre)
;on crée le tableau contenant les données de chaque "objet" décor (sprite, x, y, centre,etc..)
For i = 0 To nombre_arbre
tableau_obj(i)\Sprite = 1+Round(Random(2),0)
If tableau_obj(i)\Sprite = 1
tableau_obj(i)\centre_x = 104
tableau_obj(i)\centre_y = 256
ElseIf tableau_obj(i)\Sprite = 2
tableau_obj(i)\centre_x = 52
tableau_obj(i)\centre_y = 159
ElseIf tableau_obj(i)\Sprite = 3
tableau_obj(i)\centre_x = 83
tableau_obj(i)\centre_y = 188
EndIf
tableau_obj(i)\y = Random(room_height)
tableau_obj(i)\x = Random(room_width )
tableau_obj(i)\newposition_x = tableau_obj(i)\x - tableau_obj(i)\centre_x
tableau_obj(i)\newposition_y = tableau_obj(i)\y - tableau_obj(i)\centre_y
Next i
SortStructuredArray(tableau_obj(), #PB_Sort_Ascending, OffsetOf(objet\y), #PB_Sort_Long); on tri par le y
; le personnage est considéré comme étant le centre de la caméra. Il est donc
; le seul à avoir comme paramètre les scroll_centre_cam
tableau_obj(0)\Sprite = 0
tableau_obj(0)\centre_x = 17
tableau_obj(0)\centre_y = 80
tableau_obj(0)\x = ecranX/2
tableau_obj(0)\y = ecranY/2
tableau_obj(0)\newposition_x = tableau_obj(0)\x - tableau_obj(0)\centre_x - scroll_centre_cam_x
tableau_obj(0)\newposition_y = tableau_obj(0)\y - tableau_obj(0)\centre_y - scroll_centre_cam_y
;}
Declare evenement()
Declare update()
;{ **************** initialisation **************************
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
;}
;{ ********************** openWindow ************************
OpenWindow(#WINDOW_MAIN,150,150,EcranX,EcranY,"3 Arks - test - "+Str(CheckTime),#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#WINDOW_MAIN),0,0,EcranX,EcranY,0,0,0,#PB_Screen_WaitSynchronization )
;ClearScreen(RGB(128,128,128))
;}
;{ loading (sprites)
LoadSprite(0,"perso.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
CreateSprite3D(0,0)
For i = 1 To 3
LoadSprite(i, "arbre"+Str(i)+".png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
CreateSprite3D(i,i)
Next i
;interface
;LoadSprite(#ui, "message.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
;CreateSprite3D(#ui,#ui)
;}
Repeat
Event.l = WindowEvent()
evenement()
If (ElapsedMilliseconds() > CheckTime + 1000 / FPS_LIMIT)
CheckTime = ElapsedMilliseconds()
update()
FlipBuffers()
ClearScreen(RGB(128,128,128))
Else
Delay(1)
EndIf
Until Event = #PB_Event_CloseWindow Or quit = 1
Procedure evenement()
;ExamineMouse()
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Up)
If view_centre_y > HorBord
scroll_centre_cam_y - vitesse
view_centre_y - vitesse
ElseIf scroll_y >0
scroll_y - vitesse
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down) And scroll_y < room_height - ecranY
If view_centre_y < ecranY - HorBord
scroll_centre_cam_y + vitesse
view_centre_y + vitesse
Else
scroll_y + vitesse
EndIf
EndIf
If KeyboardPushed(#PB_Key_Left)
If view_centre_x > VertBord
scroll_centre_cam_x - vitesse
view_centre_x - vitesse
ElseIf scroll_x >0
scroll_x - vitesse
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right) And scroll_x < room_width - ecranX
If view_centre_x < ecranX - VertBord
scroll_centre_cam_x + vitesse
view_centre_x + vitesse
Else
scroll_x + vitesse
EndIf
EndIf
If KeyboardPushed(#PB_Key_Escape)
quit = 1
EndIf
EndIf
EndProcedure
Procedure update()
Dim temp.objet(nombre_arbre)
CopyArray(tableau_obj(), temp())
For i=0 To nombre_arbre
If temp(i)\Sprite <> 0
temp(i)\newposition_y - scroll_y
ElseIf temp(i)\Sprite = 0
temp(i)\newposition_y + scroll_centre_cam_y - temp(i)\centre_y
temp(i)\newposition_x + scroll_centre_cam_x - temp(i)\centre_x
EndIf
Next i
SortStructuredArray(temp(), #PB_Sort_Ascending, OffsetOf(objet\newposition_y), #PB_Sort_Long)
For i=0 To nombre_arbre
If temp(i)\Sprite <> 0
temp(i)\newposition_y + scroll_y
ElseIf temp(i)\Sprite = 0
temp(i)\newposition_y - scroll_centre_cam_y + temp(i)\centre_y
temp(i)\newposition_x - scroll_centre_cam_x + temp(i)\centre_x
EndIf
Next i
CopyArray(temp(), tableau_obj())
Start3D()
For i=0 To nombre_arbre
If tableau_obj(i)\Sprite <> 0
DisplaySprite3D(tableau_obj(i)\Sprite, tableau_obj(i)\newposition_x - scroll_x,tableau_obj(i)\newposition_y - scroll_y)
ElseIf tableau_obj(i)\Sprite = 0
DisplaySprite3D(tableau_obj(i)\Sprite, tableau_obj(i)\newposition_x + scroll_centre_cam_x,tableau_obj(i)\newposition_y + scroll_centre_cam_y)
EndIf
Next i
; DisplaySprite3D(#ui,0,0) ;interface
Stop3D()
EndProcedure
les images (ce ne sont pas les images définitives, juste des images de tests) :
http://blendman.free.fr/dev/pb/arbre1.png
http://blendman.free.fr/dev/pb/arbre2.png
http://blendman.free.fr/dev/pb/arbre3.png
http://blendman.free.fr/dev/pb/perso.png