Posted by: mitus | October 18, 2008

Taikodom, quem sabe mês que vem.

Olá Pessoal!

Essa semana que passou foi anunciado, pela Hoplon, o lançamento do mais esperado jogo de produção nacional. O Taikodom, que provavelmente dispensa apresentações, foi divulgado pelos N cantos da internet como sendo a superprodução nacional, o caso de sucesso da IBM na área de mainframe para jogos, e o pessoal da Hoplon faz questão de se compararem à produtores de peso como EA e outros.

Não vou comparar Taikodom com jogos como WoW, Lineage e Cia., não se pode comparar coisas completamente diferente, vou apenas analisar o jogo com base na experiência que tive.

Quando comecei a jogar o Taikodom, dive diversas dificuldades. A primeira foi a atualização, a cada vez que inicializava o cliente ele baixava arquivos de atualização, mas como estava na versão beta isso não é um problema e sim a prova que estão trabalhando para solucionar os problemas.

Read More…

Posted by: mitus | October 11, 2008

Recursos 2D

Para aqueles que, como eu, não tem habilidades na área artística este link é muito útil. Recheado de material 2D, e alguns 3D, pode ajudar na hora de implementar aquela idéia de jogo.

Para quem deseja fazer um RPG 2D este site é ótimo, já para outros gêneros pode deixar um pouco a desejar. Quem sabe aquele seu amigo designer, ao ver seu protótipo, não se convence e entra pro seu time de desenvolvimento.

Posted by: mitus | October 11, 2008

The Settlers

Olá pessoal!
Depois de ficar um tempo fora de foco (trabalhos acadêmicos), estarei voltando ao projeto da SGE. Pelo que eu me lembro está faltando compilar a libpng para windows e testar toda a plataforma. Enquanto isso, para relaxar, venho falar do jogo Settlers (alguns conhecem como Serf City) que joguei pela primeira vez quanto foi lançada sua segunda versão.

Um dos melhores jogos de estratégia que já joguei, Settlers consegue ser divertido, engraçado e ao mesmo tempo desafiador. Diferente de jogos como Age of Empires, The Settlers tem uma maior complexidade no processo de captação de recursos.

The Settlers I


Enquanto muitos jogos de estratégia têm uma mecânica simples para os jogadores acumularem recursos, e se dedicarem à guerra, em Settlers colher e usar não se aplica. Não basta plantar, é preciso colher a plantação, levar até o moinho e depois despachar para a padaria mais próxima e só assim você terá alimento para seus funcionários. Esta complexidade obriga o jogador a planejar o layout da sua cidade, incluindo suas ruas, pois em The Settlers as pessoas usam as ruas para transportar os recursos.

Settlers II

Settlers II

Eu poderia gastar muitos parágrafos descrevendo a mecânica deste jogo fantástico, mas nada melhor do que jogar para entendê-la. Inicialmente o jogo pode parecer complicado, principalmente para jogadores de Age, mas se você focar na organização das rotas e planejar as construções vai poder se divertir observando seus operários trabalhando.

Settlers III

Settlers III

Outro ponto legal deste jogo é a consciência ambiental. Existe uma construção que serve para você reflorestar áreas desmatadas, com isso você pode ter recurso eterno de madeira. Tudo bem, pode não ser uma consciência ambiental, mas só uma forma de não esgotar um recurso.

Settlers IV

Settlers IV

A última versão que ouvi falar deste jogo foi o The Settlers V. Nunca joguei e nunca vi ninguém jogando, mesmo porque este jogo não faz tanto sucesso no Brasil.

Settlers V

Settlers V

Posted by: mitus | September 24, 2008

Depths of Peril

Brute

Brute

Depths of Peril é um jogo de RPG e ação single player ao melhor estilo Diablo. Desenvolvido pela Soldak Entertainment(estúdio independente), traz elementos tradicionais dos jogos no estilo RPG e um conceito diferenciado, um mundo em constante transformação e que o tempo é levado em consideração.

Diferente de outros jogos que “esperam pelo jogador”, em Depths of Peril o mundo não tem tanta paciência. Demorar muito para solucionar um pequeno problema(Quest) pode acarretar em um problema maior.

