Resumo. 1- Criando a bolinha - sprites

Documentos relacionados
Vetor de tamanho variável

Menu de Barras na Screen 0

Menu de Barras na Screen 0

Rotação e Interpolação

Prof. Neckel. Capítulo 5. Aceleração média 23/03/2016 ACELERAÇÃO. É a taxa média de variação de velocidade em determinado intervalo de tempo = =

LANÇAMENTO HORIZONTAL

A Memória do MSX (I)

2ª Lista de Exercícios de Física I (Movimento em Uma Dimensão)

28/Set/ Movimento a uma dimensão Aceleração constante Queda livre 3.2 Movimento 2 e 3-D Vetor deslocamento 3.2.

O objetivo deste artigo é mostrar como é possível simular uma imagem 3D no MSX, através da técnica de anaglifo.

MOVIMENTO EM UMA LINHA RETA

Resumo. 1- Introdução

MOVIMENTO EM DUAS E TRÊS DIMENSÕES. O que um jogador de beisebol faz para saber onde deve estar para apanhar uma bola? CAPÍTULO 4

O objetivo deste artigo é apresentar o método de redução de cores Error Diffusion, utilizado no projeto MSX Viewer.

Reforço de Engenharia RESUMO. Movimento Unidimensional. Física 1 1

O objetivo deste artigo é demonstrar como se chegar ao cálculo do total de cores das screens 10, 11 e 12 do MSX 2+.

P2 MECÂNICA NEWTONIANA A (FIS 1025) 28/10/2011. Questão Valor Grau Revisão. -As respostas sem justificativas ou cálculos não serão computadas.

Física Geral Nos problemas abaixo, considere g = 9,8 m/s 2 e dê as suas respostas em unidades SI.

Leis de Newton. Algumas aplicações das leis de Newton

Movimento retilíneo uniformemente

Física I 2009/2010. Aula02 Movimento Unidimensional

a) sistema de cores aditivo b) sistema de cores subtrativo Figura 1. Sistemas de cores.

GABARITO COMENTADO DE PROVAS DE FÍSICA CINEMÁTICA

Curso de Engenharia Civil. Física Geral e Experimental I Movimento Prof.a: Msd. Érica Muniz 1 Período

V m = ΔS / Δt ΔS = V m. Δt ΔS = 3, m/s. 1,28 s ΔS = 3, m. s 0= 245 km. = 45 / 0,5 V m = 90 km/h

CEDERJ - CENTRO DE EDUCAÇÃO SUPERIOR A DISTÂNCIA DO ESTADO DO RIO DE JANEIRO

Lógica de Jogos. Conteúdo

Criptografia no MSX Fulswrjudild qr PVZ

FORMATO DO PROGRAMA FONTE

Vetores. Toda grandeza vetorial possui:

FUNÇÃO DO 2º GRAU. y = f(x) = ax² + bx + c, onde a, b e c são constantes reais e. O gráfico de uma função quadrática é uma parábola

Resposta da questão. A figura ilustra as duas situações, descida e subida.

1 Introdução 14 Lançamento horizontal (equações) 2 Queda livre e lançamento vertical 15 Lançamento horizontal x lançamento vertical

Otimização da Paleta de Cores

Resumo. 1- Introdução. 2- O programa

GABARITO DA AFE02 FÍSICA 2ª SÉRIE 2016

A partir dessas definições, podemos afirmar que se a força resultante F R 3 SEGUNDA LEI DE NEWTON: PRINCÍPIO FUNDAMENTAL DA DINÂMICA

Física 1. Resumo e Exercícios P1

FÍSICA PROFº JAISON MATTEI

BANCO DE QUESTÕES - FÍSICA - 2ª SÉRIE - ENSINO MÉDIO ==============================================================================================

3.1 - Funções para manipular dados de entrada e saída padrão

Lista 5 Leis de Newton

LISTA 2. Cinemática e dinâmica

Sonic the Hedgehog (Master System)

Aula 3 Introdução à Cinemática Movimento em 1 dimensão

Física I Prova 1 25/04/2015

Aula /2 Sistemas de coordenadas Window x Viewport

Oficina: Programação para Android com o App Inventor. Profª. Alana Gama Licencianda em Ciências da Computação IF Baiano Campus Senhor do Bonfim

Ambiente de programação

Usando Display Gráfico com C18 e C30

Movimento de um Projétil

EQUAÇÃO DE TORRICELLI E LANÇAMENTO VERTICAL EXERCÍCIOS

Resoluções dos exercícios propostos

Ezequias Martins França Paulo Giovanni de Souza Carvalho. Resolução dos problemas 2.4 e 2.6 da lista de exercícios

Cinemática Escalar. DEFINIÇÃO: estudo do movimento sem se

COLÉGIO SÃO JOÃO GUALBERTO

Guia de Atividades usando o método de Euler para encontrar a solução de uma Equação Diferencial Ordinária

Física I Prova 1 29/03/2014

Lista 2: Cinemática em uma Dimensão

Sabendo o momento do encontro, só é necessário aplicá-lo em uma das duas funções (do caminhão ou do carro).

Theory Portuguese (Portugal) Antes de iniciar este problema, leia cuidadosamente as Instruções Gerais que pode encontrar noutro envelope.

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

1ª Prova de Física I - FCM0101

O MOVIMENTO RETILÍNEO UNIFORMEMENTE VARIADO (MRUV)

Atividade Complementar para a DP de Física 1. Profs. Dulceval Andrade e Luiz Tomaz

Processamento Digital de Imagens

A Linguagem C. A forma de um programa em C

Fís. Semana. Leonardo Gomes (Arthur Vieira)

W sen = v h A. Considerando o somatório das forças: Vamos calcular o número de Reynolds: F 2 Re=1264 5, Re=28

Curso de Engenharia Civil. Física Geral e Experimental I Lançamentos Prof.a: Msd. Érica Muniz 1 Período

Theory Portugues BR (Brazil) Por favor, leia as instruções gerais contidas no envelope separado antes de iniciar este problema.

Desconsidere os efeitos do trabalho muscular após o início do salto. a) 4 m/s b) 6 m/s c) 7 m/s d) 8 m/s e) 9 m/s

CENTRO DE CIÊNCIAS E TECNOLOGIA AGROALIMENTAR UNIDADE ACADÊMICA DE TECNOLOGIA DE ALIMENTOS DISCIPLINA: FÍSICA I FORÇA E MOVIMENTO. Prof.

Sistemas numéricos e a Representação Interna dos Dado no Computador

2ª Lista de Exercícios Fundamentos de Mecânica Clássica Profº. Rodrigo Dias

Notação Científica. n é um expoente inteiro; N é tal que:

Algoritmos e Programação

FIS-14 Lista-01 Novembro/2017

Sistema de Coordenadas Intrínsecas

UniCAD. Simulação de movimento. Passo 1. Será criada uma simulação de movimento de rotação das roldanas e de translação do bloco.

(Queda Livre, Lançamentos Verticais, velocidade media, mru, mruv, derivada e integrais)

3. Programação Gráfica

UNIDADE 15 OSCILAÇÕES

Estruturas de Repetição

Fixação Módulo 1 aula 10 Gráfico sxt do MUV

MATA49 Programação de Software Básico

Transcrição:

Sprites e Gravidade

