CPC Rulez
https://cpcrulez.fr/forum/

RayCasting simple
https://cpcrulez.fr/forum/viewtopic.php?f=4&t=5372
Page 1 sur 1

Auteur :  demoniakparadox [ 05 Déc 2014, 17:59 ]
Sujet du message :  RayCasting simple

Comme j'avais quelques heures à perdre ces dernières semaines, j'ai eu envie de faire un petit essai...

Bon comme le dit le titre, c'est très "basique".
Il s'affiche en 160x200 en mode 0.
Les touches fléchées servent au déplacement.

Voici le source, commenté ;-)

Code :
        org     #9000
        run $
start:
        DI
        LD      BC,#7F8C
        OUT     (C),C
        LD      H,Laby/256              ; Adresse <HI> de la "map"
        EXX
DrawView:
        LD      A,#20                   ; Angle
        SUB     40                      ; A2 = Angle - 40, on va tracer des lignes verticales de angle-40 à angle+39 => 80 octets en largeur
        LD      (BclDrawView+1),A
        XOR     A
        LD      (DrawX+1),A
BclDrawView:
        LD      HL,TabCos/2
        LD      A,L                     ; A2
        ADD     HL,HL
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      (stepy+1),BC
        LD      H,TabCos/512
        ADD     A,64                    ; A2 + 64 (TabCos[Angle+64]=TabSin[Angle])
        LD      L,A
        ADD     HL,HL
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      (stepx+1),BC
PosY:
        LD      HL,#2800                ; yy
PosX:
        LD      DE,#3800                ; xx
        XOR     A
LoopLabyView:
        EX      AF,AF'                  ; Sauvegarde dist
        LD      A,H
        ADD     A,A
        ADD     A,A
        AND     #F0
        LD      B,A                     ; b = yy >> 6 = ( yy >>10 ) << 4
        LD      A,D
        RRA
        SRA     A                       ; a = xx >> 10
        ADD     A,B
        EXX
        LD      L,A
        LD      A,(HL)                  ; Laby[ ( xx >> 10 ) + ( yy >> 10 ) << 4 ]
        EXX
        AND     A
        JR      NZ,EndLoopLaby
stepy:
        LD      BC,0
        ADD     HL,BC                   ; HL = PosY + stepy
        EX      DE,HL
stepx:
        LD      BC,0
        ADD     HL,BC
        EX      DE,HL                   ; DE = PosX + stepx
        EX      AF,AF'
        INC     A                       ; Dist = Dist + 1
        JR      LoopLabyView
EndLoopLaby:
        LD      C,A                     ; couleur
        LD      H,TabHeight/256
        EX      AF,AF'
        LD      L,A                     ; En fonction de la distance
        LD      B,(HL)                  ; On déduit la hauteur
        LD      A,25
;
; Trace une ligne verticale avec L = x, B = hauteur, C = couleur
;
        SUB     B
        LD      (MinHauteur+1),A        ; Hauteur mini = 25 - hauteur
        ADD     A,B
        ADD     A,B
        LD      (MaxHauteur+1),A        ; Hauteur maxi = 25 + hauteur
DrawX:
        LD      HL,#C000                ; Position x
        LD      DE,#C050                ; Pour ajustement mémoire vidéo
        LD      B,50                    ; hauteur totale
BclY:
        LD      A,B
MaxHauteur:
        CP      0                       ; Hauteur max à tracer
        JR      NC,DrawVide
MinHauteur:
        CP      0                       ; Hauteur min à tracer
        JR      C,DrawVide
        LD      A,C                     ; Octet mode 0 représentant la couleur du mur
        JR      DrawOk
DrawVide:
        XOR     A                       ; Pas de mur
DrawOk:
        LD      (HL),A                  ; Ecriture dans Ligne n
        SET     3,H                     ; Ligne n + 1
        LD      (HL),A                  ; Ecriture
        SET     4,H                     ; Ligne n + 3
        LD      (HL),A                  ; Ecriture
        RES     3,H                     ; Ligne n + 2
        LD      (HL),A                  ; Ecriture
        LD      A,H                     ; Ici H a déja été augmenté de #10 (avec le SET 4)
        ADD     A,#10                   ; Passage à la ligne n+4
        LD      H,A
        JR      NC,Suite
        ADD     HL,DE                   ; Ajustement si débordement
Suite:
        DJNZ    BclY                    ; Nombre de Y terminés ?
        LD      A,(BclDrawView+1)
        INC     A                       ; Incrémeter A2 (angle de traçage)
        LD      (BclDrawView+1),A
        LD      A,(DrawX+1)
        INC     A                       ; Incrémenter position de traçage (mémoire vidéo)
        LD      (DrawX+1),A
        CP      80                      ; 80 lignes tracées ?
        JP      C,BclDrawView           ; Sinon on continue
;
; Lecture Clavier
;
        LD      BC,#F40E
        OUT     (C),C
        LD      BC,#F6C0
        OUT     (C),C
        XOR     A
        OUT     (C),A
        LD      BC,#F792
        OUT     (C),C
        LD      A,#40
        LD      HL,MatClavier
ReadClav1:
        LD      B,#F6
        OUT     (C),A
        LD      B,#F4
        INI
        INC     A
        CP      #42                     ; Pas besoin d'aller plus loin pour lire les flèches
        JR      C,ReadClav1
        LD      BC,#F782
        OUT     (C),C

        DEC     HL
        LD      A,(HL)
        RRA                             ; Left
        JR      C,TstRight
        LD      A,(DrawView+1)
        SUB     4                       ; Angle = Angle - 4
        LD      (DrawView+1),A

TstRight:
        DEC     HL
        LD      A,(HL)
        BIT     1,A                     ; Right
        JR      NZ,TstUp
        LD      A,(DrawView+1)
        ADD     A,4                     ; Angle = Angle + 4
        LD      (DrawView+1),A

TstUp:
        LD      A,(HL)
        RRA                             ; Up
        JR      c,TstDown
        LD      DE,#4000                ; Déplacement en avant => +cos[A+64] en x et +cos[A] en y
        JR      Move

TstDown:
        BIT     1,A                     ; Down
        JP      NZ,DrawView

        LD      DE,#C080                ; Déplacement en arrière => +cos[A-64] en x et +cos[A+128] en y
Move:
        LD      H,TabCos/512
        LD      A,(DrawView+1)
        ADD     A,D
        LD      L,A
        SUB     D
        ADD     A,E                     ; D = E + 64 (TabCos[Angle+64]=TabSin[Angle])
        ADD     HL,HL                   ; TabCos est un tableau de mot (16 bits)
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      HL,(PosX+1)
        ADD     HL,BC
        ADD     HL,BC
        ADD     HL,BC
        ADD     HL,BC                   ; PosX + TabCos[ Angle + D ] << 2
        EX      DE,HL                   ; DE = newPx
        LD      H,TabCos/512
        LD      L,A
        ADD     HL,HL
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      HL,(PosY+1)
        ADD     HL,BC
        ADD     HL,BC
        ADD     HL,BC
        ADD     HL,BC                   ; HL = newPy (PosY + TabCos[ Angle + E ] << 2)
        LD      A,H
        ADD     A,A
        ADD     A,A
        AND     #F0
        LD      B,A                     ; b = newpy >> 6
        LD      A,D
        RRA
        SRA     A                       ; a = newpx >> 10
        ADD     A,B
        EXX
        LD      L,A
        LD      A,(HL)                  ; Lecture valeur laby[ ( newpx >> 10 ) + ( newpy >> 10 ) << 4 ]
        EXX
        AND     A
        JR      NZ,NoMove               ; Si laby[ newpos ] non vide, pas de déplacement possible
        LD      (PosY+1),HL
        EX      DE,HL
        LD      (PosX+1),HL
NoMove:
        JP      DrawView

;
; Les données suivantes doivent commencer à une adresse divisible par 256 ;-)
;
        org     #9200

