Page 1 sur 1

Bitmap Vs Vecteur

Publié : mar. 04/nov./2025 20:47
par SPH
J'ai quelques questions pour un prochain jeu. Je vous explique tout :

Prenons l'exemple du jeu "worms". Le décors (et donc le sol) est soit en BMP (ou autres format d'image) soit en vecteur. Je pense qu'il n'est pas en vecteur mais en bitmap (quoi que je n'en suis pas sûr).
Le sol est facilement calculable pour que le vers puisse se déplacer.
Le terrain est un gros bloc pas forcement plat. Il y a du relief.

Mais voila : lors d'une explosion d'une arme du jeu, le décors s'abime. Cela creuse le chemin des vers. le calcul du sol pour les vers est facilement recalculable. Mais si le decors est en vecteur, c'est beaucoup plus dur de l'abimer suite a une explosion. Par contre, les vecteurs sont facilement zoomable. Pas le bitmap.
Autre chose : si j'utilise du bitmap pour le decors (le sol quoi), ce sera un gros bloc que je "DisplayTransparentSprite" a chaque boucle d'affichage (pas testé la rapidité mais ça risque de craindre...)

Je voudrais votre avis sur la technique a utiliser et voir aussi si vous avez des astuces...

Thx :wink:

Re: Bitmap Vs Vecteur

Publié : mer. 05/nov./2025 0:54
par nemerod
bon je fais la faire hyper simple, pour se style de jeu, je te conseille de passé sur de la 2D via un bitmap, et via les fonction de sprite si tu le veux vraiment tu peu avoir un zoom si se n'est plus, donc cela serai au final un avantage, car tu peu avoir une generation plus propre de la carte et va demandé moins de travaille sur sont edition, et quant il y a juste du déplacement tu a juste besoin de prendre une copy du bitmap se qui pourra aidé pour avoir 2 couche de rendu par exemple pour inclure un background, tu peu pour se faire utilisé le bit de point faible de chaque pixel, pour placé le statut de chaque pixel si c'est du dure, du background sois sans colision sois avoir un trou qui affiche une autre image de background qui serai en paralax, le tous avec la mise a l'echelle, tu peu pour se faire avoir une image de 2048 par 2048 au final mais que tu peu sub divisé en plusieur region qui serai sous forme de tuile pour le rendu dans plusieur sprite qui en serai dédié, se qui poura aidé a leure édition, tu sais que si une modification d'une zone est regise, tu prendre le sprite ciblé qui contien la position final et prendre les region qui l'entoure, se qui fera 9 tuille, donc si tu a par exemple 64 par 64 tuile, tu a 4096 tuile a affiché, donc sa peu avoir un vrai gain de édité que seulement une portion de l'image et pas de tous faire passé

sinon il reste une solution qui peu avoir un vrai avantage mais va demandé que fais un peu de travaille qui serai conpatible en plus avec les fonction vectoriel pour d'autre element sans se reposé sur la lib des sprite, tu peu passé par un canvasgadet et utilisé des image que tu peu venir édité avec un code ultra optimisé qui viendrai édité les pixel sans faire de copie et de transfer entre element, tu peu en sois meme te passé de fonction de startdrawing pour l'edition d'image, de simple boucle FOR pour traitré les zone en temps réèl est totalement possible, et ensuit tu affiche l'image via les fonction vectoriel pour apliqué un zoom, se qui poura évité de faire des passage de memoir entre plusieur exemplaire pour que sa arrive au GPU sans compté le bordel que purebasic fais des que tu veux édité l'image, se qui peu donc aidé a avoir des image qui peuvent etre facilement édité meme par les fonction de la parti 2D drawing de purebasic pour crée un editeur de carte en plus d'avoir la possibilité que la personne import une image a lui et la transforme en niveau de jeu qui serai jouable

j'ai une parti des element que j'avais fais il y a un moment et les moyen pour se type de chose et d'operation, je les avais partagé avec une autre personne sur le discord avec Flame, a penne posté, deja répondu, désolé


EDIT > ah et petit fun fact, avec les solution que j'avais apporté a flame, il est en sois possible d'avoir une edition faite de façon asyncronne et bien propre qui permé de le faire tourné sur un thread qui fais la gestion des personnage et le déplacement de façon indépendant du rendu qui peu pour quant la carte subit des modification, etre fais de façon indépendant du rendu, se qui fais que tu peu divisé tous le travaille dans plusieur thread qui profite de pouvoir travaillé en meme temps sur des image le tous avec une vitesse la plus haut possibloe, et donc tiré parti du multi thread pour arrivé a utilisé la perf du proc et du GPU en meme temps et donc avoir un resulta fluid et si c'est bien fais qui sois syncronisé et correct le tous sans avoir de dépendance de tous type et donc peu aidé dans des cas particulier au qu'elle le traitrement du rendu est capitable et gourment en plus de ne pas etre constant, et d'avoir une physique constant et l'édition la plus rapide possible sans affecté le rendu sauf pour en voir le resulta qui sera prise en compte de façon propre car tu peu utilisé un roulement en plusieur image pour le plan de travaille qui serai l'equivalent de buffer interne et de zone pour ton jeu meme si tu aplique un zoom se qui n'aurai aucun effect car c'est un rendu donc sans effect sur les modification et la physique, donc base de temps constant, plus de possibilité pour faire du rendu plus lourd, plus de temps pour faire des operation de physique complexe et peuvent prendre plus de temps sans avoir d'influence, plus de temps pour des operation de post et de pré-traitrement des element comme les effect et les modificateur

juste pour ton info, j'ai posté sur le discord un code qui permé de traité une image de 4096 par 4096 pixel sois un total avec alpha inclu, de 4Go pour une seul image en un temps ultra bref en utilisant de l'assembleur que sont equivalent en purebasic est lourd et que sont equivalent a lui est encors plus lourd pour resté sur que les fonction limité de base pour nouveau, et qui serai possible de faire avec des sprite qui sont encors bien plus lourd et case bonbon car beaucoup d'element ne permé pas a cause du code de purebasic en interne de traitré autent de chose car les fonction sont limité meme si il y a eu une mise a jours pour aidé

meme la parti audio avec 254 piste audio qui peuvent etre lut est une tentative un peu bancale alors que j'ai fais un code qui permé de traitré 256 piste en temps réèl et d'avoir plus de control et de fonction, donc c'est pas une lib pour de la 2D qui me fera peur, si j'arrive a affiché de la 3D avec que les fonction 2D avec une bonne fluidité, c'est qu'il y a une bonne raison, je sais pas si tu avais vue les petit demo que j'avais posté sur le discord

en plus je sais pas si c'etais toi, mais il y avais une personne sur le fofo justement qui a voulu refaire un jeu qui s'appel la boulle infernal qui est en faire un vieu jeu pour un vielle ordinateur, je les refais en purebasic sans utilisé d'image et en respectent la logic du jeu et sont visuel avec un code plutot minimal, maintement j'arrive a faire un trairement toujours avec le 2D drawing de purebasic, un total de 250 000 qui on un effect de gravité en temps réèl en plus des effect visuel que je vous avais montré

tu sais ou me trouvé si besoin, vue que tu a demandé de l'aide sur le discord a la base et que tu est passé ensuit ici avec ta demande

Re: Bitmap Vs Vecteur

Publié : mer. 05/nov./2025 10:44
par SPH
Waouw, il y a plusieurs idées dans ton post.

J'ai tout lu et je dois tout ingurgiter. Je vais coder (quand j'aurais du temps) un premier code en bitmap mais je crains pour la vitesse. Je vais bien voir...


