Probleme de code avec mon mur de brique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Probleme de code avec mon mur de brique

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Probleme de code avec mon mur de brique

Message 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 
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Re: Probleme de code avec mon mur de brique

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Probleme de code avec mon mur de brique

Message 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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Re: Probleme de code avec mon mur de brique

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Probleme de code avec mon mur de brique

Message par falsam »

Tonio a écrit :Non je sais pas comment modifié ça .
URGENT : STOP ... STOP ... STOP ... Il est urgent d’arrêter de coder !!
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Probleme de code avec mon mur de brique

Message par SPH »

Tonio, c'est pourtant facile : si tu veux resserer les briques, tu reduis ton step dans tes "For"

!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.12LTS- 64 bits
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Re: Probleme de code avec mon mur de brique

Message par Tonio »

SPH a écrit :Tonio, c'est pourtant facile : si tu veux resserer les briques, tu reduis ton step dans tes "For"
Merci
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Re: Probleme de code avec mon mur de brique

Message 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:
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Probleme de code avec mon mur de brique

Message 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  
Image
Image
Tonio
Messages : 95
Inscription : ven. 07/avr./2017 14:49
Localisation : Sud Est

Re: Probleme de code avec mon mur de brique

Message 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
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Probleme de code avec mon mur de brique

Message 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
Image
Image
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Probleme de code avec mon mur de brique

Message par TazNormand »

Mets à jour le code de ton premier message avec tes modifs, stp
Image
Image
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Probleme de code avec mon mur de brique

Message 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
Image
Image
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Probleme de code avec mon mur de brique

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre