Un début de casse briques

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Un début de casse briques

Message 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) 
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Un début de casse briques

Message 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) ;)
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Un début de casse briques

Message 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
Dernière modification par SPH le ven. 16/juil./2010 19:37, modifié 1 fois.
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Un début de casse briques

Message 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 ;)
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Un début de casse briques

Message 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é...
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Un début de casse briques

Message 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 :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Un début de casse briques

Message 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 

Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Un début de casse briques

Message 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 !
Elevé au MSX !
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Un début de casse briques

Message 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)
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Un début de casse briques

Message 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 !
Elevé au MSX !
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Un début de casse briques

Message 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
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Un début de casse briques

Message 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) 


http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Un début de casse briques

Message 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 !!
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre