[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Raycasting 3D demo disk



David Schmenk wrote:
> Here for your enjoyment is a technology preview/demonstration of a
> raycasting and rendering algorithm

here is a texture/ "tile" editor, as well as MAP editor...

RUN it, press 1 to go to demo...

ESC from demo back to the editor...

press 2 to go to map editor

map editor:

JKLI move, a for texture up, z for texture down
control J to change vertical to current texture

control I to change horizontal  to current texture

<return> to set player position to current cursor position

<escape> to return to tex editor


Rich






 10  GR
 20 D$ =  CHR$ (4)
 30  PRINT D$;"BLOAD DEMO.OBJ"
 40  PRINT D$;"BLOAD DEMO.MAP,A$2000"
 50  POKE 768 + 0,0: POKE 768 + 1,32: POKE 768 + 2,32: REM
  MAP POINTER & DIMENSION
 60  POKE 768 + 6,0: POKE 768 + 7,64: REM  TEXTURE MAP BASE
 70  POKE 768 + 8,0: POKE 768 + 9,0: REM   PLAYER X POS
 71  POKE 768 + 10,0: POKE 768 + 11,0: REM   PLAYER Y POS
 72  POKE 768 + 12,0: REM  PLAYER VIEW DIRECTION
 80  GOSUB 12000
 90  GOSUB 10000
 100  VTAB 21: PRINT "TEXTURE# = ";T + 1;"  ";
 110  VTAB 21: HTAB 16: PRINT "COLOR= ";C;"   A=+ Z=-"
 4006 LA = 32784
 8000  GET A$
 8005  IF A$ = "1" THEN  GOSUB 11000
 8006  IF A$ = "2" THEN  GOSUB 40000: POKE 49238,0
 8010  IF A$ = "." THEN T = T + 1: GOSUB 13000
 8020  IF A$ = "," THEN T = T - 1: GOSUB 13000
 8040  VTAB 21: PRINT "TEXTURE# = ";T + 1;"  ";
 8050  IF A$ = "Q" THEN  STOP
 8060  IF A$ = "J" THEN JX = JX - 1
 8070  IF A$ = "L" THEN JX = JX + 1
 8080  IF A$ = "I" THEN JY = JY - 1
 8090  IF A$ = "K" THEN JY = JY + 1
 8091  IF JY > 16 THEN JY = 16
 8092  IF JX > 16 THEN JX = 16
 8093  IF JX < 1 THEN JX = 1
 8094  IF JY < 1 THEN JY = 1
 8100  IF JY <  > OY OR JX <  > OX THEN  COLOR= OC: PLOT OX,OY: COLOR=
C:OY = JY:OX = JX:OC =  SCRN( JX,JY): PLOT JX,JY
 8101  IF A$ = "Z" OR A$ = "A" THEN  GOSUB 20000
 8110  IF A$ = " " THEN  GOSUB 30000
 8120  COLOR= C
 8130  VTAB 21: HTAB 16: PRINT "COLOR= ";C
 8150 D = 16384 + (T * 256) + ((JX - 1) * 16) + (JY - 1)
 8170  IF A$ = "S" THEN  VTAB 22: INPUT "NAME ";A$: PRINT  CHR$
(4);"BSAVE ";A$;",A$4000,L4096": GOTO 100
 9000  GOTO 8000
 10000  REM
 10010 T = 0: REM  WHICH TEXTURE
 10020  PRINT  CHR$ (4);"BLOAD DEMO.TEX,A$4000"
 10021  PRINT  CHR$ (4);"BLOAD ROL,A$8000"
 10025 C = 5
 10030 JX = 8:JY = 8
 10040 OX = JX:OY = JY:OC =  SCRN( OX,OY)
 10045  COLOR= C: PLOT JX,JY
 10050  HOME
 10055  VTAB 22: PRINT " I MOVE <SPC>=PLOT <=NEXT TEXTURE"
 10056  VTAB 23: PRINT "JKL     S=AVE Q=IT >=PREV TEXTURE"
 10060  COLOR= 1: HLIN 0,17 AT 17
 10070  HLIN 0,17 AT 0
 10080  VLIN 0,17 AT 0
 10090  VLIN 0,17 AT 17
 10100  RETURN
 11000  REM  GOTO GAME
 11010  CALL 24576
 11020  GR : GOSUB 10030
 11030  GOSUB 13000
 11040  RETURN
 12000  IF T < 0 THEN T = 0
 12005  IF T > 15 THEN T = 15
 12009  FOR Y = 1 TO 16
 12010  FOR X = 1 TO 16
 12020 B = 16384 + (T * 256) + ((Y - 1) * 16) + (X - 1)
 12030 A =  PEEK (B)
 12040  COLOR= A
 12050  PLOT Y,X
 12060  NEXT X
 12070  NEXT Y
 12080  RETURN
 13000  GOSUB 12000
 13010 OC =  SCRN( JX,JY)
 13020  COLOR= C: PLOT JX,JY
 13030  RETURN
 20000  REM  COLOR CHANGE
 20010  IF A$ = "Z" THEN C = C - 1
 20020  IF A$ = "A" THEN C = C + 1
 20030  IF C < 0 THEN C = 0
 20040  IF C > 15 THEN C = 15
 20050  COLOR= C
 20060  VTAB 21: HTAB 16: PRINT "COLOR= ";C;" ";
 20070  PLOT 22,39
 20080  PLOT JX,JY
 20090  RETURN
 30000  REM  POKE PIXEL
 30010 D = 16384 + (T * 256) + ((JX - 1) * 16) + (JY - 1)
 30020  POKE 32768,C: CALL 32769
 30030 PIX =  PEEK (32768)
 30040  POKE D,PIX
 30050 OC = C
 30060  RETURN
 40000  HGR
 40001 GD = 4: REM   GRID SIZE
 40002  HCOLOR= 7
 40005  PRINT  CHR$ (4);"BLOAD DEMO.MAP,A$8030"
 40006 LD = 32816
 40010  FOR Y = 0 TO  PEEK (768 + 2) - 1
 40020  FOR X = 0 TO  PEEK (768 + 2) - 1
 40030 W1 =  PEEK (768 + 2)
 40060 W = LD + (Y * W1) + (X)
 40070 D =  PEEK (W)
 40080  POKE 32768,D
 40090  CALL 32786
 40095  REM  LOW NIBBLE = HORIZ
 40100  IF  PEEK (32768) > 0 THEN  HPLOT X * GD,Y * GD TO (X * GD),(Y *
GD) + GD
 40200  POKE 32768,D
 40210  CALL 32798
 40215  REM  HIGH NIBBLE = VERT
 40220  IF  PEEK (32768) > 0 THEN  HPLOT X * GD,Y * GD TO (X * GD) +
GD,Y * GD
 40230  NEXT X
 40240  NEXT Y
 40250 W1 = W1 - 1
 40300 EX = 0:EY = 0
 40500  HCOLOR= 7:X2 = (EX * GD):Y2 = EY * GD:W4 = GD - 1: HPLOT X2 +
1,Y2 + 1 TO X2 + W4,Y2 + 1 TO X2 + W4,Y2 + W4 TO X2 + 1,Y2 + W4 TO X2 +
1,Y2 + 1:X1 = EX:Y1 = EY
 40505 X1 = EX:Y1 = EY
 40510  GET A$
 40511  IF A$ = "A" THEN TN = TN + 1: IF TN > 15 THEN TN = 0
 40512  IF A$ = "Z" THEN TN = TN - 1: IF TN < 0 THEN TN = 15
 40513  VTAB 21: HTAB 1: PRINT "TEXTURE= ";TN;" "
 40515  IF A$ =  CHR$ (13) THEN  POKE 768 + 9,EX: POKE 768 + 11,EY
 40520  IF A$ = "J" THEN EX = EX - 1
 40525  IF A$ = "L" THEN EX = EX + 1
 40526  IF A$ = "I" THEN EY = EY - 1
 40527  IF A$ = "K" THEN EY = EY + 1
 40528  IF  ASC (A$) = 27 THEN  PRINT  CHR$ (4);"BLOAD
DEMO.MAP,A$2000": RETURN
 40530 R =  ASC (A$): IF R = 9 OR R = 10 THEN  GOSUB 40900
 40536  IF A$ = "Q" THEN  STOP
 40538  IF A$ = "S" THEN  VTAB 21: INPUT "NAME ";A$: PRINT  CHR$
(4);"BSAVE ";A$;",A";LD;",L";( PEEK (768 + 2) *  PEEK (768 + 2))
 40540  IF EX < 0 THEN EX = W1
 40545  IF EX > W1 THEN EX = 0
 40550  IF EY < 0 THEN EY = W1
 40555  IF EY > W1 THEN EY = 0
 40560  IF EX <  > X1 OR EY <  > Y1 THEN  HCOLOR= 0:X3 = (X1 * GD):X3 =
Y1 * GD:W4 = GD - 1: HPLOT X3 + 1,Y2 + 1 TO X2 + W4,Y2 + 1 TO X2 +
W4,Y2 + W4 TO X2 + 1,Y2 + W4 TO X2 + 1,Y2 + 1:X1 = EX:Y1 = EY: GOTO
40500
 40600  GOTO 40510
 40900  REM  EDIT ITEM
 40910 W1 =  PEEK (768 + 2)
 40912 W = LD + (EY * W1) + (EX)
 40914 D =  PEEK (W)
 40916  POKE 32768,D
 40918  CALL 32786
 40920  REM   LOW NIBBLE = HORIZ
 40921 L1 =  PEEK (32768)
 40922  POKE 32768,D
 40924  CALL 32798
 40926  REM   HIGH NIBBLE = VERT
 40928 H1 =  PEEK (32768)
 40930  IF R = 9 THEN  GOTO 40940
 40931  REM  HORIZ
 40932 D = H1 + TN
 40934  IF TN = 0 THEN  HCOLOR= 0: HPLOT EX * GD,EY * GD TO (EX *
GD),(EY * GD) + GD
 40936  IF TN > 0 THEN  HCOLOR= 7: HPLOT EX * GD,EY * GD TO (EX *
GD),(EY * GD) + GD
 40937  POKE W,D
 40938  RETURN
 40940  REM  VERT
 40942 D = L1 + (TN * 16)
 40944  IF TN = 0 THEN  HCOLOR= 0: HPLOT EX * GD,EY * GD TO (EX * GD) +
GD,EY * GD
 40946  IF TN > 0 THEN  HCOLOR= 7: HPLOT EX * GD,EY * GD TO (EX * GD) +
GD,EY * GD
 40947  POKE W,D
 40948  RETURN


8000-   20 AD 00    JSR   $00AD
8003-   80 2A       BRA   $802F
8005-   2A          ROL
8006-   2A          ROL
8007-   2A          ROL
8008-   0D 00 80    ORA   $8000
800B-   8D 00 80    STA   $8000
800E-   60          RTS
800F-   EA          NOP
8010-   EA          NOP
8011-   EA          NOP
8012-   AD 00 80    LDA   $8000
8015-   29 0F       AND   #$0F
8017-   8D 00 80    STA   $8000
801A-   60          RTS
801B-   EA          NOP
801C-   EA          NOP
801D-   EA          NOP
801E-   AD 00 80    LDA   $8000
8021-   29 F0       AND   #$F0
8023-   8D 00 80    STA   $8000
8026-   60          RTS
8027-   00          BRK