Thx pour ton post :idea:

Re: Bitmap Vs Vecteur

Publié : mer. 05/nov./2025 13:17
par Ar-S
Entre Worms sur Amiga et worms armageddon et plus récent (hors 3d) il y a sûrement eu du changement. Mais sache que j'ai créé des map dans le workshop steam pour un des Worms (je sais plus si c'est armageddon) et que la taille demandée est bien plus grand que ce qu'on pense (vu qu'elle est sur plusieurs écrans). Ensuite elle doit être convertie à leur sauce mais le principe c'est 'tout ce qui n'est pas transparent est solide'.. donc un creusage ou une explosion ne fait que dessiner du transparent. En gros ça gomme.

Re: Bitmap Vs Vecteur

Publié : mer. 05/nov./2025 15:41
par SPH
Merci, ça me conforte dans l'idée de ce que je me fait.

Re: Bitmap Vs Vecteur

Publié : mer. 05/nov./2025 20:09
par SPH
Le truc, c'est que j'aimerais faire le décors en vectoriel (polygones). Mais je ne sais pas comment "creuser" les polygones suite a un dégat. Je pourrais ajouter un polygones couvrant tout le dégat (en general, un cercle suite a une bombe) mais il faudrait "mapper" le polygone avec le décors du fond de l'écran. Et ca, je ne sais pas faire...