Com imagens de qualidade(não vamos querer comparar um jogo indie com mega produções) Depths of Peril deixa qualquer desenvolvedor independente empolgado e também é certeza de  diversão aos fãns do gênero.

Pelo preço de 20 dolares (podemos arredondar para 40 reais) está disponível para os sistemas macosx e windows, sendo uma boa opção para aqueles que desejam conhecer o que acontece no mundo além das grandes produções.

É possível baixar uma versão demo para testar o jogo, e se agradar, a opção da versão completa pode ser adquirida via internet. Eu espero que Depths of Peril faça sucesso suficiente para que Steven Peeler possa trabalhar em mais projetos como este.

Requisitos Recomendados:
CPU de 2.0GHz com tecnologia equivalente ao Pentium 4.
256MB de memória RAM.
Placa de Video equivalente a GeForce 3.

Posted by: mitus | September 21, 2008

SGE – SGECorePack [parte 1]

Olá pessoal!

Enquanto estou migrando a SGE para Windows e Nintendo DS quero aproveitar para escrever sobre o básico da SGE.

Dividida em bibliotecas, a SGE tem seu conjunto de funcionalidades básicas na SGECorePack. Este pacote contém, até agora:

  • Interface dos sistemas (SGESystems)
  • Gerenciadores de Eventos(SGEEventManager) e de Sistemas(SGESystemManager)
  • Classe para controle de Tempo (SGETimer)
  • Classe para pontos 2D (SGEPoint2D)
  • A interface da Engine (SGEngine)

Todas estas classes estão no namespace SGECorePack.

Neste post vou falar de como os sistemas e seu gerenciador irão funcionar. Inicialmente não vamos ter um exemplo prático, mas quando chegarmos na SGEVideo vamos apresentar todos exemplos relacionados à este pacote.

Os Sistemas(SGESystem)
Para começar, a SGE é formada por diversos sistemas. Como exemplos destes sistemas podemos citar o video(SGEVideo), som(SGESound) e outros sistemas que podem ser criados pelo usuário. O próprio jogo que será desenvolvido com a SGE é um sistema, o SGEGame. Estes sistemas são criados e cadastrados na engine de forma que a própria engine faz o gerenciamento destes.

Para criar um sistema devemos respeitar uma interface imposta. Esta interface obriga o sistema a ter um conjunto de métodos que serão utilizados pela engine para iniciar, parar, pausar e realizar a execução destes sistemas. Esta interface faz a padronização destes sistemas e permite que o componente de gerenciamento consiga executar as operações básicas de um sistema.


class SGESystem {
private:
int status;
public:
virtual SGESystem* start(int flags) = 0;
virtual bool stop(int flags) = 0;
virtual bool pause() =0;
virtual int getStatus(){ return status; }
virtual void run() = 0;
};

Como podemos ver acima, apenas o método getStatus() já vem implementado, os demais não são implementados, mas as classes que herdarem SGESystem são obrigadas a implementá-los (o “= 0″ diz que o método deve ser implementado, se não tivesse essa indicação não seria obrigatório a implementação). Então, ao criar um sistema devemos ter no mínimo estes métodos implementados, sendo que a criação de outros métodos fica a cargo do implementador, mas a SGE irá utilizar apenas estes métodos para o gerenciamento dos sistemas.

Perceba que os métodos stop e start aceitam parâmetros. Estes parâmetros serão úteis para a inicialização de sistemas como o de vídeo e som, mas podem ser ignorados por outros sistemas. As opções de inicialização e parada para cada sistema estão descritas nos headers de cada sistema.

O Gerenciador de Sistemas(SGESystemManager)

O gerenciador de sistemas será o responsável por manipular os sistemas criados, sendo que para isto ele irá utilizar os métodos padrões da SGESystem. Por isto a necessidade dos sistemas de terem os métodos virtuais e obrigatórios, caso contrário seria complicado o gerenciador saber como interagir com cada sistema.


class SGESystemManager {
private:
std::map systems;
public:
SGESystemManager();
virtual ~SGESystemManager();
SGESystem* startSystem(int name, int flags);
bool stopSystem(int name, int flags=0);
int getSystemStatus(int name);
void run();
bool addSystem(int name, SGECorePack::SGESystem* systemInstance, int flags);

};

Como o pode ser visto acima, o SGESystemManager armazena os métodos criados dentro da variável systems. Para inicializar um sistema, ou parar, é passado o seu nome com a dados para a operação, isto significa que a criação do sistema não é suficiente para ele entrar em funcionamento é necessário inicializar. Os nomes dos sistemas da SGE estão listados no arquivo SGEngine.h.

Além dos métodos para inserir e parar um sistema existe o método para adicionar um sistema. Este método permite que um usuário possa criar seu sistema e adicionar ele na lista de sistemas da SGE. No caso, sempre um sistema será criado pelo usuário, o Jogo.

Para finalizar, o método run é responsável por executar todos os sistemas. Na SGE o usuário não precisa fazer controle de loop ou chamar todos os sistemas, isto é feito internamente e este método irá executar todos os métodos run dos sistemas, incluindo os criados pelo usuário. Ele será nada mais do que um loop com a execução do método run de cada sistema ativo.

O usuário da SGE não irá tratar diretamente com o gerenciador de sistemas. Para cadastrar, inicializar ou remover algum sistema, e mesmo outros componentes da SGE, o usuário irá utilizar a interface SGEngine. Esta interface eu irei apresentar somente após apresentar todo o SGECorePack, para poder falar de todo o suas funcionalidades junto a este pacote.

Nos próximos posts vamos continuar falando da SGECorePack e suas classes. Ao final vamos ver alguns exemplos funcionando e comentar as diferenças entre as versões windows, gnu/linux e nintendo ds.

Posted by: mitus | September 19, 2008

SGE – Progressos [parte 3]

Olá pessoal!

este post é apenas para informar que tive avanços com a SGE. Esta semana finalizei as funcionalidades básicas da engine e agora “congelei” a adição de códigos e vou trabalhar para melhorar o código já escrito.

Tive problemas com o uso do processador, nos meus testes minhas aplicações usavam 99% do processador. Este problema cheguei a resolver, mas depois de implementar os cálculos de colisão voltei a ter problemas de uso em média de 50%, a idéia é baixar isso pra 10% no máximo.

Como falei, agora estou trabalhando na otimização do código, e ao final desta etapa teremos uma versão da SGE pronta para pequenos testes. Nos próximos posts vou explicar o que eu já implementei e como está implementado. Quando a etapa de otimização do código terminar, deixarei disponível uma versão dele para download junto com a aplicação de teste que estou desenvolvendo.

Abaixo algumas imagens de uma aplicação para testes que eu fiz. Esta aplicação está me servindo para testar e validar as funcionalidades que implementei.

Posted by: mitus | September 10, 2008

SGE – Progressos [parte 2]

Olá pessoal!

Bom, do último post até agora tive problemas relacionados à saúde, gripe forte. Também estou com o tempo meio comprometido devido ao projeto freelance que estou trabalhando, atividades acadêmicas, um projeto particular que tentarei vender para uma grande empresa, 8 horas diárias no trabalho e procurar uma casa para morar.

Apesar de fazer tantas coisas, estou progredindo com a SGE versão gnu/linux. Implementei o suficiente para criar um jogo 2D no estilo space invader. Imagens aparecendo, desaparecendo, mexendo, colidindo são algumas das funcionalidades até agora.

Este jogo que está sendo feito não terá uma versão final. A verdade é que ele serve apenas para eu testar a SGE e verificar as modificações necessárias. Por enquanto não existem modificações significativas, mas algumas mudanças sempre aparecem.

Também andei pensando, a migração da SGE para windows irá acontecer depois que ela estiver funcionando para o Nintendo DS. Então, em breve teremos uma versão beta da parte de vídeo para gnu/linux e Nintendo DS.

Acredito que a implementação para Nintendo DS terá diversas alterações, devido à limitações do hardware, e nesta hora penso que a otimização necessária pode ajudar a melhorar a implementação para gnu/linux.

Nos próximos posts vou colocar imagens da SGE em ação (mas não espere muito do design, sou programador e sem capacidade para criar boas imagens). Também vou apresentar algumas técnicas utilizadas na SGE.

Quando estiver melhor e com tempo voltou a colocar conteúdo por aqui.

Posted by: mitus | September 4, 2008

SGE – Progressos

Estou trabalhando na SGE para linux. O objetivo agora é finalizar as funcionalidades básicas de video<que no caso da SGE é a exibição e desenho de objetos texturizados na tela>. Quero deixar a parte de video<SGEVideo> com o básico funcionando para poder testar a estrutura da SGE. O problema é que não basta trabalhar no módulo de video apenas, uma ou outra funcionalidade depende de outro módulo e aí você tem que implementar nesse outro módulo, também estou encontrando problemas com referências cruzadas, e não quero gerar esse tipo de dependência para não me arrepender depois.

Atualmente estou trabalhando na SGECorePack<pacote com as funcionalidades básicas da SGE>, SGEIO<faz o controle de entrada e saída, no caso mapeia o teclado e será responsável por salvar e carregar arquivos no futuro> e a SGEVideo<parte de video>. Espero, em duas semanas, terminar as funcionalidades básicas do video em ambiente GNU/linux<sei que vai demorar mais do que isso, mas vou tentar correr>. Quando terminar faço a migração para windows, e depois vejo como vai ficar no NDS.

Uma das coisas que estou utilizando neste projeto é o conceito de gerenciadores, e assim que tiver uma versão estável do gerenciador de sistemas da SGE eu posto seu funcionamento e utilização. Também estou alterando consideravelmente o design, para que as aplicações que utilizarem a SGE sejam construídas de forma mais simples, e assim que tiver uma definição coloco os diagramas relacionados.

Para finalizar, a imagem acima é a logomarca da SGE. A primeira proposta era 3D, mas como a engine é 2D achei melhor uma versão 2D da logomarca para não ser contraditório.

Posted by: mitus | August 30, 2008

Guitar Hero no Nintendo DS

Esta é a prova de que o homebrew pode ter a qualidade de muitas aplicações profissionais.

LINK PARA O SITE DO JOGO

Isso me lembra que meu projeto está atrasado. Hora de modelar menos e programar mais.

Posted by: mitus | August 23, 2008

UML na Prática – Diagrama de Classes #1

Este é o reestruturado UML na Prática. Este é o primeiro post da série que vai apresentar as Entidades mais  comuns encontradas nos Diagramas de Classes. Vamos utilizar nos exemplos a modelagem da SGE (Simple Game Engine), aplicando a modelagem de dados para jogos.

Nomenclatura

Antes de começar a falar das entidades, vamos falar um pouco sobre a nomenclatura das classes. Como padrão vamos utilizar classes com a estrutura NomeClasse. A primeira letra de cada nome que compõe o nome da classe sempre será com letra maiúscula e todas as outras com minúscula.

No caso de siglas, todas as iniciais serão em maiúsculas, então no caso das nossas classes da Simple Game Engine vamos usar a sigla SGE. Como exemplo, seguindo nosso padrão, a classe de video terá o nome SGEVideo.

Para os métodos das classes vamos seguir a mesma idéia, mas com um diferencial. O primeiro nome de cada método, salvo construtores de destrutores, irão começar com a letra minúscula. Então nosso método para exibir alguma imagem seria mostrarImagem(std::string nome).

Classe Concreta

Esta é a entidade mais comum no Diagrama de Classes. Representada pelo desenho da Figura 1, as classes concretas são aquelas onde todos os métodos são implementados e instanciamos objetos em nosso código.

Classe Concreta

Figura 1: Classe Concreta

O retângulo que representa a classe é dividido por 3 linhas, a primeira parte é apresentado apenas o nome da classe. Em seguida, no segundo retângulo, são listados os atributos das classes (as variáveis que fazem parte do seu escopo). Perceba que antes de cada nome um sinal (+ ou -) aparece antes dos atributos, isto significa sua visibilidade, no caso do sinal de + ele é um atributo do tipo público, podendo ser acessado diretamente. Quando temos um sinal de – antes do nosso atributo, significa que este atributo é privado e pode ser acessado apenas pelos métodos da classe.

O último retângulo da classe contém os métodos que pertencem a classe. E novamente temos a mesma definição dos sinais, indicando a visibilidade dos métodos. O Código abaixo tem o exemplo da declaração da classe vista na Figura 1.

#include

#ifndef SGEVIDEO_H
#define SGEVIDEO_H

class SGEVideo {
private:
boolean draw;
SGETimeControl drawTime;
SGETimeControl nowTime;
public:
void update();
std::string blitScene();
};
#endif

Classe Abstrata

Outra entidade muito comum em nossos projetos é a classe abstrata. Uma classe abstrata é uma representação de algum conceito ou objeto mais genérico. No c++, dizem alguns, as classes abstratas são definidas através de gambiarras. Na UML uma classe abstrata é identifica com o seu nome em itálico, a Figura 2 apresenta a representação gráfica da classe abstrata.

Classe Abstrada

Figura 2: Classe Abstrata

Como pode ser visto na Figura 2, a representação UML da classe abstrata é igual a da classe concreta, com o diferencial que o nome da classe aparece em itálico. Antes de exibir o código da classe abstrata devemos saber como declarar este tipo de classe no C++. Não existe como declarar uma classe abstrata no C++. Mas lembra da gambiarra? No lugar de declarar a classe abstrata vamos declarar os métodos abstratos, e podemos fazer isto de duas formas.

Na primeira, podemos deixar os métodos das classes em branco, sem implementação. Isto deixa aberto para que as classes concretas façam a implementação destes objetos. Perceba, a implementação dos métodos pelas classes concretas é opcional.

Na segunda opção, podemos obrigar que as classes tenham que implementar os métodos abstratos, para isto igualamos os mesmos à zero. Para saber qual forma utilizar devemos verificada a necessidade da aplicação e definir se um método é obrigatório ou não.

#include
#ifndef SGESINGLETON_H
#define SGESINGLETON_H

class SGESingleton {
   private:
      SGESingleton instance = NULL;
      SGESingleton(){}
      ~SGESingleton(){}
   public:
      SGESingleton getInstance()=0;
};

#endif

No código acima definimos que toda classe filha de SGESingleton deve implementar o método getInstance(), mas o construtor e destrutor da classe é algo opcional.

Interface

As interfaces são um conjunto de operações que definem os serviços de uma classe, ou de um componente. No nosso caso as interfaces existirão em cada módulo. Video, Som, Data, Core, Rede e todos os outros módulos possuirão suas interfaces, e estas serão as portas de comunicação entre os módulos e o jogo

Esta entidade possui duas representações visuais. As Figuras 3 e 4 são o mesmo exemplo de como a interface pode ser representada em UML.

Interface

Figura 3: Interface

Na Figura 3, a interface tem a mesma estrutura e desenho que uma classe concreta, a diferença está na indicação <<interface>> antes do nome da interface. No C++ uma interface nada mais é do que uma classe, como mostra o Código abaixo:


#include

#ifndef SGESystemManager_H_
#define SGESystemManager_H_

class SGESystemManager {
bool startSystem(std::string name);
bol stopSystem(std::string name)
int getError();

};

#endif

Na Figura 4, a interface é representada por um circulo, a principal característica desta representação é a falta dos métodos. Esta forma mais simples de representação pode ser utilizada no diagrama de outras interfaces. No nosso caso, o Diagrama de Classes do jogo pode conter esta representação, deixando o diagrama menos poluído, e em caso de dúvida o diagrama do módulo pode ser consultado.

Outra Forma de Representação de Interface

Figura 4: Outra Forma de Representação de Interface

Bom, existem outras entidades em diagramas uml, mas para quem esta começando estas são as principais e mais utilizadas. até a próxima.

ciao

« Newer Posts - Older Posts »

Categories