Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 265 884

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Raycasting Hollywood (Wolfeinstein 3D)

Raycasting Hollywood (Wolfeinstein 3D)#953

5Contributeur(s)
artblinkCreolsAmiDARKCrisotTarzin
3 Modérateur(s)
K-LElwoodcorto
artblink artblinkicon_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, 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

artblink artblinkicon_post
Oups,

J'ai oublié les liens des exécutables... (attention, j'ai encore des modifs à faire)

Les voici:

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

c'est comment le résultat?

Vitesse par exemple?

Respect

Creols Creolsicon_post
Le résultat est loin de nos espérances, mais sans menu, il est difficile d'imaginer ce qu'il faut faire.

Mais je suis sûr que tu vas nous arranger tout ça ;-)
0
artblink artblinkicon_post
lol.... faut appuyer sur les flèches pour bouger, mais vaut mieux appuyer sur les flèches droite gauche au départ pour faire une rotation.

T'as raison creols, c'est pas top, mais je suis à fond dessus. la, le problème c'est qu'on avance par saccade car j'utilise les coordonnées du tableau comme coordonnée de déplacement, il faut que j'arrive à définir pour 1 case de la map soit égal à une valeur de pixel (ex 32 ou 64 ou autre).

Pour le moment je fais que du code, les gfx/bruitage/msx je laisse sa de côtés car je perd du temp avec sa. se que je veux, optimiser tous mes PRG.

Dans pas longtemp, ton écran va prendre feu... il me reste a optimiser la vitesse des flammes ;-)

A quand un jeux? je fini d'abord toutes mes routines et une fois tout optimiser, je finaliserai tous mes projets (3 en particulier)

C'est plus facile de dév des routines et de les assemblé que de créé un projet directement. ;-)

J'espère que d'autre développeur hollywood seront intéressé par mes travaux, comme sa on pourra dév à plusieurs.

Pour le moment, je fais de la promo ;-)

Respect
AmiDARK AmiDARKicon_post
Salut :)

Bon, pour ce dont je t'avais parlé ( le logiciel de modélisation 3D que j'avais fait en vectoriel ), impossible de le retrouver ... j'ai dû le paumer il y a longtemps :(

Par contre ...

J'ai un vieux bouquin pour apprendre à faire un moteur 3D à la wolfeinstein avec un CD ... je viens de tester le CD il fonctionne toujours ... si tu veux je t'envoie les sources ( en C ) du moteur 3D ...

J'ai aussi (vérifié) toujours les sources (mais en 100% assembleur 68060) mon 1er moteur 3D sur Amiga OS 3.x ... Je peux t'envoyer les sources de la librairie et les codes sources AmosPRO qui l'utilisent ...

Je dois avoir un autre bouquin un peu meilleur que le 1er avec le CD aussi ... mais faut que je le recherche ... je sais pas où il est ...
artblink artblinkicon_post
O vivivivivivi...

Merci copain...
AmiDARK AmiDARKicon_post
Check ton mèl ;)
artblink artblinkicon_post
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
Message édité par : artblink / 02-01-2011 15:40
Crisot Crisoticon_post
C'est rigolo, mais encore une fois je vais faire mon chieur: Mes raycasting texturés en AMOS sur un 500 non acceléré étaient plus rapide qu'Holywood sur un G4. :-)
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
artblink artblinkicon_post
Non tu fais pas ton chieur ;-), il faut tout me dire. (enfin pas tout... hum... bon si tu veux... mais en privé :-D)

Sinon, jamais je n'améliorerai mes connaissances et mes prg


Attention, le moteur n'est as le miens, c'est celui de Jali (il est passer par des combines le malin, sa rame, mais pas con le gars)

Pour les texture, attention, c'est la technique que j'avais utilisé pour mon scroll à la kid chaos.

On sauvegarde les couleurs des pixels composant une image texture (64x64 pixel) dans un tableau
On travail dans se tableau, la rotation 3D ensuite, on la projectionne sur les surfaces a texturer grâce à la commande ... hum... rigole pas... Plot, c'est à dire que l'on va allumer chaque pixel de l'écran lol.

Bon, je me mets dessus histoire d'accélérer le truc

Sinon, mon spaceship 3D, niveau vitesse... par rapport à Amos? c'est pas trop mal? ou je dois revenir dessus?

Merci crisot ;-)
Message édité par : artblink / 03-01-2011 08:15
Message édité par : artblink / 03-01-2011 08:16
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme