Page 1 sur 1

Un début de casse briques

Publié : dim. 30/mai/2010 7:21
par SPH
Pour les newbies en programmation, voici les bases d'un jeu de casse briques. A vous de broder le reste :

Code : Tout sélectionner

If InitSprite() And InitMouse() And InitKeyboard() 
Else
MessageRequester("Erreur", "InitSprite() And InitMouse() And InitKeyboard() : impossible")
End
EndIf

OpenScreen(1024,768,32,"CasseBriques") 

;;;;;;;;;;;; dessins de la balle, de la raquette et des briques ;;;;;;;;;;;;;
GrabSprite(0,0,0,1,1) ; pas de brique

StartDrawing(ScreenOutput()) 
Circle(6,6,6,RGB(255,255,255)) 
StopDrawing() 
GrabSprite(254,0,0,12,12); notre balle

StartDrawing(ScreenOutput()) 
For i=0 To 20
  LineXY(0,i,100,i,RGB(i*8,100+i*5,255)) 
Next
StopDrawing() 
GrabSprite(255,0,0,100,20); notre raquette

StartDrawing(ScreenOutput()) 
For i=0 To 20
  LineXY(0,i,36,i,RGB(255-i*10,i*5,0)) 
Next
StopDrawing() 
GrabSprite(1,0,0,36,20); brique 1

StartDrawing(ScreenOutput()) 
For i=0 To 20
  LineXY(0,i,36,i,RGB(0,255-i*10,i*5)) 
Next
StopDrawing() 
GrabSprite(2,0,0,36,20); brique 2

StartDrawing(ScreenOutput()) 
For i=0 To 20
  LineXY(0,i,36,i,RGB(i*5,0,255-i*10)) 
Next
StopDrawing() 
GrabSprite(3,0,0,36,20); brique 3

StartDrawing(ScreenOutput()) 
For i=0 To 20
  LineXY(0,i,36,i,RGB(255-i*11,255-i*11,i*8)) 
Next
StopDrawing() 
GrabSprite(4,0,0,36,20); brique 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;; la map ;;;;;;;;;;;;;;;;
Dim briques(26,20)
For u=0 To 20
  For i=0 To 26
    briques(i,u)=Random(4)
  Next
Next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bx.f
by.f
bxf.f=-2.3
byf.f=-2

; ##########################
; ########Boucle du jeu #########
; ##########################
Repeat
  ClearScreen(0)
  For u=0 To 20
  For i=0 To 26
    DisplaySprite(briques(i,u),i*38,u*22)
  Next
Next

ExamineMouse()
Mb_Left=MouseButton(#PB_MouseButton_Left)
  mx=MouseX()-50
  DisplaySprite(255,mx,728)
  
If ok=0
  DisplaySprite(254,mx+25,716)
  If Mb_Left
    ok=1
    bx=mx+25
    by=716
  EndIf
Else
  bx+bxf
  by+byf
  If bx<0 Or bx>1012
    bxf*-1
    bx+bxf
  EndIf
  If by<0
    byf*-1
    by+byf
  EndIf
  DisplayTransparentSprite(254,bx,by)
EndIf

FlipBuffers()
  
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 

Re: Un début de casse briques

Publié : dim. 30/mai/2010 9:51
par Backup
heu !

pourquoi tu grab les sprites
au lieu de les dessiner carrement ?

pourquoi fais tu :

Code : Tout sélectionner

StartDrawing(ScreenOutput())
For i=0 To 20
  LineXY(0,i,100,i,RGB(i*8,100+i*5,255))
Next
StopDrawing()
GrabSprite(255,0,0,100,20); notre raquette

au lieu de :

Code : Tout sélectionner

CreateSprite(#raquette,0,0,100,20)
StartDrawing(SpriteOutput(#raquette))
For i=0 To 20
  LineXY(0,i,100,i,RGB(i*8,100+i*5,255))
Next
StopDrawing()
qui est la façon la plus logique de fabriquer un sprite

grabsprite est utile pour les planches de sprite
mais a partir du moment ou tu utilise l'ecran.. ça n'as plus de sens :)


de plus sous Linux
ceci plante avec invalide memory

Code : Tout sélectionner

GrabSprite(0,0,0,1,1) ; pas de brique

de plus
si ce code s'adresse a des débutants , autant leur donner les bons reflexe

a bas les :

Code : Tout sélectionner

OpenScreen(1024,768,32,"CasseBriques")
et vive les

Code : Tout sélectionner

ExamineDesktops()
OpenScreen(DesktopWidth(),DesktopHeight(),DesktopDepth(),"CasseBriques")
ben oui :) autant especter la résolution de l'utilisateur
moi par exemple j'utilise un netbook NC10 en (1024x600) ;)

Re: Un début de casse briques

Publié : dim. 30/mai/2010 9:57
par SPH
Haaaa, c'est parce que je ne l'ai jamais fait. Et puis je reste en colere pour un truc qui ne m'oriente pas vers le dessin de sprite avec cette methode. Ma colere, c'est que je n'ai jamais reussi a créer un sprite en dessinant sur ce sprite un autre sprite !!! On a eu beau me l'expliquer (je crois), je reste faché qu'on ne puisse pas faire :

Code : Tout sélectionner

CreateSprite(#raquette,0,0,100,20)
StartDrawing(SpriteOutput(#raquette))
DisplaySprite(x,0,0)
StopDrawing()
:? :? :? :? :? :? :?
Image

Re: Un début de casse briques

Publié : dim. 30/mai/2010 10:05
par Backup
je ne vois pas trop l'interet de dessiner un sprite sur un autre
mais si tu as besoin de faire ça
tu peut utiliser point()/plot() pour faire ça :)

ps: j'avais réediter mon message ci dessus ;)

Re: Un début de casse briques

Publié : dim. 30/mai/2010 10:14
par SPH
Bin moi, je vois un enorme interet a tamponer un sprite sur un autre. Le coup du plot, c'est un peu lourd, et je ne serais pas étonné que ca plante si on sort du sprite. Franchement, tamponer un sprite, je trouverais ca extra. Si fred le veux... mais bon, je ne veux pas l'embeter avec ca...

EDIT : pour la taille de l'ecran, ouai daccord, mais quand on a une map pour casse briques de x briques sur y, ton changement de taille d'ecran fout tout en l'air. Ou alors, tout est rapetissé...

Re: Un début de casse briques

Publié : dim. 30/mai/2010 10:25
par Backup
SPH a écrit : EDIT : pour la taille de l'ecran, ouai daccord, mais quand on a une map pour casse briques de x briques sur y, ton changement de taille d'ecran fout tout en l'air. Ou alors, tout est rapetissé...
faut aussi mettre les X,y des briques reatif au coordonées de l'ecran
mais c'est vrais que ça complique le code :)

Re: Un début de casse briques

Publié : dim. 30/mai/2010 11:17
par Backup
j'ai un peut reflechi a ton histoire de copie de sprite sur sprite

la solution la plus simple consiste a passer par une image

tu recupere l'image du sprite original dans une image
et tu te sert de cette image pour creer un nouveau sprite

comme ça :

Code : Tout sélectionner



Enumeration
    #sprite_original
    #sprite_copie
    #image_tampon
EndEnumeration

; Test
ExamineDesktops()
EcranX =DesktopWidth(0)
EcranY =DesktopHeight(0)
InitSprite(): InitKeyboard()

;hwnd=OpenWindow(1,0,0,EcranX,EcranY,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget  )
OpenScreen (EcranX,EcranY,32,"Test")



; *********** dessine le  sprite *****************
taille_x_origine=32
taille_y_origine=32
taille_x_copie=32
taille_y_copie=32

;  ******************* creation du sprite original celui qu'on va copier *********************
CreateSprite(#sprite_original, taille_x_origine, taille_y_origine) 
    ; dessine le sprite
StartDrawing(SpriteOutput(#sprite_original)) 
    Box( 0,0, taille_x_origine, taille_y_origine,RGB(255,166,56))
    Circle(taille_x_origine/2,taille_y_origine/2,taille_y_origine/2,RGB(0,0,0))
StopDrawing() 
; ***********************************************************************************

; voici comment copier un sprite sur un autre

; ******************** copie du sprite ***********************
CreateSprite(#sprite_copie, taille_x_copie, taille_y_copie) 
    ; copie le sprite dans une image
StartDrawing(SpriteOutput(#sprite_original))  ; on va creer une image a partir du sprite original
    Resultat = GrabDrawingImage(#image_tampon, 0,0,taille_x_origine, taille_x_origine) ; on creer l'image
StopDrawing() 

; creer le sprite copie;  avec l'image piqué sur le sprite oiriginal
StartDrawing(SpriteOutput(#sprite_copie))  ; creer le sprite qui va recevoir l'image du sprite original
    Resultat = DrawImage(ImageID(#image_tampon),0,0, taille_x_copie, taille_x_copie) ; on 'tamponne' l'image du sprite original dans le sprite copie
StopDrawing() 



; *********************************************************

x_origine=100
y_origine=EcranY/2
x_copie= 300
y_copie=EcranY/2

Repeat
   ; ****************** affichage du resultat ***************************
    DisplaySprite(#sprite_original,x_origine,y_origine)  ; affiche le sprite original
    DisplaySprite(#sprite_copie,x_copie,y_copie)  ; affiche sa copie
    ; ********************************************************************
    StartDrawing(ScreenOutput())
        DrawText(EcranX/2,(EcranY/2)+50,"appuis sur Escape pour quitter",RGB($FF,$FF,$FF))
    StopDrawing()
    
    FlipBuffers() 
    ExamineKeyboard()
    If  KeyboardPushed(#PB_Key_Escape)
        End
    EndIf 
     ClearScreen(0)
ForEver 


Re: Un début de casse briques

Publié : dim. 30/mai/2010 13:06
par Huitbit
Hugh !
Haaaa, c'est parce que je ne l'ai jamais fait. Et puis je reste en colere pour un truc qui ne m'oriente pas vers le dessin de sprite avec cette methode. Ma colere, c'est que je n'ai jamais reussi a créer un sprite en dessinant sur ce sprite un autre sprite !!! On a eu beau me l'expliquer (je crois), je reste faché qu'on ne puisse pas faire :
:?: :?: :?:

Avant c'était avec Usebuffer()
Depuis directX9 c'est plus possible.

G-Rom a trouvé éune solution élégante et peu gourmande (on peut l'utiliser en direct)
http://www.purebasic.fr/french/viewtopi ... grabsprite

En résumé tu superposes autant de sprites que tu veux et puis tu "grab" tout ça !

Hasta la vista !

Re: Un début de casse briques

Publié : dim. 30/mai/2010 13:35
par SPH
Si c'est superposer plusieurs sprites sur un SCREEN et tout graber, alors tu n'as pas compris. Ca, tout le monde sait le faire. L'histoire, c'est de mettre un sprite dans un sprite !! (je precise car je n'ai pas trouvé le morceau de code dans ton lien qui fasse ca)

Re: Un début de casse briques

Publié : dim. 30/mai/2010 13:54
par Huitbit
Hello !
C'est le code de G-Rom qu'il faut prendre.

Bin, justement depuis directx9 ce n'est plus possible (en tout cas, personne n'a proposé de solution!)

Avant on utilisait Usebuffer(sprite qui sert de support)

Ce que G-Rom propose, c'est de faire presque la même chose mais de manière moins pratique.

Hasta la vista !

Re: Un début de casse briques

Publié : mar. 01/juin/2010 17:33
par G-Rom
Tu utilises ton écran comme sprite tout simplement , c'est optimisé , ca marche très bien.

En gros :
ClearScreen(0) ; Couleur du fond de ton sprite

DisplaySprite(...
DisplaySprite(...
DisplaySprite(...
DisplaySprite(...

MonSpriteConteneur = GrabSprite(#PB_Any...
MonSpriteConteneur contient donc d'autres sprites.
C'est la seule solution avec Dx9

Re: Un début de casse briques

Publié : mer. 14/juil./2010 11:09
par SPH

Code : Tout sélectionner

If InitSprite() And InitMouse() And InitKeyboard() 
Else
MessageRequester("Erreur", "InitSprite() And InitMouse() And InitKeyboard() : impossible")
End
EndIf

OpenScreen(1024,768,32,"CasseBriques") 

lenx=32
leny=16
;;;;;;;;;;;; dessins de la balle, de la raquette et des briques ;;;;;;;;;;;;;
GrabSprite(0,0,0,1,1) ; pas de brique

StartDrawing(ScreenOutput()) 
Circle(4,4,4,RGB(255,255,255)) 
StopDrawing() 
GrabSprite(254,0,0,9,9); notre balle

ClearScreen(0)

StartDrawing(ScreenOutput()) 
Box(0,0,lenx,leny,RGB(255,255,255)) 
Box(1,1,lenx-1,leny-1,RGB(5,5,5)) 
Box(1,1,lenx-2,leny-2,RGB(150,150,150)) 
Box(2,2,lenx-3,leny-3,RGB(70,70,70)) 
Box(2,2,lenx-4,leny-4,0) 
StopDrawing() 
GrabSprite(256,0,0,lenx,leny); le cadre des briques

StartDrawing(ScreenOutput()) 
For i=0 To leny
  LineXY(0,i,100,i,RGB(i*8,100+i*5,255)) 
Next
StopDrawing() 
GrabSprite(255,0,0,100,leny); notre raquette

StartDrawing(ScreenOutput()) 
For i=0 To leny
  LineXY(0,i,lenx,i,RGB(255-i*10,i*5,0)) 
Next
StopDrawing() 
DisplayTranslucentSprite(256,0,0,127)
GrabSprite(1,0,0,lenx,leny); brique 1

StartDrawing(ScreenOutput()) 
For i=0 To leny
  LineXY(0,i,lenx,i,RGB(0,255-i*10,i*5)) 
Next
StopDrawing() 
DisplayTranslucentSprite(256,0,0,127)
GrabSprite(2,0,0,lenx,leny); brique 2

StartDrawing(ScreenOutput()) 
For i=0 To leny
  LineXY(0,i,lenx,i,RGB(i*5,0,255-i*10)) 
Next
StopDrawing() 
DisplayTranslucentSprite(256,0,0,127)
GrabSprite(3,0,0,lenx,leny); brique 3

StartDrawing(ScreenOutput()) 
For i=0 To leny
  LineXY(0,i,lenx,i,RGB(255-i*11,255-i*11,i*8)) 
Next
StopDrawing() 
DisplayTranslucentSprite(256,0,0,127)
GrabSprite(4,0,0,lenx,leny); brique 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;; la map ;;;;;;;;;;;;;;;;
cmbx=1024/lenx
cmby=550/leny

Dim briques(cmbx,cmby)
For u=0 To cmby
  For i=0 To cmbx
    briques(i,u)=Random(4)
  Next
Next
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

bx.f
by.f
bxf.f=-2.3
byf.f=-2

; ##########################
; ########Boucle du jeu #########
; ##########################
Repeat
  ClearScreen(0)
  For u=0 To cmby
  For i=0 To cmbx
    DisplaySprite(briques(i,u),i*lenx,u*leny)
  Next
Next

ExamineMouse()
Mb_Left=MouseButton(#PB_MouseButton_Left)
  mx=MouseX()-50
  DisplaySprite(255,mx,728)
  
If ok=0
  DisplaySprite(254,mx+25,716)
  If Mb_Left
    ok=1
    bx=mx+25
    by=716
  EndIf
Else
  bx+bxf
  by+byf
  If bx<0 Or bx>1012
    bxf*-1
    bx+bxf
  EndIf
  If by<0
    byf*-1
    by+byf
  EndIf
  DisplayTransparentSprite(254,bx,by)
EndIf

FlipBuffers()
  
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 



Re: Un début de casse briques

Publié : sam. 21/août/2010 19:47
par Fig
Dites c'est bien sympa que Usebuffer ne fonctionne plus, mais on ne devrait pas le noter quelque par dans la doc ça, huu ?

Parce que la semaine dernière j'ai passé 3 jours à ne pas comprendre pourquoi ça ne fonctionnait pas et j'ai dû utiliser la méthode du grabsprite, en désespoir de cause, ignorant pourquoi Usebuffer ne fonctionnait pas (plus) chez moi ! :roll:

C'est déja assez désespérant de chercher des bugs, si en plus ça ne vient pas de soi, c'est vraiment une grosse perte de temps !!