Raycasting Hollywood (Wolfeinstein 3D)

4 sujets de 1 à 4 (sur un total de 4)

  • Anonyme

      #9214

      Bonsoir,

      Pour cette fin d’année, je file ma routine de raycasting Hollywood ;-)

      Elle est améliorer, mais sachez qu’il est facile d’ajouté des brush a exploser ;-) et même un fusil au milieu de l’écran.

      Le code est pas optimisé, se soir c’est soiré entre amoureux pour la nouvelle année donc je reprend sa dimanche ;-)

      Je vous tiens au courant et si vous trouvez des modifs faites le savoir.

      Juste un bug, quand on appuie sur la flèche Haut ou Bas, on avance en diagonale…. pas top. La technique, je trace des ligne verticale. Je me suis inspirer d’un moteur en LUA et d’un moteur en C. et pour info, j’ai fait très peux de modification, mais j’ai ajouté une touche perso.

      Eclatez vous ;-)

      @SCREEN {Mode = « ask », Width = 640, Height = 480}

      ;–Définition de la taille de la carte, un tableau de 24 colonnes/24 lignes

      NombreDeLigne=24

      NombreDeColonne=24

      ; 0 rien, >0 un mur, le numéro étant la couleur de se mur

      map = {

      {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},

      {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,3,0,0,0,3,0,0,0,1},

      {1,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,2,2,0,2,2,0,0,0,0,3,0,3,0,3,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,0,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

      {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}

      }

      ; Position du départ dans le tableau

      PositionEnXSurCarte = 22 ; Ligne N°21

      PositionEnYSurCarte = 12 ; Colonne N°11

      ; Définition des variables

      DirectionEnX = 1

      DirectionEnY = 0

      planex = 0

      planey = 0.66

      Vitesse= 1

      rotation = 0.1

      TailleEcranEnX=640

      TailleEcranEnY=480

      Function prg()

      For Local CoordonnesEnX = 1 To TailleEcranEnX

      CameraEnX = 2*CoordonnesEnX/TailleEcranEnX

      rayposx = PositionEnXSurCarte

      rayposy = PositionEnYSurCarte

      raydirx = DirectionEnX + planex*CameraEnX

      raydiry = DirectionEnY + planey*CameraEnX

      mapx = rayposx

      mapy = rayposy

      DistanceLateraleEnX = 0

      DistanceLateraleEnY = 0

      deltadistx = Sqrt(1+(raydiry*raydiry)/(raydirx*raydirx))

      deltadisty = Sqrt(1+(raydirx*raydirx)/(raydiry*raydiry))

      perp = 0

      stepx = 0

      stepy = 0

      Touche = 0

      Cote = 0

      If raydirx < 0 stepx = -1 DistanceLateraleEnX = (rayposx – mapx)*deltadistx Else stepx = 1 DistanceLateraleEnX = (mapx + 1 – rayposx)*deltadistx EndIf If raydiry < 0 stepy = -1 DistanceLateraleEnY = (rayposy – mapy)*deltadisty Else stepy = 1 DistanceLateraleEnY = (mapy + 1 – rayposy)*deltadisty EndIf While Touche = 0 If DistanceLateraleEnX < DistanceLateraleEnY DistanceLateraleEnX = DistanceLateraleEnX + deltadistx mapx = mapx + stepx Cote = 0 Else DistanceLateraleEnY = DistanceLateraleEnY + deltadisty mapy = mapy + stepy Cote = 1 EndIf Tmapx=Round(mapx) Tmapy=Round(mapy) If map[tmapx][tmapy] > 0 Then Touche = 1

      Wend

      If Cote = 0

      perp = Abs((mapx – rayposx + (1-stepx)/2)/raydirx)

      Else

      perp = Abs((mapy – rayposy + (1-stepy)/2)/raydiry)

      EndIf

      If perp<>0 Then HauteurLigne = Round(Abs(TailleEcranEnY/perp))

      If perp=0 Then HauteurLigne = Round(Abs(TailleEcranEnY/10))

      DepartLigne = Round(-HauteurLigne /2 + TailleEcranEnY*0.5)

      If DepartLigne < 1 Then DepartLigne = 1 FinLigne = Round(HauteurLigne /2 + TailleEcranEnY*0.5) If FinLigne >= TailleEcranEnX Then FinLigne = TailleEcranEnX- 1

      Switch(Map[TmapX][TmapY])

      Case 1: Couleur = $AA2222 ; Rouge

      Case 2: Couleur = $22AA22 ; Vert

      Case 3: Couleur = $2222AA ; Bleu

      Case 4: Couleur = $AAAAAA ; Blanc

      Default: Couleur = $AAAA22 ; Jaune

      EndSwitch

      CouleurSol = $444444

      CouleurPlafond = $888888

      CouleurBandes = $666666

      If Cote = 1

      Couleur=Couleur/2

      CouleurBandes = CouleurBandes /2

      EndIf

      BandeHaut = TailleEcranEnY/2+FinLigne

      BandeBas = TailleEcranEnY/2+DepartLigne

      Line (CoordonnesEnX,DepartLigne,CoordonnesEnX,FinLigne,Couleur); Mur

      Line (CoordonnesEnX,FinLigne,CoordonnesEnX,FinLigne+240,CouleurSol) ; Sol

      Line (CoordonnesEnX,0,CoordonnesEnX,DepartLigne,CouleurPlafond) ; Plafond

      Line (CoordonnesEnX,BandeHaut/2,CoordonnesEnX,BandeHaut/2,CouleurBandes) ; Trait haut des murs

      Line (CoordonnesEnX,BandeBas/2,CoordonnesEnX,BandeBas/2,CouleurBandes) ; Trait bas des murs

      Line (CoordonnesEnX,TailleEcranEnY/2,CoordonnesEnX,TailleEcranEnY/2,CouleurBandes); Trait du milieu des murs

      Next

      Flip

      Cls

      If IsKeyDown(« Up »)=True

      Local A=Round(PositionEnXSurCarte + DirectionEnX * Vitesse)-1

      Local B=Round(PositionEnYSurCarte + DirectionEnY * Vitesse)-1

      Local Tposy=Round(PositionEnYSurCarte)

      If map[A][Tposy] = 0 Then PositionEnXSurCarte = PositionEnXSurCarte + DirectionEnX * Vitesse

      Local Tposx=Round(PositionEnXSurCarte)

      If map[Tposx] = 0 Then PositionEnYSurCarte = PositionEnYSurCarte + DirectionEnY * Vitesse

      EndIf

      If IsKeyDown(« Down »)=True

      Local A=Round(PositionEnXSurCarte + DirectionEnX * Vitesse)-1

      Local B=Round(PositionEnYSurCarte + DirectionEnY * Vitesse)-1

      Local Tposy=Round(PositionEnYSurCarte)

      If map[A][Tposy] = 0 Then PositionEnXSurCarte = PositionEnXSurCarte – DirectionEnX * Vitesse

      Local Tposx=Round(PositionEnXSurCarte)

      If map[Tposx] = 0 Then PositionEnYSurCarte = PositionEnYSurCarte – DirectionEnY * Vitesse

      EndIf

      If IsKeyDown(« Left »)=True

      ;–both camera direction And camera plane must be rotated

      oldDirX = DirectionEnX ;

      DirectionEnx = DirectionEnX * Cos(-rotation) – DirectionEnY * Sin(-rotation);

      DirectionEnY = oldDirX * Sin(-rotation) + DirectionEnY * Cos(-rotation);

      oldPlaneX = planex;

      planex = planex * Cos(-rotation) – planey * Sin(-rotation);

      planey = oldPlaneX * Sin(-rotation) + planey * Cos(-rotation);

      EndIf

      If IsKeyDown(« Right »)=True

      ;–both camera direction And camera plane must be rotated

      oldDirX = DirectionEnX ;

      DirectionEnx = DirectionEnX * Cos(rotation) – DirectionEnY * Sin(rotation);

      DirectionEnY = oldDirX * Sin(rotation) + DirectionEnY * Cos(rotation);

      oldPlaneX = planex;

      planex = planex * Cos(rotation) – planey * Sin(rotation);

      planey = oldPlaneX * Sin(rotation) + planey * Cos(rotation);

      EndIf

      EndFunction

      BeginDoubleBuffer

      SetInterval(1,PRG,1000/25)

      Repeat

      WaitEvent()

      Forever

      Tarzin

        #141330

        whaaaa, tu progresses bien en 3D

        Je bricole des trucs en filaire, je te les ferai parvenir

        Bonne année à tous sinon!

        Anonyme

          #141331

          Merci,

          Attention, pour les accés tableau avec hollywood, n’utilise pas les commande d’écriture lecture comme rawset(), sa ralenti les accé tableau, utilise plutôt Nom_Du_Tableau[Index]=Valeur, en LUA, selon les pros de se langage, rawset ralenti les accés tableau de presque 10% benchmark à l’appui.

          Pareil, un gars m’a dit que la commande Next doit être localiser, les boucles « for » sont quasi 20% plus rapide, il faut créer une fonction local Next et utilisé cette fonction pour déterminé la fin de la boucle, je suis dessus, mais avec hollywood, c’est un peu plus dur a adapter.

          Pour les calcules de tableau, il faut utilisé les metamethod, sortir les variables ou données d’un tableau fais perdre du temp, il faut calculer directement dans le tableau si bien sûr les données sont dans 2 tableaux différent, si on calcule des données d’un tableau avec une constante, les metamethod sont inexploitable.

          Bref, je te fais un tutos sur l’optimisation du code hollywood.

          Mais va sur les forum LUA, tu verra que hollywood et LUA sont quasi cul et chemise. Tous les codes LUA sont facilement trancriptible en hollywood (comme le C Ansi)

          Modifie dans mon tuto 3D les commande rawset par des accès direct mémoire.

          Au fait, j’ai quasiment réussi à créé un loader d’objet 3D surface pleine ;-). Un fois fini, je te fil les sources ainsi qu’a tous le monde bien sûr.

          Mon scrolling 3D fonctionne pas mal, je suis à 10 FPS sur MicroAone (scroll à la kid chaos), je dois l’optimiser un peut et c’est good.

          J’ai réussi la texturisation, mais avec des images vectorielle créé sous hollywood. Le bitmap, c’est trop lent. snif. D’après le même gars (dev sous hollywood) il manque une fonction de translation d’image sous hollywood, on a la rotation, si Andreas sort une fonction de translation d’image, je pourrai faire de la texturisation.

          J’ai trouvé plein de petit effet cool, tu verra ton écran prendre feu par exemple dans pas longtemp ;-) et c’est assez fluide.

          En fin de compte, les textures doivent être calculer sous la forme des torseurs (en méca)… problème, en mécanique, j’était trop nul, je me suis spécialisé dans la partie commande et pas la partie opérative. je vais devoir ressortir mes cours. lol

          Cette année sa va sentir bon à hollywood ;-)

          Edit: Lien des tests pour le moteur

          Attention, le moteur n’est pas au point ;-)

          http://jeannoel.roueste.free.fr/Amiga/raycast/test6800x0.exe

          http://jeannoel.roueste.free.fr/Amiga/raycast/testAOS4.exe

          http://jeannoel.roueste.free.fr/Amiga/raycast/testmorphos.exe

          http://jeannoel.roueste.free.fr/Amiga/raycast/testwarpos.exe

          Respect

          Anonyme

            #141332

            Jali m’a filer sa source hollywood raycast qui est mille fois supérieur au mien, mais… il utilise pas la précalculation, son moteur est trop lent.

            Comme je maitrise les tableaux, je vais lui refaire son code en l’optimisant.

            De plus, des actions sont lourdement exécuté. yearh!

            Vous voyez, quand on s’intéresse aux travaux des autres, bin on s’entraide… comme koi, la complémentarité entre dév… SA MARCHE

            Merci a tous pour vos coup de mains, une fois le moteur améliorer, je le post.

            Pour le moment, essayer sa version, c’est les même liens.

            Attention, sa rame dès qu’il y a texturisation.

            Touche fléché pour se déplacer et les touches 1 à 7 pour les options d’affichage.

            Voyer comme jali explose mon moteur lol d’un point de vue la qualité d’affichage (mais pas en vitesse :-p )

            Respect

          4 sujets de 1 à 4 (sur un total de 4)

          • Vous devez être connecté pour répondre à ce sujet.

          Forums AmigaOS, MorphOS et AROS Développement Raycasting Hollywood (Wolfeinstein 3D)

          Amiga Impact