Re: Bitmap Vs Vecteur

Publié : dim. 09/nov./2025 17:00
par nemerod
coucou

je tes fais le detail sur discord mais en voila un résumé ici

j'ai testé et regardé directement dans 2 version dispo sur 2 version, la premier est basé sur une grande image qui est affiché directement, tous les ver et les animation sont sous forme de sprite, il y a une parti qui tourne pour faire le background avec de la 3D mais qui n'a aucun effect et qui est juste pour faire jolie, se qui est aussi le cas pour le 2eme jeu testé meme si j'ai passé plus de temps a le reverse

donc le 2eme jeu est un peu plus particulier car c'est en faite un mix, il y a un carte en 2D qui peu etre édité et qui une fois qu'elle passe dans un algo bien lourd qui tourne en background dans l'editeur, on peu voir la carte mise a jours mais l'effect de profondeur est pas instantanément mise a jours, on peu voir que un mesh 3D est realisé depuis la carte 2D, et quant on regarde bien, l'algo essais de lissé la carte

donc je te conseil de passé sur une image qui pour chaque pixel est donné pour une taille connu, tu peu partir de une zone de 16 par 16 est equal a la taille d'un personnage, en tous cas c'est se que j'ai constaté en terme de valeur récurent dans les 2 jeu

le 2eme jeu a juste prise l'envie d'ajouté de la profondeur sur une image 2D pour avoir un effect plutot cool et de faire croire qu'on marche bien sur un sol qui se prendre les valeur de couleur/pixel de l'image, se qui va demandé a ton code vectoriel un travaille de TITAN qu'il va pleuré et que sa sera bien plus simple d'affiché une image sur ta surface et d'utilisé les fonction vectoriel pour les tire balistique et les effect visuel uniquement, mais je ne te conseille pas de faire le rendu de la carte car j'ai vue les algo et tu va deja en bavé pour faire tout la physique, plus rapide de testé si une position est le sol ou pas que de prendre des element vectoriel qui vons te demandé un travaille de fou pour que au final le rendu a la tout fin sois sous forme d'image traitré par le GPU qui sera plus rapide pour lui que le CPU qui va passé plus de 75% de sont temps a donné les instruction au GPU et le GPU qui sera vraiment sous utilisé pour qu'il attent se qui arrive de ton code, je connais des jeu qui on voulu avoir beaucoup de chose fais en vectoriel, pour des element statique sans modification, sa passe, mais le probleme c'est qu'il utilise le vectoriel de façon abusif et au final des que un truc doit etre modifier, tous est a refaire, equivalent aun redraw extreme de absolument TOUS, alors qu'avec une image, tu fais que édité la region voulu et le reste ne bouge pas, donc mise a jours minimal, aucun contenu modifier qui est strictement le meme, temps de traitrement et vitesse, minimal, facilité de mise en place, fonction commun


donc fais un mix, le sais que les fonction vectoriel de purebasic peuvent affiché une image, et ensuit tu vien placé tes element comme les prop et objet et personnage fais en vectoriel si tu le veux, donc un mix propre



la parti physique est traitré dans un thread et la modification de l'image est faite si il y a des truc a faire se qui fais qu'elle sera prise en compte par la parti principal qui affiche le visuel, une image a affiché, des ligne vectoriel pour faire jolie et tu utilise un peu le GPU et tu maximise la stabilité et la regularité d'execution indépendament du visuel final


voila une petit section de code pour te donné un ordre d'idée de comment tu peu faire pour que ta physique et l'édition de la carte sois autonome

Code : Tout sélectionner


