Page 1 sur 2

Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:06
par Tonio
Bonjour
j'ai commencer à codé un mur e brique pour un cassebriques
Mon probleme c'est que je sais pas quoi écrire dans ForEach next l'afficher

merci d'avance


Code : Tout sélectionner

;--- Wall test ---

;--Initialisation
EnableExplicit

If InitSprite()=0 Or InitKeyboard()=0 Or InitSound()=0 Or InitMouse()=0
  MessageRequester("Erreur", "Impossible d'initialiser le jeux ")
  End
EndIf

;--Constantes 
Enumeration MainForm
  #Main_Window
EndEnumeration

Enumeration Wall
  #Spr_brique
EndEnumeration  

;--Structure
Structure sBrique
  sprite.i
  briqueX.i
  briqueY.i
EndStructure  

;-- liste chainée

Global  NewList mur.sBrique(),gLigne,gColonne
;-- variables globales 
Global gWidth = 800,gHeight = 600,gEvent

;-- Création de la fenetre 
OpenWindow(#Main_Window,0,0,gWidth,gHeight,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Window),0,0,gWidth,gHeight)
SetWindowTitle(#Main_Window,"Test de Mur de briques  ")

;-- Création d'une brique 
CreateSprite(#Spr_brique,50,16)
StartDrawing(SpriteOutput(#Spr_brique))
Box(0, 0, 50,16, RGB(0, 128, 192))
StopDrawing()
;mur\briqueX = 110
;mur\briqueY = 30
;-- Création du mur de briques 6 sur 10 
For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = gLigne *100
      \briqueY =  gColonne *50
      
    EndWith  
  Next 
Next  







;-- Boucle du programme 

Repeat
  Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
      End
    EndSelect
    Until gEvent=0
    ClearScreen(RGB(0, 0, 0))
    ;-- Affichage 
    ForEach mur()
      
     Next 
    ExamineKeyboard()
      FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
End

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:26
par falsam
Et hop troisiéme sujet de tonio sur le théme d'un casse brique :mrgreen:
Tonio a écrit :je sais pas quoi écrire dans ForEach next l'afficher
Afficher les sprites.

Code : Tout sélectionner

;-- Affichage 
  ForEach mur()
    DisplaySprite(mur()\sprite, mur()\briqueX, mur()\briqueY) 
  Next 

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:33
par Tonio
Merci falsam
mais comment faire pour ç a ressemble a un mur de casse brique car là il y a trop d'espacement entre les briques

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:40
par falsam
Tonio a écrit :Merci falsam
mais comment faire pour ç a ressemble a un mur de casse brique car là il y a trop d'espacement entre les briques
En modifiant cette partie du code

Code : Tout sélectionner

For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = gLigne *100
      \briqueY =  gColonne *50
      
    EndWith  
  Next 
Next  
tu sais quand meme ce que tu fais non ?

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:42
par Tonio
falsam a écrit :
Tonio a écrit :Merci falsam
mais comment faire pour ç a ressemble a un mur de casse brique car là il y a trop d'espacement entre les briques
En modifiant cette partie du code

Code : Tout sélectionner

For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = gLigne *100
      \briqueY =  gColonne *50
      
    EndWith  
  Next 
Next  
tu sais quand meme ce que tu fais non ?
Non je sais pas comment faire pour modifié , j'ai juste repris ce que m'avais appris avec les invaders

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:45
par falsam
Tonio a écrit :Non je sais pas comment modifié ça .
URGENT : STOP ... STOP ... STOP ... Il est urgent d’arrêter de coder !!

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:48
par SPH
Tonio, c'est pourtant facile : si tu veux resserer les briques, tu reduis ton step dans tes "For"

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:51
par Tonio
SPH a écrit :Tonio, c'est pourtant facile : si tu veux resserer les briques, tu reduis ton step dans tes "For"
Merci

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 16:52
par Tonio
falsam a écrit :
Tonio a écrit :Non je sais pas comment modifié ça .
URGENT : STOP ... STOP ... STOP ... Il est urgent d’arrêter de coder !!
Montre moi svp mais tu le fera pas :mrgreen:

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 17:00
par TazNormand
falsam a écrit :En modifiant cette partie du code

Code : Tout sélectionner

For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = gLigne *100
      \briqueY =  gColonne *50
      
    EndWith  
  Next 
Next  
L'extrait de code dit :
Tu boucles sur les 6 lignes,
==> pour chaque ligne, tu boucles sur les 10 colonnes
====> pour chaque colonne, tu ajoute un élément "mur()", une brique donc
======> pour cet élément (brique), tu copies le sprite originel d'une brique
======> pour ce même élément, la position X (horizontale) de la brique correspond à la valeur de la ligne multipliée par 100
======> pour ce même élément, la position Y (verticale) de la brique correspond à la valeur de la colonne multipliée par 50.

Donc si tu veux éviter les espaces, il faut changer les valeurs des multiplicateurs de positions X et Y.

Si tes briques font 80 de large, et bien tu multiplies la position X par 80, et si elles font 40 de haut, et bien tu multiplies par 40 ; tu ajoutes 1 à chaque position pour éviter le chevauchement :

Code : Tout sélectionner

For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = (gLigne *80) + 1
      \briqueY =  (gColonne *40) + 1
     
    EndWith 
  Next
Next  

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 17:59
par Tonio
Merci taz

Mais
Donc si tu veux éviter les espaces, il faut changer les valeurs des multiplicateurs de positions X et Y.
j'ai beau modifié il y a toujours des espacements

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 18:21
par TazNormand
Est-ce que tu as lu ce que j'ai écrit plus haut ?

La question que tu dois te poser est : quelles sont les dimensions de mon sprite "brique" ?

Et après tu affiches tes sprites tous les multiples de ces dimensions !!!

Prends un cahier à petit carreaux de 5mm x 5mm, tu es bien d'accord que si tu en "prends" 5 de large sur 1 de haut, tu auras un "bloc" de 25mm, et si tu en prends 5 de large sur 2 de haut, tu auras un bloc de 25mm de large sur 10mm de haut.

C'est pareil pour tes sprites, mais en pixels : si ton sprite "Brique" fait 40 pixel de large sur 20 de haut, pour les afficher en ligne tu en place un tous 40 pixels (+1 de décalage), et idem pour les colonnes, tu en place un tous les 20 pixels (+1 de décalage également)

Dans le code plus haut, tu boucles sur les lignes, et comme tu vas de 1 à 16, tu veux donc 6 lignes de briques. pour chaque ligne tu boucles de 1 à 10, donc 10 colonnes, ce qui signifie que chaque ligne aura 10 briques (= colonnes).

Comme tu veux les afficher côte à côte, tu place ta première brique en (1 * 100) donc 100 puisque ligne vaut 1 pour la position X.
pour la position Y, ta brique sera en (1*50) donc 50 puisque la colonne vaut 1.

Deuxième passage de la boucle gColonne, la position Y ne change pas, donc on reste sur notre "ligne", mais la position X elle, change en (2x100) donc 200.

C'est pour cela que je t'ai dit d'adapter le multiplicateur par la taille réelle du sprite "brique" et d'ajouter "+1" pour éviter un chevauchement de sprite.

tu n'as qu'à mettre cette taille de sprite dans des variables, et comme ça tu peux adapter sui jamais tu changes ton sprite de brique :

Code : Tout sélectionner

For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = (gLigne * SprBriqueLargeur) + 1 ; Rappel : le +1 est là pour éviter le chevauchement des sprites
      \briqueY =  (gColonne * SprBriqueHauteur) + 1
     
    EndWith 
  Next
Next 
Si après tous ça tu ne comprends pas, je ne peux plus rien pour toi

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 18:23
par TazNormand
Mets à jour le code de ton premier message avec tes modifs, stp

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 18:32
par TazNormand
J'ai repris ton code en 1 (avant que tu n'aies fait quelques modif que ce soit, donc le 10/07/2017 à 19h28)

J'ai modifié les dimensions de ta box pour la création du sprite, car ton sprite fait 50 pixels de large sur 16 de haut, et la box que tu dessines dans ce sprite fait 51x17 car tu commençais en 0,0 pour finir en 50,16, et comme on compte 0,0 comme étant le premier pixel, de 0 à 50 on obtient 51 pixels, pas 50.

Ensuite, dans la boucle de création du mur, j'ai appliqué ce que je t'ai décrit plus haut : tous les 50 (+1) et tous les 16 (+1).

Dans ta bouche ForEach mur(), j'ai affiché les sprites en utilisant les coordonnées entrées dans la liste chaînée.

Code : Tout sélectionner

;--- Wall test ---

;--Initialisation
EnableExplicit

If InitSprite()=0 Or InitKeyboard()=0 Or InitSound()=0 Or InitMouse()=0
  MessageRequester("Erreur", "Impossible d'initialiser le jeux ")
  End
EndIf

;--Constantes
Enumeration MainForm
  #Main_Window
EndEnumeration

Enumeration Wall
  #Spr_brique
EndEnumeration 

;--Structure
Structure sBrique
  sprite.i
  briqueX.i
  briqueY.i
EndStructure 

;-- liste chainée

Global  NewList mur.sBrique(),gLigne,gColonne
;-- variables globales
Global gWidth = 800,gHeight = 600,gEvent

;-- Création de la fenetre
OpenWindow(#Main_Window,0,0,gWidth,gHeight,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Window),0,0,gWidth,gHeight)
SetWindowTitle(#Main_Window,"Test de Mur de briques  ")

;-- Création d'une brique
CreateSprite(#Spr_brique,50,16)
StartDrawing(SpriteOutput(#Spr_brique))
Box(0, 0, 49,15, RGB(0, 128, 192))
StopDrawing()
;mur\briqueX = 110
;mur\briqueY = 30
;-- Création du mur de briques 6 sur 10
For gLigne=1 To 6
  For gColonne= 1 To 10
    AddElement(mur())
    With mur()
      \sprite = CopySprite(#Spr_brique,#PB_Any)
      \briqueX = (gLigne * 50) + 1
      \briqueY =  (gColonne * 16) + 1
      Debug \briqueX
      Debug \briqueY
     
    EndWith 
  Next
Next 



;-- Boucle du programme

Repeat
  Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
      End
    EndSelect
    Until gEvent=0
    ClearScreen(RGB(0, 0, 0))
    ;-- Affichage
    ForEach mur()
     DisplaySprite(mur()\sprite,mur()\briqueX,mur()\briqueY)
     Next
    ExamineKeyboard()
      FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
End

Re: Probleme de code avec mon mur de brique

Publié : lun. 10/juil./2017 18:48
par microdevweb
Voila un exemple de ton code modifié

Code : Tout sélectionner

;--- Wall test ---

;--Initialisation
EnableExplicit

If InitSprite()=0 Or InitKeyboard()=0 Or InitSound()=0 Or InitMouse()=0
  MessageRequester("Erreur", "Impossible d'initialiser le jeux ")
  End
EndIf

;--Constantes 
Enumeration MainForm
  #Main_Window
EndEnumeration

Enumeration Wall
  #Spr_brique
EndEnumeration  

;--Structure
Structure sBrique
  sprite.i
  briqueX.i
  briqueY.i
EndStructure  

;-- liste chainée

Global  Dim mur.sBrique(6,10),gLigne,gColonne
;-- variables globales 
Global gWidth = 800,gHeight = 600,gEvent

;-- Création de la fenetre 
OpenWindow(#Main_Window,0,0,gWidth,gHeight,"",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Main_Window),0,0,gWidth,gHeight)
SetWindowTitle(#Main_Window,"Test de Mur de briques  ")

;-- Création d'une brique 

Procedure MakeBrique()
  Protected gLigne,gColonne,w=80,h=60,X,Y
  For gLigne=0 To 5
    X=0
    For gColonne= 0 To 9
      With mur(gLigne,gColonne)
        \sprite = CreateSprite(#PB_Any,w,h)
        \briqueX =X
        \briqueY =Y
        StartDrawing(SpriteOutput(\sprite))
        Box(0, 0, w,h, RGB(0, Random(255,0), Random(255,0)))
        StopDrawing()
        X+W
      EndWith
    Next
    Y+H
  Next
EndProcedure
Procedure DrawWall()
  Protected gLigne,gColonne
  For gLigne=0 To 5
    For gColonne= 0 To 9
      With mur(gLigne,gColonne)
       DisplaySprite(\sprite,\briqueX,\briqueY)
      EndWith
    Next
  Next
EndProcedure




MakeBrique()
;-- Boucle du programme 

Repeat
  Repeat
    gEvent=WindowEvent()
    Select gEvent
      Case #PB_Event_CloseWindow
      End
    EndSelect
    Until gEvent=0
    ClearScreen(RGB(0, 0, 0))
    ;-- Affichage 
    DrawWall()
    ExamineKeyboard()
      FlipBuffers()
Until KeyboardReleased(#PB_Key_Escape)
End