Page 1 sur 1

Mosaic + explosion

Publié : mer. 12/oct./2005 11:04
par Crystal Noir
Vala un ptit code que j'ai fait histoire de m'amuser.

Il vous faut l'image compris dans le zip pour faire fonctionner le programme :) Il suffit de le mettre dans le repertoire du code, on lance et on attends que ca se passe lol.

Appuyez sur ECHAP pour sortir du programme.

Voici l'image à prendre :

http://www.telegaga.com/pb/pingouin.zip


et voici le code

Code : Tout sélectionner

;Effet mosaic + explosion

;Initialisation des composants 
InitSprite() 
InitKeyboard() 
InitMouse()
UseJPEGImageDecoder()


;Constantes 
#Pingouin = 0

;Variables Globales
Global Mosaic
  
;Création de la fenêtre principale 
SetRefreshRate(60) 
MaFenetre = OpenScreen(800,600,32,"Test") 
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok) 
EndIf 

;Chargement des images
LoadSprite(#Pingouin,"pingouin.jpg")

;Creation de la structure
Structure Morceau
  x.f
  y.f
  sourcex.f
  sourcey.f
  Explox.f
  Exploy.f
EndStructure
NewList Ping.Morceau()

;Procedures du programme

Procedure Mosaic()
  For posx = 0 To 400 Step 8
    For posy = 0 To 300 Step 8
      AddElement(Ping())
      Ping()\x = posx + 200
      Ping()\y = posy + 150
      Ping()\sourcex = Sourcex
      Ping()\sourcey = Sourcey
      Ping()\Explox = Random(30) - 15
      Ping()\Exploy = Random(30) - 15
      Sourcey = Sourcey + 8
    Next
    Sourcex = sourcex + 8
    Sourcey = 0
  Next
EndProcedure

Procedure AfficheExplo()
  ResetList(Ping())
  While NextElement(Ping())
    Ping()\x = Ping()\x + Ping()\Explox
    Ping()\y = Ping()\y + Ping()\Exploy
    ClipSprite(0,Ping()\sourcex,Ping()\sourcey,8,8)
    DisplaySprite(0,Ping()\x,Ping()\y)
    If Ping()\x > 800 Or Ping()\x < 0 Or Ping()\y > 600 Or Ping()\y < 0
      DeleteElement(Ping())
    EndIf
  Wend
EndProcedure

Procedure AfficheMos()
  ResetList(Ping())
  While NextElement(Ping())
    ClipSprite(0,Ping()\sourcex,Ping()\sourcey,8,8)
    DisplaySprite(0,Ping()\x,Ping()\y)
  Wend
EndProcedure

Procedure AfficheCrack()
  ResetList(Ping())
  While NextElement(Ping())
    a = Random(4) - 2
    b = Random(4) - 2
    Ping()\x = Ping()\x + a
    Ping()\y = Ping()\y + b
    ClipSprite(0,Ping()\sourcex,Ping()\sourcey,8,8)
    DisplaySprite(0,Ping()\x,Ping()\y)
  Wend
EndProcedure
 
Mosaic()
AfficheMos()
FlipBuffers()
Delay(2500)
AfficheCrack()
StartDrawing(ScreenOutput())
BackColor(0,0,0)
FrontColor(255,255,255)
Locate(300,500)
DrawText("Attention ca va péter !")
StopDrawing()
FlipBuffers()
Delay(2000)

Repeat
  ClearScreen(0,0,0)
  AfficheExplo()
  ExamineKeyboard()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Bon le code n'est peut être pas optimisé mais j'aime bien l'effet.

J'attends vos commentaires ^^

Publié : mer. 12/oct./2005 13:29
par Flype
c vrai que c sympa...
ca serait encore plus sympa si chaque morceau vibrait/tremblait avant de s'envoler, çà dynamiserait encore plus le truc.

Publié : mer. 12/oct./2005 19:08
par Crystal Noir
oui ca serait pas mal ^^

En tout cas ca n'a pas l'air de brancher grand monde.

Publié : mer. 12/oct./2005 19:24
par Chris
Brigitte Bardot va faire la tronche si on fait peter les pingouins mais bon... On fera avec :lol:

Faudrait que les petits morceaux de pingouin tournent après l'explosion, ce serait plus dynamique!

Sinon, c'est bien pour celui qui programme des jeux ou des démos!

[Edité]

J'ai encore oublié les 'u' à pingouin :oops:

Fait chier ce mot :x :twisted:

Publié : mer. 12/oct./2005 19:38
par Droopy
Très sympa comme effet :D

Publié : mer. 12/oct./2005 21:12
par Ar-S
Sympa ce petit effet !
Ce serait un peu mieux si un texte comme
pressez echap pour quitter apparaissait apres l'explosion et que l'image explose sans message

Publié : mer. 12/oct./2005 22:50
par Backup
Ce serait un peu mieux si un texte comme
pressez echap pour quitter apparaissait apres l'explosion et que l'image explose sans message
ceci est du a ta meconnaissance des coutumes locale !

il est de coutume qu'un code posté ici , propose une sortie soit par appuis de la touche escape , soit par click d'un bouton de souris ! :D

tout les intervenants du forum connaissent ceci ! :D

Publié : mer. 12/oct./2005 23:28
par dlolo
Oulala c'est pas bien tous les morceaux sont perdus, il faut les retrouver...

(Pareil pour l'image : pingouin.jpg)

Code : Tout sélectionner

Structure p
  num.l
  xo.f
  yo.f
  w.f
  h.f
  xm.f
  ym.f
  dx.f
  dy.f
  
  col.l ; couleur du point si w=1 et h=1
EndStructure
NewList img.p()

InitSprite() : InitKeyboard()

#scr_w=640
#scr_h=480

OpenScreen(#scr_w,#scr_h,32,"")

#nbe=150  ; Nombre d'étape
#w=16 ; largeur des carrés
#h=16 ; hauteur des carrés

UseJPEGImageDecoder()
LoadImage(0,"pingouin.jpg")
ResizeImage(0,#scr_w,#scr_h)

Procedure display_img_m()
  
  StartDrawing(ScreenOutput())
  ForEach img()
    If img()\xm<#scr_w And img()\xm>=0
      If img()\ym<#scr_h And img()\ym>=0
        Plot(img()\xm,img()\ym,img()\col)
      EndIf
    EndIf
  Next
  StopDrawing()
EndProcedure
Procedure display_img_box()
  
  StartDrawing(ScreenOutput())
  ForEach img()
    ;If img()\xm<#scr_w And img()\xm>=0
    ;  If img()\ym<#scr_h And img()\ym>=0
        DrawImage(UseImage(img()\num),img()\xm,img()\ym)
     ; EndIf
        ;EndIf
        ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Escape)
          End
        EndIf
  Next
  StopDrawing()
EndProcedure
Procedure rnd()
  ForEach img()
    img()\xm=Random(#scr_w-1)
    img()\ym=Random(#scr_h-1)
    
    img()\dx=(img()\xo-img()\xm)/#nbe
    img()\dy=(img()\yo-img()\ym)/#nbe
  Next
EndProcedure
Procedure update_img()
  ForEach img()
    img()\xm+img()\dx
    img()\ym+img()\dy
  Next
EndProcedure
Procedure get_col()
  UseImage(0)
  StartDrawing(ImageOutput())
  i.l=0
  
  For y=0 To 479
    For x=0 To 639
      AddElement(img())
      img()\num=1
      img()\xo=x
      img()\yo=y
      img()\w=#w
      img()\h=#h
      img()\xm=Random(#scr_w-1)
      img()\ym=Random(#scr_h-1)
      img()\col=Point(x,y)
      img()\dx=(img()\xo-img()\xm)/#nbe
      img()\dy=(img()\yo-img()\ym)/#nbe
      
      i+1
      
    Next x
  Next y
  StopDrawing()
EndProcedure
Procedure get_box()

  For y=0 To 479 Step #h
    For x=0 To 639 Step #w
      AddElement(img())
      img()\num=GrabImage(0,#PB_Any,x,y,#w,#h)
      img()\xo=x
      img()\yo=y
      img()\xm=Random(#scr_w-1)
      img()\ym=Random(#scr_h-1)
      img()\dx=(img()\xo-img()\xm)/#nbe
      img()\dy=(img()\yo-img()\ym)/#nbe
      
    Next x
  Next y
EndProcedure

;get_col()

get_box()

Repeat
  
  ExamineKeyboard()
  
  
  For i=1 To #nbe
  
    ExamineKeyboard()    
    update_img()
    ClearScreen(0,0,0)
    ;display_img_m()
    display_img_box()
  
    If KeyboardPushed(#PB_Key_Escape)
      End
    EndIf
  
    FlipBuffers()
    ; Debug i
  Next i

  Delay(2000)
  rnd()

Until KeyboardPushed(#PB_Key_Escape)

Publié : jeu. 13/oct./2005 1:56
par filperj
Sympa pour faire une transition d'écran^^

Publié : jeu. 13/oct./2005 8:25
par Crystal Noir
c'est marrant je comptais adapter un code que j'avais fait qui fait une transition entre deux images avec ce système :lol:

Publié : jeu. 13/oct./2005 9:41
par dlolo
oui pour la transition j'y avais pensé.

Si vous aviez pas vu : dans le code on peut choisir soit des points soit des carrés de tailles variables (#w et #h) et la vitesse (#nbe)

Pour les points il faut mettre en remarque l'appel de Get_box() et l'appel de display_img_box() et enlever les marques pour Get_col() et Display_img_m().

Ce n'est pas du tout optimisé non plus !!