domingo, 26 de março de 2023
CM: Os Jogos no Computador - 110
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.
'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
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
Wolfenstein 3D em CGA composto
quinta-feira, 23 de junho de 2022
Recortes: Micro-ordinateurs de voyage - Science & Vie 833 (1987)
A revista francesa "Science et Vie" é uma das mais antigas publicações de actualidades e divulgação científica. Temas como micro-computação e informática já eram recorrentes na década de 1980.
É o caso do recorte que trazemos da edição 833 (Fevereiro de 1987) que lista as características de doze computadores portáteis (ou transportáveis) de marcas como Zenith, Panasonic ou Toshiba.
O PDF deste recorte pode ser obtido neste link.
quarta-feira, 18 de maio de 2022
RS232 n.º6
quarta-feira, 11 de maio de 2022
RS232 n.º5
Encontramos dois pontos de interesse neste número. O primeiro é a análise ao WYSE PC 386, um equipamento da americana WYSE, bem conhecida no início dos anos 80 pelos seus terminais de texto, antes de se aventurar no mercado dos computadores pessoais.
O segundo ponto de interesse é uma adaptação de um programa de BIORRITMO (no ZX Spectrum) para os Amstrad PC1512 e PC1640, realizada por Fernando Preces em Locomotive BASIC 2.
O post original do Planeta Sinclair com esta edição encontra-se neste link, e o ficheiro PDF pode ser obtido neste link.
quinta-feira, 5 de maio de 2022
30 anos de Wolfenstein 3D
Mas uma memória ficou bem vincada. Em certo ponto da feira formara-se uma multidão animada em torno de um computador. Pequenas colunas de som debitavam sons dignos de uma máquina de arcade: tiros, gritos, música! Aproximei-me por entre a multidão e preguei os meus olhos em algo que me fez cair o queixo! A acção era frenética e decorria na primeira pessoa, encarnando um herói de um qualquer filme da 2ª Guerra Mundial. Bastando para tal um mero PC 286 com placa Adlib! Como vibrava o público juvenil em volta desse stand na feira!
Muito poderia escrever sobre este clássico, por exemplo, como a inovação na jogabilidade e na técnica deu o mote inicial para um novo género que se afirmaria definitivamente com o DOOM. Mas decidi homenagear o "avô" dos FPS com uma memória bastante pessoal: a minha primeira impressão pessoal que descambou em centenas de horas de jogatina com este clássico da id Software.Foi também uma das minhas primeiras experiências "modernas" de criação de níveis quando, uns meses depois, chegava às minhas mãos um editor de mapas. Não fiz grande coisa com esta ferramenta, mas proporcionou-me horas de diversão (e mapas muito mal feitos)!
Parabéns, Wolfenstein 3D!