;
; "Map" => chaque valeur est un octet en mode 0
;
Laby:
        DB      #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC
        DB      #FC, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #F3, #00, #00, #03
        DB      #03, #00, #00, #00, #00, #00, #00, #00, #33, #00, #00, #00, #3F, #00, #C3, #FC
        DB      #FC, #00, #00, #00, #00, #00, #00, #00, #33, #00, #30, #00, #F3, #00, #00, #03
        DB      #03, #00, #00, #00, #00, #00, #30, #CF, #CF, #00, #CC, #00, #00, #00, #00, #FC
        DB      #FC, #00, #00, #00, #00, #00, #CC, #00, #33, #CC, #30, #CC, #30, #CC, #00, #03
        DB      #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #CC, #00, #CC, #00, #00, #FC
        DB      #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #CC, #00, #CC, #00, #00, #FC
        DB      #FC, #00, #00, #00, #00, #00, #CC, #00, #00, #00, #30, #00, #30, #00, #C3, #03
        DB      #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #00, #00, #00, #00, #00, #FC
        DB      #FC, #00, #00, #00, #00, #00, #F0, #3C, #F0, #3C, #00, #00, #00, #00, #00, #03
        DB      #FC, #00, #00, #00, #00, #00, #F0, #3C, #F0, #3C, #00, #00, #00, #00, #00, #03
        DB      #03, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #FC
        DB      #FC, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #03
        DB      #03, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #FC
        DB      #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03

;
; Conversion distance en hauteur de mur (hauteur variant de 25 (hauteur max) à 0)
;
TabHeight
        DB      #19, #19, #19, #19, #19, #19, #19, #19, #19, #19, #16, #14, #12, #11, #10, #0F
        DB      #0E, #0D, #0C, #0B, #0B, #0A, #0A, #09, #09, #09, #08, #08, #08, #07, #07, #07
        DB      #07, #06, #06, #06, #06, #06, #05, #05, #05, #05, #05, #05, #05, #05, #04, #04
        DB      #04, #04, #04, #04, #04, #04, #04, #04, #04, #03, #03, #03, #03, #03, #03, #03
        DB      #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #02, #02, #02, #02
        DB      #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02
        DB      #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02
        DB      #02, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
        DB      #01, #01, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00
        DB      #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00

;
; Tableau de mot de 16 bits => cos(x)*80 (x de 0 à 255 pour un équivalent angle de 0 à 359 degrés)
;
TabCos
        DW      #0050, #004F, #004F, #004F, #004F, #004F, #004F, #004E
        DW      #004E, #004E, #004D, #004D, #004C, #004B, #004B, #004A
        DW      #0049, #0049, #0048, #0047, #0046, #0045, #0044, #0043
        DW      #0042, #0041, #0040, #003F, #003D, #003C, #003B, #0039
        DW      #0038, #0037, #0035, #0034, #0032, #0031, #002F, #002E
        DW      #002C, #002A, #0029, #0027, #0025, #0023, #0022, #0020
        DW      #001E, #001C, #001A, #0019, #0017, #0015, #0013, #0011
        DW      #000F, #000D, #000B, #0009, #0007, #0005, #0003, #0001
        DW      #0000, #FFFF, #FFFD, #FFFB, #FFF9, #FFF7, #FFF5, #FFF3
        DW      #FFF1, #FFEF, #FFED, #FFEB, #FFE9, #FFE7, #FFE6, #FFE4
        DW      #FFE2, #FFE0, #FFDE, #FFDD, #FFDB, #FFD9, #FFD7, #FFD6
        DW      #FFD4, #FFD2, #FFD1, #FFCF, #FFCE, #FFCC, #FFCB, #FFC9
        DW      #FFC8, #FFC7, #FFC5, #FFC4, #FFC3, #FFC1, #FFC0, #FFBF
        DW      #FFBE, #FFBD, #FFBC, #FFBB, #FFBA, #FFB9, #FFB8, #FFB7
        DW      #FFB7, #FFB6, #FFB5, #FFB5, #FFB4, #FFB3, #FFB3, #FFB2
        DW      #FFB2, #FFB2, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1
        DW      #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB2
        DW      #FFB2, #FFB2, #FFB3, #FFB3, #FFB4, #FFB5, #FFB5, #FFB6
        DW      #FFB7, #FFB7, #FFB8, #FFB9, #FFBA, #FFBB, #FFBC, #FFBD
        DW      #FFBE, #FFBF, #FFC0, #FFC1, #FFC3, #FFC4, #FFC5, #FFC7
        DW      #FFC8, #FFC9, #FFCB, #FFCC, #FFCE, #FFCF, #FFD1, #FFD2
        DW      #FFD4, #FFD6, #FFD7, #FFD9, #FFDB, #FFDD, #FFDE, #FFE0
        DW      #FFE2, #FFE4, #FFE6, #FFE7, #FFE9, #FFEB, #FFED, #FFEF
        DW      #FFF1, #FFF3, #FFF5, #FFF7, #FFF9, #FFFB, #FFFD, #FFFF
        DW      #0000, #0001, #0003, #0005, #0007, #0009, #000B, #000D
        DW      #000F, #0011, #0013, #0015, #0017, #0019, #001A, #001C
        DW      #001E, #0020, #0022, #0023, #0025, #0027, #0029, #002A
        DW      #002C, #002E, #002F, #0031, #0032, #0034, #0035, #0037
        DW      #0038, #0039, #003B, #003C, #003D, #003F, #0040, #0041
        DW      #0042, #0043, #0044, #0045, #0046, #0047, #0048, #0049
        DW      #0049, #004A, #004B, #004B, #004C, #004D, #004D, #004E
        DW      #004E, #004E, #004F, #004F, #004F, #004F, #004F, #004F

