Páginas

domingo, 26 de março de 2023

domingo, 26 de março de 2023

CM: Os Jogos no Computador - 110

A título pontual publicamos esta edição de 25 de agosto de 1991 de "Os Jogos no Computador", o espaço dedicado aos videojogos no Correio da Manhã.  Esta edição publicou um mapa e solução (parcial) e em português, da aventura "The Secret of Monkey Island". Terá sido a primeira publicação portuguesa a dar dicas para este clássico? A digitalização encontra-se acessível neste link.

sábado, 4 de março de 2023

sábado, 4 de março de 2023

Type-in: Gráficos em 3D (1990)


Na edição nº27 da revista RS232 encontramos uma listagem de código de Fernando Preces para o QuickBASIC, a qual fez parte de uma sequência de artigos sobre gráficos em 3D. 


Este programa apresenta uma animação simples da rotação de um objeto em 3D (wireframe) em torno do seu eixo vertical. Cada frame de animação objeto é pré-desenhado e armazenado em memória. A animação, relativamente fluída, é conseguida com a troca das páginas 0 e 1 no modo gráfico 9. Quando um passo da animação é exibido numa das páginas, na outra é guardado o passo seguinte.

A listagem dispõe de dados para duas figuras, sendo só apresentada uma deles. Basta trocar as labels "dados" e "dados1" para mudarmos a silhueta apresentada. Também há código comentado para a inserção manual das silhuetas pelo utilizador.

Segue a listagem:

'F.A.Preces - Fev 90
'Gráficos em 3D

CONST pi = 3.1416   'Valor aproximado de PI

w = 5500: ap% = 1: vp% = 0

'Espaço para as 6 figuras do movimento rotativo
DIM cubo1(w), cubo2(w), cubo3(w)
DIM cubo4(w), cubo5(w), cubo6(w)

'Reserva de espaço para os valores dos 3 eixos
DIM x(17, 8), y(17, 8), z(17, 8)

'Porçao da figura a rodar
seno = SIN(pi / 4): coseno = COS(pi / 4)

aa = 320: bb = 50   'Coordenadas de arranque

'Coordenada do Ecran em EGA
SCREEN 9: WINDOW (0, 0)-(640, 350): COLOR 6, 1: CLS

RESTORE dados
READ x: x(15, 1) = x: READ y: y(1, 1) = y: z(1, 1) = 0

'leitura dos dados da Silhueta
FOR c = 2 TO 16
    READ x: 'ou por GOSUB limpa: INPUT "Comprimento "; x
    x(c, 1) = x
    READ y: 'ou por GOSUB limpa: INPUT "Altura "; y
    y(c, 1) = y
    z(c, 1) = 0
    x1 = x(c - 1, 1) + aa: y1 = y(c - 1, 1) + bb
    x2 = aa + x(c, 1): y2 = bb + y(c, 1)
    LINE (x1, y1)-(x2, y2) 'Desenha a silhueta
NEXT c

'Prepara a figura em 3D
FOR q = 1 TO 6
    FOR B = 2 TO 8
        FOR a = 1 TO c - 1
            x(a, B) = x(a, B - 1) * coseno - z(a, B - 1) * seno
            z(a, B) = z(a, B - 1) * coseno + x(a, B - 1) * seno
            y(a, B) = y(a, B - 1)
        NEXT a
    NEXT B
    CLS
    'Desenha as seis imagens para a rotaç?o
    FOR B = 1 TO 7
        FOR a = 1 TO c - 1
            x1 = aa + x(a, B): y1 = bb + (y(a, B) - .5 * z(a, B))
            x2 = x1 + x(a, B + 1) - x(a, B)
            y2 = y1 + (y(a, B + 1) - .5 * z(a, B + 1)) - (y(a, B) - .5 * z(a, B))
            LINE (x1, y1)-(x2, y2), 6
            x1 = x2: y1 = y2
            x2 = x1 + x(a + 1, B + 1) - x(a, B + 1)
            y = y1 + y(a + 1, B + 1) - .5 * z(a + 1, B + 1)
            y2 = y - (y(a, B + 1) - .5 * z(a, B + 1))
            LINE (x1, y1)-(x2, y2), 5
        NEXT a
    NEXT B
    FOR a = 1 TO c - 1
        x1 = aa + x(a, 8): y1 = bb + (y(a, 8) - .5 * z(a, 8))
        x2 = x1 + x(a, 1) - x(a, 8)
        y2 = y1 + (y(a, 1) - .5 * z(a, 1)) - (y(a, 8) - .5 * z(a, 8))
        LINE (x1, y1)-(x2, y2), 6
        x1 = x2: y1 = y2
        x2 = x1 + x(a + 1, 1) - x(a, 1)
        y2 = y1 + (y(a + 1, 1) - .5 * z(a + 1, 1)) - (y(a, 1) - .5 * z(a, 1))
        LINE (x1, y1)-(x2, y2), 5
    NEXT a

    'Memoriza as 6 imagens
    IF q = 1 THEN GET (220, 42)-(440, 235), cubo1
    IF q = 2 THEN GET (220, 42)-(440, 235), cubo2
    IF q = 3 THEN GET (220, 42)-(440, 235), cubo3
    IF q = 4 THEN GET (220, 42)-(440, 235), cubo4
    IF q = 5 THEN GET (220, 42)-(440, 235), cubo5
    IF q = 6 THEN GET (220, 42)-(440, 235), cubo6

    'Prepara o desfazamento entre imagens
    FOR a = 1 TO c - 1
        xn = x(a, 1) * COS(pi / 24) - z(a, 1) * SIN(pi / 24)
        zn = z(a, 1) * COS(pi / 24) + x(a, 1) * SIN(pi / 24)
        x(a, 1) = xn: z(a, 1) = zn
    NEXT a
NEXT q: CLS

'As 6 imagens s?o memorizadas no Buffer de Imagens gradualmente,
'em 2 páginas sucessivas de ecran (apresenta uma e grava outra)

ciclo:
FOR q% = 1 TO 6
    SCREEN 9, , ap%, vp%
    CLS 1
    IF q% = 1 THEN PUT (220, 42), cubo1
    IF q% = 2 THEN PUT (220, 42), cubo2
    IF q% = 3 THEN PUT (220, 42), cubo3
    IF q% = 4 THEN PUT (220, 42), cubo4
    IF q% = 5 THEN PUT (220, 42), cubo5
    IF q% = 6 THEN PUT (220, 42), cubo6

    SWAP ap%, vp%   'Troca de página

NEXT q%

IF INKEY$ <> "" THEN END
GOTO ciclo
END

limpa:
    LOCATE 1, 1: PRINT STRING$(79, " "): LOCATE 1, 1
    RETURN

dados1:  'Silhueta de reserva
DATA 40, 40, 40, 40, 80, 40, 85, 45, 85, 100, 80, 100, 60, 100, 80, 100, 80, 125
DATA 40, 125, 40, 125, 55, 125, 55, 125, 40, 125, 40, 40, 0, 40

dados:    'Silhueta apresentada
DATA 0, 0, 25, 5, 35, 20, 80, 30, 80, 80, 30, 120, 30, 150, 45, 160, 20, 160
DATA 20, 110, 70, 70, 70, 35, 0, 20, 0, 20, 0, 20, 0, 20

sábado, 25 de fevereiro de 2023

sábado, 25 de fevereiro de 2023

Type-in: Efeitos sonoros (1989)

Ao longo da sua existência, a revista portuguesa RS232 publicou inúmeros type-ins de pequenos programas e jogos. Apresentamos um desses type-ins, enviado por Fernando Preces para RS232 nº14, que demonstra alguns efeitos sonoros obtidos a partir da instrução SOUND. A listagem pode ser inserida no GW-BASIC original, e também no PC-BASIC, um interpretador moderno que emula o GW-BASIC e o BASICA.