Global *PHYSIQUE_MAP_and_DIRECT__RAW_DRAWING_BUFFER=0
Global REQUEST_SOFT_CLOSE.q=0
Procedure MOTEUR_2(ID)
  Static *temp_buffer,HDC.q:*temp_buffer=AllocateMemory($100)
  HDC=StartDrawing(ImageOutput(ID)):If HDC=0:ProcedureReturn -1:EndIf
  GetObject_(ImageID(a),$100,*temp_buffer)
  *PHYSIQUE_MAP_and_DIRECT__RAW_DRAWING_BUFFER=PeekQ(*temp_buffer+24)
  
  ;variable HDC disponible pour fonction windows si besoin, 
  ;variable du buffer direct de l'image pour manipulation special depuis tout position du code
  ;variable REQUEST_SOFT_CLOSE pour stoppé le thread au propre, le HDC est invalide une fois stoppé, seul *PHYSIQUE_MAP_and_DIRECT__RAW_DRAWING_BUFFER reste quant que l'image n'a pas etais free de façon explicitit
  
  Repeat
    If FUNCTION_OR_GLOBAL_VARIABLE_HERE;autorise l'execution a intervale regulier 
      ;fais ton traitrement ici de la physique ici et l'editition de l'image, libre a toi de faire comme tu veux pour faire passé les element entre le gameplay et les input
      
      
      
      
    Else:Delay(10)
    EndIf
  Until REQUEST_SOFT_CLOSE<>0
  StopDrawing()
EndProcedure

; creation de la map avant le lancé le thread sur l'image, l'ID de l'image doit est le meme dans l'argument de createimage et du createthread
MAP_ID=0
CreateImage(MAP_ID,2048,2048,32,$ff000000)

;assure toi d'avoir l'option multithread activé sur ton purebasic de base et pour tes future code, sa ne lui fera aucun mal et sera profitable dans tous les cas
GLOBAL_SYSTEME_M_2=CreateThread(@MOTEUR_2(),MAP_ID)

;..... ton code principal pour le rendu, il va juste affiché les element visuel et les autre element comme les menu et autre qui ne sont pas la carte et qui ne sont pas la physique

;dans ton rendu, utilise l'equivalent vectoriel si tu veux vraiment ou autre si besoin
DrawAlphaImage(ImageID(MAP_ID),0,0)
;le faite d'affiché une image qui est en traitrement par un autre thread n'a pas d'effect surtout pour ton cas, on veux voir direct le resulta avec le moins de latence possible et une reactivité la plus bref possible

le code est en sois fonctionnelle mais il ne tien que a toi d'adapté et dans faire se que tu veux
tu est sur la piste que je te propose, libre a toi de faire autrement ou de trouvé autre chose,

profite car j'ai entendu dire que des personne français voulais privatisé les ligne de code et la programmation dans le monde avec un amendement sur le systeme d'heure dété et hiver et des 2 joure ferier qui saut, c'est faux en faite, mais sa pourrai le devenir, faut pas le dire a qui que se sois XD


amuse toi bien sinon ;)

Re: Bitmap Vs Vecteur

Publié : lun. 10/nov./2025 20:06
par nemerod
Sinon voila un code en réponse a se que tu demande
via discord au sujet d'un programme en mode fullscreen ou fenetré pour se que les personne seron prés a payé, un jeu moderne a des fonction pour passé a du fullscreen borderlless, soit une fenetre sans bordure, se qui est le cas de beaucoup de navigateur et de programme qui se veux adaptable, des jeu video utilise de plus en plus se type de solution quant le moteur est biensur compatible mais la c'est un autre sujet, mais sa se reste que une sorti tout simple et une formalité

voila un code exemple vierge que j'ai adapté depuis un ancien code que j'avais fais pour flame a la suite d'un probleme qu'il avais eu pour avoir plusieur mode

le bouton F11permé de passé du mode fullscreen <> fenetré, tu peu maximisé si tu veux pour avoir la barre de titre mais la c'est une formalité et peu de ligne de code, meme notepad++ est capable de le faire, donc je vois pas pourquoi on pourais pas

Code : Tout sélectionner