MatClavier:
        DS      3

Auteur :  hERMOL [ 05 Déc 2014, 19:39 ]
Sujet du message :  Re: RayCasting simple

Image

Wouaah ! très intéressent, tu peu m'explique comment marche l'encodage de la map ?

Auteur :  demoniakparadox [ 06 Déc 2014, 10:13 ]
Sujet du message :  Re: RayCasting simple

hERMOL a écrit :
Wouaah ! très intéressent, tu peu m'explique comment marche l'encodage de la map ?


C'est très simple :
J'affiche des "doubles pixels mode 0" (soit un octet).
Si je veux donc un pixel de couleur 1, je code #C0 dans la map (#C0 = pixel 0 et pixel 1 de couleur 1, en mode 0)
Si je veux un pixel de couleur 2, je code #0C dans la map
Et ainsi de suite...

Avec ce système, on pourrait même créer des "murs rayés" : contenant deux couleurs, par exemple en codant #48 dans la map, on aurait un pixel de couleur 2 suivi d'un pixel de couleur 1

Auteur :  demoniakparadox [ 08 Déc 2014, 17:37 ]
Sujet du message :  Re: RayCasting simple

Petit update, version optimisée en vitesse (au détriment de la précision d'affichage...)

Code :
        org     #9000
        run $
start:
        DI
        LD      BC,#7F8C
        OUT     (C),C
        LD      H,Laby/256              ; Adresse <HI> de la "map"
        EXX

DrawView:
        LD      A,#00                   ; Angle
        SUB     40                      ; A2 = Angle - 40, on va tracer des lignes verticales de angle-40 à angle+39 => 80 octets en largeur
        LD      (BclDrawView+1),A
        XOR     A
        LD      (DrawX+1),A
BclDrawView:
        LD      HL,TabCos/2
        LD      A,L                     ; A2
        LD      D,A
        ADD     HL,HL
        LD      A,(HL)
        INC     HL
        LD      B,(HL)
        RLA
        RL      B
        RLA
        RL      B
        RLA
        RL      B
        RLA
        RL      B
        LD      C,A
        LD      (stepy+1),BC
        LD      H,TabCos/512
        LD      A,D
        ADD     A,64                    ; A2 + 64 (TabCos[Angle+64]=TabSin[Angle])
        LD      L,A
        ADD     HL,HL
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      (stepx+1),BC
PosX:
        LD      DE,#0400                ; xx
PosY:
        LD      HL,#1000                ; yy
        XOR     A
LoopLabyView:
        EX      AF,AF'                  ; Sauvegarde dist
        LD      A,H
        AND     #F0
        OR      D
        EXX
        LD      L,A
        LD      A,(HL)                  ; Laby[ ( xx >> 10 ) + ( yy >> 10 ) << 4 ]
        EXX
        AND     A
        JR      NZ,EndLoopLaby
stepy:
        LD      BC,0
        ADD     HL,BC                   ; HL = PosY + stepy
        EX      DE,HL
stepx:
        LD      BC,0
        ADD     HL,BC
        EX      DE,HL                   ; DE = PosX + stepx
        EX      AF,AF'
        INC     A                       ; Dist = Dist + 1
        JR      LoopLabyView
EndLoopLaby:
        LD      C,A                     ; couleur
        LD      H,TabHeight/256
        EX      AF,AF'
        LD      L,A                     ; En fonction de la distance
        LD      B,(HL)                  ; On déduit la hauteur
        LD      A,25
;
; Trace une ligne verticale avec L = x, B = hauteur, C = couleur
;
        SUB     B
        LD      (MinHauteur+1),A        ; Hauteur mini = 25 - hauteur
        ADD     A,B
        ADD     A,B
        LD      (MaxHauteur+1),A        ; Hauteur maxi = 25 + hauteur
DrawX:
        LD      HL,#C000                ; Position x
        LD      DE,#C050                ; Pour ajustement mémoire vidéo
        LD      B,50                    ; hauteur totale
BclY:
        LD      A,B
MaxHauteur:
        CP      0                       ; Hauteur max à tracer
        JR      NC,DrawVide
MinHauteur:
        CP      0                       ; Hauteur min à tracer
        JR      C,DrawVide
        LD      A,C                     ; Octet mode 0 représentant la couleur du mur
        JR      DrawOk
DrawVide:
        XOR     A                       ; Pas de mur
DrawOk:
        LD      (HL),A                  ; Ecriture dans Ligne n
        SET     3,H                     ; Ligne n + 1
        LD      (HL),A                  ; Ecriture
        SET     4,H                     ; Ligne n + 3
        LD      (HL),A                  ; Ecriture
        RES     3,H                     ; Ligne n + 2
        LD      (HL),A                  ; Ecriture
        LD      A,H                     ; Ici H a déja été augmenté de #10 (avec le SET 4)
        ADD     A,#10                   ; Passage à la ligne n+4
        LD      H,A
        JR      NC,Suite
        ADD     HL,DE                   ; Ajustement si débordement
Suite:
        DJNZ    BclY                    ; Nombre de Y terminés ?
        LD      A,(BclDrawView+1)
        INC     A                       ; Incrémeter A2 (angle de traçage)
        LD      (BclDrawView+1),A
        LD      A,(DrawX+1)
        INC     A
        LD      (DrawX+1),A
        CP      80
        JP      C,BclDrawView
        LD      BC,#F40E
        OUT     (C),C
        LD      BC,#F6C0
        OUT     (C),C
        XOR     A
        OUT     (C),A
        LD      BC,#F792
        OUT     (C),C
        LD      A,#40
        LD      HL,MatClavier
ReadClav1:
        LD      B,#F6
        OUT     (C),A
        LD      B,#F4
        INI
        INC     A
        CP      #42                     ; Pas besoin d'aller plus loin pour lire les flèches
        JR      C,ReadClav1
        LD      BC,#F782
        OUT     (C),C

        DEC     HL
        LD      A,(HL)
        RRA                             ; Left
        JR      C,TstRight
        LD      A,(DrawView+1)
        SUB     4                       ; Angle = Angle - 4
        LD      (DrawView+1),A

TstRight:
        DEC     HL
        LD      A,(HL)
        BIT     1,A                     ; Right
        JR      NZ,TstUp
        LD      A,(DrawView+1)
        ADD     A,4                     ; Angle = Angle + 4
        LD      (DrawView+1),A

TstUp:
        LD      A,(HL)
        RRA                             ; Up
        JR      c,TstDown
        LD      DE,#4000                ; Déplacement en avant => +cos[A+64] en x et +cos[A] en y
        JR      Move

TstDown:
        BIT     1,A                     ; Down
        JP   NZ,DrawView

        LD      DE,#C080                ; Déplacement en arrière => +cos[A-64] en x et +cos[A+128] en y
Move:
        LD      H,TabCos/512
        LD      A,(DrawView+1)
        ADD     A,D
        LD      L,A
        SUB     D
        ADD     A,E                     ; D = E + 64 (TabCos[Angle+64]=TabSin[Angle])
        ADD     HL,HL                   ; TabCos est un tableau de mot (16 bits)
        LD      C,(HL)
        INC     HL
        LD      B,(HL)
        LD      HL,(PosX+1)
        ADD     HL,BC
        EX      DE,HL                   ; DE = newPx
        LD      H,TabCos/512
        LD      L,A
        ADD     HL,HL
        LD      A,(HL)
        INC     HL
        LD      B,(HL)
        RLA
        RL      B
        RLA
        RL      B
        RLA     
        RL      B
        RLA
        RL      B
        LD      C,A
        LD      HL,(PosY+1)
        ADD     HL,BC                   ; HL = newPy (PosY + TabCos[ Angle + E ] << 1)
        LD      A,H
        AND     #F0
        OR      D
        EXX
        LD      L,A
        LD      A,(HL)                  ; Lecture valeur laby[ ( newpx >> 10 ) + ( newpy >> 10 ) << 4 ]
        EXX
        AND     A
        JP      NZ,DrawView             ; Si laby[ newpos ] non vide, pas de déplacement possible
        LD      (PosY+1),HL
        EX      DE,HL
        LD      (PosX+1),HL
        JP      DrawView

        org     #9200

;
; "Map" => chaque valeur est un octet en mode 0
;
Laby:
   DB #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #C4, #4C
   DB #FC, #10, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #01, #4C
   DB #03, #00, #00, #00, #00, #00, #00, #00, #33, #00, #00, #00, #00, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #00, #00, #33, #00, #30, #00, #00, #00, #00, #4C
   DB #03, #00, #00, #00, #00, #00, #30, #CF, #CF, #00, #CC, #00, #00, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #CC, #00, #33, #CC, #30, #CC, #30, #CC, #00, #4C
   DB #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #CC, #00, #CC, #00, #00, #4C
   DB #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #CC, #00, #CC, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #CC, #00, #00, #00, #30, #00, #00, #00, #C3, #4C
   DB #03, #00, #00, #00, #00, #00, #30, #00, #00, #00, #00, #00, #00, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #F0, #3C, #F0, #00, #00, #00, #00, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #F0, #3C, #F0, #3C, #00, #00, #00, #00, #00, #4C
   DB #03, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #4C
   DB #FC, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #4C
   DB #03, #10, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #00, #01, #4C
   DB #FC, #03, #FC, #03, #FC, #03, #FC, #03, #FC, #03, #34, #FC, #03, #FC, #C4, #4C

;
; Conversion distance en hauteur de mur (hauteur variant de 25 (hauteur max) à 0)
;
TabHeight
   DB #19, #19, #19, #19, #19, #19, #19, #19, #19, #19, #19, #16, #14, #13, #11, #10
   DB #0F, #0E, #0D, #0D, #0C, #0B, #0B, #0A, #0A, #0A, #09, #09, #08, #08, #08, #08
   DB #07, #07, #07, #07, #06, #06, #06, #06, #06, #06, #05, #05, #05, #05, #05, #05
   DB #05, #05, #05, #04, #04, #04, #04, #04, #04, #04, #04, #04, #04, #04, #04, #03
   DB #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03, #03
   DB #03, #03, #03, #03, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02
   DB #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02
   DB #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #02, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01
   DB #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #01, #00, #00, #00, #00, #00

;
; Tableau de mot de 16 bits => cos(x)*80 (x de 0 à 255 pour un équivalent angle de 0 à 359 degrés)
;
TabCos
        DW      #0050, #004F, #004F, #004F, #004F, #004F, #004F, #004E
        DW      #004E, #004E, #004D, #004D, #004C, #004B, #004B, #004A
        DW      #0049, #0049, #0048, #0047, #0046, #0045, #0044, #0043
        DW      #0042, #0041, #0040, #003F, #003D, #003C, #003B, #0039
        DW      #0038, #0037, #0035, #0034, #0032, #0031, #002F, #002E
        DW      #002C, #002A, #0029, #0027, #0025, #0023, #0022, #0020
        DW      #001E, #001C, #001A, #0019, #0017, #0015, #0013, #0011
        DW      #000F, #000D, #000B, #0009, #0007, #0005, #0003, #0001
        DW      #0000, #FFFF, #FFFD, #FFFB, #FFF9, #FFF7, #FFF5, #FFF3
        DW      #FFF1, #FFEF, #FFED, #FFEB, #FFE9, #FFE7, #FFE6, #FFE4
        DW      #FFE2, #FFE0, #FFDE, #FFDD, #FFDB, #FFD9, #FFD7, #FFD6
        DW      #FFD4, #FFD2, #FFD1, #FFCF, #FFCE, #FFCC, #FFCB, #FFC9
        DW      #FFC8, #FFC7, #FFC5, #FFC4, #FFC3, #FFC1, #FFC0, #FFBF
        DW      #FFBE, #FFBD, #FFBC, #FFBB, #FFBA, #FFB9, #FFB8, #FFB7
        DW      #FFB7, #FFB6, #FFB5, #FFB5, #FFB4, #FFB3, #FFB3, #FFB2
        DW      #FFB2, #FFB2, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1
        DW      #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB1, #FFB2
        DW      #FFB2, #FFB2, #FFB3, #FFB3, #FFB4, #FFB5, #FFB5, #FFB6
        DW      #FFB7, #FFB7, #FFB8, #FFB9, #FFBA, #FFBB, #FFBC, #FFBD
        DW      #FFBE, #FFBF, #FFC0, #FFC1, #FFC3, #FFC4, #FFC5, #FFC7
        DW      #FFC8, #FFC9, #FFCB, #FFCC, #FFCE, #FFCF, #FFD1, #FFD2
        DW      #FFD4, #FFD6, #FFD7, #FFD9, #FFDB, #FFDD, #FFDE, #FFE0
        DW      #FFE2, #FFE4, #FFE6, #FFE7, #FFE9, #FFEB, #FFED, #FFEF
        DW      #FFF1, #FFF3, #FFF5, #FFF7, #FFF9, #FFFB, #FFFD, #FFFF
        DW      #0000, #0001, #0003, #0005, #0007, #0009, #000B, #000D
        DW      #000F, #0011, #0013, #0015, #0017, #0019, #001A, #001C
        DW      #001E, #0020, #0022, #0023, #0025, #0027, #0029, #002A
        DW      #002C, #002E, #002F, #0031, #0032, #0034, #0035, #0037
        DW      #0038, #0039, #003B, #003C, #003D, #003F, #0040, #0041
        DW      #0042, #0043, #0044, #0045, #0046, #0047, #0048, #0049
        DW      #0049, #004A, #004B, #004B, #004C, #004D, #004D, #004E
        DW      #004E, #004E, #004F, #004F, #004F, #004F, #004F, #004F

MatClavier:
        DS      3

Auteur :  Kris [ 09 Déc 2014, 09:09 ]
Sujet du message :  Re: RayCasting simple

Bel essai ;)

