Pages vues depuis 25/07/2007 : 25 535 189
Index du forum »» Création-Développement »» Je concurrence le moteur à 2 balle de crisot
;?Moteur?de?Raycasting?Simplifié
;?Créer?par?Artblink?en?2010,?modifié?en?2013
;?Se?moteur?n'est?pas?optimisé?mais?simplifié?pour?la?lecture
;?Moteur?à?90?FPS?=>?peut?être?poussé?à?200?FPS,?mais?difficilement?lisible?
;?(testé?Sur?PC?Quad?Q9550?@?2.83Ghz/4?Go/NVIDIA?GeForce?GTX?570?avec?Hollywood?4.8)
;?Il?sert?de?tuto?pour?être?adapté?sur?d'autres?langage?de?programmation
;?Normalement,?il?doit?être?très?simple?de?l'adapter?en?Amos
;
@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
CarteDuJeux?=?{
{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?Globales
DirectionEnX?=?1
DirectionEnY?=?0.1
planex?=?0
planey?=?0.66
VitesseDeDeplacement=?0.25
VitesseDeLaRotation?=?0.05
TailleEcranEnX=639
TailleEcranEnY=479
;?Fonction?Principale
Function?prg()
StartTimer(1)?;?Départ?du?chronomètre?pour?calculer?le?nombre?d'image?par?seconde????
For?Local?CoordonnesEnX?=?1?To?TailleEcranEnX
;?Variables?Local?pour?gagner?en?rapidité
Local?CameraEnX?=?2*CoordonnesEnX/TailleEcranEnX-1
Local?PositionEnXduLancerdeRayon?=?PositionEnXSurCarte?
Local?PositionEnYduLancerdeRayon?=?PositionEnYSurCarte?
Local?DirectionEnXduLancerDeRayon?=?DirectionEnX?+?planex*CameraEnX
Local?DirectionEnYduLancerDeRayon?=?DirectionEnY?+?planey*CameraEnX
Local?CarteEnX?=?Int(PositionEnXduLancerdeRayon)
Local?CarteEnY?=?Int(PositionEnYduLancerdeRayon)
Local?DistanceLateraleEnX?=?0
Local?DistanceLateraleEnY?=?0
Local?deltadistx?=?Sqrt(1+(DirectionEnYduLancerDeRayon*DirectionEnYduLancerDeRayon)/(DirectionEnXduLancerDeRayon*DirectionEnXduLancerDeRayon))
Local?deltadisty?=?Sqrt(1+(DirectionEnXduLancerDeRayon*DirectionEnXduLancerDeRayon)/(DirectionEnYduLancerDeRayon*DirectionEnYduLancerDeRayon))
Local?Perspective?=?0
Local?stepx?=?0
Local?stepy?=?0
Local?MurTouche?=?0
Local?CoteDuMur?=?0
;?Début?des?tests?du?raycasting?(lancé?de?rayon)
If?DirectionEnXduLancerDeRayon?0?
stepx?=?-1
DistanceLateraleEnX?=?(PositionEnXduLancerdeRayon?-?CarteEnX)*deltadistx
Else
stepx?=?1
DistanceLateraleEnX?=?(CarteEnX?+?1?-?PositionEnXduLancerdeRayon)*deltadistx?
EndIf
If?DirectionEnYduLancerDeRayon?0?
stepy?=?-1
DistanceLateraleEnY?=?(PositionEnYduLancerdeRayon?-?CarteEnY)*deltadisty
Else?
stepy?=?1
DistanceLateraleEnY?=?(CarteEnY?+?1?-?PositionEnYduLancerdeRayon)*deltadisty?
EndIf
;?On?test?si?lorsque?l'on?bouge,?on?touche?un?mur?de?la?carte
While?MurTouche?=?0??;?Tant?qu'il?n'y?a?pas?de?mur
;????
If?DistanceLateraleEnX?DistanceLateraleEnX?=?DistanceLateraleEnX?+?deltadistx
CarteEnX?=?CarteEnX?+?stepx
CoteDuMur?=?0
Else
DistanceLateraleEnY?=?DistanceLateraleEnY?+?deltadisty
CarteEnY?=?CarteEnY?+?stepy
CoteDuMur?=?1
EndIf
;
If?CarteDuJeux[CarteEnX][CarteEnY]?>?0?Then?MurTouche?=?1?
;
Wend?;?fin?du?test?de?tant?qu'il?y?a?pas?de?mur
;?Il?est?plus?rapide?de?multiplier?par?0.5?que?de?diviser?par?2
If?CoteDuMur?=?0?
Perspective?=?Abs((CarteEnX?-?PositionEnXduLancerdeRayon?+?(1-stepx)*0.5)/DirectionEnXduLancerDeRayon)????????
Else?????????
Perspective?=?Abs((CarteEnY?-?PositionEnYduLancerdeRayon?+?(1-stepy)*0.5)/DirectionEnYduLancerDeRayon)
EndIf
;
If?Perspective=0?Then?Perspective=1????
HauteurLigne?=?Int(TailleEcranEnY/Perspective)????
DepartLigne?=?(-HauteurLigne*0.5?+?TailleEcranEnY*0.5)
;
If?DepartLigne?<0?Then?DepartLigne=0
;
FinLigne?=?(HauteurLigne*0.5?+?TailleEcranEnY*0.5)
;
If?FinLigne?>=?TailleEcranEnX?Then?FinLigne?=?TailleEcranEnX?
;?En?fonction?de?la?valeur?du?mur?dans?la?carte,?on?change?la?couleur?du?mur
Switch(CarteDuJeux[CarteEnX][CarteEnY])
;??????
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
;?Variable?global?pour?les?couleurs?sauf?celles?des?murs????
Local?CouleurSol?=?$444444
Local?CouleurPlafond?=?$888888
Local?CouleurBandes?=?$666666
;
If?CoteDuMur?=?1?
Couleur=Couleur*0.5
CouleurBandes?=?CouleurBandes?*0.5
EndIf
;?Encore?du?local?pour?la?rapiditée
Local?BandeHaut?=?TailleEcranEnY/2+FinLigne?
Local?BandeBas?=?TailleEcranEnY/2+DepartLigne?
;?On?trace?les?lignes?pour?créer?la?perspective
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*0.5,CoordonnesEnX,BandeHaut*0.5,CouleurBandes)?;?Trait?haut?des?murs
Line?(CoordonnesEnX,TailleEcranEnY*0.5,CoordonnesEnX,TailleEcranEnY*0.5,CouleurBandes);?Trait?du?milieu?des?murs
Line?(CoordonnesEnX,BandeBas*0.5,CoordonnesEnX,BandeBas*0.5,CouleurBandes)?;?Trait?bas?des?murs
;?Fin?de?la?boucles
Next
;?Test?si?on?appuie?sur?la?touche?flèche?"Haut"????
If?IsKeyDown("Up")=True
;????
If?CarteDuJeux[Int(PositionEnXSurCarte?+?DirectionEnX?*?VitesseDeDeplacement)][Int(PositionEnYSurCarte)]?=?0?Then?PositionEnXSurCarte?=?PositionEnXSurCarte?+?DirectionEnX?*?VitesseDeDeplacement
If?CarteDuJeux[Int(PositionEnXSurCarte)][Int(PositionEnYSurCarte?+?DirectionEnY?*?VitesseDeDeplacement)]?=?0?Then?PositionEnYSurCarte?=?PositionEnYSurCarte?+?DirectionEnY?*?VitesseDeDeplacement
;
EndIf
;?Test?si?on?appuie?sur?la?touche?flèche?"Bas"????
If?IsKeyDown("Down")=True?
If?CarteDuJeux[Int(PositionEnXSurCarte?+?DirectionEnX?*?VitesseDeDeplacement)][Int(PositionEnYSurCarte)]?=?0?Then?PositionEnXSurCarte?=?PositionEnXSurCarte?-?DirectionEnX?*?VitesseDeDeplacement
If?CarteDuJeux[Int(PositionEnXSurCarte)][Int(PositionEnYSurCarte?+?DirectionEnY?*?VitesseDeDeplacement)]?=?0?Then?PositionEnYSurCarte?=?PositionEnYSurCarte?-?DirectionEnY?*?VitesseDeDeplacement
EndIf
;?Test?si?on?appuie?sur?la?touche?flèche?"Gauche"????
If?IsKeyDown("Left")=True?
;
AncienneDirectionEnX=DirectionEnX
DirectionEnx?=?DirectionEnX?*?Cos(-VitesseDeLaRotation)?-?DirectionEnY?*?Sin(-VitesseDeLaRotation);
DirectionEnY?=?AncienneDirectionEnX?*?Sin(-VitesseDeLaRotation)?+?DirectionEnY?*?Cos(-VitesseDeLaRotation);
oldPlaneX?=?planex;
planex?=?planex?*?Cos(-VitesseDeLaRotation)?-?planey?*?Sin(-VitesseDeLaRotation);
planey?=?oldPlaneX?*?Sin(-VitesseDeLaRotation)?+?planey?*?Cos(-VitesseDeLaRotation);
EndIf
;?Test?si?on?appuie?sur?la?touche?flèche?"Droite"????
If?IsKeyDown("Right")=True?
;
AncienneDirectionEnX?=?DirectionEnX?;
DirectionEnx?=?DirectionEnX?*?Cos(VitesseDeLaRotation)?-?DirectionEnY?*?Sin(VitesseDeLaRotation);
DirectionEnY?=?AncienneDirectionEnX?*?Sin(VitesseDeLaRotation)?+?DirectionEnY?*?Cos(VitesseDeLaRotation);
oldPlaneX?=?planex;
planex?=?planex?*?Cos(VitesseDeLaRotation)?-?planey?*?Sin(VitesseDeLaRotation);
planey?=?oldPlaneX?*?Sin(VitesseDeLaRotation)?+?planey?*?Cos(VitesseDeLaRotation);
EndIf
;?Calcule?simple?du?FPS
Local?Temps=GetTimer(1)
Local?FPS=Int((1/Temps)*1000)
;?Affichage?du?FPS
TextOut(0,0,FPS)
;?Flip?d'écran?(technique?du?double?buffer)
Flip
;?Effacer?l'écran?est?inutile,?puisque?l'on?retrace?par?dessus?l'ancienne?image
;?donc?la?commande?Cls?ne?sert?à?rien,?encore?du?temps?de?gagner
;
;?Fin?de?la?fonction?principale
EndFunction
;?Lancement?du?moteur?Double?Buffer,?toujours?en?dehors?de?fonction
BeginDoubleBuffer
;?Configuration?de?l'intervalle?Maximale?de?temps?entre?l'affichage?de?chaque?image,?ici?50?FPS
SetInterval(1,PRG,20)
;?Boucle?infinie?pour?que?le?programme?ne?se?termine?jamais
Repeat????
WaitEvent()?;?Attendre?une?action,?ici,?se?sera?les?touches?fléchées?du?clavier
Forever