Resumo O objetivo deste artigo é mostrar como aplicar o efeito de gravidade em uma bolinha feita a partir do recurso de sprites do MSX 1. 1- Criando a bolinha - sprites O recurso de sprites no MSX serve para criar máscaras (figuras) para serem desenhadas sobre a tela, podendo ser movimentadas livremente, e sem causar prejuízo a tela de fundo, como por exemplo, apagar a área sob a máscara ao movimentar-se. A figura do sprite é definida por áreas que irão acender e sobrepor o fundo da tela e outras que ficarão apagadas e manter o fundo da tela. As áreas acesas serão representadas por uma única cor no MSX 1, definida no comando PUT SPRITE. Há dois tamanhos de sprite: 8x8 e 16x16, que serão definidos no comando SCREEN modo, sprite, onde a opção sprite irá valer: 0 sprites 8x8 normal 1 sprites 8x8 aumentado 2 sprites 16x16 normal 3 sprites 16x16 aumentado A instrução em Basic SPRITE$(n) = string define o desenho que irá aparecer na tela. A variável n é uma identificação para o sprite, que varia de 0 a 255 no modo 8x8, e de 0 a 63 no modo 16x16. Já string é uma cadeia de caracteres que irá conter a configuração de desenho do sprite. Cada caractere da string de definição do sprite é um código ASCII que irá conter a informação de pixel aceso e pixel apagado do sprite. Ao converter-se esse valor do código ASCII para binário, os valores de bit iguais a um irão acender o pixel do sprite, enquanto que os valores de bit igual a zero irão apagar. No modo 8x8, cada caractere define uma linha, onde cada bit do código ASCII define uma coluna da tela. O exemplo a seguir contém a configuração para desenhar a letra M no modo 8x8: A$ = CHR$(&b01000010) B$ = CHR$(&b01100110) C$ = CHR$(&b01011010) D$ = CHR$(&b01011010) E$ = CHR$(&b01000010) F$ = CHR$(&b01000010) G$ = CHR$(&b01000010) H$ = CHR$(&b) SPRITE$(1) = A$+B$+C$+D$+E$+F$+G$+H$ Note que os bits 0 e 1 definem a forma do desenho. Os valores igual a 1 foram destacados em vermelho para melhor visualizar o formato da letra M. Já o modo 16x16 é composto de 4 quadrantes, onde cada quadrante é formado por um bloco de 8x8 de 0 e 1's, configurados da seguinte maneira:

Q1 Q3 Q2 Q4 Onde os quadrantes serão empilhados na ordem: Q1, Q2, Q3 e Q4. Configuração do desenho na tela Empilhamento para as instruções READ-DATA Um exemplo de desenho fica: 1000100110001100 1101101001010010 1010101111011100 1000101001011100 1000101001010110 1000100111010010 1101101000010010 1010100110001100 1000100001010010 1000101110010010

No exemplo do manual do Expert [1] relativo ao comando PUT SPRITE, há uma receita de bolo de como desenhar um sprite na tela. O programa a seguir, substitui o desenho do programa do livro por uma bolinha. 20 FOR T=1 TO 8 30 READ A$ 40 S$=S$+CHR$(VAL("&B"+A$)) 50 NEXT T 60 SPRITE$(1)=S$ 70 PUT SPRITE 0,(128,96),15,1 80 GOTO 80 100 DATA 00111100 110 DATA 01111110 120 DATA 130 DATA 140 DATA 150 DATA 160 DATA 01111110 170 DATA 00111100 sprite.bas Esse programa trata os dados contidos em DATA como uma string de 8 caracteres, onde futuramente irão receber o prefixo &B, para transformá-los em um número binário. Então, cada valor de DATA é convertido de binário-string para um valor inteiro. Finalmente, obtém-se o caractere correspondente ao valor de inteiro obtido. O comando PUT SPRITE camada, (x,y), cor, id_sprite irá desenhar o sprite na tela. É possível fornecer também os valores de DATA em outros formatos, como, por exemplo binário, decimal e hexadecimal. sprite2.bas 20 FOR T=1 TO 8 30 READ A 40 S$=S$+CHR$(A) 50 NEXT T 60 SPRITE$(1)=S$ 70 PUT SPRITE 0,(128,96),15,1 80 GOTO 80 100 DATA &B00111100 110 DATA &B01111110 120 DATA &B 130 DATA &B 140 DATA &B 150 DATA &B 160 DATA &B01111110 170 DATA &B00111100 Dados no formato binário. sprite3.bas 20 FOR T=1 TO 8 30 READ A$ 40 S$=S$+CHR$(VAL("&H"+A$)) 50 NEXT T 60 SPRITE$(1)=S$ 70 PUT SPRITE 0,(128,96),15,1 80 GOTO 80 100 DATA 3C,7E,FF,FF,FF,FF,7E,3C ou 20 FOR T=1 TO 8 30 READ A 40 S$=S$+CHR$(A) 50 NEXT T 60 SPRITE$(1)=S$ 70 PUT SPRITE 0,(128,96),15,1 80 GOTO 80 100 DATA &H3C,&H7E,&HFF,&HFF,&HFF,&HFF, &H7E,&H3C Dados no formato hexadecimal.

A movimentação da bolinha é feita alterando-se o valor das coordenadas x, y do PUT SPRITE. A coordenada x, y define a origem do desenho e ela se localiza no canto superior do sprite, conforme mostrado pelo ponto vermelho da figura 1a. Entretanto, há um bug no MSX quando o sprite é desenhado, no qual a figura é deslocada y+1 pixel (figura 1b). a) Coordenada x,y teórica do sprite. b) Coordenada x,y real do sprite. Figura 1. Coordenada x,y do sprite. Assim, os limites do sprite são definidos por: (x, y+1) (x+7, y+8). Quando o sprite é no formato 16x16, a linha 20 é substituída por: 20 FOR T=1 TO 32 A camada do comando PUT SPRITE irá definir o nível de prioridade de desenho. Os sprites de menor nível irão desenhar sobre os de maior nível. Varia de 0 a 31. 2- Movimento de Queda Livre no MSX Depois de desenhar a bolinha, aplicamos os conceitos de aceleração da gravidade e queda livre nela, para vê-la caindo e quicando sobre uma superfície na tela. Na física, as seguintes equações definem o movimento uniformemente variado (MUV) de um objeto: I. v=v 0 +a. Δ t II. s=s 0 +v 0. Δ t+ a. Δ t2 2 Para um movimento vertical, o valor da aceleração é a própria aceleração da gravidade, representada pela letra g. As equações são reescritas da seguinte maneira: III. v=v 0 +g.δ t IV. s=s 0 +v 0. Δ t+ g. Δ t 2 2

O cálculo do movimento da bolinha estará dentro de um loop, onde serão encontrados os valores de duas incógnitas a cada iteração: a nova velocidade da bolinha e sua nova posição na tela. Você deve ter se perguntado e o valor de Δt? O Δt é o tempo decorrido entre uma iteração e outra. Esse tempo pode ser medido e colocado aqui, mas vamos assumir que o tempo entre cada iteração seja igual a 0.2 segundos. Será adotado como origem do sistema o local de inicio da queda da bolinha. Dessa forma, o sistema no eixo y, onde o movimento da bolinha se dará, será positivo de cima para baixo, coincidindo com a convenção do eixo y da tela do MSX. A equação IV será reescrita, de forma a se calcular o deslocamento da bolinha e facilitar os cálculos. V. Δ s=v 0.Δ t+ g.δt 2 2 Os valores conhecidos são: g = 9,81 m/s² Δt = 0.2 s Figura 2. Sistemas de coordenadas. O programa a seguir faz o cálculo da nova velocidade e posição da bolinha em uma iteração. 10 SCREEN 0 20 G=9.81 30 DT=0.2 40 V0=0 50 S0=0 60 GOSUB 500 70 PRINT"NOVA VELOCIDADE:";V0 80 PRINT"NOVA POSICAO:";S0+DS 90 END 497 ' 498 ' GRAVIDADE 499 ' 500 V = V0 + G*DT 510 DS = V0*DT + (G*DT^2)/2 520 RETURN grav1.bas 3- Aplicando o Conceito de Queda Livre na bolinha Agora é só juntar tudo o que foi feito até aqui. O código da bolinha e o código da gravidade.

