Page 1 sur 7

Bloxorz

Publié : dim. 26/août/2007 21:58
par comtois
[EDIT]
Télécharger la dernière version 18 sept 2007:
http://herved25.free.fr/sources/PureBlock.zip
- 33 maps
- les sons sont gérés (il en manque encore)
- Les sources sont incluses
- Un éditeur de map est en cours, il est aussi disponible dans l'archive.

Image
_______________________
Comme j'aime bien ce jeu, j'ai commencé à le coder en 3D.

Par contre j'ai l'impression que c'est de la 2D dans le jeu original non ?

C'est un exercice intéressant de le faire en 3D :)

Code : Tout sélectionner

;Comtois
;PB 4.10 Le 26/08/07

EnableExplicit

InitEngine3D()
InitSprite()
InitKeyboard()
 
Enumeration
  #Nord
  #Est
  #Sud
  #Ouest
  #Vertical
EndEnumeration

#Taille=12
#Taille2 = #Taille/2

Structure f_Vecteur
  x.f
  y.f
  z.f
EndStructure

Structure i_Vecteur
  x.l
  y.l
  z.l
EndStructure

Structure s_Cube
  Angle.f
  p.f_Vecteur
  s.f_Vecteur
  t.f_Vecteur  
  Type.l
  Sens.l
  Case1.I_Vecteur
  Case2.I_Vecteur
  Origine.I_Vecteur
EndStructure

Structure s_Vertex
  px.f
  py.f
  pz.f
  nx.f
  ny.f
  nz.f
  u.f
  v.f
EndStructure

Global Cube.s_Cube, Px.l, Pz.l, Perdu.l, MapX.l, MapZ.l
Define.l Options, i, j, Tombe

Restore Niveau1
Read MapX
Read MapZ
Dim Map(MapX+1,MapZ+1)
Read Cube\Origine\X
Read Cube\Origine\Z
For j=1 To MapZ
  For i = 1 To MapX
    Read Map(i,j)
  Next i  
Next j

;Initialise le cube
Cube\p\x=Cube\Origine\X*#Taille
Cube\p\y=#Taille
Cube\p\z=Cube\Origine\Z*#Taille
Cube\Type = #Vertical
Cube\Sens = #Vertical 

;- Ouverture de la fenêtre et de l'écran
OpenScreen(1280,1024,32,"Test")

;- Declaration des procédures
Declare MakeMesh()
Declare Animation()

