Page 1 sur 1

Je cherche une instruction

Publié : sam. 08/févr./2025 19:37
par SPH
Salut,

J'ai un peu la flemme de chercher et surtout : je ne sais pas quoi chercher.

Quoi donc ?
=> la fameuse instruction qui ajoute et qui retire un element d'une serie d'evenement (comme par exemple un point ou un sprite)

Si vous ne voyez toujours pas, imaginez 100 pixels se déplaçant dans l'ecran. A chaque collision, ca ajoute un pixel (ou ca elimine un pixel, qu'importe).

Merci

Re: Je cherche une instruction

Publié : dim. 09/févr./2025 15:52
par Ar-S
Tes sprites sont gérés dans un tableau ? Tu affiches un nombre N pour démarrer. En gérant les collisions par coordonnées par exemple, à toi de modifier le N dans ta boucle +1 ou -1 si collision.

ici tableau de 1000 sprites max
Tu en affiches 150
Si 2 pixels se touchent, soit +1 vert, soit -1
Les verts ensuite ne peuvent avoir le même comportement qu'avec les blancs.

Code : Tout sélectionner

; Initialisation
InitSprite()
InitKeyboard()
OpenScreen(800, 600, 32, "Sprites aléatoires")

Structure Sprite
  x.l
  y.l
  color.l
  isGreen.b  ; 1 = Vert, 0 = Blanc
EndStructure

Global Dim sprites.Sprite(1000)  ; Tableau contenant jusqu'à 1000 sprites
Global spriteCount = 150        ; Départ avec 150 sprites actifs
Global Dim pixelGrid(800, 600)  ; Grille de détection des collisions (blancs uniquement)

; Initialisation des 150 premiers sprites (blancs)
For i = 0 To spriteCount - 1
  sprites(i)\x = Random(799)
  sprites(i)\y = Random(599)
  sprites(i)\color = RGB(255, 255, 255)  ; Blanc
  sprites(i)\isGreen = 0
  pixelGrid(sprites(i)\x, sprites(i)\y) = 1  ; Seuls les blancs sont enregistrés
Next

Procedure UpdateSprites()
  For i = 0 To spriteCount - 1
    ; Effacer l'ancienne position de la grille si le sprite est blanc
    If sprites(i)\isGreen = 0
      pixelGrid(sprites(i)\x, sprites(i)\y) = 0
    EndIf
    
    ; Déplacement aléatoire de ±1 pixel
    sprites(i)\x + Random(2) - 1
    sprites(i)\y + Random(2) - 1

    ; Vérification des limites
    If sprites(i)\x < 0 : sprites(i)\x = 0 : EndIf
    If sprites(i)\x > 799 : sprites(i)\x = 799 : EndIf
    If sprites(i)\y < 0 : sprites(i)\y = 0 : EndIf
    If sprites(i)\y > 599 : sprites(i)\y = 599 : EndIf
    
    ; **Détection de collision** (seulement pour les blancs)
    If sprites(i)\isGreen = 0 And pixelGrid(sprites(i)\x, sprites(i)\y) = 1
      If Random(1) = 0 And spriteCount > 1  ; Supprimer un sprite blanc
        spriteCount - 1
        sprites(i) = sprites(spriteCount)  ; Remplace par le dernier
      ElseIf spriteCount < 1000  ; Ajouter un sprite vert à l'endroit de la collision
        sprites(spriteCount)\x = sprites(i)\x
        sprites(spriteCount)\y = sprites(i)\y
        sprites(spriteCount)\color = RGB(0, 255, 0)  ; Nouveau sprite en vert
        sprites(spriteCount)\isGreen = 1  ; Marqué comme vert
        spriteCount + 1
      EndIf
    EndIf

    ; Remettre à jour la grille **uniquement pour les blancs**
    If sprites(i)\isGreen = 0
      pixelGrid(sprites(i)\x, sprites(i)\y) = 1
    EndIf
  Next
EndProcedure

Procedure DrawSprites()
  ClearScreen(RGB(0,0,0))
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Default)
  For i = 0 To spriteCount - 1
    Plot(sprites(i)\x, sprites(i)\y, sprites(i)\color)
  Next
  StopDrawing()
  FlipBuffers()
EndProcedure

; Boucle principale
Repeat
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape) : End : EndIf
  
  UpdateSprites()
  DrawSprites()
  
  Delay(16)  
ForEver


Re: Je cherche une instruction

Publié : dim. 09/févr./2025 18:13
par SPH
Ar-S a écrit : dim. 09/févr./2025 15:52
ici tableau de 1000 sprites max
Justement pas !
Je cherche la fameuse instruction qui n'a pas besoin d'une limite. Je crois me rappeler que ca ajoute (on peux dire: a l'infini) un sprite de plus à l'ecran (un sprite ou autre).
Il me semble que ca n'a rien a voir avec un dim()

8O

Re: Je cherche une instruction

Publié : dim. 09/févr./2025 18:59
par Ar-S
Sinon une liste chainée... Tu ajoutes (ou enlève) un élément au fur et à mesure.

Re: Je cherche une instruction

Publié : dim. 09/févr./2025 20:19
par SPH
Je pense que c'est ça !

(je teste ça) 8)


Thx