Auteur :  Plissken [ 09 Déc 2014, 17:27 ]
Sujet du message :  Re: RayCasting simple

Pas mal du tout !

Des tests pour un futur jeu ?

Auteur :  demoniakparadox [ 09 Déc 2014, 21:07 ]
Sujet du message :  Re: RayCasting simple

Plissken a écrit :
Pas mal du tout !

Des tests pour un futur jeu ?


Non, plus trop la motivation pour faire quelque chose de concret...
Mais si quelqu'un veut s'en servir pour faire un jeu, pas de soucis ;-)

Auteur :  AsT [ 10 Déc 2014, 10:18 ]
Sujet du message :  Re: RayCasting simple

Salut,

C'est plutôt pas mal. Heureux de te revoir... Il faudra un jour qu'on assemble toutes ses routines 'from scratch' et qu'on en sorte quelque chose pour ce bon vieu Cpc.
À bientôt Ludo.

Auteur :  Plissken [ 10 Déc 2014, 11:46 ]
Sujet du message :  Re: RayCasting simple

J'ai fait mu muse avec la map,il y a du potentiel :)

Auteur :  demoniakparadox [ 10 Déc 2014, 12:22 ]
Sujet du message :  Re: RayCasting simple

AsT a écrit :
Salut,

C'est plutôt pas mal. Heureux de te revoir... Il faudra un jour qu'on assemble toutes ses routines 'from scratch' et qu'on en sorte quelque chose pour ce bon vieu Cpc.
À bientôt Ludo.


Salut David !
Oui, faudrait faire ça en effet :)

Page 1 sur 1 Le fuseau horaire est UTC+1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/