Macro TEXTURE(Texture, Couleur)
  CreateTexture(Texture, 128, 128)
  ;Remplissage de la texture en blanc
  StartDrawing(TextureOutput(Texture))
    Box(0, 0, TextureWidth(Texture), TextureHeight(Texture), Couleur)
    DrawingMode(#PB_2DDrawing_Outlined)
    Box(0, 0, TextureWidth(Texture), TextureHeight(Texture), $FF0000)
  StopDrawing()
EndMacro
Macro GAGNE()
  Repeat
    tombe - 1
    MoveEntity(#Entity, 0, -1, 0)
    RenderWorld()
    FlipBuffers()   
  Until tombe < -150
  tombe = 0
EndMacro

;-Mesh
#Mesh = 0

CreateMesh(#Mesh, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate 
SetMeshData(#Mesh, Options      , ?Sommets, 24)
SetMeshData(#Mesh, #PB_Mesh_Face, ?Triangles, 12)

#MeshN=1
CreateMesh(#MeshN, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate 
SetMeshData(#MeshN, Options      , ?Sommets, 24)
SetMeshData(#MeshN, #PB_Mesh_Face, ?Triangles, 12)

;-Textures
#Texture = 0
Texture(#Texture, $BA8E3A)

#TextureSol = 1
Texture(#TextureSol, $FFFFFF)

;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))

#MatiereSol = 1
CreateMaterial(#MatiereSol, TextureID(#TextureSol))

;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
MakeMesh()

#EntitySol = 1
For j=1 To MapZ
  For i=1 To MapX
    If Map(i,j)=1
      Map(i,j)= CreateEntity(#PB_Any, MeshID(#MeshN), MaterialID(#TextureSol))
      ScaleEntity(Map(i,j), #Taille, 2, #Taille) 
      EntityLocate(Map(i,j), i*#Taille, -1, j*#Taille)
    EndIf
  Next i
Next j      

;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0, 100, 100)
CameraLocate(#Camera, 0, 110, 16*#Taille)
CameraLookAt(#Camera, 5*#Taille, 0, 3*#Taille) 
   
;-Light
AmbientColor(RGB(185,185,185))
CreateLight(0,$FFFFFF,500,500,500)

;- **** MAIN ****

Repeat
 
  If ExamineKeyboard() 
   
    If Cube\Sens = #Vertical
      If KeyboardPushed(#PB_Key_Left)
        Cube\Sens = #Ouest : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Right)
        Cube\Sens = #Est   : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Up)
        Cube\Sens = #Nord  : MakeMesh()
      ElseIf KeyboardPushed(#PB_Key_Down)
        Cube\Sens = #Sud   : MakeMesh()
      EndIf
    EndIf
         
  EndIf
 
  Animation()
 
  ;Test position
  Perdu = #False
  If Cube\type = #Vertical
    Px = Cube\p\x / #Taille
    Pz = Cube\p\z / #Taille
    If Map(Px, Pz)=2
      GAGNE()
      Perdu = #True
    ElseIf Map(Px, Pz)=0
      Perdu = #True
    EndIf
  ElseIf Cube\type = #Nord Or Cube\type = #Sud
    Px = Cube\p\x / #Taille
    Pz = (Cube\p\z + #Taille2) / #Taille
    If Map(Px, Pz)=0
      Perdu = #True
    EndIf
    Pz = (Cube\p\z - #Taille2) / #Taille
    If Map(Px, Pz)=0
      Perdu = #True
    EndIf
  ElseIf Cube\type = #Est Or Cube\type = #Ouest
    Px = (Cube\p\x + #Taille2) / #Taille
    Pz = Cube\p\z  / #Taille
    If Map(Px, Pz)=0
      Perdu = #True
    EndIf
    Px = (Cube\p\x - #Taille2) / #Taille
    If Map(Px, Pz)=0
      Perdu = #True
    EndIf
  EndIf       
                 
         
  If Perdu
    ;Initialise le cube
    Cube\p\x=Cube\Origine\X*#Taille
    Cube\p\y=#Taille
    Cube\p\z=Cube\Origine\Z*#Taille
    Cube\Type = #Vertical
    Cube\Sens = #Vertical  
    CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
    MakeMesh()
  EndIf
 
  RenderWorld()
 
  FlipBuffers()
 
Until KeyboardPushed(#PB_Key_Escape)


Procedure MakeMesh()
  Define. l Options, i
  Protected *Sommet, *Face, *Ptr.s_Vertex
   
  Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_UVCoordinate 
  *Sommet=AllocateMemory(SizeOf(s_Vertex)*24) ; 24 sommets et 36 octets par sommet
  *Face=AllocateMemory(6*12) ; 12 triangles et 6 octets par triangle
 
  CopyMemory(?Sommets,*Sommet,SizeOf(s_Vertex)*24)
  CopyMemory(?Triangles,*Face,6*12)
  With Cube
  Select \type
    Case #Vertical
      \s\x = 1 : \s\y = 2 : \s\z = 1
    Case #Nord, #Sud
      \s\x = 1 : \s\y = 1 : \s\z = 2
    Case #Ouest, #Est
      \s\x = 2 : \s\y = 1 : \s\z = 1
  EndSelect
 
  Select \Sens
    Case #Nord
      \t\x = 0.5 : \t\y = 0.5 : \t\z = 0.5
    Case #Sud
      \t\x = 0.5 : \t\y = 0.5 : \t\z = -0.5
    Case #Ouest
      \t\x = 0.5 : \t\y = 0.5 : \t\z = 0
    Case #Est
      \t\x = -0.5 : \t\y = 0.5 : \t\z = 0
    Case #Vertical
      \t\x = 0 : \t\y = 0.5 : \t\z = 0 
  EndSelect 
   
  *Ptr=*Sommet
  For i = 1 To 24
    *Ptr\px = (*Ptr\px + \t\x) * \s\x*#Taille
    *Ptr\py = (*Ptr\py + \t\y) * \s\y*#Taille
    *Ptr\pz = (*Ptr\pz + \t\z) * \s\z*#Taille
    *Ptr + SizeOf(s_Vertex) 
  Next i
     
  SetMeshData(#Mesh, Options      , *Sommet, 24)
  SetMeshData(#Mesh, #PB_Mesh_Face, *Face  , 12)
   
  EntityLocate(#Entity, \p\x-\t\x*\s\x*#Taille, 0, \p\z-\t\z*\s\z*#taille)
  EndWith
EndProcedure

Procedure Animation()
  Define.f Delta
  Delta = 4.5
  
  Select Cube\Sens

    Case #Ouest
      Cube\Angle + Delta
      RotateEntity(#Entity,0,0,Cube\Angle)

      If Int(Cube\Angle) = 90
        Cube\Angle = 0 : Cube\Sens = #Vertical
        If Cube\Type = #Vertical
          Cube\Type = #Ouest
          Cube\p\x - 1.5*#Taille
        ElseIf Cube\Type = #Est Or Cube\Type = #Ouest
          Cube\Type = #Vertical
          Cube\p\x - 1.5*#Taille
        Else 
          Cube\p\x - #Taille
        EndIf
      EndIf
     
    Case #Est
      Cube\Angle - Delta
      RotateEntity(#Entity,0,0,Cube\Angle)
   
      If Int(Cube\Angle) = -90
        Cube\Angle = 0 : Cube\Sens = #Vertical
         
        If Cube\Type = #Vertical
          Cube\Type = #Est
          Cube\p\x + 1.5*#Taille
        ElseIf Cube\Type = #Est Or Cube\Type = #Ouest
          Cube\Type = #Vertical
          Cube\p\x + 1.5*#Taille
        Else
          Cube\p\x + #Taille 
        EndIf
       
      EndIf   
     
  Case #Nord
      Cube\Angle - Delta
      RotateEntity(#Entity,0,Cube\Angle,0)

      If Int(Cube\Angle) = -90
        Cube\Angle = 0 : Cube\Sens = #Vertical
 
        If Cube\Type = #Vertical
          Cube\Type = #Nord
          Cube\p\z - 1.5*#Taille
        ElseIf Cube\Type = #Nord Or Cube\Type = #Sud
          Cube\Type = #Vertical
          Cube\p\z - 1.5*#Taille
        Else
          Cube\p\z - #Taille 
        EndIf
       
      EndIf
           
  Case #Sud
      Cube\Angle + Delta
      RotateEntity(#Entity,0,Cube\Angle,0)
     
      If Int(Cube\Angle) = 90
        Cube\Angle = 0 :  Cube\Sens = #Vertical
 
        If Cube\Type = #Vertical
          Cube\Type = #Sud
          Cube\p\z + 1.5*#Taille
        ElseIf Cube\Type = #Nord Or Cube\Type = #Sud
          Cube\Type = #Vertical
          Cube\p\z + 1.5*#Taille
        Else
          Cube\p\z + #Taille 
        EndIf 

      EndIf 
  EndSelect 
     
EndProcedure

;{ Définition du cube
DataSection
Sommets:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.f 0,1

Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.f 1,1

Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.f 1,0

;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.f 0,0

Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.f 1,0

;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.f 0,0

Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.f 0,1

Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.f 1,1

Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.f 1,0

;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.f 0,0

Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.f 0,1

Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.f 1,1

Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.f 1,0

;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.f 0,0

Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.f 0,1

Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.f 1,1

Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.f 1,0

;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.f 0,0

Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.f 0,1

Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.f 1,1

Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.f 1,0

Triangles:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22

Niveau1:
Data.l 10,6
Data.l 2, 2
Data.l 1,1,1,0,0,0,0,0,0,0
Data.l 1,1,1,1,1,1,0,0,0,0
Data.l 1,1,1,1,1,1,1,1,1,0
Data.l 0,1,1,1,1,1,1,1,1,1
Data.l 0,0,0,0,0,1,1,2,1,1
Data.l 0,0,0,0,0,0,1,1,1,0
Niveau2:
Data.l 15,6
Data.l 2, 5
Data.l 0,0,0,0,0,0,1,1,1,1,0,0,1,1,1
Data.l 1,1,1,1,0,0,1,1,4,1,0,0,1,2,1
Data.l 1,1,3,1,0,0,1,1,1,1,0,0,1,1,1
Data.l 1,1,1,1,0,0,1,1,1,1,0,0,1,1,1
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Data.l 1,1,1,1,0,0,1,1,1,1,0,0,0,0,0
EndDataSection
;}

Publié : dim. 26/août/2007 22:23
par Backup
impressionant ! :D

tu n'as pas choisi Dreamotion comme moteur 3D ?
il me semble pourtant bien plus simple a programmer non ? 8O :)

Publié : lun. 27/août/2007 8:08
par Anonyme
Trop fort comtois ! excelent ! 8O

Publié : lun. 27/août/2007 8:15
par ATHOW
Très proche de l'original ! Bravo !
Tu comptes faire un éditeur de niveau ? Le gros défaut de l'original en Flash est qu'il est trop court (une trentaine de niveaux si je me souviens bien), un éditeur serait donc génial pour le tien !

Publié : lun. 27/août/2007 11:20
par comtois
Dobro a écrit :tu n'as pas choisi Dreamotion comme moteur 3D ?
il me semble pourtant bien plus simple a programmer non ? 8O :)
Tu peux toujours essayer d'en faire une version avec Dreamotion , ça serait intéressant de comparer.

Publié : lun. 27/août/2007 11:23
par comtois
ATHOW a écrit :Tu comptes faire un éditeur de niveau ?
Ben je laisse le code pour ceux qui seraient tenter de continuer le projet.
Je ne sais pas si je ferai un éditeur, mais je mettrai en place un système pour coder un niveau ,sans doute en XML histoire d'apprendre encore un peu plus à l'utiliser.

je me sens tout petit...

Publié : lun. 27/août/2007 13:04
par beauregard
8O
Honte à moi comtois, mais je ne connais pas ce jeu, si l'un d'entre vous peut laisser un lien...

quand à dreammotion, ben il n'aime pas les petites machines avec carte ATI toute pourri( ouverture fenêtre puis tout se fige, plus aucune combinaison de touche ne fonctionne, seul le pointeur de la souris fonctionne vaillamment... mais qui finis par disparaitre au bout de quelques secondes...) :?

Publié : lun. 27/août/2007 13:10
par MorpheusDX
Si tu veux, en flash, tu en a un ici, meme si c'est surement pas l'original.

http://www.zeronews-fr.com/flash/v-11-bloxorz.html

;)

Publié : lun. 27/août/2007 13:14
par beauregard
MorpheusDX a écrit :Si tu veux, en flash, tu en a un ici, meme si se n'est surement pas l'original
merci :D

via ce site, chuis tombé sur un lien d'un jeu de plate-forme épatant pour du flash, un rick dangerous des temps moderne:
http://www.nitrome.com/games/toxic/index.php
la manière de s'accrocher au mur est plus astucieuse que celle utilisé dans newsuperMBros ( elle même repris sans vergogne d'un megaman sur superfamicom, un vrai sans gène ce mario)...
...encore merci MorpheusDX de m'avoir montré la voie ! ;)

Publié : lun. 27/août/2007 13:17
par flaith
j'adores ce jeu : pourquoi ne pas en faire un projet commun pour le rendre identique à l'original ? :D

Re: je me sens tout petit...

Publié : lun. 27/août/2007 16:09
par comtois
beauregard a écrit :8O
Honte à moi comtois, mais je ne connais pas ce jeu, si l'un d'entre vous peut laisser un lien...
J'avais pourtant pris la peine de mettre le lien dans le premier post :)

flaith a écrit :J'adores ce jeu : pourquoi ne pas en faire un projet commun pour le rendre identique à l'original ? :D
Comme je n'ai jamais pu passer le niveau 6 ou 7 ; je ne sais pas ce qu'il y a après, est-ce que quelqu'un connait tous les niveaux ?

Quelqu'un a une idée sur le format que devrait avoir un niveau ? c'est à dire pour coder les différentes pièces du jeu , et les actionneurs.
J'ai envie de le faire en XML.

Et il faudrait faire un bilan des différents blocs , et leur action.

Publié : lun. 27/août/2007 16:38
par ATHOW
J'ai passé tous les niveaux il y a environ un mois.
Je me souviens qu'il y a des dalles "fragiles" (qui s'écroulent quand le pavé est debout dessus), des dalles dotées d'un bouton rond (activables que le pavé soit debout couché, et qui font apparaître d'autres dalles), des dalles dotées d'un bouton activable seulement quand le pavé est debout, et des dalles qui scindent le pavé en deux cubes dirigeables individuellement (on passe de l'un à l'autre en pressant "Espace").
Après, est-ce que c'est nécessaire de copier exactement l'original, je ne sais pas... on peut inventer nos propres dalles spéciales !

Sinon, mettre de l'XML partout est à la mode (je bosse qu'avec ça à ma boite). Et cette mode me gonfle, car au final, si parser un XML est souvent très facile (selon le langage), ça fait fait même des très gros fichiers pour pas grand chose. Pour Bloxorz, je verrais bien : dimension x de la matrice (un octet), dimension y de la matrice (un octet), la matrice contenant un octet par case indiquant quel type de dalle il s'agit, la position x du pavé (un octet), la position y du pavé (un octet).

Publié : lun. 27/août/2007 16:53
par Chris
ATHOW a écrit :Sinon, mettre de l'XML partout est à la mode (je bosse qu'avec ça à ma boite). Et cette mode me gonfle, car au final, si parser un XML est souvent très facile (selon le langage), ça fait fait même des très gros fichiers pour pas grand chose. Pour Bloxorz, je verrais bien : dimension x de la matrice (un octet), dimension y de la matrice (un octet), la matrice contenant un octet par case indiquant quel type de dalle il s'agit, la position x du pavé (un octet), la position y du pavé (un octet).
Bien d'accord avec toi. Je connais pas l'xml, mais ce que je sais, c'est qu'à chaque fois que je télécharge un truc qui est basé là-dessus, c'est tout de suite des fichiers de 20 ou 30 Mo.

Et quand tu fais fonctionner le programme, ben tu t'aperçois que finalement, t'as rien comme fonctions.

Suffit de regarder les différents Médias Center qu'on trouve avec les cartes télé, ou sur le net.

Publié : lun. 27/août/2007 17:05
par Backup
niveau 14 code 2 10362
niveau 15 code 098598
niveau 16 code 000 241
niveau 17 code 68 35 96


je me suis arreté la pour l'instant :D

je me demandais surtout comment sur ce type de jeu, peut on etre sur
que l'on ne fabrique pas un niveau impossible a faire ??

Publié : lun. 27/août/2007 17:45
par wolfjeremy
Perso j'ai une erreur à la compilation (erreur adresse mémoire invalide)