Pages vues depuis 25/07/2007 : 25 534 406
Index du forum »» Création-Développement »» Raycasting Hollywood (Wolfeinstein 3D)
@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][B] = 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][B] = 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