Raycasting Hollywood (Wolfeinstein 3D)
4 sujets de 1 à 4 (sur un total de 4)
-
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
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
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)