
Depois de algum tempo, termino esta série. A idéia desde o início era simplesmente explicar o básico sobre desenvolvimento de games conforme eu fosse aprendendo. Desde o primeiro post, o jogo WinForms Lander já estava praticamente completo. E claro, como nem todos gostam de ler posts técnicos, fui alternando os posts com posts padrão deste blog. Por isso a série demorou para acabar. Mesmo assim, recomendo muitíssimo a todos a leitura dos posts anteriores, pois eu tentei ser bastante didático e teórico, não se prendendo somente em códigos. Acredito que os textos tenham ficados bem agradáveis e com conteúdo interessante. Mesmo se você não quer desenvolver.
Leiam o restante para acessar os downloads:
Ao longo do desenvolvimento, fui tomando algumas decisões de design e alterando coisas. A principal alteração foi o uso de código 100% nativo para leitura de teclas. Agora não é mais necessário usar aquela dll do XNA para isso. O código eu achei na internet e mantive intacto, junto com o comentário que identifica o autor.
Outra coisa foi o uso de código nativo para tocar arquivos de áudio multimídia. Também peguei da internet. A biblioteca original do Windows Forms/.Net só permitia tocar um som por vez, e ainda somente .WAV. Agora o game toca mp3.
Algo que descobri desenvolvendo o game é que a parte audiovisual é um grande limitador para quem desenvolve sozinho. Fazer um game sem uma equipe multi-talentosa requer um criador multi-talentoso. Criar gráficos 2D estáticos é fácil. Mas criar sons, músicas, animações, backgrounds sem copiar tudo de outras fontes é extremamente difícil para um simples programador.
E aí vem o problema. Encontrar bons efeitos sonoros é muito mais difícil que encontrar músicas. Acredite.
Um dos grandes problemas para desenvolver este jogo foi tentar incluir cenários. O Windows Forms aceita inserir imagens de background, mas qualquer animação fica meio quebrada. A detecção de transparência não é muito boa. Por isso, e também por falta de habilidades de minha parte, não foi possível colocar backgrounds, muito menos obstáculos nas fases, como montanhas, relevos e etc.
Isso levou a algumas idéias interessantes para aumentar o desafio de pousar as naves. Eu fiz com que em cada fase a plataforma se movesse de variadas velocidades e direções para dificultar um pouco e diferenciar as áreas mais avançadas. Algumas áreas possuem ventos. Outra coisa que inseri nas últimas fases foram asteróides que ficam caindo em velocidades e direções variadas, para atrapalhar um pouco.
No geral, acho que o game ficou bem completo.
Tentei neste game incluir um pouco das coisas que sinto falta em alguns games, como fases variadas, prêmios e incentivos para continuar a jogar. Tudo isso na escala do jogo, claro.
Bom, depois de tudo isso, vamos aos downloads:
Aqui tem os fontes.
Para codificar, adotei por padrão o idioma inglês. Acho mais fácil em inglês porque assim evitamos estrangeirismos, acentuações ou traduções grosseiras geralmente vistas no código em “português”. Se for codificar em português e usar “GetValor” para nomear alguma função, então que se adote o inglês de uma vez! Ou usa “PegaValor”. Os comentários estão todos em português, no entanto.
Aqui tem o executável.
Aqui tem o executável sem o áudio, para quem tiver problemas.
Para rodar o game, é necessário ter o .Net 2.0 instalado. Talvez precise de alguma outra biblioteca, mas não consegui testar em uma grande variedade de PCs para me certificar se está tudo ok. Qualquer problema, deixe um comentário.
Edit:
PROBLEMA – a biblioteca de audio que usei pode não funcionar corretamente em alguns sistemas (foi o caso do Kazuma). Como a biblioteca não é minha, não sei porque não funciona. Vou investigar. Enquanto isso, estou disponibilizando uma versão sem áudio do game.
VISUAL – Como utilizei controles visuais usados em formulários de sistemas, como barras, botões, painéis e etc., as imagens ficarão melhores se o jogo rodar no modo visual clássico, e não com o tema do XP (ou mesmo Aero). Cliquem com o botão direito no WinFormsLander.exe e em Propriedades >> Compatibilidade, marquem “Desabilitar temas visuais”.
Tags: C#, Desenvolvimento, Jogos, Windows Forms, WinForms Lander
Categorias: Desenvolvimento | 2 Comments »
Opa.
Muito legal a a matéria cara.
Fiquei com muita vontade de jogar, mas, infelizmente está dando erro:
[quote]
Consulte o final desta mensagem para obter detalhes sobre como chamar a
depuração just-in-time (JIT) em vez desta caixa de diálogo.
************** Texto de Exceção **************
System.TypeInitializationException: O inicializador de tipo de ‘WinFormsLander.Classes.Globals’ acionou uma exceção. —> MediaException: Foi encontrado um problema desconhecido ao se carregar o driver do dispositivo especificado. em Org.Mentalis.Multimedia.MediaFile.Open(String file)
em Org.Mentalis.Multimedia.MediaFile..ctor(String file, IWin32Window owner)
em WinFormsLander.Classes.SoundEffect..ctor(String AudioFilePath)
em WinFormsLander.Classes.Globals..cctor()
— Fim do rastreamento de pilha de exceções internas —
em WinFormsLander.Forms.FormBase.FormBase_Load(Object sender, EventArgs e)
em System.EventHandler.Invoke(Object sender, EventArgs e)
em System.Windows.Forms.Form.OnLoad(EventArgs e)
em System.Windows.Forms.Form.OnCreateControl()
em System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
em System.Windows.Forms.Control.CreateControl()
em System.Windows.Forms.Control.WmShowWindow(Message& m)
em System.Windows.Forms.Control.WndProc(Message& m)
em System.Windows.Forms.ScrollableControl.WndProc(Message& m)
em System.Windows.Forms.ContainerControl.WndProc(Message& m)
em System.Windows.Forms.Form.WmShowWindow(Message& m)
em System.Windows.Forms.Form.WndProc(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
em System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** Conjuntos de Módulos (Assemblies) Carregados **************
mscorlib
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
—————————————-
WinFormsLander
Versão do Conjunto de Módulos (Assembly): 1.0.0.0
Versão do Win32: 1.0.0.0
Base de Código: file:///C:/Documents%20and%20Settings/Rodr%EDgo%20F/Desktop/WinFormsLander_Game/WinFormsLander.exe
—————————————-
System.Windows.Forms
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
—————————————-
System
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
—————————————-
System.Drawing
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
—————————————-
mscorlib.resources
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
—————————————-
System.Windows.Forms.resources
Versão do Conjunto de Módulos (Assembly): 2.0.0.0
Versão do Win32: 2.0.50727.1433 (REDBITS.050727-1400)
Base de Código: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_pt-BR_b77a5c561934e089/System.Windows.Forms.resources.dll
—————————————-
************** Depuração JIT **************
Para habilitar a depuração just-in-time (JIT), o arquivo .config deste
aplicativo ou computador (machine.config) deve ter o valor
jitDebugging definido na seção system.windows.forms.
O aplicativo também deve ser compilado com a depuração
habilitada.
Por exemplo:
Quando a depuração JIT está habilitada, qualquer exceção não tratada
será enviada ao depurador JIT registrado no computador,
em vez de ser tratada nesta caixa de diálogo.
[/quote]
Quero fazer um jogo mas não sei como.