Salut Redstar, c'est chouette de voir un autre jeu style RPG développé en pure

.
En plus, j'aime beaucoup les jeux kawaï, si le scénario est un peu poussé, ça peut être vraiment très sympa.
Sinon, concernant la mémoire, je suis loin d'être un spécialiste, mais étant donné que je développe moi aussi un jeu de ce style/genre-là, je me dis que quelques remarques/réflexions pourraient t'être utiles, qui sait

.
Alors, tout d'abord, je dirais qu'il y a plusieurs types de mémoires (si je ne dis pas de bêtises) :
- la mémoire vidéo
- la RAM
Je pense que l'on peut voir assez facilement ce que l'on utilise grâce au gestionnaire des taches.
Je ne sais pas par contre ce que cela donne niveau mémoire vidéo, doit-on ajouter la taille de chaque sprite utilisé sur la map et faire la somme pour connaitre ce que l'on consomme en mémoire vidéo ?
Sinon, pour tes cartes, il faut partir sur une taille de base pas trop grande. Personnellement, j'utilise en général quelque chose comme 4000*3000 (environ). C'est assez petit, mais déjà largement suffisant pour faire des maps assez variées.
Sur ces maps, si tu utilises des sprites en tilesets, tu vas donc diviser par les cases que tu gères (dans ton tableau). Moi, je ne fais pas cela, j'utilise comme fond une image qui se répète sur la longueur de ma map. Et au dessus, j'ajoute mes couches de sprites (en général des png).
J'utilise catchsprite() pour les charger directement en mémoire.
Quelques remarques concernant l'optimisation :
- il ne faut afficher et ne s'occuper que de ce que l'on voit à l'écran. sauf pour certaines choses, comme le déplacement des mobs par exemple si c'est nécessaire.
- il vaut mieux utiliser des sprites3D que des sprites.
- il faut éviter d'utiliser des fonctions comme plot(), drawtext() circle(), etc.. et préférer les sprites3D encore (conseil de G-rom).
- il faut privilégier lorsque cela est possible les map(), plutôt que les listes c'est un peu plus rapide (conseil de G-rom).
- il faut aussi privilégier les constantes par rapport au map() par exemple lorsque cela est possible, c'est plus rapide (conseil de Djes et G-rom).
- si tu dois gérer beaucoup d'objets, et de structures, il peut être intéressant de créer plusieurs petites structures, plutôt que des grosses structures. Idem pour les liste (list()), map() ou tableau.
- il faut toujours veiller à utiliser le meilleur type pour la variable (a,b,w,q..), voire gérer plusieurs choses dans une seule variable (par exemple le fullscreen + le choix de la résolution).
- lorsque tu charges une nouvelle carte, si tu as utilisés des map(), list() ou array (tableau), n'oublies pas de faire un freemap(), freelist(), etc si ce la est possible.
- enfin, une chose importante, il faut gérer l'affichage et ce qui est lié à cela dans une boucle spécifique (c'est un conseil de G-rom

)
un exemple rapide pour comprendre la gestion de l'affichage dans une "boucle" spécifique :
Code : Tout sélectionner
;{ structures & variables globales
Structure StEnnemi
id.w
x.w
y.w
vie.q
degat.q
radar.q
level.a
type.a
agressivite.a
speed.b
sprite.a
EndStructure
Global NewList ennemis.StEnnemi()
Global GbChecktime.l,GbFpsMax.b=60
;}
;{ enumeration
Enumeration
#SpEnnemiNeutre
#SpEnnemiBad
EndEnumeration
;}
;{ declaration
Declare DisplayEnnemis()
Declare Affichage()
Declare FPS()
;}
;{ init
If InitSprite() =0 Or InitSprite3D() =0 Or InitKeyboard() =0 Or UseJPEGImageDecoder() =0 Or UsePNGImageDecoder() =0
MessageRequester("Error","Error directX")
End
EndIf
;}
;{ open window
OpenWindow(0,0,0,1024,768,"Ennemis",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,1024,768,0,0,0)
CreateSprite(#SpEnnemiNeutre,32,32, #PB_Sprite_Texture)
CreateSprite3D(#SpEnnemiNeutre,#SpEnnemiNeutre)
StartDrawing(SpriteOutput(#SpEnnemiNeutre))
Box(0,0,32,32,RGB(0,0,50))
StopDrawing()
CreateSprite(#SpEnnemiBad,32,32, #PB_Sprite_Texture)
CreateSprite3D(#SpEnnemiBad,#SpEnnemiBad)
StartDrawing(SpriteOutput(#SpEnnemiBad))
Box(0,0,32,32,RGB(50,0,0))
StopDrawing()
For i = 0 To 19
AddElement(ennemis())
With ennemis()
\level = 1+Random(5)
\degat = 2 + \level
\agressivite = Random(1)
\radar = 150 + \agressivite*250
While \speed = 0;Not (\speed = -1 Or \speed = 1)
\speed = Random(1)-Random(1)+ \agressivite*(Random(1)-Random(1))
Wend
\x = Random(1024)
\y = Random(768)
\sprite = \agressivite*#SpEnnemiBad + (1-\agressivite)*#SpEnnemiNeutre
EndWith
Next i
;}
;{ boucle
Repeat
If (ElapsedMilliseconds() > GbCheckTime + 1000 / GbFpsMax)
GbCheckTime = ElapsedMilliseconds()
; ici, tu places l'affichage (y compris le déplacement des ennemis par exemple, car cela doit être régulier)
Affichage()
FPS() ; pour afficher le fps du drawing
Else
Delay(1)
EndIf
; ici, tu places les events
;FPS() ; pour afficher le fps des events normaux -> les 2 fps seront différents.
event = WaitWindowEvent(1)
Until quit = 1 Or event = #PB_Event_CloseWindow
FreeList(ennemis())
End
;}
;{ procedures
Procedure DisplayEnnemis()
ForEach ennemis()
With ennemis()
If \x >=-32 And \x <= 1024+32 And \y>=-32 And \y <= 768+32
\x + \speed
\y + \speed
DisplaySprite3D(\sprite,\x,\y)
Else
If \speed>0
\x = -32
\y = Random(768)
Else
\x = 1024+32
\y = Random(768)
EndIf
EndIf
EndWith
Next
EndProcedure
Procedure Affichage()
ClearScreen(RGB(125,125,125))
Start3D()
DisplayEnnemis()
Stop3D()
FlipBuffers()
EndProcedure
Procedure FPS()
Shared s, fps
ss=Second(Date())
fps+1
If s<>ss
s=ss
SetWindowTitle(0,"FPS: "+Str(FPS))
fps=0
EndIf
EndProcedure
;}
Dans cet exemple, on pourrait avoir 2 structures pour les ennemis : avec agressivité et sans, histoire de ne gérer qu'un seul type d'ennemi à la fois.
Logiquement, tu ne devrais avoir aucun problème de ralentissement, sauf si tu utilises 1000 sprites de 1024*1024 et que tu les affiches tous à l'écran en même avec des effets de lumières

.
Pour tes effets de pluie, je te conseille de créer un système de particules avec quelques sprites 3D, ça fonctionne super bien

.
Voici un exemple de celui que j'ai conçu :
http://vimeo.com/29825802
http://vimeo.com/29917047