Page 1 sur 2
Mini effet vague !....
Publié : sam. 29/sept./2007 19:31
par Mytic
Un petit code pour le Fun….
Code : Tout sélectionner
UseJPEGImageDecoder()
UsePNGImageDecoder()
InitSprite()
LoadImage(0,"c:\image.jpg");--------(changez le nom par votre image)
OpenWindow(0,0,0,500,500,"test")
OpenWindowedScreen(WindowID(0),0,0,500,500,0,0,0)
FlipBuffers()
Global Dim pix.l(999999)
Procedure mem(image.l)
tx = ImageWidth(image)-1
ty = ImageHeight(image)-1
p = -1
StartDrawing(ImageOutput(image))
For y = 1 To ty
For x = 1 To tx
p = p + 1
coul = Point(x,y)
pix(p) = Point(x,y)
Next x
Next y
StopDrawing()
EndProcedure
Procedure vague(image.l,min.l,max.l)
Static aa.l,ma.l
aa = aa + ma
tx = ImageWidth(image)-1
ty = ImageHeight(image)-1
If aa > max:ma=-1:EndIf
If aa < min+1:ma=1:EndIf
If aa = 0:aa=1:EndIf
p = -1
StartDrawing(ScreenOutput())
For y = 1 To ty
For x = 1 To tx
p = p + 1
nx = x + 6 * Sin(y / aa)
If nx > 0 And nx < 500
Plot(nx, y, pix(p))
EndIf
Next x
Next y
StopDrawing()
EndProcedure
mem(0)
Repeat
vague(0,10,25)
Event = WindowEvent()
Delay(2)
FlipBuffers()
Until Event = #PB_Event_CloseWindow
Publié : sam. 29/sept./2007 20:10
par Buckethead
Voilà un effet sympa, le sinuscroll !
La routine le fait au point par point. Est-il possible de le faire ligne par ligne ? J'aimerais le faire en copiant d'abord l'image sur l'écran et scroller ligne par ligne. Si c'est possible. (J'ai très peu d'experience en PureBasic) Dans d'autre langage je pouvais le faire en copiant l'image ligne par ligne ou en scrollant après avoir afficher l'image (ce qui ne necessite pas de coller une partie de l'image à chaque ligne. Cette méthode était plus rapide sur cet autre langage, un simple déplacement des pixels)
J'ai bien aimé aussi ton code sur la physique des fluides. Bravo, et continue comme ça Mytic.
Publié : sam. 29/sept./2007 20:18
par Mytic
Il suffit de copier l’écran dans un sprite avec GrabSprite
Et pour le ligne par ligne !! Est-ce que tu veux faire un Point() mais pour toute une ligne au lieu d’un seul pixel ?
Publié : sam. 29/sept./2007 20:32
par Mytic
Je t’ai crée ces procédures :
J’espère qu’elles te seront utiles.
Code : Tout sélectionner
Global Dim tabL.l(1024)
Global maxtab.l = 0
Procedure Point_ligne(startX.l,EndX.l,y.l)
p = 0
For x = startX.l To EndX.l
tabL(p) = Point(x,y)
maxtab = P
p+1
Next x
EndProcedure
Procedure Plot_ligne(x.l,y.l)
For i = 0 To maxtab
Plot(x+i,y,tabL(i) )
Next i
EndProcedure
;------------------------------------------------(Exemple)
UseJPEGImageDecoder()
UsePNGImageDecoder()
InitSprite()
OpenWindow(0,0,0,500,500,"test")
OpenWindowedScreen(WindowID(0),0,0,500,500,0,0,0)
FlipBuffers()
LoadImage(0,"c:\image.jpg") ;-----------(à changer)
StartDrawing(ImageOutput(0)) ;-------(on ouvre le mode de dessin sur l'image)
Point_ligne(1,499,10) ;-----------(on copie une ligne de limage (la ligne 10 , et (1 à 499) le début et la fin de la ligne)
StopDrawing()
StartDrawing(ScreenOutput()) ;------------(on ouvre le mode de dessin sur l'écran)
Plot_ligne(1,100) ;---------(on colle la ligne copié avec Point_ligne à la position X,Y)
StopDrawing()
FlipBuffers()
Delay(3000)
End
Publié : sam. 29/sept./2007 20:33
par Buckethead
Mince, il semble que ça soit pas vraiment du point par point, si je met un step 50 à la ligne "For x = 1 To tx" il affiche plusieurs petits bouts pour faire une ligne et non 50 pixels espacés.
Oui je voulais si on pouvais le faire ligne par ligne, voir zoomer en temps réel au passage. (pour faire des effets de routes, scrolling "à la starwars" etc)
Peut on aussi simplement déplacer une portion des pixels présent sur l'écran sans devoir copier cette portion ?
Publié : sam. 29/sept./2007 20:34
par Buckethead
ok je test

Publié : sam. 29/sept./2007 20:39
par Mytic
J’ai ajouté des commentaires au Code

Publié : sam. 29/sept./2007 20:52
par Buckethead
Il affiche une ligne de l'image et ensuite il me semble que ca freeze puis quitte. Je pense que ca vient de la taille de l'image, j'ai essayé de modifier les valeurs. J'ai remarqué aussi le problème avec Plot() qui interdit de dessinner en dehors de l'écran. Autrement si j'ai bien compris, pour copier une ligne il faut faire pixel par pixel ?
Edit: huh nawak! En fait c'est normal qu'il copie juste une ligne

Publié : sam. 29/sept./2007 20:56
par Mytic
Le seul moyen c’est de copier pixel par pixel.
Et pour l’exemple, j’ai fait exprès de copier qu’une seule ligne pour mieux comprendre mes procédures.
Et après 3000 ms (3s) il s’arrête.
Sinon pour le dépassement, c’est à toi de le gérer.
Par exemple il suffit d’ajouter cette condition :
If x > 0 and x < 500 and y > 0 and y < 500
Plot()
Pset()
Etc…
EndIf

Publié : sam. 29/sept./2007 21:20
par Buckethead
Merci Mytic. Ca me fait penser un peu à l'époque où l'on devait se faire ses propres routines, même pour une ligne. Où tout se faisait par le processeur.
J'étais entrain de penser à faire une petite routine pour créér une texture, ainsi on aurait plus besoin de se préocuper de l'image dans les exemples donné sur le site. #PB_2DDrawing_XOr ne marche pas comme je l'aurais voulu. En tracant des lignes en dégradés horizontal et en écrasant l'image obtenu "xorrant" un dégradé vertical, on obtient cette texture "XOR".

Publié : sam. 29/sept./2007 21:42
par Mytic
Sympa la texture

Publié : sam. 29/sept./2007 22:23
par Guimauve
Il serait bien de spécifier que l'image doit être 500X500 pixels pour que ça marche.
Si non, sympa l'effet.
A+
Guimauve
Publié : sam. 29/sept./2007 22:43
par Buckethead
J'ai tenté de reproduire cette texture, mais il me manque encore pas mal de choses pour réaliser ce code. Il faudrait corriger la fin du code. Je ne suis pas certain non plus que ca marche. Quand je le faisais c'était bien plus simple, ligne par ligne, le deuxieme dégradé était en inverse vidéo avec transparence. C'est franchement presque pareil #PB_2DDrawing_XOr en ce qui concerne le cercle, je ne comprend pas trop pourquoi ca ne le fait pas avec les lignes . Edit: il y a quand même une "perte" importante en nombre de couleur dans ce nouveau dégradé une fois xorré.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"S")
Repeat
StartDrawing (ScreenOutput ())
; Premier dégradé horizontal
DrawingMode(#PB_2DDrawing_Default)
For y = 0 To 480
LineXY(0, y, 640, y , RGB(y % 255,0,0))
Next y
; ---------- Ne marche pas, l'effet escompté était un inverse video (avec transparence) J'ai aussi essayé de voir avec box pour faire une ligne.
; car j'ai vu qu'avec un rond en XOR que le dégradé apparaissait en transparence. (Remplacer le if 0 par 1 pour voir)
; un dégradé de ligne verticale écrase le premier dégradé...
If 0
DrawingMode(#PB_2DDrawing_XOr )
For x = 0 To 640 Step 2
Box(x,20,2, 430 ,RGB(x % 255,x % 255,0))
Next x
Circle(100,100,250,255)
EndIf
; ----------
; ### Tentative de créer l'effet XOR pixel par pixel.
For y = 0 To 479
For x = 0 To 639
;(c'est notre couleur dans le prmier dégradé, inutile d'aller le grabber)
oldcolor = y % 255
newcolor = x % 255
oldcolor$ = Bin(oldcolor)
newcolor$ = Bin(newcolor)
; Ayant deux jours de Purebasic, je ne peux que donner l'idée avec un pseudo code:
; XORcouleur = newcolor$ XOR oldcolor$
; note, on doit pouvoir le faire aussi avec "AND"
; Plot(x,y,XORcouleur)
Next x
Next y
StopDrawing ()
FlipBuffers ()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
# Dernier Edit
Avec des gros cercles, on voit clairement apparaitre ce nouveau dégradé xorré. Ce même cercle de la taille d'un pixel avec un step de 1 en x et y et la texture que l'on voit sur l'image doit apparaitre. Il en est rien ;(
Code : Tout sélectionner
InitSprite()
InitKeyboard()
OpenScreen(640,480,32,"S")
Repeat
StartDrawing (ScreenOutput ())
; Premier dégradé horizontal
DrawingMode(#PB_2DDrawing_Default)
For y = 0 To 480
LineXY(0, y, 640, y , RGB(0,0,y % 255))
Next y
DrawingMode(#PB_2DDrawing_XOr )
For y = 0 To 479 Step 20
For x = 0 To 639 Step 20
Circle(x,y,8,x % 255)
Next x
Next y
StopDrawing ()
FlipBuffers ()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Publié : sam. 29/sept./2007 22:45
par Mytic
@Guimauve
Dsl, j’avais oublié de le préciser !!
L’effet ne marche qu’avec des images de grandes tailles, sinon pour des images plus petites il suffit de changer la longueur d’onde des vagues.

Publié : sam. 29/sept./2007 23:06
par Mytic
@Buckethead
petite question !!!
Quand tu utilise % , c'est pour une division ?
si oui , alors il faut faire un / !
le % Calcule le reste de la division entière de RHS par LHS.