17 ' 18 ' Parametros iniciais 19 ' 20 G=9.81 30 DT=0.2 40 V0=0 50 S0=0 57 ' 58 ' Cria a bolinha 59 ' 60 FOR T=1 TO 8 70 READ A$ 80 S$=S$+CHR$(VAL("&B"+A$)) 90 NEXT T 100 SPRITE$(1)=S$ 110 DATA 00111100 120 DATA 01111110 130 DATA 140 DATA 150 DATA 160 DATA 170 DATA 01111110 180 DATA 00111100 190 ' 191 ' Loop de movimento da bola 192 ' 200 PUT SPRITE 0,(128,S0),15,1 210 GOSUB 500 220 S0 = S0 + DS 230 V0 = V 240 IF S0 > 220 THEN END ELSE 200 497 ' 498 ' GRAVIDADE 499 ' 500 V = V0 + G*DT 510 DS = V0*DT + (G*DT^2)/2 520 RETURN gravbol.bas O programa acima faz com que a bolinha caia até ultrapassar a borda inferior da tela. Vamos acrescentar um chão e fazer a bolinha quicar até parar? Para isso, as seguintes considerações terão que ser feitas: Quando a bolinha chegar ou ultrapassar o chão (lembre-se dos limites da bolinha apresentados na seção 1), travar a bolinha acima da superfície. De acordo com a lei de ação e reação, inverter o sentido de movimento (o chão empurra a bolinha de volta para cima com a mesma força). Absorver parte da energia da bolinha, retirando um pouco de sua velocidade (agora considera-se que o impacto no chão absorve energia). Obs: levar em conta o bug da posição y+1 do sprite.

gravbol2.bas 17 ' 18 ' Parametros iniciais 19 ' 20 G=9.81 30 DT=0.2 40 V0=0 50 S0=0 57 ' 58 ' Cria a bolinha 59 ' 60 FOR T=1 TO 8 70 READ A$ 80 S$=S$+CHR$(VAL("&B"+A$)) 90 NEXT T 100 SPRITE$(1)=S$ 110 DATA 00111100 120 DATA 01111110 130 DATA 140 DATA 150 DATA 160 DATA 170 DATA 01111110 180 DATA 00111100 181 ' 182 ' Desenha o chão 183 ' 184 LINE(0,180) (255,211),3,BF 190 ' 191 ' Loop de movimento da bola 192 ' 200 PUT SPRITE 0,(128,S0),15,1 210 GOSUB 500 220 S0 = S0 + DS 230 V0 = V 240 IF S0+8 >= 179 THEN V0 = V0*0.7 : S0=179 8 250 GOTO 200 497 ' 498 ' GRAVIDADE 499 ' 500 V = V0 + G*DT 510 DS = V0*DT + (G*DT^2)/2 520 RETURN No programa anterior, a bolinha ultrapassa o chão em uma determinada iteração e este fato é ignorado. Dessa forma, a velocidade utilizada nesse instante corresponde a uma posição além do chão. O correto é utilizar o valor da velocidade correspondente ao exato instante em que a bolinha toca o chão. Ao desprezarmos esse fato, geramos um movimento oscilatório quando a bolinha tenta parar no chão, pois uma energia extra é introduzida no sistema.

Figura 3. Correção da posição da bolinha. A figura 3 ilustra o erro mencionado, quando a bola atinge o chão pela primeira vez. A velocidade adotada é de 58,86, quando deveria ser de 57,92. Dessa forma, uma energia correspondente a uma velocidade de 0,94 é adicionada ao sistema. A velocidade para S=171 pode ser calculada utilizando-se a Equação de Torricelli: VI. v 2 =v 0 2 +2a Δ s, onde a=g. Assim: (58,86) 2 =v 0 2 +2 9,81 (176,58 171) v 0 2 =3464,4996 2 9,81 5,58 v 0 2 =3464,4996 109,4796 v 0 = 3355,02=57,92 A linha 240 pode ser modificada para: 240 IF S0+8 >= 179 THEN DS=171 S0:V0=SQR(ABS(V0^2+2*G*DS))*.7:S0=179 8 O uso desse cálculo gera um retardo na animação da bolinha. No MSX Turbo-R, esse efeito não é notado. Uma solução alternativa é detectar quando a bolinha atinge o chão e não tem mais forças para subir, e interromper a animação. Utilizando-se a Equação de Torricelli, calculamos a velocidade mínima para a bolinha quicar e mover um pixel para cima: v 2 =v 0 2 +2a Δ s 0=v 0 2 +2 9,81 ( 1) v 0 2 = ( 19,62) v 0 = 19,62=4,43 Alterando-se as seguintes linhas programa anterior, resolvemos o problema: 210 IF EN=1 THEN 200 ELSE GOSUB 500... 240 IF S0+8>=179 THEN V0 = V0*0.7 : S0=179 8 : IF ABS(V0)<4.4 THEN EN=1 Pode-se também introduzir um movimento horizontal na bolinha. O programa a seguir reproduz o efeito da bolinha como em um jogo de squash, onde há movimento horizontal e vertical e o acréscimo de duas paredes para a bolinha ricochetear.

squash.bas 17 ' 18 ' Parametros iniciais 19 ' 20 DT=0.2 30 VV= 50 40 SV=172 50 VH=40 51 SH=5 57 ' 58 ' Cria a bolinha 59 ' 60 FOR T=1 TO 8 70 READ A$ 80 S$=S$+CHR$(VAL("&B"+A$)) 90 NEXT T 100 SPRITE$(1)=S$ 110 DATA 00111100 120 DATA 01111110 130 DATA 140 DATA 150 DATA 160 DATA 170 DATA 01111110 180 DATA 00111100 181 ' 182 ' Desenha o chão e as paredes 183 ' 184 LINE(0,180) (255,211),3,BF 185 LINE(250,0) (255,179),14,BF 187 LINE(0,0) (5,179),14,BF 190 ' 191 ' Loop de movimento da bolinha 192 ' 200 PUT SPRITE 0,(SH,SV),15,1 210 IF EN<>1 THEN V0=VV : A=9.81 : GOSUB 500 : ' Mov. Vertical 220 IF EN<>1 THEN VV=V0 : SV = SV + DS 230 V0=VH : A=0 : GOSUB 500 : ' Mov. Horizontal 240 VH=V0 : SH = SH + DS 250 IF SV+8 >= 179 THEN VV = VV*0.8 : VH = VH*0.8 : SV=179 8 : IF ABS(VV) < 4.4 THEN EN=1 260 IF SH+8 >= 250 THEN VV = VV*0.8 : VH = VH*0.8 : SH=250 8 270 IF SH <= 5 THEN VV = VV*0.8 : VH = VH*0.8 : SH=5 280 GOTO 200 497 ' 498 ' Movimento 499 ' 500 V = V0 + A*DT 510 DS = V0*DT + (A*DT^2)/2 520 V0 = V 530 RETURN Obs: Os programas-fonte acompanham o artigo na página MarMSX Development.

4- Créditos Este artigo foi escrito por Marcelo Silveira, em Outubro de 2016 e revisado em Setembro de 2017. E-mail: flamar98@hotmail.com Homepage: http://marmsx.msxall.com Referências: [1] - Livro: Linguagem Basic MSX, editora Aleph, 5a. Edição, 1987. [2] - Livro: Dominando o Expert, editora Aleph, 5a. Edição, 1987.