Exemple casse briques

Généralités sur la programmation 3D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Exemple casse briques

Message par comtois »

Il n'y a pas de score, je ne teste pas la fin de la partie, je ne teste pas la direction de la balle pour la corriger au besoin(il arrive qu'elle rebondisse d'un mur à l'autre indéfiniment).
J'ai juste bricolé ce truc pour voir ce que ça donnerait , et donner des idées pour d'autres jeux de ce type.

Le moteur physique fait tout le boulot, c'est cool.

Barre espace pour lancer la bille, et les flèches gauche et droite pour diriger la raquette.

[EDIT]
Correction suite à la remarque de Mesa, et ajout d'une correction de la trajectoire de la balle, pour éviter qu'elle rebondisse indéfiniment entre 2 murs, et ajout d'une petite animation quand une brique est touchée.

Code : Tout sélectionner

IncludeFile #PB_Compiler_Home + "Examples/3D/Screen3DRequester.pb"

Macro CreateCadre(x, y, z, sx, sy, sz, m, r, f)
  Cadre = CreateEntity(#PB_Any, MeshID(1), MaterialID(2), x, y, z)
  ScaleEntity(Cadre, sx, sy, sz)
  EntityPhysicBody(Cadre, #PB_Entity_BoxBody, m, r, f)
EndMacro


#CameraSpeed = 1

Define.f KeyX, KeyY, MouseX, MouseY, Angle = 145
NewList BriquesTouchees()

If InitEngine3D()
  
  
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Textures", #PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Scripts",#PB_3DArchive_FileSystem)
    Add3DArchive(#PB_Compiler_Home + "Examples/3D/Data/Packs/desert.zip", #PB_3DArchive_Zip)
    Parse3DScripts()
    
    WorldShadows(#PB_Shadow_Modulative)
    WorldGravity(0)
    
    ;-Materials
    CreateMaterial(0, LoadTexture(0, "Wood.jpg"))
    GetScriptMaterial(1, "SphereMap/SphereMappedRustySteel")
    GetScriptMaterial(2, "Color/Blue")
    GetScriptMaterial(3, "Scene/GroundBlend")
    
    ;-Mesh
    CreateCube(1, 1.0)
    CreateSphere(2, 1, 30, 30)
    
    
    ;-Entity
    Sphere = CreateEntity(#PB_Any, MeshID(2), MaterialID(1), 0, 50, 0)
    EntityPhysicBody(Sphere, #PB_Entity_SphereBody, 1, 1, 0)
    EntityLinearFactor(Sphere, 1, 1, 0)
    
    ; Cadre
    CreateCadre(  0,  0, 0, 50, 1,  4, 0, 1.0, 0)
    CreateCadre(  0, 90, 0, 50, 1,  4, 0, 1.0, 0)
    CreateCadre(-25, 45, 0,  1, 90, 4, 0, 1.0, 0)
    CreateCadre( 25, 45, 0,  1, 90, 4, 0, 1.0, 0) 
    
    
    ;Briques
    For j=0 To 3
      For i = 0 To 10
        n + 1
        Brique = CreateEntity(n, MeshID(1), MaterialID(0), 20 - i * 4, 80 - j * 4, 0)
        ScaleEntity(n, 2, 2, 2)
        EntityPhysicBody(n, #PB_Entity_BoxBody, 0, 1, 0)
      Next
    Next
    
    ;Raquette
    Raquette = CreateEntity(#PB_Any, MeshID(1), MaterialID(1), 0, 40, 0)
    ScaleEntity(Raquette, 6, 1, 2)
    EntityPhysicBody(Raquette, #PB_Entity_BoxBody, 0, 1, 0)
    
    ;-Camera
    CreateCamera(0, 0,  0, 100, 100)
    MoveCamera(0, 0, 45, -110, #PB_Absolute)
    CameraLookAt(0, 0,  45, 0)
    
    ;-Skybox
    SkyBox("desert07.jpg")
    
    ;-Light
    CreateLight(0, RGB(255, 255, 255), 100, 800, -500)
    AmbientColor(RGB(20, 20, 20))
    
    Repeat
      Screen3DEvents()
      
      ExamineMouse()
      
      If ExamineKeyboard()
        If KeyboardPushed(#PB_Key_Left) And EntityX(Raquette) < 22
          MoveEntity(Raquette, EntityX(Raquette)+0.5, EntityY(Raquette), EntityZ(Raquette),#PB_Absolute)
        ElseIf KeyboardPushed(#PB_Key_Right) And EntityX(Raquette) > -22
          MoveEntity(Raquette, EntityX(Raquette)-0.5, EntityY(Raquette), EntityZ(Raquette),#PB_Absolute)
        EndIf 
        
        If KeyboardReleased(#PB_Key_Space)
          ApplyEntityImpulse(Sphere,  Random(20)-10, -60, 0)
        EndIf     
        
      EndIf
      
      If Abs(GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityY)) < 2 And GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityX) <> 0
        ApplyEntityImpulse(Sphere,  0, GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityY) * 3, 0)
        Debug "correction Y" + StrF(GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityY))
      EndIf
      
      If Abs(GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityX)) < 2 And GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityY) <> 0
        ApplyEntityImpulse(Sphere, GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityX) * 3, 0, 0)
        Debug "correction X" + StrF(GetEntityAttribute(Sphere, #PB_Entity_LinearVelocityX))
      EndIf  
      
      SetEntityAttribute(Sphere, #PB_Entity_MaxVelocity, 60)
      
      
      If ExamineWorldCollisions(#False)
        
        While NextWorldCollision()
          
          If SecondWorldCollisionEntity() <= n
            AddElement(BriquesTouchees())
            x.f = EntityX(SecondWorldCollisionEntity())
            y.f = EntityY(SecondWorldCollisionEntity())
            z.f = EntityZ(SecondWorldCollisionEntity())
            BriquesTouchees() = CreateEntity(#PB_Any, MeshID(1), MaterialID(0), x, y, z)
            ScaleEntity(BriquesTouchees(), 2, 2, 2)
            
            FreeEntity(SecondWorldCollisionEntity())
          ElseIf FirstWorldCollisionEntity() <= n
            FreeEntity(FirstWorldCollisionEntity()) 
            
          EndIf
        Wend
        
      EndIf
      
      ForEach BriquesTouchees()
        RotateEntity(BriquesTouchees(), 1, 1, 1, #PB_Relative)
        MoveEntity(BriquesTouchees(), 0, -0.3, 0, #PB_Relative)
        If EntityY(BriquesTouchees()) < 35
          FreeEntity(BriquesTouchees())
          DeleteElement(BriquesTouchees())
        EndIf  
      Next
      
      If EntityY(Sphere) < 35
        MoveEntity(Sphere, 0, 50, 0, #PB_Absolute)
      EndIf
      
      RenderWorld(10)
      Screen3DStats()
      FlipBuffers()
      
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
    
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized",0)
EndIf

End
Dernière modification par comtois le ven. 25/avr./2014 11:06, modifié 2 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Exemple casse briques

Message par Ar-S »

Merci pour cet exemple, il fonctionne bien.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Exemple casse briques

Message par flaith »

Merci, pas mal du tout
Et...bien sur la derniere brique restante et la balle faisait des aller-retours indefiniement :P
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Exemple casse briques

Message par Mesa »

J'ai une erreur accès mémoire invalide au niveau du Parse3DScripts() sous Windows Xp 32b.

C'est un bug assez ancien.

Il suffit de déplacer Parse3DScripts() après le If Screen3DRequester() pour que ça fonctionne.

M.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Exemple casse briques

Message par comtois »

Petites modifs :

- correction suite à la remarque de Mesa
- ajout d'une correction de la trajectoire de la balle, pour éviter qu'elle rebondisse indéfiniment entre 2 murs
- parfois la balle rebondissait sur une brique sans la détruire , j'ai modifié le temps de la simulation physique dans RenderWorld(), apparemment je ne loupe plus de briques ?
- ajout d'une petite animation quand une brique est touchée
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Fred
Site Admin
Messages : 2807
Inscription : mer. 21/janv./2004 11:03

Re: Exemple casse briques

Message par Fred »

Super :)
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Exemple casse briques

Message par Fig »

RenderWorld(10) Acces memoire invalide... :|
PB 5.22 LTS
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
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Exemple casse briques

Message par graph100 »

Si le même que moi : Utilise OpenGl comme bibliothèque sous-système lors de la compilation
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Exemple casse briques

Message par comtois »

Fig a écrit :RenderWorld(10) Acces memoire invalide... :|
PB 5.22 LTS

Supprime cette ligne, ça devrait corriger le problème (la ligne ne sert à rien, j'ai oublié de la supprimer)

Code : Tout sélectionner

  WorldShadows(#PB_Shadow_Modulative)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Exemple casse briques

Message par Fig »

Effectivement ça marche comme ça...

Exemple très interessant de l'utilisation de la 3d...
Il ne faut pas appuyer sur espace par contre quand la balle est dans la partie basse :mrgreen:
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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Exemple casse briques

Message par comtois »

Fig a écrit :Il ne faut pas appuyer sur espace par contre quand la balle est dans la partie basse :mrgreen:

Exact, j'avais fait la correction à la dernière minute avant de poster sur le forum anglais (avec un autre point de vue de la caméra)

http://www.purebasic.fr/english/viewtop ... 36&t=59102
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre