PureBasic

Forums PureBasic
Nous sommes le Sam 25/Mai/2013 16:02

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 
Auteur Message
 Sujet du message: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 7:21 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 2590
Pour les newbies en programmation, voici les bases d'un jeu de casse briques. A vous de broder le reste :
Code:
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)

_________________
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!

http://xmas.free.fr/


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 9:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 26/Avr/2004 0:40
Messages: 12957
heu !

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

pourquoi fais tu :
Code:
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:
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:
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:
OpenScreen(1024,768,32,"CasseBriques")


et vive les
Code:
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) ;)

_________________
Image


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 9:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 2590
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:
CreateSprite(#raquette,0,0,100,20)
StartDrawing(SpriteOutput(#raquette))
DisplaySprite(x,0,0)
StopDrawing()

:? :? :? :? :? :? :?
Image

_________________
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!

http://xmas.free.fr/


Dernière édition par SPH le Ven 16/Juil/2010 19:37, édité 1 fois.

Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 10:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 26/Avr/2004 0:40
Messages: 12957
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 ;)

_________________
Image


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 10:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 2590
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é...

_________________
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!

http://xmas.free.fr/


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 10:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 26/Avr/2004 0:40
Messages: 12957
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 :)

_________________
Image


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 11:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 26/Avr/2004 0:40
Messages: 12957
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:


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


_________________
Image


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 13:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 728
Localisation: Guadeloupe
Hugh !
Citation:
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)
viewtopic.php?f=1&t=10368&hilit=grabsprite

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

Hasta la vista !

_________________
Elevé au MSX !


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 13:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 2590
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)

_________________
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!

http://xmas.free.fr/


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Dim 30/Mai/2010 13:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 728
Localisation: Guadeloupe
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 !


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Mar 01/Juin/2010 17:33 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 2139
Tu utilises ton écran comme sprite tout simplement , c'est optimisé , ca marche très bien.

En gros :

Citation:
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


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Mer 14/Juil/2010 11:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 09/Nov/2005 9:53
Messages: 2590
Code:
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)



_________________
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!
i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!

http://xmas.free.fr/


Haut
 Profil  
 
 Sujet du message: Re: Un début de casse briques
MessagePosté: Sam 21/Aoû/2010 19:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 14/Oct/2004 19:48
Messages: 417
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 !!

_________________
Ceci n'est pas une signature.


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 13 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye