![]() |
|
Spaces home Site pessoal de Glaudist...PhotosProfileFriends | ![]() |
|
June 27 Desativando este Blog novo Blog: http://glaudiston.blogspot.com/Olá a todos, Agradeço a sua visita, mas estou desativando hoje, 27 de junho de 2008 este espaço. Vou deixar todos os posts aqui, porém já copiei-os para meu novo Blog. Existem várias razões para isto, mas as principais são a falta de recursos para injeção de código html e script neste blog. Obrigado a todos e visitem meu novo blog: http://glaudiston.blogspot.com/ E farei o possível para postar com mais frequência. Abs, Glaudiston Gomes IT Specialist. June 20 Adeus propagandas Faz um tempo que quero compartilhar este plugin do firefox, que faz milagres para melhorar a experiência com a internet. por padrão, o AdBlock Plus já bloqueia a maioria das propagandas, e permite a personalização do restante. Imagine usar o windows live mail sem o banner, sem propagandas, sem perda de espaço. Por padrão depois de instalado o adblock plus, o banner do live spaces e do live mail já não vai aparecer, mas o espaço ainda vai estar lá. Para remover o espaço vazio, até então usado pelo banner do live mail, é só adicionar o filtro: #div(RadAd_Banner) Já para remover os banners do spaces.live.com, é só adicionar o filtro: #div(AdContainer) o resultado são páginas limpas mais seguras e muito menos cansativas. Pra quem quer ser feliz e testar este milagre da tecnologia é só baixar o plugin do firefox e nunca mais usar o desnecessário e obsoleto Microsoft Internet Explorer. Segue o link do addon: http://adblockplus.org/en/installation e do firefox: http://www.getfirefox.com Abraços, Ton February 13 Carro Novo DíVida Nova...Hoje peguei meu primeiro carro, depois de pesquisar muito e analizar os pontos fortes e fracos, problemas conhecidos, custos de manutenção e freqüência desta manutenção, depreciação, desempenho, valor e dentre outras coisas principalmente conforto, cheguei a conclusão que um importado usado é a melhor escolha para mim. Os importados novos tem uma depreciação muito alta, comparadas com o Vectra e Fusion. Minha escolha foi um Citroën Xsara GLX 1.8 16v GLX. Este carro tem muitas peças compatíveis com o Peugeot 306 e existem aqui em Campinas opções bem em conta para compra de peças originais fora da concessionária da Citroën. Para meus amigos e os que acompanham o meu desenvolvimento estou postando as fotos do meu mais novo brinquedo/recurso Abraços, Ton January 04 Introdução ao Kernel Linux Para quem não entende muito bem este lance de kernel do linux, vou explicar superficialmente: O Linux em sí é um "programa" chamado kernel que controla a parte física do computador(Hardware). Estes programas do tipo kernel só podem ser usados por outros programas, e são o coração do computador. O kernel é o Sistema Operacional puro, que controla o processador, memória e instruções de hardware, entre outras coisas. Todo sistema operacional(O.S.) tem seu kernel. Claro que por causa dos infindáveis tipos de hardware, é necessário que se tenha outros programas ou informações que o kernel precisa para controlar o hardware, estes programas são chamados no windows de drivers, e no linux de modulos. Muitos tipos de hardwares são suportados diretamente pelo kernel do linux, mas se você não tem um hardware específico em seu computador, então você não precisa do módulo dele instalado pra você. No Windows você não tem saída. Todos os dispositivos de hardware que vêm com suporte nativo do windows estão lá. Querendo você ou não, e ocupando um espaço desnecessário em sua instalação. Por isto existe no linux a opção de configurar o kernel, ativando apenas o que você precisa. Assim você tem a liberdade de criar o seu sistema personalizado, enxuto e íntegro. A configuração do kernel do linux é simples. O difícil é você adquirir os conhecimentos necessários do seu hardware e das opções do kernel que você quer. É necessário que você estude muito a documentação do kernel para ter este conhecimento. As distros nada mais são, do que uma configuração compilada do kernel do linux somados a um pacote de programas. Tudo pra facilitar a vida de usuários que normalmente não têm o conhecimento necessário para criar sua própria distro, ou simplesmente acham perca de tempo reinventar a roda. Espero que esta breve e resumida informação seja útil. Abs, Ton December 23 Desafio, um jogo 2D até dia 23-12-2007 ... Feito!No início deste mês aceitei um desafio do meu amigo Bill Guedes no forum programadoresdejogos.com.br, aqui está o desafio: http://www.programadoresdejogos.com/forum/viewtopic.php?t=9193&postdays=0&postorder=asc&start=0 Se trata de um desafio para testar os conhecimento e capacidades de colocar estes conhecimentos em prática: "Quem consegue fazer um jogo do tipo space invaders até o dia 23 ?". Como achei a idéia simples, e eu tinha outras prioridades, trabalhei pouco nela, só peguei firme nesta ultima semana, quando acordei do fato que o prazo estava acabando. No final das contas, fiquei satisfeito com o resultado, fiz o jogo com usando o autotools, em bibliotecas divididas para o ambiente, o menu e o jogo em si. Coloquei audio... e está bem jogável. Sei que tem alguns detalhes errados, e falta algumas coisas do que eu havia pensado em fazer, mas já está bom. Pelo meno concluí a tempo. Quem quiser testar este jogo "beta", pegue-o no meu projeto bombas.sf.net no link de downloads December 10 autotools parte2 - adicionando dependenciasBem, no artigo anterior, já expliquei como funciona o autotools: http://glaudiston.spaces.live.com/blog/cns!50A3054EE15AB96C!298.entry Agora vou explicar como adicionar dependências. Neste exemplo, vou puxar pro lado de desenvolvimento de games, usando SDL que é uma biblioteca portável, que tem funções de controle de hardware entre outras coisas que facilitam muito nossa vida, e outras bibliotecas derivadas do SDL, como o SDL_image para controle de imagens de vários formatos, o SDL_mixer para o controle de mid, wav, ogg e mp3, o SDL_gfx, para rotação e zoom de imagens ou filmes, o SDL_mpeg para reprodução de filmes... etc. Vamos começar com a teoria: Pelo que já vimos, você deve ter percebido que o autotools trabalha com macros, macros são funções prontas, programas que você passa um comando com parâmetros ou não e eles executam determinadas funções. Você também já deve ter percebido que estas configurações são centralizadas nos arquivos configure.ac e Makefile.am. Sim... continua assim, porém vamos colocar mais um arquivo importante: o acinclude.m4 . acinclude.m4: Este arquivo é uma forma de adicionar macros que podem ser usadas dentro do configure.ac, por exemplo: o Sam Lantinga, desenvolvedor do SDL, criou um arquivo chamado sdl.m4 que está no código fonte do SDL, você pode baixar este código na página do SDL em http://www.libsdl.org, e copiar este arquivo sdl.m4 para o nosso diretório base. depois disto é só adicionar sdl.m4 em nosso arquivo acinclude.m4.in ou acinclude.m4, adicionar o teste desta biblioteca no arquivo configure.ac e executar o autogen.sh Depois de copiar o sdl.m4, só é necessário adionar uma linha com o conteudo sdl.m4 no acinclude.m4.in ... NÃO é preciso nada como #include sdl.m4 ... apenas o sdl.m4... depois disto o script de teste no configure.ac, deve ser colocado na parte de libraries é assim: dnl Check for SDLPara mais informações, consulte o artigo: http://www.samhart.com/snh/files/docs/sdl-kdev/sdl-kdev-mini-how2-2.html Agora se tudo está certo, você pode executar nosso script de reconfiguração (vide artigo anteiror citado acima): $ sh autogen.sh O resultado esperado é: sh autogen.sh checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking for sdl-config... /usr/bin/sdl-config checking for SDL - version >= 1.2.0... yes configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: creating config.h config.status: config.h is unchanged config.status: executing depfiles commands Observe que agora temos uma parte onde o SDL está sendo checado por uma versão superior à 1.2.0 Isto é suficiente pro SDL, mas e quando temos outras dependências que não nos dão as macros m4 prontas ? A primeira coisa é procurar no google... muitas vezes, no código fonte não vem o arquivo m4, mas alguém criou e postou em algum lugar. Então, se você encontrar vai simplificar muito seu configure.ac da forma q fizemos acima. Mas se o google não achar ? como fazer ? Neste caso, você pode criar seu arquivo m4, ou pode simplesmente adicionar o uma verificação no configure.ac, só q vai poluir um pouco nosso arquivo configure.ac que até então está bem simples. Depois vou postar mais entrada a respeito disto: autotools, criando seu próprio m4. Por hora é só. Tenho que fazer algum código também Abs, Ton December 07 ifconfig não funciona??? net-tools!!!Hahaaa!!! Usando o LinuxFromScratch, e tentando executar alguns programas que configuram VPN, tive vários problemas, e testando, descobri que o problema é que o ifconfig que eu estava usando era o do netutils, e não o do net-tools... segue alguns: 'ifconfig: can not resolve`down`: No address associated with name" "ifconfig: cannot resolve `up': No address associated with name" "ifconfig eth0 up" "ifconfig: can not resolve `up': Unknown host" # ifconfig -a ifconfig: option requires an argument -- a Usage: ifconfig [OPTION]... [SYSTEM OPTION]... Try `ifconfig --help' for more information.': No address associated with name" "ifconfig: can not resolve `up': No address associated with name" "ifconfig eth0 up" "ifconfig: can not resolve `up': Unknown host" # ifconfig -a ifconfig: option requires an argument -- a Usage: ifconfig [OPTION]... [SYSTEM OPTION]... E o incrível, é q o google não acha nenhum resultado com a maioria destas pesquisas. O LFS Book bem q me avisou pra não instalar o ifconfig do netutils... mas não disse q tinha ifconfig no net-tools tbm... então eu q fiquei quebrando a cabeça e consegui resolver com a ajuda do Guedes... valeu mais esta Bill! resumindo, é só instalar o net-tools: http://www.linuxfromscratch.org/blfs/view/stable/basicnet/net-tools.html Abs November 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 November 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. November 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 November 09 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 August 20 ANSI C - Portabilidade - WINMAIN LPSTR lpCmdLine to char **argvSempre tento criar minhas rotinas portáveis... mesmo que elas sejam apenas para aprendizado. Recentemente testei o SDL_mixer que traz uma rotina exemplo bem legal de como funciona, roda todos os formatos suportados, wav, ogg, mp3... etc. Segue o link: http://jcatki.no-ip.org/SDL_mixer/demos/ Mas enfrentei alguns problemas de compilação por causa dos argumentos passados pela linha de comando, com certeza a rotina foi desenvolvida em linux... aprecio isto... mas não acho interessante para um software ser restrito pelo sistema operacional, mesmo que este seja aberto. Pesquisei coisas como LPSTR to char** e LPWSTR* to char* mas sem sucesso. É, a microsoft sempre nos dá um trabalho extra totalmente desnecessário, mas vamos lá... Como vocês já sabem (ou deveriam saber), o windows possui uma forma diferente de iniciar o programa. ao invés do famoso, fácil e perfeito: int main(int argc, char **argv) ele usa INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nShowCmd) Assim sendo, você não tem o array para pegar is itens da linha de comando da forma que está acostumado. Então tive que criar uma forma de resolver isto para que eu possa criar meu código sem me preocupar com OS em que está sendo compilado. Segue: #ifndef WIN32 int main(int argc, char **argv) { #else #include <windows.h> INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nShowCmd) { int argc; char **argv; LPWSTR *szArglist; szArglist = CommandLineToArgvW(GetCommandLineW(), &argc); int __i; if( NULL == szArglist ) { wprintf(L"CommandLineToArgvW failed\n"); return 0; } else { argv = malloc(sizeof(char *) * argc); for( __i=0; __i<argc; __i++) { int tmp = wcslen(szArglist[__i]); char *c = malloc(sizeof(char) * tmp); wcstombs(c, szArglist[__i], tmp); argv[__i] = c; } } // Free memory allocated for CommandLineToArgvW arguments. LocalFree(szArglist); #endif // O código vem aqui... // e vc pode acessar o argv normalmente: int i; for( i=0; i<argc; i++) printf("%d: %s\n", i, argv[i]); #ifdef WIN32 // Free memory allocated for CommandLineToArgvW arguments. for ( __i = 0; __i < argc; __i++ ) free(argv[__i]); free(argv); #endif return(0); } Me avise se isto for util pra você, ficarei feliz em saber. Até a próxima, Abs, Ton December 16 BATCH SCRIPT!!! Batch scripts são arquivos texto com extensão bat (*.bat), são pequenos programas interpretados pelo prompt do ms-dos, são muito usados para automatizar pequenas tarefas do dia-a-dia, e por este motivo mesmo não existem tantas funções práticas para elaborar problemas complexos... mesmo assim com um pouco de criatividade pode-se fazer maravilhas com ele, lógico que não é nada que se compare com os bash scripts do *nix. A documentação não é muito boa... muito básica e os bons tópicos são espalhados pela internet. Desde modo fica difícil saber o que pode e o que não pode ser feito com batch script.
Neste artigo vou publicar minhas rotinas de batch script que podem ser úteis em diversas situações. Todos os scripts são feitos em windows xp, que usa o padrão NT para prompt do ms-dos... sendo assim, talvez alguns detalhes não funcionem em Windows 9x/ME, daí é você testar e usar a criatividade
Coisas básicas que são difíceis de encontrar:
* Como pegar uma parte da variável (substring):
caso seja um parâmetro tipo %1 ou %%i, sete este valor para uma variável temporária:
set var=variavel_a_testar
para pegar o left, por exemplo as primeiras 5 letras da variavel use %var:~0,5%
para pegar o mid, por exemplo a string da posição 9 até a 11 "_a_" letras da variavel use %var:~8,3%
para pegar o right, por exemplo as ultimas 6 letras da variavel use %var:~-6%
isto funciona muito bem pra pegar datas horas ou qualquer tipo de valor de variavel de ambiente também. Perguntas e respostas que eu tive que codificar por mim mesmo:
* Como conseguir a largura de um parâmetro ou variável em um arquivo .bat:
C:\WORKSP~2>more len.bat
:: December 16, 2006 by Glaudiston Gomes da Silva
@echo off set Len=-1 :next_for if "%Len%"=="-1" ( for /L %%i in (1,1,4096) do ( echo @echo off > getLen.bat echo SET s=%1>>getLen.bat echo if "%%s:~0,%%i%%"=="%%s%%" echo Len=%%i>>getLen.bat getlen.bat | find /c "Len" | find "0" > null IF ERRORLEVEL 1 ( echo Length=%%i set Len=%%i goto next_for ) ) ) del getlen.bat C:\WORKSP~2>len palavra_a_testar
Length=16 C:\WORKSP~2>set len
Len=16 De tempo em tempo vou atualizar este tópico...
see'ya! December 02 cheguei na IBM !Olá a todos, Até meu último post relacionado com meu trabalho, estava trabalhando na ACSYS Consultoria e Sistemas, mas por razões alheias à minha vontade (e à da vontade acsys também), fui forçado a buscar outras oportunidades de trabalho... Tenho que deixar relatado aqui o respeito que tenho pelo Marcos Atílio da ACSYS que é um excelente progamador e um homem que não desiste nunca... desejo que Deus o abençoe... e que |