Page 1 sur 2

point, ... plot, ... [Réglé !]

Publié : ven. 24/juin/2005 17:56
par jerexgrz
Voici, un petit code ... qui marche pas !! :evil:

;------------------------------------------------------------------------------------
InitSprite()
InitKeyboard()
InitMouse()

Dim tabdec.l (32,32)
OpenScreen(800, 600, 16, "Mouse")

StartDrawing(ScreenOutput())

; dessin d'un point:
Plot(63,64,RGB(128,0,128))
Plot(64,64,RGB(128,0,128))
Plot(65,64,RGB(128,0,128))
Plot(66,64,RGB(128,0,128))

Plot(65,63,RGB(128,0,128))
Plot(65,65,RGB(128,0,128))


FlipBuffers()
StopDrawing()

x = 100
y = 100

Repeat

ExamineKeyboard()
ExamineMouse()

If KeyboardReleased(#pb_key_u)
rr.l

StartDrawing(ScreenOutput())
;Plot(65,64,RGB(128,0,128))
rr=Point(65,64)
FlipBuffers()
StopDrawing()

Debug rr
EndIf

Until MouseButton(1) Or KeyboardPushed(#PB_Key_Escape)
End
;------------------------------------------------------------------------------------
Ca marche pas, je veux dire la variable rr doit contenir la valeur de rgb(128,0,128).

Par contre si on place un point dans les lignes avant de retrouver le point ca marche, ... est ce qu'il sagirait douno bugginous ??? :mad:

Publié : ven. 24/juin/2005 18:51
par Backup
ton flipbuffer est a l'ouest !! en general un seul suffit dans toute apli jeux,
bref qui utilise l'ecran !!
on le met dans la boucle principale !!
pour qu'il soit executé a chaque tour !

son role est d'afficher le contenu de la ram et en arriere plan d'ecrire la future frame !

un swap d'ecran en quelque sorte ! :D

et puis tu ouvre ton ecran en 16 bits !!!


voici un code qui marche , tu a juste a appuyer sur "u"


et aussi lorsque tu post un code utilise le bouton "code"
en haut de la zone de saisi de ton message !!
(faut l'utiliser 2 fois une fois au debut de ton code et une autre fois a la fon !! :D

Code : Tout sélectionner

;------------------------------------------------------------------------------------
InitSprite()
InitKeyboard()
InitMouse()

Dim tabdec.l (32,32)
OpenScreen(800, 600, 32, "Mouse")

StartDrawing(ScreenOutput())

; dessin d'un point:
Plot(63,64,RGB(128,0,128))
Plot(64,64,RGB(128,0,128))
Plot(65,64,RGB(128,0,128))
Plot(66,64,RGB(128,0,128))

Plot(65,63,RGB(128,0,128))
Plot(65,65,RGB(128,0,128))
StopDrawing()

x = 100
y = 100

Repeat
        
        ExamineKeyboard()
        ExamineMouse()
        
        If KeyboardReleased(#PB_Key_U)
            
     
                StartDrawing(ScreenOutput())
                ;Plot(65,64,RGB(128,0,128))
                
                rr.l=Point(65,64)
                
                rouge.l=Red(rr) 
                vert.l=Green(rr)
                bleu.l=Blue(rr) 
                
                DrawingMode(1)
                BackColor(0, 0, 0)
              FrontColor(255, 255, 255)
                Locate(200,300) 
                DrawText("valeur de rouge:"+Str(rouge)) 
                  Locate(200, 350) 
                DrawText("valeur de vert:"+Str(vert)) 
                  Locate(200, 400) 
                DrawText("valeur de bleu:"+Str(bleu))  
                StopDrawing()
                
        EndIf
           
     
        FlipBuffers()
Until MouseButton(1) Or KeyboardPushed(#PB_Key_Escape)
End 

Publié : ven. 24/juin/2005 18:51
par fweil
Les points que tu traces dans la première partie du programme sont dessinés dans le buffer initial.

Lorsque tu rentres dans la boucle Repeat / Until, tu commences en faisant un FlipBuffers(), ce qui change le buffer utilisé. Le buffer en cours est alors vide.

Lorsque tu demandes la valeur du point dans ce buffer vide, il est normal de ne pas retrouver la valeur indiquée dans le buffer précédent.

Ton code devrait plutôt ressembler à qq chose comme :

Code : Tout sélectionner

  InitSprite()
  InitKeyboard()
  InitMouse()
  Dim tabdec.l (32,32)
  OpenScreen(800, 600, 16, "Mouse")
  x = 100
  y = 100
  Repeat
    FlipBuffers()
    ClearScreen(0, 0, 0)
    StartDrawing(ScreenOutput())
      Plot(63,64,RGB(128,0,128))
      Plot(64,64,RGB(128,0,128))
      Plot(65,64,RGB(128,0,128))
      Plot(66,64,RGB(128,0,128))
      Plot(65,63,RGB(128,0,128))
      Plot(65,65,RGB(128,0,128))
    StopDrawing()
    ExamineKeyboard()
    ExamineMouse()
    If KeyboardReleased(#pb_key_u)
        rr.l
        StartDrawing(ScreenOutput())
          Locate(10, 10)
          DrawText(RSet(Hex(Point(65, 64)), 6, "0"))
        StopDrawing()
    EndIf
  Until MouseButton(1) Or KeyboardPushed(#PB_Key_Escape)
End 

Publié : ven. 24/juin/2005 18:56
par Backup
oui sauf que c'est plus propre de metre flipbuffer a la fin , mais sinon
il fait pareil que moa !! :lol: :lol:

et mon code est plus clair non ?

il est plus beau en effet :lol: :lol:

Publié : ven. 24/juin/2005 19:49
par cederavic
Dobro a écrit :oui sauf que c'est plus propre de metre flipbuffer a la fin , mais sinon
il fait pareil que moa !! :lol: :lol:

et mon code est plus clair non ?

il est plus beau en effet :lol: :lol:
Ca dépend comment on raisone ;)

FlipBuffers au debut : J'affiche ce que j'ai dejas dessiner puis je dessine la prochaine frame
FlipBuffers à la fin : Je dessine ce que j'ai dessiné

Mais vu que c'est en boucle, ça n'a aucune importance :P

Publié : ven. 24/juin/2005 20:03
par fweil
C'est en boucle donc ça n'a plus d'importance ?

Il y a deux catégories de gens : ceux qui lavent la vaisselle après manger, et ceux qui la lavent avant. Bon il y en a une troisième qui ne laven pas la vaisselle, soit parce que quelqu'un d'autre s'en occupe, soit parce que ... enfin bon.

Ca me rappelle l'histoire du chimiste et de physicien. A quoi distingue t-on un chimiste et un physicien ?

Le physicien se lave les mains après avoir été aux toilettes. Le chimiste c'est le contraire. Juste pour éviter de se contaminer avec les produits qu'il manipule.

Pour en revenir aux FlipBuffers, je dessine dans des buffers et j'affiche les buffers dans lesquels je ne dessine pas.

Question de mentalité.

Mais on peut faire dans un sens ou dans l'autre, si le programme est bien écrit et passé la première trame, celui qui regarde le programme tourner n'y verra que du feu.

Publié : ven. 24/juin/2005 20:44
par Backup
:D

Publié : lun. 27/juin/2005 9:16
par jerexgrz
Merci, pour l'aide ! :o

Par contre, je ne comprends pas pourquoi quand on ouvre un ecran en 16bits, celà pose probleme ??

Concernant, flipbuffers() je l'utilise plusieurs fois, car je n'ai pas toujours besoin de réafficher l'ecran complet = gain de temps ?!? (je pensais simplement à rafraichir certaines zones de l'ecran).

Publié : mar. 28/juin/2005 18:17
par jerexgrz
Voici, un truc bizarre :

Code : Tout sélectionner

InitSprite()
InitKeyboard() 


Dim tabdec.l (32,32)

OpenScreen(800, 600, 16, "Mouse") 
 
x = 100
y = 100
 
; -----------------------------------------------------------------------------------------
Procedure G_Point(ScanX.l,ScanY.l)
i.w
u.w

i=1
u=1        
                    
    For Yy = ScanY To (ScanY + 32)
        For Xx = ScanX To (ScanX + 32)        
                        
             tabdec(i,u) = Point(XX,YY)                                
             
             i = i + 1                     
                         
             If i => 33 
                i = 1 : u = u + 1                
             EndIf
    
             If u => 33 
                u = 1
             EndIf               
                                    
        Next Xx
    Next Yy    
    
    ProcedureReturn tabdec(10,10)        
          
EndProcedure
; -----------------------------------------------------------------------------------------
Procedure G_Plot(ScanX.l,ScanY.l)    
i.w
u.w

i=1
u=1   
                
    For Yy = ScanY To ScanY + 32
        For Xx = ScanX To ScanX + 32
                           
         Plot(Xx,Yy,tabdec(i,u))
         
         i = i + 1
                 
         If i => 33 
            i = 1 : u = u + 1              
         EndIf
         
         If u >= 33
            u = 1
         EndIf                         
                              
        Next Xx
    Next Yy
        
EndProcedure
; -----------------------------------------------------------------------------------------

     
; --------------------- BOUCLE PRINCIPALE -------------------------------------------------
Repeat  
   
  ExamineKeyboard()   
  
  StartDrawing(ScreenOutput())  
   For Sy = 192 To 224
      For Sx = 192 To 224
  
         Plot(Sx,Sy,RGB(128,0,128))  
  
      Next Sx
   Next Sy
  StopDrawing()

    ; --------------------- Touche G ----------------------
    If KeyboardReleased(#pb_key_g)
        StartDrawing(ScreenOutput())
        
            g_point(192,192)                              
            g_Plot(192,256)     
                                
        StopDrawing()                           
    EndIf
    
    ; --------------------- Touche U ----------------------
    If KeyboardReleased(#pb_key_u)
        rr.l      
        r2.l
        
        StartDrawing(ScreenOutput())          
            rr = Point(192,192)                               
            r2 = Point(192,256)            
        StopDrawing()            

    Debug rr
    Debug r2
    EndIf

    
    FlipBuffers()   

Until KeyboardPushed(#pb_key_escape)
il suffit d'appuyer sur g une fois que le carre violet est apparu sur l'ecran!


Le probleme vient du clignotement du carre violet qui vient d'etre copier ! il clignote, pourtant, le flipbuffers() devrait recevoir les nouvelles données ? :roll:

Publié : mar. 28/juin/2005 20:18
par comtois
petite suggestion pour simplifier l'écriture de tes procédures

Code : Tout sélectionner

Procedure G_Point(ScanX.l,ScanY.l)
    
    For Yy = O To 31
        For Xx = 0 To 31
            
            tabdec(Xx,Yy) = Point(ScanX + Xx, ScanY + Yy)                               
          
        Next Xx
    Next Yy   
    
    ProcedureReturn tabdec(10,10)       
    
EndProcedure
; -----------------------------------------------------------------------------------------
Procedure G_Plot(ScanX.l,ScanY.l)   
    
    For Yy = O To 31
        For Xx = 0 To 31
            
            Plot(ScanX + Xx,ScanY + Yy,tabdec(Xx,Yy))

        Next Xx
    Next Yy
    
EndProcedure
Quand tu appuis sur g ,tu ne dessines que dans un des deux buffers ,tant que tu n'auras pas redessiné la même chose dans le second buffer ,tu auras cet effet de scintillement .

essaye ça

Code : Tout sélectionner

   ; --------------------- Touche G ----------------------
    If KeyboardReleased(#PB_Key_G)
        For i = 1 To 2
            StartDrawing(ScreenOutput())
            
            G_Point(192,192)                             
            G_Plot(192,256)     
            
            StopDrawing()    
            FlipBuffers()
        Next i
    EndIf
A éviter ce genre de code bien sûr ,c'est juste pour que tu comprennes ce qui se passe .


Sinon , pourquoi tu n'utilises pas les sprites ? que cherches-tu à faire exactement ?

Publié : mer. 29/juin/2005 9:42
par jerexgrz
Oui, voila quand on le redessine 2X, il apparait bien !!

En faite, j'essaye de copier une partie de l'ecran, qui va etre ensuite memoriser puis va etre redessiner ! Ca sert par exemple, à gerer l'interface, je vais utiliser ma propre police : A, b, ... qui vont etre coller sur une barre avec des dessins, et comme ca, quand je change de lettre, je n'est qu'a afficher le decor en dessous de A !!

C'est vrai, les sprites je commence à comprendre comment ils fonctionnent ! Sauf, que j'ai besoin de faire des filtres de couleurs (ou masques si je ne me trompe pas). Ex: quand 1 unité tire une boule verte, j'aimerais par la suite, faire une zone de lumiere autour de cette boule, qui va donc changer les couleurs des murs à cotés, ... :P

Publié : mer. 29/juin/2005 11:25
par comtois
tout ce que tu décris peut être fait avec des sprites , et ça sera beaucoup plus simple !

par exemple , tu dessines à l'écran et tu fais un GrabSprite()

et ensuite tu peux appliquer tes filtres sur les sprites .

Publié : ven. 01/juil./2005 16:31
par jerexgrz
il faut regarder ceci (voir si c'est normal, je pense pas, mais bon !!)
Flipbuffers ca marche tres bien !!
...
If KeyboardPushed(#pb_key_g)
StartDrawing(ScreenOutput())
For Yy = 1 To 32
For Xx = 1 To 32

Plot(192+Xx,256+Yy,128)

Next Xx
Next Yy
StopDrawing()
EndIf

RQ: si on remplace keyboardpushed par keyboardreleased : ca scintille !! :mad:

RQ: Si on remplace la couleur dans plot par un tableau (comme tabdec, ou la fonction RGB) mais exactement comme au dessus le code : ca scintille aussi !! :mad:

Donc ... Est ce normal ??

Publié : ven. 01/juil./2005 21:29
par Backup
Dobro a écrit : et aussi lorsque tu post un code utilise le bouton "code"
en haut de la zone de saisi de ton message !!
(faut l'utiliser 2 fois une fois au debut de ton code et une autre fois a la fin !! :D

Publié : sam. 02/juil./2005 8:44
par comtois
jerexgrz a écrit :RQ: si on remplace keyboardpushed par keyboardreleased : ca scintille !! :mad:

Donc ... Est ce normal ??
Oui !!

Lis l'aide sur keyboardpushed et keyboardreleased , et ensuite relis tous les conseils qui t'ont déjà été donnés dans ce post , et cherche à faire un rapprochement.

Un indice , relis avec attention le fonctionnement du flipbuffer().