CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo VI Desenhos e Animação Arquivos fornecidos para a aula: CES10 Prat 6 2014.ppt: slides da aula lab_6_ces10_2014.doc: proposta do Lab 6 conio2.zip: arquivos para a biblioteca conio2 a ser utilizada no CodeBlocks (Aba Códigos da página do prof); contém: – conio2.h e libconio.a winbgi.zip: arquivos com rotinas gráficas a serem utilizadas no CodeBlocks (Aba Códigos da página do prof); contém: – winbgi.c e winbgi.h Instruções para usar o conio2 no CodeBlocks: Adaptação de documento do Prof. Paulo André Lima de Castro 1. Copiar o arquivo conio2.h para C:\Arquivos de Programas (x86) \CodeBlocks\MingW\include 2. Copiar o arquivo libconio.a para C:\ Arquivos de Programas (x86) \CodeBlocks\MingW \lib 3. Abrir o CodeBlocks e entrar no menu Settings → Compiler Instruções para usar o conio2 no CodeBlocks: 4. Clicar no botão “Linker Settings” 5. Abaixo do quadro “Link libraries”, clicar no botão “Add” 6. Escrever na janelinha “Add library” o seguinte: libconio.a 7. No programa, colocar: #include <conio2.h> textbackground () – Seta a cor de fundo Algumas funções do textcolor () – Seta a cor do texto clrscr () – Limpa a tela conio2: gotoxy () – Coloca o cursor em uma posição da tela Programa 6.1: Posicionamento do cursor no vídeo-texto Copiar, salvar e clrscr (conio2.h): #include <stdio.h> executar limpa a tela #include <conio.h> #include <conio2.h> \r: reescreve a 1ª int main () { linha da tela int col, lin; char c; Posiciona o cursor printf ("Maximize a tela e digite algo: "); nas coordenadas getche (); clrscr (); desejadas – digitar printf ("Posicionar cursor? (s/n): "); um caractere Posiciona o cursor c = getche(); na coluna e linha 1 while (c == 's' || c == 'S') { printf ("\rDigite a coluna e a linha: "); Limpa a 1ª linha scanf ("%d%d", &col, &lin); \r: reescreve a 1ª gotoxy (col, lin); getche (); linha da tela gotoxy (1, 1); printf (" "); printf ("\rPosicionar cursor? (s/n): "); c = getche();} return 0; } Programa 6.2: Determinação dos limites do gotoxy Copiar, salvar e #include <stdio.h> executar Colunas variam #include <conio.h> de 1 a 80 #include <conio2.h> int main () { int i, n; printf ("TESTE DO LIMITE DE LINHAS DO GOTOXY"); printf ("\n\n\tDigite o numero de linhas: "); Valores escritos scanf ("%d", &n); variam de 0 a 9 printf ("\nMaximize a tela e digite algo!"); getche (); clrscr (); for (i=1; i<=n; i++) { gotoxy ((i-1)%80+1, i); printf ("%d", i%10); } Experimentar os printf ("\nDigite algo para encerrar: "); seguintes valores getch (); para n: Qual o limite de linhas atingidas return 0; 40, 53, 60, 80, 200, pelo gotoxy? } 300, 400 Qual o número de linhas da tela maximizada? Limites no Borland (n = 80): Coluna 80 Linha 44 Programa 6.3: Passeio do ‘*’ pelo vídeo-texto Copiar, salvar #include <stdio.h> e executar #include <conio.h> #include <conio2.h> int main () { int i, j, demora = 20000000; printf ("Maximize a tela e digite algo: "); getche (); clrscr (); for (i = 10; i <= 60; i++) { gotoxy (i, 5); printf (" *"); for (j = 1; j <= demora; j++);} for (i = 6; i <= 40; i++) { gotoxy (61, i-1); printf (" "); gotoxy (61, i); printf ("*"); for (j = 1; j <= demora; j++); } printf ("\n\nDigite algo para encerrar: "); getch (); return 0; } Programa 6.3: Passeio do ‘*’ pelo vídeo-texto Para i = 10, na linha 5: #include <stdio.h> #include <conio.h> Escreve ‘ ’ na coluna #include <conio2.h> 10 e ‘*’ na coluna 11 int main () { int i, j, demora = 20000000; Para i = 11, na linha 5: printf ("Maximize a tela e digite algo: "); getche (); clrscr (); Escreve ‘ ’ na coluna for (i = 10; i <= 60; i++) { 11, apagando ‘*’ gotoxy (i, 5); printf (" *"); Escreve ‘*’ na coluna for (j = 1; j <= demora; j++);} 12 for (i = 6; i <= 40; i++) { gotoxy (61, i-1); printf (" "); Dá a impressão de gotoxy (61, i); printf ("*"); movimento do ‘*’ uma for (j = 1; j <= demora; j++); posição p/direita } printf ("\n\nDigite algo para encerrar: "); Para i = 60, ‘*’ vai getch (); return 0; para a coluna 61 } Programa 6.3: Passeio do ‘*’ pelo vídeo-texto #include <stdio.h> #include <conio.h> #include <conio2.h> int main () { Faz ‘*’ permanecer int i, j, demora = 20000000; numa posição durante printf ("Maximize a tela e digite algo: "); um t perceptível getche (); clrscr (); for (i = 10; i <= 60; i++) { O valor 20.000.000 gotoxy (i, 5); printf (" *"); para ‘demora’ é for (j = 1; j <= demora; j++);} experimental for (i = 6; i <= 40; i++) { Esse valor pode variar gotoxy (61, i-1); printf (" "); com o computador gotoxy (61, i); printf ("*"); for (j = 1; j <= demora; j++); } printf ("\n\nDigite algo para encerrar: "); getch (); return 0; } Programa 6.3: Passeio do ‘*’ pelo vídeo-texto #include <stdio.h> #include <conio.h> #include <conio2.h> int main () { int i, j, demora = 20000000; Para i = 6, na coluna printf ("Maximize a tela e digite algo: "); 61: getche (); clrscr (); for (i = 10; i <= 60; i++) { Escreve ‘ ’ na linha 5, gotoxy (i, 5); printf (" *"); apagando ‘*’ for (j = 1; j <= demora; j++);} Escreve ‘*’ na linha 6 for (i = 6; i <= 40; i++) { gotoxy (61, i-1); printf (" "); Dá a impressão de gotoxy (61, i); printf ("*"); movimento do ‘*’ uma for (j = 1; j <= demora; j++); posição p/baixo } printf ("\n\nDigite algo para encerrar: "); Para i = 40, ‘*’ vai getch (); return 0; para a linha 40 } Programa 6.3: Passeio do ‘*’ pelo vídeo-texto #include <stdio.h> #include <conio.h> #include <conio2.h> int main () { int i, j, demora = 20000000; printf ("Maximize a tela e digite algo: "); getche (); clrscr (); for (i = 10; i <= 60; i++) { gotoxy (i, 5); printf (" *"); for (j = 1; j <= demora; j++);} for (i = 6; i <= 40; i++) { gotoxy (61, i-1); printf (" "); Também faz ‘*’ gotoxy (61, i); printf ("*"); permanecer numa for (j = 1; j <= demora; j++); posição durante um } printf ("\n\nDigite algo para encerrar: "); t perceptível getch (); return 0; } Rotinas gráficas: Rotinas gráficas são necessárias para vários programas profissionais A Linguagem C padrão não define rotinas gráficas Foram criados independentemente vários conjuntos de rotinas gráficas, tais como o Microsoft C/C++ para DOS e o Borland Graphics Interface (BGI) Nestas aulas será utilizado um conjunto de rotinas, elaborado pelo Prof. Carlos Henrique Quartucci Forster, conjunto esse que é uma imitação da BGI Instalação das rotinas gráficas no CodeBlocks: Arquivos necessários (compactados em winbgi.zip): winbgi.h: copiá-lo em CodeBlocks\MingW\include winbgi.c: guardá-lo em alguma pasta de sua biblioteca, para depois adicioná-lo ao projeto do programa Uso de projetos: Para trabalhar em modo gráfico será necessário utilizar o conceito de projeto Projeto é um container que armazena todos os elementos (arquivos) que compõem um programa Criando um novo projeto no ambiente CodeBlocks: Clicar no menu "File" e selecionar "New", "Project... " Escolher “Win32 GUI project" e clicar em “Go”, “Next”, “Next” Escolher um título para o projeto Pode-se dar qualquer nome válido para um arquivo, por exemplo, “FigurasGeometricas” Criando um novo projeto no ambiente CodeBlocks: Escolher uma pasta onde salvar o projeto clicar em “OK” – Dentro dessa pasta será criada uma pasta com o nome do projeto (por exemplo, FigurasGeometricas) – Dentro dessa última será criado um arquivo com o nome do projeto, com extensão .cbp (por exemplo, FigurasGeometricas.cbp) Em seguida, clicar em “Next”, “Finish” Criando um novo projeto no ambiente CodeBlocks: Na coluna “Management” do ambiente aparecerá o projeto Expandir “Sources” Clicar com o botão direito do mouse em “main.cpp” e removê-lo Adicionando ao projeto arquivos existentes: Duas formas: Clicar no menu "Project" e selecionar “Add files...” Ou então, na coluna “Management”, clicar com o botão direito do mouse no nome do projeto e clicar com o esquerdo em “Add files...” É só procurar os arquivos a serem adicionados e clicar neles Para adicionar um novo arquivo contendo código para o programa, deve-se editá-lo, salvá-lo e adicioná-lo ao projeto Usando a biblioteca gráfica no projeto: Criado o projeto, deve-se adicionar a ele o arquivo “winbgi.c” Ao editar o programa colocar “include <winbgi.h>” e também uma função int main com chamadas para funções gráficas Programa 6.4: Desenho simples no vídeo-gráfico #include <stdio.h> Pede o número de colunas e #include <winbgi.h> linhas da janela gráfica a ser #include <conio.h> aberta, abrindo a em seguida int main () { int left, top, bottom, right, i, j; Limpa a janela criada, start_graphics (); getch (); colorindo-a com a cor de fundo setbkcolor (LIGHTBLUE); corrente (LIGHTBLUE) cleardevice (); getch (); left = 160; right = 400; top = 80; bottom = 320; for (i = top; i <= bottom; i++) - Criar projeto for (j = left; j <= right; j++) - Adicionar este arquivo putpixel (j, i, RED); ao projeto getch (); - Adicionar winbgi.c ao closegraph ( ); Colore o pixel [j, i] projeto return 0; com a cor RED - Salvar e executar } Lista de cores disponíveis em winbgi.h: DARKGRAY GREEN MAGENTA CYAN GRAY WHITE LIGHTGREEN LIGHTMAGENTA LIGHTCYAN LIGHTBROWN ORANGE RED BLUE YELLOW LIGHTGRAY BLACK LIGHTRED LIGHTBLUE LIGHTYELLOW BROWN DARKBROWN LIGHTORANGE Programa 6.5: Desenho de várias figuras #include <stdio.h> #include <winbgi.h> #include <conio.h> int main () { int left, top, bottom, right, i, j; /* Abrir janela grafica start_graphics(); getch (); setbkcolor(LIGHTBLUE); cleardevice(); */ /* Colorir uma area quadrada de pixels */ getch (); left = 160; right = 400; top = 80; bottom = 320; for (i = top; i <= bottom; i++) for (j = left; j <= right; j++) putpixel (j, i, RED); /* Desenhar as bordas de um quadrado */ getch (); left = 160; right = 400; top = 80; bottom = 320; setcolor (YELLOW); setlinestyle(SOLID_LINE,0,1); rectangle (left, top, right, bottom); /* Preencher um circulo */ getch (); setcolor (YELLOW); setfillstyle(SOLID_FILL,YELLOW); fillcircle (280, 200, 120); /* Desenhar as bordas de um circulo */ getch (); setcolor (BLACK); circle (280, 200, 120); /* Preencher uma elipse com eixos paralelos aos eixos coordenados */ getch (); setcolor (LIGHTGRAY); setfillstyle(SOLID_FILL,LIGHTGRAY); fillelipse (680, 400, 200, 150); /* Desenhar as bordas de uma elipse com eixos paralelos aos eixos coordenados */ getch (); setcolor (RED); elipse (680, 400, 200, 150); /* Desenhar um segmento de reta */ getch (); setcolor (WHITE); line (40, 480, 640, 80); /* Preencher um retangulo com textura e cor */ getch (); left = 80; right = 560; top = 400; bottom = 450; setcolor (DARKGRAY); setfillstyle(DOTTED_LINE, BROWN); setlinestyle(DOTTED_LINE,0,1); bar (left, top, right, bottom); /* Preencher outro retangulo com textura e cor getch (); left = 100; right = 700; top = 500; setcolor (BLACK); setfillstyle(SOLID_FILL, BROWN); setlinestyle(SOLID_LINE,0,5); bar (left, top, right, bottom); /* Escrever um texto */ getch (); outtextxy(150, 515, "Teste"); /* Fechar janela grafica getch (); closegraph ( ); return 0; } */ */ bottom = 550; Estas rotinas têm alguns defeitos: outtextxy só escreve junto com o próximo desenho ou com o fechamento da tela setlinestyle só desenha linha pontilhada com espessura mínima Mais detalhes sobre rotinas gráficas: Abrir os arquivos winbgi.h e winbgi.c Consultar a Internet