Page 1 sur 1

Exemple casse briques

Publié : jeu. 24/avr./2014 22:31
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

Re: Exemple casse briques

Publié : ven. 25/avr./2014 0:13
par Ar-S
Merci pour cet exemple, il fonctionne bien.

Re: Exemple casse briques

Publié : ven. 25/avr./2014 4:42
par flaith
Merci, pas mal du tout
Et...bien sur la derniere brique restante et la balle faisait des aller-retours indefiniement :P

Re: Exemple casse briques

Publié : ven. 25/avr./2014 9:30
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.

Re: Exemple casse briques

Publié : ven. 25/avr./2014 11:10
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

Re: Exemple casse briques

Publié : ven. 25/avr./2014 11:15
par Fred
Super :)

Re: Exemple casse briques

Publié : lun. 05/mai/2014 15:35
par Fig
RenderWorld(10) Acces memoire invalide... :|
PB 5.22 LTS

Re: Exemple casse briques

Publié : lun. 05/mai/2014 16:20
par graph100
Si le même que moi : Utilise OpenGl comme bibliothèque sous-système lors de la compilation

Re: Exemple casse briques

Publié : lun. 05/mai/2014 17:01
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)

Re: Exemple casse briques

Publié : lun. 05/mai/2014 18:00
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:

Re: Exemple casse briques

Publié : lun. 05/mai/2014 19:03
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