Glaudiston 的个人资料Site pessoal de Glaudist...照片日志列表更多 ![]() | 帮助 |
|
11月22日 Autotools, ah se todos usassem !!!autotools é um conjunto de ferramentas que simplifica a verificação de dependências e compilação de programas. É tão usado no mundo opensource que é até um padrão usado e recomendado pelo gnu. tudo se torna simples quando se tem um projeto usando autotools... Você apenas descompacta os fontes com: tar xvf nomedoarquivo.tar.bz2 depois usa: ./configure make make install Se o código depender de outro componente que não exista em seu ambiente, ele vai ser detectado no ./configure ... sendo assim fica fácil descobrir o que está faltando e instalar esta dependência antes de executar o make que é a parte demorada do processo. O make é a compilação do programa... isto costuma demorar... e muitas vezes tem que executar centenas de subcompilações com linhas de comandos que incluem várias bibliotecas e que seria inviável para um usuário digitá-las na mão, um script para esta compilação poderia ser mantido pelo desenvolvedor do programa, mas daria muito trabalho a ele. É aqui que entra o autotools, ele cria este script automaticamente com um esforço mínimo do desenvolvedor. Mas infelismente muitos projetos não o usam. Vou mostrar em um exemplo prático como é fácil e prático usá-lo. Vamos criar um novo diretório com o nome autotools-example: $ mkdir autotools-example $ cd autotools-example teremos um subdiretório src onde ficaram os fontes: $ mkdir src e agora vamos criar um arquivo representando o nosso código: cat > src/main.c << "EOF" #include <stdio.h> int main(int argc, char** argv) { printf("funciona!!!\n"); return 0; } EOF pronto... já temos um código do programa, hora de usar o autotools pra compilar. O autotools precisa de um arquivo de referência onde ele vai pesquisar para saber o nome do programa que está sendo compilado e qual é a versão atual, onde estão os arquivos fontes, além de validações obrigatórias ou opcionais, como por exemplo um programa que pode ou não ter suporte a som, dependendo de um parâmetro que o usuário passa para o ./configure... também é no configure.ac que o desenvolvedor personaliza mensagens para o usuário e adiciona verificações adicionais para certificar que o código será compilado. parece complicado né ? mas na prática é simples... olhe: Primeiro use o autoscan que varre todos os arquivos do diretório e subdiretórios para detectar os arquivos fontes e criar o configure.ac que é um dos arquivos essenciais do autotools que o programador deve editar. $ autoscan agora devem ter sido criados 2 arquivos: autoscan.log e configure.scan. o arquivo configure.scan é o configure.ac que nós precisamos para o autotools, e que foi criado automaticamente pelo comando autoscan e o autoscan.log registra algum erro ou mensagens ocorridas durante o processo do autoscan. renomeie o arquivo configure.scan para configure.ac : $ mv configure.scan configure.ac vamos olhar o conteúdo do configure.ac e analisar o que precisaremos atualizar: $ more configure.ac # -*- Autoconf -*- # Process this file with autoconf to produce a configure script AC_PREREQ(2.61) AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT bom... vamos ver... todas as linhas começando com #(sharp, cerquilha, ou jogo da velha, como preverir) são comentários, e ignorados pelo autotools, então a primeira linha de código é: AC_PREREQ(2.61) está dizendo que no ambiente onde será compilado, deve existir instalado o autotools versão 2.61 ou superior. Logo após vem: AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) aqui temos o lugar onde dizemos ao autotools qual é o nosso programa, a versão do nosso programa, e o endereço de email para onde os usuários devem mandar emails em caso de erros. atualize isto como preferir como no exemplo abaixo: AC_INIT(autotools-example, 1.0, [seuemail at dominio dot com] ) depois temos: AC_CONFIG_SRCDIR([src/main.c]) aqui ele detectou corretamente o nosso diretório de códigos fontes. AC_CONFIG_HEADER([config.h]) este arquivo config.h deve pelo comando autoheader e server para definir variáveis de compilação para o autotools, como o PACKAGE_NAME, opções ativas por padrão... etc... $ autoheader agora vamos criar nosso script configure... $ autoconf pronto... se tudo deu certo, agora você terá um arquivo configure em seu diretório, execute-o: $ ./configure ele vai verificar tudo pela primeira vez e criar o config.h... mas ainda precisamos cuidar do automake que irá compilar o nosso projeto. para isto precisamos adicionar um AM_INIT_AUTOMAKE( nomedoprograma, versao ) no configure.ac, então adicione isto logo abaixo de AC_CONFIG_HEADER. AM_INIT_AUTOMAKE(exemplo, 1.0) além disto também é necessário informar quais Makefiles precisam ser criados... então no finao do arquivo configure.ac altere a linha AC_OUTPUT para: AC_OUTPUT([ Makefile src/Makefile ]) pronto, agora execute um autoreconf para atualizar os arquivos: $ autoreconf vamos atualizar o automake agora com o parâmetro --add-missing, para que ele crie os arquivos faltantes: $ automake --add-missing agora um ultimo passo é criar o Makefile.am que é bem simples: cat > Makefile.am << "EOF" SUBDIRS = src EXTRA_DIST = NOTES autogen.sh EOF e um Makefile.ac no diretório de fontes, onde informaremos quem deve ser compilado: cat > src/Makefile.am <<"EOF" bin_PROGRAMS = exemplo exemplo_SOURCES = main.c EOF vamos criar um script pra reconfigurar os arquivos, já fizemos isto, mas precisaremos fazer varias vezes durante o desenvolvimento, um script vai ajudar muito: cat > autogen.sh <<"EOF" #!/bin/sh # aclocal automake --add-missing --foreign autoconf ./configure $* EOF agora execute ele: $ sh autogen.sh bem... se vc executar o automake: $ automake vai receber várias mensagens de erros dizendo q ele não encontrou arquivos necessários... alguns podem ser criados automaticamentes com o parâmetro --add-missing... então vamos criá-los: $ automake --add-missing $ touch NEWS README AUTHORS ChangeLog lembre-se de transformar os links simbólicos possivelmente criados pelo automake --add-missing em arquivos reais antes de compartilhar seu projeto, vc pode fazer isto copiando os arquivos dos links e substituindo-os. Neste ponto já deve estar tudo pronto, e você já pode executar: ./configure make e já deve ter um arquivo executavel com o nome exemplo na pasta src... então execute: $ src/exemplo funciona!!! se apareceu funciona!!! parabéns, vc acaba de criar seu primeiro projeto com autotools... depois vou mostrar como gerenciar dependências, como o SDL e outros... Qualquer dúvida usem os comentários. Abs... Ton 11月21日 Odisséia do Desenvolvimento de JogosOdisséia do Desenvolvimento de Jogos ==================================== Olá, meu nome é Glaudiston, atualmente sou um desenvolvedor IBM, mas sempre que sobra algum tempo tento desenvolver alguma coisa voltada à jogos e realidade virtual. Vou tentar manter este documento atualizado como um manual para os que estiverem interessados em desenvolvimento de jogos, e também para minha própria referência, afinal compartilhar é a melhor forma de não errar denovo. =) Por onde começar ================ Primeiro decidi que queria fazer jogos, e pagaria o preço por isto, então comecei a pesquisar... De início pensei que daria conta facilmente, afinal me achava muito inteligente, mas descobri que não é bem assim... é necessário muita dedicação, perseverança e ajuda. Este é quase um passo a passo, mas se você não está disposto a passar horas intermináveis quebrando a cabeça com detalhes, pode parar de ler, você ainda não está pronto. O que é necessário saber/ter para desenvolver jogos =================================================== Tudo pode ser conseguido sem custo na internet, mas o aprendizado é penoso. Para criar um jogo você precisa de: * Escrever a Lógica do seu jogo, * Escolher uma Linguagem, * Escolher a API(rotinas prontas), * interface(janelas, resolução, tela cheia, cores) * Entrada(Joysticks, Mouse, teclado) * conexão(TCP/IP, multiplayer) * audio(musicas, sons, mp3) * Detecção de colisão * Gerenciamento de gráficos 3D * Configurar o ambiente(talvez a parte mais difícil), * Fazer download certos de cada opção escolhida * Instalar e configurar corretamente * Aprender a compilar cada opção necessária no jogo Escrever a Lógica do seu jogo ============================= Você tem uma idéia do que quer que seu jogo faça, talvez até saiba de cór tudo, mas acredite, precisa colocar isto por escrito. Isto te dá um ponto de partida... e evita que você se perca em seus objetivos. Existem diagramas UML e uma estrutura muito grande que pode te confundir se vc se aprofundar nesta parte... Jogos grandes são escritos por times e tem profissionais por conta de ficar criando documentações para serem implementados por outros... isto é muito bom, mas não é o caso, pelo menos não o meu. Não tente criar "O JOGO" de primeira ==================================== Primeiro porque para ser introduzido ao desenvolvimento de jogos é necessário ser humilde. Isto mesmo, comece de baixo... crie jogos 2D simples para aprender lógica e conseguir continuar motivado, sabendo que já conseguiu fazer alguma coisa. Sem falar que criando estes joginhos 2D vc acaba tendo muitas idéias de como usá-los dentro do seu jogo, então de certa forma, você já está trabalhando "NO JOGO". Se tentar criar um jogo fantástico de primeira, vai esbarrar em muitas barreiras que já deveria ter superado quando criava joguinhos pequenos e relativamente simples, e como não conseguiu fazer nenhum jogo antes, pode chegar à falsa conclusão que não é capaz disto. Lembre-se: "Motivação é Essencial." Eu já tentei criar uma engine completa para um mundo virtual melhor que o secondlife... na verdade pegando as melhores opções de jogabilidade dele mesclando um idéias do GTA e the sims... nfsu2... etc... com certeza a engine para o Jogo de meus sonhos... O resultado é que chegou em um ponto que não consegui mais passar... então desisti por um bom tempo... ainda tenho o código, algum dia conseguirei retomá-lo. Fique tão triste por não conseguir que voltei apenas a jogar e admirar os programadores que conseguem criar tais jogos... quase venerando os desenvolvedores da EA Games dentre outras empresas que fazem coisas fantástica escovando bits. Mas depois de continuar na programação comercial por muito tempo e com mais maturidade, voltei a sonhar... Afinal se cheguei na IBM, porque não posso chegar na EA ? Mas desta vez pretendo começar realmente do zero, como tem que ser para um novato em jogos. Vou relatar tudo para entender onde estou errando, ajudar os outros será conseguência. Hoje tenho uma lógica mais aprofundada e entendo melhor a necessidade de documentar o que deve ser feito antes de começar o código em sí. Aí você diz: "Mas eu não quero fazer joguinhos... quero fazer jogos 3D!!!" Eu sei... nem eu... a pesar de que existem muitos joguinhos 2D bem melhores q 3D, estou fazendo isto pra aprender e conseguir chegar ao final do desenvolvimento de um jogo 3D. E Nem sempre fazemos oque queremos. Certo, já entendi que devo criar jogos básicos, e conseguir concluí-los antes de passar ao jogo que realmente quero concluir. Jogos que podemos criar para treinar lógica =========================================== Campo Minado, Paciência, Pong, Tetris, Tiro ao alvo, Invaders, pac-man, Damas, Lógica do nosso primeiro jogo: Campo minado =========================================== Descrição: Campo minado é um jogo muito simples de cálculos matemáticos, e muito divertido também. Funcionamento: O jogador inicia o jogo e aparece para ele uma espécie de tabuleiro de botões, e uma quantidade de bombas escondidas em alguns botões, se o jogador clica em um botão que tem uma bomba, ele perde o jogo, se clica em um botão que não tem bomba, mas está próximo(faz fronteira) com uma ou mais bombas, aparece o nr de bombas que existem nas proximidades, esta é a única pista que o jogador tem para descobrir quais quadrados têm bomba e quais não têm, e se não tem bombas nas proximidades, o jogo automaticamente abre as fonteiras até não encontrar mais fonteiras sem números. Opções e comportamento do jogo: Ao Abrir o jogo o usuário tem as opções: Novo jogo Ao clicar em novo jogo, as opções são: Novo jogo * Monta novamente um novo jogo pro usuário Esta montagem é feita criando os botões visíveis ao jogador, e espalhando as bombas aleatoriamente nestes de maneira oculta ao jogador. * Zera o cronômetro * Aguarda o primeiro clique do jogador Sair do Jogo Fecha o programa ---------------- Clicar em um botão(fazer uma nova jogada) * No primeiro clique o cronômetro é disparado e o jogo começa. * Se o jogador clicou em quadrado com uma bomba o jogo termina, ele perdeu +( * Se o jogador clicou em quadrado sem bomba, e não existe bomba de fronteira com este quadrado, o quadrado é aberto, e outros quadrados de fronteira são abertos recursivamente até esgotarem-se os quadrados que não tem bombas nas fronteiras * Se o jogador clicou em um quadrado sem bomba, mas que tem bomba em um dos quadrados de fronteira, imprime no quadrado clicado, o nr de bombas que existe nas fonteiras * Se não restam mais quadrados sem bombas, o jogo termina, ele venceu. =D Ao vencer são guardados os dados nas estatísticas. Estatísticas Ao Clicar em Estatísticas o jogo mostra uma lista em ordem de maior dificuldade e menor tempo com os dados: Nome jogador, Data, Tempo gasto, dificuldade Podemos definir a dificuldade como a possibilidade de erro em um chute, por exemplo, se ele tiver 30 bombas em um tabuleiro de 200 quadrados, dizemos q a dificuldade era (30/200)*100 = 15 então nossa fórmula será (bombas/quadrados)*100 Opções Permite ao usuário definir a quantidade de bombas e o tamanho do tabuleiro Sair do jogo Fecha o programa Analisando possíveis problemas ============================== Lendo atentamente este comportamento do jogo notei as seguintes dificuldades: Como gerenciar todos os itens e bombas em memória? Penso que a melhor opção seria trabalhar com arrays... pra quem não conhece, são como matrizes da matemática, todos já vimos isto na escola se não me engano no fim do ensino fundamental. ficaria algo como isto: int linsize=10; // Numero de colunas int colsize=10; // Numero de linhas int campo[linsize][colsize]; // int bombas=10; // As bombas não são arrays então posso colocar o valor certo após a rotina distribuir as 10 bombas randomizadas... ficaria algo como: campo[0] = {0,0,0,0,0,0,1,0,0,0}; campo[1] = {0,0,1,0,0,0,0,0,0,0}; campo[2] = {0,0,0,0,0,0,0,0,0,0}; campo[3] = {0,0,0,1,0,1,0,0,0,0}; campo[4] = {0,0,1,0,0,0,0,0,0,0}; campo[5] = {0,1,0,0,0,0,1,0,1,0}; campo[6] = {0,0,0,0,0,0,0,0,0,0}; campo[7] = {0,0,0,1,0,0,0,0,0,0}; campo[8] = {0,0,0,0,0,0,0,0,0,0}; campo[9] = {0,0,0,0,0,0,1,0,0,0}; Os zeros são onde não existem bombas e os 1 são onde existem... Observe que existem apenas dez "1" espalhados no array que é nosso tabuleiro Porém em C não é possível definir um array por variáveis... é possível em java e outras linguagens mais alto-nivel q C... Isto complica um pouco... sem isto não poderíamos permitir ao jogador definir o tamanho. No máximo conseguiríamos predefinir niveis pra ele. Uma boa saída é o malloc e trabalhar com ponteiros... vamos ver: campo = malloc(linhas*colunas * sizeof(int)); Mas como espalhar as bombas? Isto é bem simples dependendo da linguagem, na maioria tem algo como rnd ou randomize que nos permite fazer isto com muita facilidade. Mas não é o caso de C, onde a handomização é feita sempre na mesma sequência, o q deixaria nosso jogo no mínimo previsível. Neste caso da C, pensei em gerar a randomização baseada na data, hora completa incluindo os milisegundos... e me veio outro problema, por padrão não é possível pegar os milisegundos no C, não no ANSI C... e como gosto de seguir padrões de portabilidade, encontrei uma boa saída... o SDL possui uma forma de calcular o framerate que disponibiliza uma variável atualizada em milisegundos.... o SDL_GetTicks()... vamos trabalhar com ela para gerar a randomização. Primeiro faça simples, depois complique gradativamente Vamos primeiro fazer um código que permita o usuário acessar os menus em modo texto mesmo... Assim você vai aprender a base do C Iniciar um novo Jogo Sair Campo minado lógica: define tamano de campo como 10 linhas e 10 colunas num total de 100 quadrantes. int linsize=9; int colsize=9; campo[linsize][colsize] //O array começa do zero, sendo assim, se usar 10 vai gerar um array de 11 posições, por isto usamos o array de 9 usuário iniciou um novo jogo. rotina distribui 10 bombas randomizadas... algo como: campo[0][0,0,0,0,0,0,1,0,0,0] campo[1][0,0,1,0,0,0,0,0,0,0] campo[2][0,0,0,0,0,0,0,0,0,0] campo[3][0,0,0,1,0,1,0,0,0,0] campo[4][0,0,1,0,0,0,0,0,0,0] campo[5][0,1,0,0,0,0,1,0,1,0] campo[6][0,0,0,0,0,0,0,0,0,0] campo[7][0,0,0,1,0,0,0,0,0,0] campo[8][0,0,0,0,0,0,0,0,0,0] campo[9][0,0,0,0,0,0,1,0,0,0] Totaliza os quadrantes livres: int quadranteslivres = 0; for (int i=0; i<=linsize; i++) { for(int j=0; j<=colsize; j++) { if (campo[i,j]==0) quadranteslivres += campo } } usuáro seleciona um item: linhasel=3; colsel=2; caso campo[linhasel,colsel]==1 tem bomba, explode, game over. revelabombas(); caso campo[linhasel,colsel]==0 // Rotina calcula quantidade de bombas próximas: int bombasproximas = 0; for (int i=-1; i<2; i++) { if (linhasel+i>=0 && linhasel+i<linsize) { for(int j=-1; j<2; j++) { if (colsel+j>=0 && colsel<colsize) bombasproximas += campo[linhasel+i, colsel+j]; } } } caso itensproximos==0 não tem bombas na fronteira, rotina abre todos os ítens próximos recursivamente até esgotar itens de fronteira sem bombas próximas. caso itensproximos > 0 Apenas relata ao usuário a quantidade de bombas nas proximidades. // incrementa quadrantesabertos quadrantesabertos++; Verifica se existe mais algum quadrante livre, if (quadranteslivres-quadrantesabertos>0) caso exista o relata ao usuário. e aguarda a próxima jogada. else caso não exista o usuário ganhou o jogo. Parabéns pra ele =) usuário desiste do jogo: gameover; revelabombas(); A Escolha da Linguagem ====================== Teoricamente, você pode usar quase todas as linguagens para criar seu jogo, porém algumas se destacam C, C++, Java, .Net(C#, VB.NET, etc)... Eu programo em todas estas linguagens, principalmente em java, que se destaca muito pela portabilidade, que traduzindo é: você escreve um programa no linux, mas roda em qualquer outro lugar onde tenha java... mas optei por C, por querer algo mais comercial... nos jogos normalmente é usado C++, mas eu gosto de procedural. =) A Escolha das APIs ================== Claro que você pode escolher uma engine pronta como a OGRE ou irlitch, mas eu quero conhecer mais do que estou fazendo, estas APIs encapsulam muito as coisas e mesmo assim ficam complexas. Decidi montar meu próprio motor... Vou usar SDL como API principal para gerenciamento de ambiente, graficos, janelas, mouse, teclado, joys, sons, etc), bullet physics para detecção de colisão, que é algo extremamente complexo, e OpenGL para 3D. Compilando ========== gcc fonte.c -o rodar -lmingw32 -lSDLmain -lSDL Não mude a sequencia!!! logo vou atualizar isto corrigindo alguns erros e adicionando o autotools para podermos usar os famosos: ./configure ; make ; make install; ...continua... Mas só Deus sabe quando. O primeiro grande problema é aprender a compilar o SDL depois de instalar o gcc e baixar o SDL, não teria tido problemas com isto no Linux, mas no windows precisei do mingw32 e o SDLmain pra compilar um código de iniciação do SDL: gcc helloSDL.c -o helloSDL -lmingw32 -SDLmain -lSDL Isto compilou o básico, mas agora enfrento um novo desafio, a compilação do SDL para o SDL_GetTicks Programação em Camadas (MVC)Programação em Camadas (MVC) ============================ Ouve-se muito hoje em dia falar em programação em camadas ou MVC, neste artigo vou passar um pouco dos meus conhecimentos sobre o assunto, e como este conceito pode ser colocado em prática no desenvolvimento não só Orientado a Objetos(OOP) mas também no Procedural. Para começar, MVC significa Model View Controller ou Modelo Visualização Controle, isto porque é esta a divisão básica da programação em camadas, por esta razão, você encontra também o termo programação em 3 níveis. Mas pra que MVC ? Em resumo, pra você não se perder no seu código, e ter maior produtividade. Mas vou tentar sei mais específico... ================= Algumas Razões: 1. O Mercado usa e quer. E com toda razão. Saber usar MVC vai acrescentar alguns pontos no seu currículo e vários pontos na hora da entrevista. 2. Programas crescem. Quando se faz um programa pequeno é relativamente fácil gerenciar o que foi feito, então você pode criar seus programinhas sem MVC, e funcionaram muito bem... praque você vai se preocupar em seguir um padrão? Bom... Cada caso é um caso, mas na maioria das vezes esta é justamente a mente de quem pensa pequeno e não se importa muito com a qualidade do código que está escrevendo. Muitas vezes estes programas crescem e se tornam muito complexos e quase ilegíveis. Então MVC é pra quem pensa grande, pensa no futuro quando você não estiver entendendo muito o que fez no passado. Em que consiste MVC? ==================== A intenção é dividir todas as funcionalidades do seu programa de forma que fiquem organizadas nestes 3 níveis. Desta forma além do código ficar bem legível, será mais fácil dividir tarefas entre vários desenvolvedores. E a reutilização do código será muito mais simplificada. Só pra ressaltar: Quais os benefícios do MVC? =========================== * Código segue um padrão mais legível. * Menor dificuldade em encontrar e resolver problemas no código. * Vários programadores pode trabalhar em uma mesma funcionalidade facilmente. * Novos desenvolvedores que conhecem MVC terão facilidade com o código. * Reutilização do código muito facilitada. Principalmente usando Shared Objects. Mas MVC não é só para Programação Orientada a Objetos (OOP)? =========================================================== Não. Sei que posso estar começando um frame... mas estou convencido que NÃO! O que acontece, é que nas linguagens como java que usa conceitos OOP o MVC é muito enfatizado, e isto nos dá a impressão de que ele é para OOP. Mas nada impede que se use este conceito em um código procedural. E oque significa cada nível ? ============================= Model (Modelo) : ============== Nesta camada devem ser implementadas tudo que é essencial ao funcionamento do recurso... seria o célebro do código. View (Visualização) : =================== Nesta camada são implementadas as rotinas que o usuário possa interagir, mesmo que este usuário seja uma outra aplicação, qualquer forma de interação externa só pode ser feita pelas implemetações desta camada. Controller (Controle) : ===================== Esta é uma camada intermediária que traduz as informações fornecidas pela camada view para algo legível pela camada Model e vice-versa. Muitas vezes ela apenas repassa a chamada. Parece algo desnecessário mas não se engane, sem ela não seria tão simples a reutilização do código. Exemplo Teórico: ============= Vamos imaginar que a empresa onde você trabalha solicita que você desenvolva um programa que leia vários arquivos(ou um banco de dados), faça alguns cálculos complexos e retorne um vetor com as informações lidas e calculadas para o usuário. Isto pode levar algum tempo, não é? Mas não é só isto. Você também precisa criar várias formas do usuário acessar este programa: Modo texto; Modo gráfico 2D; Modo gráfico 3D; Modo Web; Mas não pára por aí. Você também tem que criar isto em um tempo que você, mesmo sendo o gênio que é, não acredita que conseguirá sozinho... você reclama disto e seu chefe/gerente diz: Até entendo, mas não posso ampliar o prazo, o que posso fazer e te disponibilizar mais desenvolvedores. "E agora José ???" "Está cansado de criar um código e ter que ficar separando fragmentos dele para copiar e colar em outro código que faz exatamente a mesma coisa mas não sabe como reutilizá-lo?" "ACABARAM SEUS PROBLEMAS!!!" "Chegou o maginífico, ultra-rápido e revolucionário: Model Viel Controller ["Programation Planification Tabajara"]. ;-)" Você se lembra do MVC... e coloca em prática. como ? Vamos dividir as tarefas: * Um primeiro programador vai criar as assinaturas de métodos do código reutilizavel e salvar em um objeto compartilhado em C podemos pensar no arquiv .h . Isto vai servir para os outros desenvolvedores criarem as chamadas de método nos seus programas. Depois este programador vai continuar trabalhando na implementação dele. Este é nossa camada Model. * Um segundo desenvolvedor, irá criar retornos falsos, para serem retornados para o código dos outros desenvolvedores enquanto este código não fica pronto. Pra isto ele vai precisar estabelescer padrões de tipo e ojetos e vai compilar nosso objeto compartilhado falso =|... Isto será nossa camada Controller (temporária). * Um terceiro desenvolvedor vai programando a interface Texto com a estrutura de menus, telas de boas vindas, ajuda, sobre, aquela frescuragem toda que o usuário quer ter, e deixando as partes de código que precisa da dita cuja funcionalidade com a assintatura do método que o segundo desenvolvedor já passou... mas lembre-se que por enquanto este método vai estar retornando um valor falso... apenas pra não ficar parado. Um exemplo prático que estou criando é o http://bombas.sf.net estou desenvolvendo baseado na lógica do campominado do windows(winmine.exe) com alguma divertidas funcionalidades adicionadas. Minha intenção era criar um jogo que tivesse 3 interfaces, Texto, 2D e 3D. como a lógica do jogo é uma só, eu pude criar um código de forma que fosse usado pelos 3 modos do jogo. Compilei este código como um Shared Object que no windows são as famosas .dll e no linux são os arquivos .so . E assim pude reutilizar este código compartilhado com os outros modos... No futuro, se eu quiser usar esta lógica como parte de um outro jogo será só adicionar esta biblioteca e pronto. Queria continuar com isto, mas está ficando muito extenso... e vocês podem se basear no código do bombas.sf.net que já postei o link acima. Também é verdade que estou sem tempo talvez eu poste futuramente uma parte 2 deste artigo. Espero que seja útil a vocês... Qualquer dúvida, usem os comentários. Até a próxima, Abs. 11月12日 UltraStar - A nova geração de karaokêAlgumas semandas atrás, minha esposa me pediu que eu conseguisse um programa de karaokê para que ela exercite sua doce voz(para os que não sabem ela é cantora, uma bela cantora com uma linda voz mas continuando... ), então eu pesquisei... pesquisei.... De início achei muitos programas de karaokes pagos... E alguns gratúitos como o kanário que é brasileiro, usa o microsoft agent... aqueles bichinhos do office 2000 e da pesquisa do windows xp... não gostei muito... tem restrições na versão gratuita... e não estava afim de pagar por um aplicativo tão simples... mas funciona... depois de algumas semanas ela me pediu algo melhor... Logo... de volta ao google... pesquisei mais um pouco e encontrei o microke - Muito bom mesmo vale a pena postar os links... além de ser gratuito e sem frescuras de ficar te avisando q existem muitos recursos q não estão ativos porq é gratuito... ele te dá acesso fácil à uma fonte excelente de arquivos de karaoke (.kar) e em outros formatos aceitos por este programa também... vale muito a pena... mas não se compara com nossa próxima descoberta... de qualquer forma segue o link: http://www.microke.com.br/new/index.html Mas então, em um momento iluminado, pensei... "Uai... o sf.net deve com certeza ter alguma coisa totalmente gratuita e aberta onde além de deixar minha esposa se divertir, poderia colaborar de alguma forma com o crescimento do projeto..." e foi o que fiz... deixei o oráculo (leia-se google), e fui ao sf.net pesquisar... e o que encontrei me surpreendeu demasiadamente: http://sourceforge.net/project/screenshots.php?group_id=191560 Não posso deixar de compartilhar o quanto fiquei facinado com este aplicativo. Além de ter uma versão portada pra linux, e opcionalmente funcionar via wine esta versão deluxe, conta com um site que permite o download das musicas no formato do aplicativo... o http://www.ultrastarsongs.com/ O download é simples e tem um acervo enorme de músicas em inglês... Porém, este site tem um controle muito rígido dos downloads... se tentar burlar pode ser bloqueado por mais de 6 horas... então o melhor é baixar as musicas via torrent... encontrei uma boa fonte em: http://www.torrentz.com/search?q=ultrastar Se você não tem um client de torrent, necessário para este tipo de download, pode usar o firefox (www.getfirefox.com) com o addon (um plugin) foxtorrent(http://www.foxtorrent.com/) Depois de baixar e instalar o aplicativo, e as músicas, é só copiar as pastas das musicas com os arquivos txt, mp3/ogg, e imagens para a subpasta songs da pasta onde você instalou o ultrastar. A versão Deluxe já vem com uma música pra mostrar o potencial do ultrastar e te dar um bom exemplo de como adicionar novas músicas na pasta... não tem segredo. É um aplicativo fantástico para treinar afinação e fonética de inglês... porém tem um outro problema para nós brasileiros... não existem, ou pelo menos eu não encontrei músicas em português... Por isto, pesquisei e descobri uma forma eficaz e relativamente simples de converter os arquivos kar que conseguimos usar com outros aplicativos de karaoke como o microke para o txt usado pelo ultrastar... depois disto é só adicionar o MP3... fiz uma música, ficou ótimo... e não foi difícil... mas vou tratar disto em um outro post. Qualquer dúvida, postem nos comentários e terei prazer em responder... Abs, Ton 11月9日 Saudades na madrugadaPrincesa, são umas 4 da manhã e estou sem sono, sei que é a falta que estou sentindo de você. A melhor decisão que eu tomei foi a de me casar com você, e não consigo passar nem um dia longe. Acho que isto é bom, porque após 4 anos juntos continuo te amando, mas não te amando como antes... não... te amo bem mais. Te amo bem mais não só porque sempre acreditei que o amor era enfatizado pela convivência, Te amo bem mais, porque sempre estive procurando por você, e finalmente você chegou... 5 anos atrás... como você demorou !!! Te amo bem mais, porque até hoje você acreditou em mim, e um homem só precisa disto, uma mulher que o ame e que acredite nele, com isto, o céu não é nenhum limite. "PRO INFINITO E ALÉM!!! Te amo bem mais, porque quando estávamos em nossos momentos críticos, ao invés de você me humilhar dizendo que eu não estava conseguindo te dar a vida que você merecia, você me ajudou, me motivou, e me encorajou a enfrentar os problemas sabendo que iríamos passar vitoriosos por eles. Te amo bem mais, porque quando nos conhecemos, me apaixonei por você, e já te amei desde o início, mas quando passamos por nossas dificuldades, você me apoiou. Quando saímos de Jataí, você acreditou em mim, sem emprego, sem renda, sem nada... hoje estamos conseguindo tudo que queremos, um passo de cada vez, sim... mas é assim que se aprende a andar... e depois correr... chegaremos lá. Poderia passar toda a madrugada aqui dizendo o porque te amo mais hoje... mas se não conseguir dormir posso ter problemas com o trabalho e não voltar pra casa amanhã... então... vou me esforçar pra pegar no sono... Bjos... e boa noite. De quem te ama bem mais; Ton |
|
|