Ir ao conteúdo
  • Cadastre-se

Benjamin Breeg

Membro Pleno
  • Posts

    230
  • Cadastrado em

  • Última visita

Tudo que Benjamin Breeg postou

  1. Uma opção interessante também é usar compiladores online, não é preciso instalar nada. Esse roda o GCC 7.1.1 https://www.tutorialspoint.com/compile_c_online.php
  2. O Dev C++ do orwell tem a versão portable, basta colocar num pendrive e usar. https://sourceforge.net/projects/orwelldevcpp/files/Portable Releases/Dev-Cpp 5.11 TDM-GCC x64 4.9.2 Portable.7z/download
  3. Da uma olhada nesse código que eu estava trabalhando, eu tinha simplificado umas coisas inclusive o método de colisão modificando o array, ela é um inteiro de números mas coloquei um define para M0 e T1, esta tudo em if/else if sem precisar de funções. Lembrando que é só um esboço, é melhor colocar o foco na versão do TYSQUARE89 que esta mais organizada e usa as funções de colisão e movimentação mais aprimoradas. maze.zip Eu estou tentando tirar algumas ideias desse código aqui que encontrei no YouTube mas os caras acho que são da indonésia, código confuso, repetitivo, é difícil saber o que faz cada coisa. Porém esta bem completinho tem princesa, monstros, troca de mapa, menu etc etc. Vale a pena gastar um tempo e aprimorar.
  4. Aqui ta apresentando problemas o exe, deve ser a font e bmp, tentei usar os que tinha aqui mas não deu certo,você pode enviar os bmp e os arquivos de fonte que usou? Ficaram excelentes a limpeza e as implementações que você fez no código, muito obrigado.
  5. Nunca vi usar for como loop principal, geralmente em jogos e outros programas é mais comum usar o while. Um exemplo pratico seria +/- assim: #include <iostream> using namespace std; int main() { int opc; cout<<"1. Digite 1 para sair\n"; cout<<"Opcao: "; cin>> opc; for(;;) { switch(opc) { case 1: goto sair; break; } } sair: cout << "\nVoce saiu!" << endl; return 0; }
  6. Um bom lugar para iniciar é: https://pt.wikipedia.org/wiki/Método_de_Newton-Raphson
  7. Cara você tem que assistir os tutoriais do Anderson para entender essas funções, procure por bounding box no google tem muita coisa. Esse erro é porque esta falando algum chave, parêntese, eu sugiro que você de uma limpeza no código e tente implementar pouco a pouco as funções , seu código já esta ficando tão confuso que nem você deve estar entendendo mais hehe. Essa semana eu to agarrado, pouco tempo pra ficar no PC, fim de semana ou quando der eu tento desenvolver mais alguma coisa. To longe de ser mestre, ate pouco atrás eu só via a penumbra do console do Windows, pouco tempo que comecei a mexer com parte gráfica, escolhi o Allegro 4 por ele ser mais simples de aprender e pegar os fundamentos iniciais.
  8. Consegui adaptar a colisão de Caixa e Pixel Perfeito do Anderson Urbano para o boneco não conseguir transpassar o bloco e ter algum controle como mudar a velocidade por ex. A movimentação ficou bem fluida, depois eu vejo como adaptar pra funcionar dentro do mapa de tile. OBS: Atualiza seu código, corrigi o problema na atualização do Loop. #include <allegro.h> #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) int dir = 360; int velPlayer = 3; ///MÉTODO PIXEL PERFECT int pixel_perfect_colision(int x1, int y1, BITMAP* obj1, int x2, int y2, BITMAP* obj2) { int i, j; int colisao = FALSE; //Se os retângulos estiverem se intersectando if(!( (x1 > x2 + obj2->w) || (y1 > y2 + obj2->h) || (x2 > x1 + obj1->w) || (y2 > y1 + obj1->h) )) { int cima = max(y1, y2); int baixo = min(y1 + obj1->h, y2 + obj2->h); int esquerda = max(x1, x2); int direita = min(x1 + obj1->w, x2 + obj2->w); for(i = cima; i < baixo && !colisao; i++) { for(j = esquerda; j < direita && !colisao; j++) { if(getpixel(obj1, j-x1, i-y1) != makecol(255,0,255) && getpixel(obj2, j-x2, i-y2) != makecol(255,0,255)) colisao = TRUE; } } } return colisao; } ///MÉTODO DE CAIXAS DE COLISÃO int bounding_box_collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) { if( (x1 > x2 + w2) || (y1 > y2 + h2) || (x2 > x1 + w1) || (y2 > y1 + h1) ) return FALSE; else return TRUE; } volatile int exit_program; void fecha_programa() { exit_program = TRUE; } END_OF_FUNCTION(fecha_programa) volatile int ticks; void tick_counter() { ticks++; } END_OF_FUNCTION(tick_counter) int main() { allegro_init(); install_timer(); install_keyboard(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0); set_window_title("Tutorial 15 - Colisoes"); exit_program = FALSE; LOCK_FUNCTION(fecha_programa); LOCK_VARIABLE(exit_program); set_close_button_callback(fecha_programa); ticks = 0; LOCK_FUNCTION(tick_counter); LOCK_VARIABLE(ticks); install_int_ex(tick_counter, BPS_TO_TIMER(60)); ///BITMAPS BITMAP* buffer = create_bitmap(SCREEN_W, SCREEN_H); BITMAP* objeto1 = load_bitmap("boneco.bmp", NULL); BITMAP* objeto2 = load_bitmap("muro.bmp", NULL); ///Variáveis int x1 = 150; int y1 = 150; int x2 = 400; int y2 = 300; ///GAME LOOP while(!exit_program) { while(ticks > 0 && !exit_program) { ///INPUT if(key[KEY_ESC]) fecha_programa(); ///Movimentação if(key[KEY_UP]) { y1 -= velPlayer; dir = 90; } if(key[KEY_DOWN]) { y1 += velPlayer; dir = 270; } if(key[KEY_LEFT]) { x1 -= velPlayer; dir = 180; } if(key[KEY_RIGHT]) { x1 += velPlayer; dir = 360; } ticks--; } ///DRAW //if(pixel_perfect_colision(x1, y1, objeto1, x2, y2, objeto2) == TRUE) if(bounding_box_collision(x1, y1, objeto1->w, objeto1->h, x2, y2, objeto2->w, objeto2->h) == TRUE) { if (dir == 180) { x1 += velPlayer; } if (dir == 90) { y1 += velPlayer; } if (dir == 360) { x1 -= velPlayer; } if (dir == 270) { y1 -= velPlayer; } } draw_sprite(buffer, objeto2, 400, 300); draw_sprite(buffer, objeto1, x1, y1); draw_sprite(screen, buffer, 0, 0); clear_to_color(buffer, makecol(255,255,255)); } ///FINALIZAÇÂO destroy_bitmap(buffer); destroy_bitmap(objeto1); destroy_bitmap(objeto2); return 0; } END_OF_MAIN();
  9. Para resolver esse problema da fonte, você precisa baixar um programa chamado ttf2pcx, o Allegro 4 não consegue manipular fontes TTF e nem seus atributos. No ttf2pcx você vai configurar os atributos da fonte: itálico, negrito, tamanho e depois manda exportar para um arquivo com formato PCX que você salva na pasta do seu projeto, ai é só carregar as fontes. Lembrando que caso queira usar fontes baixadas na internet, ela precisa ser instalada no Windows para o ttf2pcx reconhecer. https://www.allegro.cc/resource/Tools/Fonts/ttf2pcx fonts.zip #include <allegro.h> #define Vermelho makecol(255,0,0) #define Verde makecol(0,255,0) #define Azul makecol(0,0,255) #define Amarelo makecol(255,255,0) #define W 800 #define H 600 int main() { allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, W, H, 0, 0); FONT *Font1 = load_font("font1.pcx", NULL,NULL); FONT *Font2 = load_font("font2.pcx", NULL,NULL); textout_ex(screen, Font2, "Maze Escape", 100, 100, Amarelo, 0); textout_centre_ex(screen, Font1, "Precione ESQ a qualquer momento para fechar o programa!", W/2, H/2, Vermelho, Azul); textout_right_ex(screen, Font1, "v4.2.0-beta2", 200, 50, Azul, 0); readkey(); destroy_font(Font1); allegro_exit(); return 0; } END_OF_MAIN()
  10. Eu to tentando fazer a colisão do personagem com o muro, mas o exemplo do pacman parece não ser a melhor maneira, toda vez que tento mexer na velocidade ou movimentação do personagem da pane na colisão. Fiz uma modificação do seu programa configurando o ajuste de FPS e o Game Loop, temporariamente tirei o menu, e as msg de texto. #include <allegro.h> // Biblioteca gráfica #define LINHAS 20 // Define a quantidade de linhas da matriz #define COLUNAS 31 // Define a quantidade de colunas da matriz #define TAMANHO 30 // Define o tamanho do "quadradro" da imagem importada int dir = 4; int px = 5*6; int py = 5*6; BITMAP *buffer; BITMAP *boneco; BITMAP *muro; BITMAP *trilha; volatile int sair_programa; void fechar_programa() { sair_programa = TRUE; } END_OF_FUNCTION(fechar_programa) volatile long tempo = 0; void aumenta_tempo() { tempo++; } END_OF_FUNCTION(aumenta_tempo) char matriz[LINHAS][COLUNAS]= { "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM", "MTTTTTTTTTTTMMMMMTTTTTTTTTTTM", "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM", "MTMMMTMMMMMTMMMMMTMMMMMTMMMTM", "MTTTTTTTTTTTTTTTTTTTTTTTTTTTM", "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM", "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM", "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM", "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM", "MTTTTTMMTMMMMMMMMMMMTMMTTTTTM", "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM", "MTMMMTMMTTTTTTTTTTTTTMMTMMMTM", "MTMMMTMMMMMMTMMMTMMMMMMTMMMTM", "MTTTTTMMTTTTTMMMTTTTTMMTTTTTM", "MTMMMTMMTMMMMMMMMMMMTMMTMMMTM", "MTMMMTTTTTTTTTTTTTTTTTTTMMMTM", "MTMMMTMMMMTMMMMMMMMTMMMTMMMTM", "MTMMMTMMMMTTTTTTTTTTMMMTMMMTM", "MTTTTTTTTTTMMMMMMMMTTTTTTTTTM", "MMMMMMMMMMMMMMMMMMMMMMMMMMMMM", }; void inicia_alegro() /* Inicialização do allegro */ { allegro_init(); // Inicialização do allegro install_keyboard(); // Instala a função para usar o teclado install_mouse(); // Instala a função para usar o mouse install_timer(); // Instala a função de tempo set_color_depth(32); // Tipo de cor 8/15/16/24/32 bits set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0); // Auto decteta o driver de vídeo set_window_title("Maze Escape"); // Define o titulo da janela sair_programa = FALSE; LOCK_FUNCTION(fechar_programa); LOCK_VARIABLE(sair_programa); set_close_button_callback(fechar_programa); LOCK_VARIABLE(tempo); LOCK_FUNCTION(aumenta_tempo); install_int_ex(aumenta_tempo, BPS_TO_TIMER(30)); } void desenha_mapa(BITMAP *Buffer) /* Colocando imagens na matriz */ { int i, j; for (i=0; i<LINHAS; i++) { for (j=0; j<COLUNAS; j++) { if(matriz[i][j]== 'M') { draw_sprite(buffer, muro, j*TAMANHO, i*TAMANHO); } else if (matriz[i][j]== 'T') { draw_sprite(buffer, trilha, j*TAMANHO, i*TAMANHO); } } } } void tela() /* Criando da proporção do mapa em tela*/ { // clear_to_color(nomedomapa, makecol(0, 0, 0)); // Limpar mapa em caso de substiição draw_sprite(buffer, boneco, px, py); blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); clear_bitmap(buffer); } void jogar() { } void rankings() { } void creditos() { } void sair() { } void finaliza_tudo() { // Destruição do mapa destroy_bitmap(buffer); destroy_bitmap(boneco); destroy_bitmap(trilha); destroy_bitmap(muro); clear_keybuf(); // Limpa buffer do teclado } int main() { inicia_alegro(); // Importação das imagens do mapa buffer = create_bitmap(SCREEN_W, SCREEN_H); // Criando o mapa muro = load_bitmap("ffacd56a-7cfa-45e2-aaa7-0ab704711bea.bmp", NULL); boneco = load_bitmap("boneco.bmp", NULL); trilha = load_bitmap("594f655c-0380-4a3b-9237-6dd82ffbd75d.bmp", NULL); while(!sair_programa) { while(tempo > 0) { if (key[KEY_ESC]) fechar_programa(); if(key[KEY_RIGHT]) { dir = 1; } else if(key[KEY_LEFT]) { dir = 0; } else if(key[KEY_UP]) { dir = 2; } else if(key[KEY_DOWN]) { dir = 3; } if(dir == 0) { if(matriz[py/30][(px-30)/30] != 'M') { px -= 30; } else { dir = 4; } } if(dir == 1) { if(matriz[py/30][(px+30)/30] != 'M') { px += 30; } else { dir = 4; } } if(dir == 2) { if(matriz[(py-30)/30][(px)/30] != 'M') { py -= 30; } else { dir = 4; } } if(dir == 3) { if(matriz[(py+30)/30][(px)/30] != 'M') { py += 30; } else { dir = 4; } } tempo --; } desenha_mapa(buffer); tela(); } // Precionar ESQ para fechar finaliza_tudo(); return 0; } END_OF_MAIN()
  11. O Visual Studio 2017 também tem o GUI para c++, você precisa instalar o pacote do C++/CLI. Faz o seguinte: Abre o Visual Studio Installer, seleciona "Modificar", em "Desenvolvimento para Desktop com C++" clica na caixinha "Suporte para C++/CLI", para terminar clica no botão Modificar. Esse instalador do VS 2017 é mais personalizável, muita coisa que era obrigatório instalar no VS 2015 nesse novo você pode personalizar.
  12. O código esta certo, como você disse que tentou no VS, MinGW etc e nenhum deles esta compilando é um tanto estranho. Pode ser que no VS você não tenha instalado o pacote para C++, eu não tenho certeza mas no VS vem por padrão o C# ( C Sharp), o pacote de desenvolvimento para o C++ você tem que habilitar manualmente, no caso do MinGW pode ser que você instalou mas não configurou o C:\MinGW\bin na PATH do sistema, ai ele não vai executar. De uma olhada nesse vídeo: Poste algum log das mensagens de erro, assim no escuro fica difícil.
  13. Explicando melhor ao exemplo anterior que eu tinha feito, matemática não é muito meu forte hehe.. O quadrado perfeito é quando a soma dos números ímpares em sequencia (1+3+5+7+...) é igual ao número, Neste caso a quantidade de termos somados é a raiz quadrada deste número. Por exemplo: 4 = 1 + 3 9 = 1 + 3 + 5 16 = 1 + 3 + 5 + 7 Foram somados 2 termos que equivale a raiz quadrada de 4. Foram somados 3 termos que equivale a raiz quadrada de 9. Foram somados 4 termos que equivale a raiz quadrada de 16. Com isso em mente acho que você consegue fazer o algoritmo.
  14. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_PILHA 50 int topo = -1; char pilha[MAX_PILHA]; void push(char); void pop(); void verificaTopo(); int main() { int i; char expressao[MAX_PILHA]; printf("Digite a expressao: "); scanf("%s", &expressao); for (i = 0; expressao[i] != '\0'; i++) { if(expressao[i] == '(') { push(expressao[i]); } else if(expressao[i] == ')') { pop(); } } verificaTopo(); } void push(char a) { pilha[topo] = a; topo++; } void pop() { if (topo == -1) { printf("Expressao invalida\n"); exit(0); } else { topo--; } } void verificaTopo() { if (topo == -1) printf("\nExpressao valida\n"); else printf("\nExpressao invalida\n"); }
  15. Você pode fazer algo assim #include<stdio.h> int main() { int i, conta = 0; char caracteres[50], c; printf("Digite uma string: "); gets(caracteres); printf("Informe um caractere da string: "); scanf("%c", &c); for(i=0; caracteres[i]!='\0'; i++) { if(caracteres[i]==c) conta++; } if(conta==0) { printf("Caractere nao encontrado"); } else { printf ("Contagem de caracteres = %d\n", conta); } }
  16. Esse "efeito de túnel" não é algo muito simples de fazer não, fazendo uma procura rápida achei esse artigo(em inglês) que explica os fundamentos para conseguir "essa torcida" hehe. http://benryves.com/tutorials/tunnel/1
  17. Funciona porque você não especificou o tipo no printf, coloque %f nas funções com float para você ver o resultado.
  18. Você declarou 2 funções main. #include <stdio.h> int calcula (int x, int y) { int soma; soma = x + y; return soma; } int main() { int num1, num2, resultado; num1=2; num2=4; resultado = calcula (num1, num2); printf("o resultado vale: %d", resultado); return 0; }
  19. Eu não tenho certeza mas o draw_sprite só consegue manipular bmp de no máximo 256 cores, por isso o problema, testei alguns que tinha aqui nessa configuração e todos funcionaram, os que voce converteu ultrapassam esse limite por isso o executável falha. Cara aqui eu uso CodeBlocks 16:01 e MinGW 4.70.. os exemplos compilaram perfeitamente, um ou outro não executaram mas acho que é porque foram feitos para compiladores de 16 bits. Quanto a personalizar aquele menu, é possível sim mas ai precisa estudar as funções de gui do Allegro, esse que o vangodp postou esta excelente, o cara fez varios exemplos de menu com fundo, animação etc etc. Eu também comecei a estudar Allegro a pouco tempo. Baixa o arquivo, veja se consegue rodar. gui.zip
  20. Ah sim desculpe, os exemplos estão no arquivo do código fonte da biblioteca Allegro. Baixa esse arquivo: http://cdn.allegro.cc/file/library/allegro/4.4.2/allegro-4.4.2.zip
  21. Esse seu ultimo código não funcionou aqui, isso que você quer fazer não da porque o seu primeiro jogo usa a saída do console, no allegro você tem que desenhar os objetos na screen ou no buffer, teria que adaptar o menu usando funções do próprio Allegro. Não sei se da pra usar funções da winapi, pelo menos não as de texto. adicionado 13 minutos depois Saca só isso, pesquisando ontem achei uma forma bem simples de fazer menu com suporte a setas e mouse no Allegro nos próprios exemplos que vem no pacote do Allegro. Procura o arquivo "exgui.c" na pasta examples, compile e execute. Versão simplificada: #include <allegro.h> void jogar() { allegro_message("GAME"); } void rankings() { allegro_message("Rankings"); } void creditos() { allegro_message("Creditos"); } void sair() { allegro_message("sair"); } MENU opcao[] = { { "JOGAR", jogar, NULL, 0, NULL }, { "RANKINGS", rankings, NULL, 0, NULL }, { "CREDITOS", creditos, NULL, 0, NULL }, { "SAIR", sair, NULL, 0, NULL } }; int main() { allegro_init(); install_keyboard(); install_mouse(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); show_mouse(screen); do_menu(opcao, 300, 300); return 0; } END_OF_MAIN()
  22. No primeiro programa: cstdlib - cabeçalhos sem o .h são usados pelo c++ Você criou um array de 5 elementos e nao usou os índices na entrada e nos loop for: num Int i = 0 é sintaxe do c89 se não me engano, criar a variável dentro do for so a partir do c99, no 89 você tem que criar a variável fora do for: int i; for (i= 0; i <= 4 ; i++ ) #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <stdlib.h> int main (void) { int num[5]; int soma = 0; int i; setlocale (LC_ALL, "portuguese"); for (i= 0; i <= 4 ; i++ ) { printf ("\nDigite o %d° número : ", i+1); scanf ("%d", &num[i]); } for (i=0;i<=4;i++) { soma += num[i]; } printf ("A soma dos 5 números é %d\n", soma); system ("pause"); return 0; }
  23. Cara o Loop tem todo sentido, quando se trata de jogos, todo jogo tem um Game Loop que vai conter toda a lógica, entrada de dados, renderização, atualização, regular fps, temporização etc etc, como C não é orientada e objetos e sim procedural, se usa funções para não poluir o Game Loop, isso é considerado uma boa pratica de programação. Isso que você quer fazer não é tão simples, teria que criar funções para carregar os mapas a partir de arquivos, criar eventos dentro do cenário para passar de fase, colisão etc etc. Ali no exemplo ele desenha tudo em um buffer, essa técnica chama double buffer, perceba que nao da aquele efeito de piscada nas atualizações de tela, ai ele usa a função blit para "imprimir" o que esta no buffer na screen, o allegro ja tem um ponteiro screen predefinido. Caso contrario você veria tudo preto.
  24. Eu postei no tópico errado hehe... Ah sim.. a logica é no c/c++. seria interessante você portar o código do menu para o allegro, naquele exemplo usou as funcoes da WinAPI, no Allegro você pode fazer menus com imagens ou ate mesmo esses de texto. Da uma olhada nesse video: Eu achei o código do primeiro tutorial do PACMAN do deividcoptero mas não esta completo, eu não cheguei terminar o tutorial mas da uma ideia de como fazer o labirinto usando um bmp. Veja se ajuda. Baixa os arquivos do tutorial, coloca o arquivo roca.bmp na pasta do seu projeto. https://www.mediafire.com/folder/cff2zi955gj265z,ej135roc11aho6z/shared #include <allegro.h> #define MAXFILAS 20 #define MAXCOLS 31 BITMAP *buffer; BITMAP *roca; char mapa[MAXFILAS][MAXCOLS]={ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "X XXXXX X", "X XXX XXXXX XXXXX XXXXX XXX X", "X XXX XXXXX XXXXX XXXXX XXX ", "X X", "X XXX XX XXXXXXXXXXX XX XXX X", "X XX XXX XX X", "X XXX XXXXXX XXX XXXXXX XXX X", "X XXX XX XX XXX X", " XX XXXXXXXXXXX XX ", "X XXX XX XXXXXXXXXXX XX XXX X", "X XXX XX XX XXX X", "X XXX XXXXXX XXX XXXXXX XXX X", "X XX XXX XX X", "X XXX XX XXXXXXXXXXX XX XXX X", "X XXX XXX ", "X XXX XXXX XXXXXXXX XXX XXX X", "X XXX XXXX XXX XXX X", "X XXXXXXXX X", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", }; void desenha_mapa() { int row, col; for (row = 0; row < MAXFILAS; row++) { for (col = 0; col < MAXCOLS; col++) { if(mapa[row][col] == 'X') { draw_sprite(buffer, roca, col*30, row*30); } } } } void pantalla() { blit(buffer, screen, 0, 0, 0, 0, 880, 600); } int main() { allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(GFX_AUTODETECT_WINDOWED, 880, 600, 0, 0); set_window_title("Labirinto"); buffer = create_bitmap(880, 600); roca = load_bitmap("roca.bmp", NULL); while(!key[KEY_ESC]) { desenha_mapa(); pantalla(); } } END_OF_MAIN()
  25. Por favor peço a moderação que apague essa mensagem, o conteúdo ja foi movido para o tópico correto.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!