website logo
Auteur
avatar
artblink

Forum » » Création-Développement » » Je concurrence le moteur à 2 balle de crisot


Posté : 13-01-2013 02:55 icone du post

Hihihihi.... J'ai le droit de déconner non?! Rolalalala, mon moteur est 1 milliard de fois plus pourrie que celui de crisot, mais j'ai le droit de rêver lol

Bon, les ch'tis, j'ai revu mon code de Raycasting (Moteur de Wolfenstein Fausse 3D )

J'ai essayé de faire un code lisible est compréhensible (moteur de lancé de rayon)

Normalement, je dis bien NORMALEMENT, il est possible de le retranscrire très facilement pour un ti coder Amos

Amusez-vous a le coder, normalement, je dis bien NORMALEMENT, il est exécutable avec les version d'hollywood inférieur à la 4.8 puisque j'utilise QUE des commandes de bases... voir des commandes dispo dès les premières version d'Hollywood.

A tester bien sûr car il fonctionne (ou plutôt le rendu fonctionne) sur la version 4.8 PC

Le prochain topic sera... COMMENT OPTIMISER SE CODE POUR PASSER DE 80 FPS A 200 FPS (sur ma config PC bien sûr... car pas tester sur AmigaNG :-p )

Voici le code :




;?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,?m ais?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?progr ammation
;?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?li gnes
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*DirectionEnYduLancerDe Rayon)/(DirectionEnXduLancerDeRayon*DirectionEnXduLancerDeRayon))
Local?deltadisty?=?Sqrt(1+(DirectionEnXduLancerDeRayon*DirectionEnXduLancerDe Rayon)/(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?stepx?=?-1
DistanceLateraleEnX?=?(PositionEnXduLancerdeRayon?-?CarteEnX)*deltadistx
Else
stepx?=?1
DistanceLateraleEnX?=?(CarteEnX?+?1?-?PositionEnXduLancerdeRayon)*deltadistx?
EndIf
If?DirectionEnYduLancerDeRayon?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)/Dir ectionEnXduLancerDeRayon)????????
Else?????????
Perspective?=?Abs((CarteEnY?-?PositionEnYduLancerdeRayon?+?(1-stepy)*0.5)/Dir ectionEnYduLancerDeRayon)
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< br />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,Coule urBandes);?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?+?DirectionE nY?*?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?+?DirectionE nY?*?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)?+?DirectionEn Y?*?Cos(-VitesseDeLaRotation);
oldPlaneX?=?planex;
planex?=?planex?*?Cos(-VitesseDeLaRotation)?-?planey?*?Sin(-VitesseDeLaRotati on);
planey?=?oldPlaneX?*?Sin(-VitesseDeLaRotation)?+?planey?*?Cos(-VitesseDeLaRot ation);
EndIf
;?Test?si?on?appuie?sur?la?touche?flèche?"Droite"????
If?IsKeyDown("Right")=True?
;
AncienneDirectionEnX?=?DirectionEnX?;
DirectionEnx?=?DirectionEnX?*?Cos(VitesseDeLaRotation)?-?DirectionEnY?*?Sin(V itesseDeLaRotation);
DirectionEnY?=?AncienneDirectionEnX?*?Sin(VitesseDeLaRotation)?+?DirectionEnY ?*?Cos(VitesseDeLaRotation);
oldPlaneX?=?planex;
planex?=?planex?*?Cos(VitesseDeLaRotation)?-?planey?*?Sin(VitesseDeLaRotation );
planey?=?oldPlaneX?*?Sin(VitesseDeLaRotation)?+?planey?*?Cos(VitesseDeLaRotat ion);
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'ancie nne?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&eacu te;es?du?clavier
Forever



Message édité par : artblink / 13-01-2013 02:56

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