If ExamineDesktops()=0:End 3:EndIf
Global screenSizeX.q=DesktopWidth( 0)-100
Global screenSizeY.q=DesktopHeight(0)-100
Global fullscreen.q=0
Global gmx,gmy
DisableExplicit:DisableASM:StopProfiler()
OpenWindow(0,0,0,screenSizeX,screenSizeY,"DEV",#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(0,0,0,screenSizeX,screenSizeY):RemoveKeyboardShortcut(0,#PB_Shortcut_All)
WindowBounds(0,640,480,#PB_Ignore,#PB_Ignore):Delay(100)

Repeat:eee=WindowEvent()
  gmx=(DesktopMouseX()-WindowX(0,#PB_Window_InnerCoordinate))
  gmy=(DesktopMouseY()-WindowY(0,#PB_Window_InnerCoordinate))
  Select eee
    Case $000
      If StartDrawing(CanvasOutput(0)):Box(0,0,screenSizeX,screenSizeY,$FF035F32):DrawingMode(#PB_2DDrawing_AlphaBlend)
        ;test background, place ton rendu ICI en equivalent, et uniquement le rendu
        For x = gmx&$1f To screenSizeX Step 32:Box(x,0,          1,screenSizeY,$40ffffff):Next
        For y = gmy&$1f To screenSizeY Step 32:Box(0,y,screenSizeX,          1,$40ffffff):Next
        
        
        
        StopDrawing()
      EndIf:Delay(10)
    Case #PB_Event_SizeWindow,#PB_Event_MaximizeWindow,#PB_Event_RestoreWindow
      screenSizeX=WindowWidth( 0,#PB_Window_InnerCoordinate)
      screenSizeY=WindowHeight(0,#PB_Window_InnerCoordinate)
      If screenSizeX<=0:screenSizeX=1:EndIf
      If screenSizeY<=0:screenSizeY=1:EndIf
      ResizeGadget(0,0,0,screenSizeX,screenSizeY)
    Case $100,$104;button pressed
      temp=EventwParam()
      Select temp
        Case $26;UP     ;ARROW
        Case $28;DOWN   ;ARROW
        Case $27;GAUCHE ;ARROW
        Case $25;DROIT  ;ARROW
        Case $20;SPACE  ;
        Case $0D;ENTER  ;
        Case $09;TAB    ;
        Case $DE;²      ;
        Case $70;F1     ;
        Case $71;F2     ;
        Case $72;F3     ;
        Case $73;F4     ;
        Case $74;F5     ;
        Case $75;F6     ;
        Case $76;F7     ;
        Case $77;F8     ;
        Case $78;F9     ;
        Case $79;F10    ;
        Case $7a;F11    ;TOGGLE FULLSCREEN
          fullscreen!1
          If fullscreen
            temp=GetWindowLong_(WindowID(0),#GWL_STYLE)&~(#WS_BORDER|#WS_SIZEBOX|#WS_DLGFRAME|#WS_SYSMENU)
            SetWindowLong_(WindowID(0),#GWL_STYLE,temp)
            ResizeWindow(0,0,0,DesktopWidth( 0),DesktopHeight(0))
          Else
            temp=GetWindowLong_(WindowID(0),#GWL_STYLE)|(#WS_BORDER|#WS_SIZEBOX|#WS_DLGFRAME|#WS_SYSMENU)
            SetWindowLong_(WindowID(0),#GWL_STYLE,temp)
            ResizeWindow(0,#PB_Ignore,#PB_Ignore,DesktopWidth( 0)-100,DesktopHeight(0)-100)
          EndIf
        Case $7b;F12    ;
        Default;:Debug temp
      EndSelect
  EndSelect
Until eee=#PB_Event_CloseWindow

les screenshot on etais posté sur le discord, le background est primitif est n'est formé que d'une simple grille qui ne fais que suivre la souri qu'elle que se sois le mode d'affichage et la taille

amuse toi bien et a bientot

Re: Bitmap Vs Vecteur

Publié : lun. 10/nov./2025 20:26
par venom
Merci pour le partage nemerod.

Ça peut toujours servir. Je vais essayer ça et le.mettre de côté :wink:







@++

Re: Bitmap Vs Vecteur

Publié : lun. 10/nov./2025 20:26
par SPH
Merci Nemerod :!:

Je te rassure, j'ai lu tes posts du discord et de ce forum.

Là, je fais un test bitmap qui va durer une semaine environ... et je me penche sur ta soluce :wink: