3. Animação com a metodologia clássica de programação.

Documentos relacionados
Algoritmos e Estruturas de dados

PCS-2529 Introdução aos Processadores. Prof. Dr. Paulo Sérgio Cugnasca

Estruturas de Repetição

Estrutura e Funcionamento dos Computadores (Conceitos Básicos)

COMANDOS DE DECISÕES. O COMANDO if. O comando if instrui o computador a tomar uma decisão simples. Forma Geral: if (expressão de teste) instrução;

Laboratório 3 Comandos de repetição while, do-while e for

Programação I A Linguagem C. Prof. Carlos Alberto

Tecnólogo em Análise e Desenvolvimento de Sistemas. Sistemas Operacionais (SOP A2)

Comando Switch. Embora a escada if else-if possa executar testes de várias maneiras, ela não é de maneira nenhuma elegante.

Algoritmos e Programação

Nível da Arquitetura do Conjunto das Instruções

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Linguagem C Princípios Básicos (parte 1)

Informática I. Aula /09/2006 1

Sistemas Operacionais. BSI / UAB 2013 Hélio Crestana Guardia

10 Comandos de repetição

Algoritmos e Técnicas de Programação. Professora Luciana Faria

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Material criado e organizado por: Suéllen Rodolfo Martinelli. Disponibilizado em:

Introdução a Sistemas Operacionais. Adão de Melo Neto

SO: Introdução e Estrutura. Sistemas Operacionais Flavio Figueiredo (

Linguagem C: Introdução

Arquitetura Von Neumann Dados e instruções são obtidos da mesma forma, simplificando o desenho do microprocessador;

Arquitetura e Organização de Computadores

Estrutura de Sistemas Operacionais. Capítulo 1: Introdução

UFRJ IM - DCC. Sistemas Operacionais I. Unidade IV Gerência de Recursos Entrada e Saída. 02/12/2014 Prof. Valeria M. Bastos

Linguagens de Programação

Prof. Sandro Wambier

Introdução a Computação

Ambiente de programação

Introdução à Programação

Comandos de entrada. e saída. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada.

Aula 4 Introdução ao C

05/11/2018. Linguagem de Programação e Estruturada

Introdução à Linguagem C

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Sistema Operacional. Etapa

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: tipos de dados definidos pelo programador: struct union enum typedef

Teste de Software. Técnica de Teste Estrutural. Rosemary Silveira Filgueiras Melo

Capítulo 6: Arquivos

Ederson Luiz da Silva Ciência da Computação. Algoritmos e Programação

Sistemas Operacionais Processos. Carlos Ferraz Jorge Cavalcanti Fonsêca

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU

Sistemas Operacionais - UCSAL Professor : Marco Antônio C. Câmara Primeira Lista de Exercícios

Programação de Computadores II. Cap. 4 Funções

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Processos O conceito de processos é fundamental para a implementação de um sistema multiprogramável. De uma maneira geral, um processo pode ser entend

Sistema de entrada e saída (E/S)- Módulos de E/S; tipos de operações de E/S

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Rio de Janeiro, 15 de fevereiro de 2016.

18/10/2010. Unidade de Controle Controle. UC Microprogramada

Working 04 : Conceitos Básicos III

Cap. 3 Entrada e Saída e Controle de Fluxo

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

LINGUAGEM DE PROGRAMAÇÃO ESTRUTURADA CAPÍTULO 5 ESTRUTURAS DE REPETIÇÃO EM C#

Unidade 3: Estruturas de Controle Parte 2 - Lógica, SWITCH, FOR, WHILE e DO WHILE Prof. Daniel Caetano

1. MATERIAIS NECESSÁRIOS

ENGENHARIA DE PRODUÇÃO ICC 1 TÉCNICAS DE PROGRAMAÇÃO

Trabalho Linguagem e Programação de Compiladores

ANÁLISE DE ALGORITMOS: PARTE 1. Prof. André Backes. Como resolver um problema no computador? Precisamos descrevê-lo de uma forma clara e precisa

Fundamentos de Programação

Programação Estruturada Aula - Estruturas de Repetição

Estruturas de Repetição

Sâmia Rodrigues Gorayeb. Arquitetura de Computadores Linguagem de Máquina

Desenvolvimento de Aplicações Desktop

INSTRUÇÕES DE REPETIÇÃO

Fundamentos de Arquiteturas de Computadores Turma :A1 Lista 3 Profa.: Simone Martins

INFORMÁTICA: Informação automática

Linguagem de Programação

Linguagem Java. Introdução. Rosemary Silveira Filgueiras Melo

Lógica de Programação e Algoritmos com exemplos na linguagem JAVA

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

MICROSOFT WINDOWS 7 WINDOWS 7 WINDOWS 7

Programação. Module Introduction. Cap. 1 Fundamentos de Computadores

Informática Básica e Aplicativos de Escritório

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

Introdução à Programação de Computadores Parte I

Ferramentas Programação. UDESC - Prof. Juliano Maia 1

Introdução à Informática. Aprenda o essencial da informática para sobreviver no mundo digital.

Fundamentos de Programação1

Fundamentos de Programação 1

Programação de Computadores I Funções de Repetição da Linguagem C PROFESSORA CINTIA CAETANO

TÉCNICAS DE PROGRAMAÇÃO II TRABALHO 2

Fundamentos de Sistemas Operacionais

Leitura Segura de Strings

Questão 1 Analise o trecho do código abaixo, escrito na linguagem C#:

Teste de Software. Técnica de Teste Estrutural. Rosemary Silveira Filgueiras Melo

Introdução a Programação. Arquivos

Aula 25: E/S: Controladoras, Mapeamentos e Técnicas

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Desenvolvendo Jogos 2D-Android

3. Linguagem de Programação C

Introdução à Programação

Programação Estruturada

Capítulo 2 Operadores. A função scanf()

Aula 6 Oficina de Programação Estruturas Condicionais no C. Profa. Elaine Faria UFU

15/03/2018. Professor Ariel da Silva Dias Paradigma Imperativo

Transcrição:

Considerações do autor. Criei este tutorial no intuito de preencher uma lacuna existente sobre a estrutura dos jogos na linguagem C, a qual também se aplica noutras linguagens, como o Pascal e o Basic. A compreensão deste material é de importância fundamental para o desenvolvimento de jogos animados, uma vez que a estrutura lógica será a mesma. Espero que seja útil para que você desenvolva o seu próprio jogo e com isso, tenha uma boa experiência com a poderosa linguagem C. 1. Introdução.!"# $%&'(%%)* +,-./01234+2,415 Cristian Machado Goulart, 14 de Maio de 2007. Acadêmico do curso de Sistemas de Informação - FACCAT Então você quer criar um jogo na linguagem C? Muito bem, este documento abordará desde a lógica de programação até exemplos com código fonte funcional. Apesar de que algumas pessoas pensem que os programadores de jogos para computador não dêem a mesma seriedade quanto no desenvolvimento de um software aplicativo, neste artigo você perceberá a real complexidade do desenvolvimento de um jogo simples. Por que criar um jogo de computador? Pela fascinante possibilidade de dar vida e inteligência aos personagens que você criou, ainda adquirir um significativo conhecimento na linguagem C e ser muito mais competitivo no mercado de trabalho. 2. Lógica de funcionamento de um jogo. A estrutura de um jogo difere do clássico método de implementar um aplicativo, uma vez que no ambiente de jogo diversas tarefas ocorrem simultaneamente (ex.: atirar e se mover), enquanto que o aplicativo sempre aguarda a entrada de dados do usuário (ex.: digite seu nome). Geralmente um jogo não precisa da interatividade constante do jogador para funcionar (outros objetos podem se movimentar para animar o cenário), enquanto que um aplicativo depende diretamente do que o usuário faz no programa. Assim podemos dizer que os jogos têm processamento de instruções quase paralelo (ex.: movimentar a nave do jogador e a nave inimiga). Por isso, as rotinas de programação (ou funções) não podem monopolizar o processamento da CPU e sim, utiliza-la por curtos períodos de tempo (ou ciclos de máquina). Desta forma a CPU dará a mesma atenção à cada uma das rotinas de forma que nenhum processo seja concluído antes do outro (destruir a nave antes do tiro completar a trajetória). As funções devem ser estruturadas para consumir apenas um ciclo de máquina e logo liberar a CPU para que outra rotina (ou função) possa ocupa-la pelo mesmo período. Como não é possível processar todos comandos de uma rotina em apenas um ciclo, são necessárias variáveis auxiliares que informem o ponto de continuação quando a rotina for chamada novamente. As variáveis auxiliares devem ser declaradas como estáticas para que o seu valor não seja perdido ao sair da rotina (ex.: static int i;) 3. Animação com a metodologia clássica de programação. Suponha que você queira construir um jogo no qual o jogador ainda não tenha interatividade: os personagens se movem por conta própria. Vamos escolher uma animação bem simples: Uma nave parada no centro superior da tela deve disparar um tiro até a parte inferior. (obs.: copie este trecho a partir do capítulo anexos e compile-o). /* Programa de exemplo 1 - Turbo C versao 1.0 */ /* Desc.: Mover o tiro de uma nave */ int i; /* limpa tela */ /* desl. cursor*/ gotoxy(40,1); /* posiciona coordenadasx,y */ printf("<ë>"); /* desenha nave na tela */ for (i=2;i<24;i++){ gotoxy(41,i); /* posiciona tiro */ /* limpa rastro */ gotoxy(41,i+1); /* posiciona */ /* desenha tiro nave */ delay(100); /* aguarda miliseg. */ Observe que a execução do tiro da nave funciona, mas requer toda atenção da CPU, ou seja, nenhuma outra instrução será atendida até que o laço for{ seja concluído. Isto significa que sempre que alguma nave atirar, o alvo não conseguirá escapar, pois a CPU não dará atenção à essa tarefa até concluir o movimento do tiro. A solução aparente seria criar todas animações dentro deste laço for{, mas isso impediria que o laço mais externo fosse executado até a conclusão do interno, o que travaria as outras animações. É neste instante que devemos optar pelo processamento quase paralelo de instruções, que implica na implementação de funções que ocupem a CPU por pouco tempo. Para isso, não devemos utilizar instruções de laço.

4. Animação com a metodologia de programação de jogos de videogame. A função abaixo é utilizada na implementação de jogos para videogame: animacao(){ static int naofaznada; if (naofaznada<4){ else naofaznada=0; aqui deve ser colocada a animacao A função animação() tem por objetivo, executar um quadro da animação do personagem e em seguida, liberar a CPU. Inicialmente é declarada a variável nãofaznada, que armazenará quantos ciclos de máquina deverão ser aguardados até permitir a execução um quadro da animação. Em seguida é verificado se a função já aguardou o tempo necessário para ser executada com a seguinte condição: Se a variável nãofaznada for menor do que o tempo necessário para executar uma animação, então fica mais um ciclo sem fazer nada e sai da função para que outra função possa usar a CPU. Caso variável nãofaznada seja igual ao tempo de espera, então a ela é zerada e um quadro da animação é processado. Logo em seguida a CPU é liberada. Além deste tipo de função consumir apenas um ciclo de máquina, a variável nãofaznada determina a velocidade da animação sem interferir no desempenho das demais animações. Agora a animação do exemplo 1 será implementada seguindo a estrutura de jogos, execute o Programa de exemplo 2 localizado nas páginas anexas. A trecho destacado em negrito corresponde a animação desta função: Enquanto o tiro não chegar na parte inferior da tela (linha 24), ocorre um incremento na PosiçãoTiro. Se o tiro chegou na parte inferior, a variável é reiniciada em 2, pois a nave já ocupa a posição 1. Experimente velocidades diferentes para a instrução naofaznada<6. Ex.: naofaznada<10 A instrução Kbhit (Keyboard Hit) informa se alguma tecla foi pressionada, o que nos permite criar condições de acordo com a interatividade do jogador. 5. Associando animações com o teclado. Cada dispositivo do computador é identificado por um número de interrupção (definido na BIOS). O teclado é encontrado no endereço 0x60. O Programa de exemplo 3 da secção de anexos identifica o valor de cada tecla do teclado para que possa ser associado com alguma função do jogo. A instrução switch(getch()) destina-se a esvaziar o buffer de memória de 16 Bytes do teclado e evitar os bips. Esta instrução foi contribuída por Leonardo Sápiras (sapiras@faccat.br) em 2006/1. Um exemplo onde a nave dispara o tiro sempre que a barra de [ESPAÇO] for pressionada é encontrado no Programa de exemplo 4 na seção anexos. Os trechos de código destacados representam as partes importantes desta implementação: Note que a variável tecla foi declarada fora da função main(), isto permite que todas as funções acessem a leitura do teclado. A variável tiro=1 é ativada quando o jogador atira (tecla=57) e então a função é executada. Quando o tiro percorre toda tela, a animação está concluída e a própria função se desliga (tiro=0). Caso o jogador não tenha atirado, a função é abandonada imediatamente (e libera a CPU). 6. Movimentando o personagem. Vamos agora da liberdade ao jogador: Ele poderá guiar a nave utilizando as teclas (código 75) e (código 77). Como estamos criando uma nova animação, significa que agora a CPU deverá atender ao movimento do tiro e ao movimento da nave, quando for eventualmente solicitado. De inicio vamos criar uma estrutura global para a nave (declarada fora da função main). Assim o código será mais legível e permitirá que uma função saiba o que as outras estão fazendo. O exemplo é encontrado no Programa de exemplo 5. 7. Detecção de colisão e placar. A idéia do jogo está quase pronta, mas ainda é necessário identificar se o jogador acertou o alvo ou se foi atingido. Já que ainda não existe um inimigo, vamos criar um objeto estático na tela chamado estrela, que também será uma função, assim termos a terceira animação. Para detectar a colisão, será necessário comparar as coordenadas X,Y do tiro com a posição X,Y da estrela. Se forem iguais, o jogador ganha 1 ponto. O código está na sessão de anexos, como programa exemplo 6. 8. Finalizando... Você deve ter percebido que o jogo pode ser aperfeiçoado, mas foi propositalmente deixado assim para que você incremente o código e torne o jogo mais interessante, por exemplo: ter vidas, energia, salvar o placar em disco, ter uma nave inimiga, aumentar o nível de dificuldade, ter um cenário de fundo estrelado, etc. Críticas, sugestões e dúvidas são sempre bemvindas! E Obrigado por ler o meu artigo!

Programas anexos. /* Programa de exemplo 1 - Turbo C versao 1.0 */ /* Desc.: Mover o tiro de uma nave */ int i; /* limpa tela */ /* desl. cursor*/ gotoxy(40,1); /* posiciona coordenadasx,y */ printf("<ë>"); /* desenha nave na tela */ for (i=2;i<24;i++){ gotoxy(41,i); /* posiciona tiro */ /* limpa rastro */ gotoxy(41,i+1); /* posiciona */ /* desenha tiro nave */ delay(100); /* aguarda miliseg. */ /* Programa de exemplo 2 */ /* Desc.: Mover tiro com uma funcao */ static int PosicaoTiro=2; if (naofaznada<6){ else naofaznada=0; if (PosicaoTiro<24){ PosicaoTiro++; gotoxy(41,posicaotiro); gotoxy(41,posicaotiro+1); else PosicaoTiro=2; gotoxy(40,1); printf("<ë>"); while (!kbhit()); /* Fim do programa de exemplo 1 */ /* Fim do programa de exemplo 2 */

/* Programa de exemplo 3 */ /* Desc.: Leitura das teclas no teclado */ #include<dos.h> int tecla; printf("pressione uma tecla.esc= sair."); tecla=inportb(0x60); /* le o teclado */ switch(getch()); gotoxy(10,3); /* posiciona em X,Y */ printf("%d", tecla); /* exibe o codigo */ delay(500); /* aguarda meio segundo */ gotoxy(10,3); printf(" ", tecla); while (tecla!=129); /* ESC=sair */ /* Fim do programa de exemplo 3 */ /* Programa de exemplo 4 */ /* Desc.: atirar pressionando a barra de ESPACO*/ int tecla=0; static int PosicaoTiro=2; static int tiro=0; if (tecla==57) tiro=1; if(tiro==0) if (naofaznada<6){ else naofaznada=0; if (PosicaoTiro>2) { PosicaoTiro--; gotoxy(41,posicaotiro); gotoxy(41,posicaotiro-1); else{ tiro=0; PosicaoTiro=24; /* insira aqui o comando para */ /* limpar o rastro do tiro */ gotoxy(40,24); printf("<ê>"); tecla=inportb(0x60); while (tecla!=129); /* Fim do programa de exemplo 4 */

/* Programa de exemplo 5 */ /* Desc.: atira e move a nave */ int tecla=0; struct Nave{ int posx; int tirox; int tiroy; int pontos; jogador; movejogador(){ gotoxy(jogador.posx,24); printf(" <Ê> "); if ((tecla==75)&&(jogador.posx>2)) jogador.posx--; if (tecla==77) jogador.posx++; static int tiro=0; if (tecla==57) { tiro=1; jogador.tirox=jogador.posx+2; if(tiro==0) if (naofaznada<6){ else naofaznada=0; if (jogador.tiroy>2) { jogador.tiroy--; gotoxy(jogador.tirox,jogador.tiroy); gotoxy(jogador.tirox,jogador.tiroy-1); else{tiro=0; jogador.tiroy=24; /* insira aqui o comando para */ /* limpar o rastro do tiro */ jogador.tirox=41; jogador.posx=39; tecla=inportb(0x60); if (kbhit()) switch(getch()); movejogador(); while (tecla!=129); /* Fim do programa de exemplo 5 */

/* Programa de exemplo 6 */ /* Desc.: jogo completo */ int tecla=0; struct Nave{ int posx; int tirox; int tiroy; int pontos; jogador; estrela(void){ static int quadrodaestrela=0; if (naofaznada<8){ else naofaznada=0; if (quadrodaestrela==0){ gotoxy(41,1); printf("*"); quadrodaestrela=1; else{ gotoxy(41,1); printf("ú"); quadrodaestrela=0; if ((jogador.tirox==41)&&(jogador.tiroy==2)){ jogador.pontos++; jogador.tiroy=1; gotoxy(1,1); printf(" Pontos: %d", jogador.pontos); movejogador(){ gotoxy(jogador.posx,24); printf(" <Ê> "); if ((tecla==75)&&(jogador.posx>1)) jogador.posx--; if (tecla==77) jogador.posx++; static int tiro=0; if (tecla==57) { tiro=1; jogador.tirox=jogador.posx+2; if(tiro==0) if (naofaznada<4){ else naofaznada=0; if (jogador.tiroy>2) { jogador.tiroy--; gotoxy(jogador.tirox,jogador.tiroy);

gotoxy(jogador.tirox,jogador.tiroy-1); else{ tiro=0; jogador.tiroy=24; /* insira aqui o comando para */ /* limpar o rastro do tiro */ jogador.tirox=41; jogador.posx=39; tecla=inportb(0x60); if (kbhit()) switch(getch()); movejogador(); estrela(); while (tecla!=129); /* Fim do programa de exemplo 6 */