website logo
Auteur
avatar
artblink

Forum » » Création-Développement » » Raycasting Hollywood (Wolfeinstein 3D)


Posté : 31-12-2010 20:39 icone du post

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,& nbsp;un tableau de 24 colonnes/24 lignes
NombreDeLigne=24
NombreDeColonne=24
; 0 rien, >0 un mur, le numéro&n bsp;é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)*delt adistx 
EndIf
If raydiry < 0 
stepy = -1
DistanceLateraleEnY = (rayposy - mapy)*deltadisty
Else 
stepy = 1
DistanceLateraleEnY = (mapy + 1 - rayposy)*delt adisty 
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 = 
Wend
If Cote = 0 
perp = Abs((mapx - rayposx + (1-stepx)/2)/raydi rx)        
Else         
perp = Abs((mapy - rayposy + (1-stepy)/2)/raydi ry)
EndIf
    
If perp<>0 Then HauteurLigne = Round(Abs(Taill eEcranEnY/perp))    
If perp=0 Then HauteurLigne = Round(Abs(TailleEcranE nY/10))
DepartLigne = Round(-HauteurLigne /2 + TailleEcranEn Y*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); Mu r
Line (CoordonnesEnX,FinLigne,CoordonnesEnX,FinLigne+240,CouleurSol)  ;; Sol
Line (CoordonnesEnX,0,CoordonnesEnX,DepartLigne,CouleurPlafond) ;&n bsp;Plafond
Line (CoordonnesEnX,BandeHaut/2,CoordonnesEnX,BandeHaut/2,CouleurBandes)  ; Trait haut des murs
Line (CoordonnesEnX,BandeBas/2,CoordonnesEnX,BandeBas/2,CouleurBandes)&n bsp;; Trait bas des murs
Line (CoordonnesEnX,TailleEcranEnY/2,CoordonnesEnX,TailleEcranEnY/2,Coul eurBandes); Trait du milieu des murs

Next
    
Flip

Cls

If IsKeyDown("Up")=True 
Local A=Round(PositionEnXSurCarte + DirectionEnX * V itesse)-1
Local B=Round(PositionEnYSurCarte + DirectionEnY * V itesse)-1
Local Tposy=Round(PositionEnYSurCarte)
If map[A][Tposy] = 0 Then PositionEnXSurCarte =  PositionEnXSurCarte + DirectionEnX * Vitesse
Local Tposx=Round(PositionEnXSurCarte)
If map[Tposx][B] = 0 Then PositionEnYSurCarte =  PositionEnYSurCarte + DirectionEnY * Vitesse
EndIf

If IsKeyDown("Down")=True 
Local A=Round(PositionEnXSurCarte + DirectionEnX * V itesse)-1
Local B=Round(PositionEnYSurCarte + DirectionEnY * V itesse)-1
Local Tposy=Round(PositionEnYSurCarte)
If map[A][Tposy] = 0 Then PositionEnXSurCarte =  PositionEnXSurCarte - DirectionEnX * Vitesse
Local Tposx=Round(PositionEnXSurCarte)
If map[Tposx][B] = 0 Then PositionEnYSurCarte =  PositionEnYSurCarte - DirectionEnY * Vitesse
EndIf

If IsKeyDown("Left")=True 
;--both camera direction And camera plane must& nbsp;be rotated
oldDirX = DirectionEnX ;
DirectionEnx = DirectionEnX * Cos(-rotation) -  DirectionEnY * Sin(-rotation);
DirectionEnY = oldDirX * Sin(-rotation) + Direc tionEnY * Cos(-rotation);
oldPlaneX = planex;
planex = planex * Cos(-rotation) - planey  * Sin(-rotation);
planey = oldPlaneX * Sin(-rotation) + planey&nb sp;* Cos(-rotation);
EndIf

If IsKeyDown("Right")=True 
;--both camera direction And camera plane must& nbsp;be rotated
oldDirX = DirectionEnX ;
DirectionEnx = DirectionEnX * Cos(rotation) - D irectionEnY * Sin(rotation);
DirectionEnY = oldDirX * Sin(rotation) + Direct ionEnY * Cos(rotation);
oldPlaneX = planex;
planex = planex * Cos(rotation) - planey *  Sin(rotation);
planey = oldPlaneX * Sin(rotation) + planey&nbs p;* Cos(rotation);
EndIf

EndFunction

BeginDoubleBuffer

SetInterval(1,PRG,1000/25)

Repeat    
WaitEvent()
Forever


Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=953&forum=14