Segue a listagem:

5 DEFINT A-Z
10 ' Programa demonstraçao dos Efeitos Sonoros
12 ' PLANETA MS-DOS: Type-in de Fernando Preces na RS232 #14
15 ' GWBASIC/BASICA
20 ' Menu de efeitos de som
25 Q = 2: a$ = "Prima uma tecla para terminar"
30 WHILE Q >= 1
35      CLS
40      PRINT "Efeitos sonoros": PRINT
45      COLOR 15, 0: PRINT "  C"; : COLOR 7, 0: PRINT "rescente"
50      COLOR 15, 0: PRINT "  D"; : COLOR 7, 0: PRINT "ecrescente"
55      COLOR 15, 0: PRINT "  B"; : COLOR 7, 0: PRINT "uzina"
60      COLOR 15, 0: PRINT "  S"; : COLOR 7, 0: PRINT "irene"
65      COLOR 15, 0: PRINT "  Q"; : COLOR 7, 0: PRINT "uit"
70      PRINT : PRINT "Select: ";
75      Q$ = INPUT$(1): Q = INSTR ("CDBSQcdbsq", Q$) ' Dá uma tecla válida
80      IF Q = 0 GOTO 75
85      CLS     ' Mostra a acçao baseada na tecla
90      ON Q GOSUB 100, 200, 300, 400, 500, 100, 200, 300, 400, 500
95 WEND
100 ' Crescente com dois sons decrementando o intervalo de tempo
105     HTONE = 32767: LTONE = 246
110     PRINT "Crescente . . ."
111     PRINT : PRINT a$
112     WHILE INKEY$ = ""
115         FOR COUNT = 60 TO 1 STEP -2
120             SOUND LTONE - COUNT / 2, COUNT / 20
125             SOUND HTONE, COUNT / 15
130         NEXT COUNT
131         FOR n = 1 to 5000: NEXT n
132     WEND
135 RETURN
200 ' Decrescente - de tom agudo para tom baixo
205     HTONE = 2000: LTONE = 550: DELAY = 500
210     PRINT "Decrescente . . ."
211     PRINT: PRINT a$
212     WHILE INKEY$ = ""
215         FOR COUNT = HTONE TO LTONE STEP -10
220             SOUND COUNT, DELAY / COUNT
225         NEXT COUNT
226         FOR n = 1 to 5000: NEXT n
227     WEND
230 RETURN
300 ' Buzina - dois sons alternados até tecla premida
305     HTONE = 987: LTONE = 329
310     PRINT "Buzinando . . ."
315     PRINT: PRINT a$
320     WHILE INKEY$ = ""
325         SOUND HTONE, 5: SOUND LTONE, 5
330     WEND
335 RETURN
400 ' Sirene - dois sons até tecla premida
405     HTONE = 780: RANGE = 650
410     PRINT "Sirenando . . ."
415     PRINT: PRINT a$
420     WHILE INKEY$ = ""
425         FOR COUNT = RANGE TO -RANGE STEP -4
430             SOUND HTONE - ABS(COUNT), .3
435             COUNT = COUNT - 2 / RANGE
440         NEXT COUNT
445     WEND
450 RETURN
500 ' Terminar
505 END

sexta-feira, 13 de janeiro de 2023

sexta-feira, 13 de janeiro de 2023

Wolfenstein 3D em CGA composto

Wolfenstein 3D em CGA composto? Parece irreal, mas alguém implementou o avô dos FPS modernos para os modos gráficos CGA, tanto no padrão tradicional de 4 cores, como o composto! O game developer James Howard, autor de tal proeza, explica o contexto neste tweet, no qual ficamos a saber que o código-fonte e uma demo serão disponibilizadas brevemente!