Estou estudando c++ desde o inicio de outubro, estou desenvolvendo bem e meu interesse em aprender a linguagem é criar uma ENGINE (Criar um jogo será apenas uma consequência, o que eu quero mesmo é criar uma engine).
A questão é que para mim tudo é muito novo, no inicio da faculdade eu peguei um pouco de C estruturado e lógica de programação e além disso eu sou bem forte em matemática (Engenharia 9/10), então, por ser um mundo tão novo eu estou com alguns problemas conceituais que estão me atrapalhando, são alguns deles:
Estava fuçando como criar uma janela no windows e me deparei com um header chamado WinUser.h, parece que tudo referente a criar coisas no windows passa por ele(Ou bastante coisa), mas eu não entendo como efetivamente ele cria as coisas, eu não tenho como ver o código assembly para dar uma conferida como ele fez isso?
Ainda sobre o WinUser.h, observe a seguinte estrutura:
WINUSERAPI
BOOL
WINAPI
ShowWindow( In HWND hWnd, In int nCmdShow);
Então, é assim se mostra uma janela no windows, mas por que??? é mágica??? Eu só preciso botar alguns parâmetros por uma função mágica e pimba… Uma janela é criada?
Digamos que eu acredite nessa magia (Magia da manipulação de registradores e pilha que eu não consigo descobrir encontrar como é feita), tudo bem, eu não sou tão cético, existe algum manual com todas as funções do WinUser.h que eu possa usar para criar o que eu quiser??? Por que eu já me debati atrás disso e não consigo encontrar.
Eu gostaria de bater um papo com alguém que já fez uma ENGINE e possa me tirar algumas dúvidas estupidas q eu não estou conseguindo resolver sozinho, tais como, por que eu devo usar uma .DLL (Eu disse que eram dúvidas estupidas), será que não é melhor eu criar meu próprio framework do que ficar usando aleatórios por ae, dúvidas sobre o directX e outras coisas bobas.
Mas eu gostaria de conversar por voz, bater um papo mesmo, skype ou teamspeak =////… Me comprometo a botar o conteúdo discutido e o que eu entendi sobre o assunto aqui nesse tópico para garantir que todos tenham acesso a ele.
Você domina assembler ? se domina não terá assim tanta dificuldade com C++, porem… !!!
Parece-me que você quer mais e’ uma consultoria com viva voz e tudo mais !?
Você parece escrever sobre coisas simples e outras extremamente profundas, como criar uma engine, assembler etc.
Qualquer que seja a linguagem de programação, não se pode confundir parametrização com a logica da programação devidamente implementada para que tudo funcione. Não existem milagres, trata-se de ciência.
Você estudando pode sim fazer suas proprias engines, mas pensa bem, tem coisas que consumiram sabe-se la’ quantas teses de doutorados para que chegasse nisso que temos funcionando hoje, tem coisas que vale a pena agente entender como funciona e usar. Que isso não tire da gente a vontade de melhorar as coisas, pois ai’ esta’ o progresso.
Dominar eu não domino, mas eu sempre consegui fazer uma coisinha ou outra na faculdade, como por exemplo criar uma interfacezinha gráfica simples com algumas animações rústicas para meus projetinhos acionando algumas in/out no PC usando um 8086 e 8088… Eu me viro no assembly… Eu pelo menos consigo ler os códigos e não ter um ataque de pânico.
Na verdade eu só queria bater um papo mesmo, queria ter contatos para conversar sobre o assunto… Estou tentando aprender uma coisa por hobbie (Extremamente complexa), partindo do zero (Eu já disse que a coisa é extremamente complexa?) e sem conhecer ngm para me dar uma direção (Sobre uma coisa extremamente complexa)… Eu queria conversar para pelo menos saber a opinião de alguém sobre o que eu quero fazer, se o que eu quero é viável e ter alguma direção. Nada técnico…
Eu não quero reconstruir a roda, apesar de que eu já tive algumas piruetas mentais enquanto pensava nessa ENGINE (Que eu não sei se já foram testadas ou se até mesmo são usadas atualmente), como por exemplo, eu já imaginei uma forma de tornar impossível um jogador usar WALL em um jogo de FPS, eu só não sei se é viável do ponto de vista da transferência de dados entre os registradores e a pilha, talvez meu plano crie um atraso indesejado (demasiado) para o joguinho… Bem… Enfim… Vou postar minha ideia aqui em baixo depois de terminar essa resposta, vai que alguém implementa e acabem com essa praga de hacker que atrapalha tanto meu CSzinho.
Voltando ao assunto, usar algumas sub-engines para controlar a física do jogo, controlar as horas do dia, cálculos matemáticos e etc… Eu estou disposto a usar, desde que eu domine o que eu estou usando, mas minha ideia, o que realmente eu quero é ter controle absoluto do que eu estou fazendo, além de poder criar as ferramentas que eu quero para funcionar como eu quero.
eu diria que, antes de fazer uma engine, faça um demo e ai vc refatora o codigo de forma que o seu demo sera simples, só usando o que vc expoe como uma biblioteca separada.
se vc expor isso no github e mostrar como o cara compila o demo ( pode ser uma sequencia de demos, do mais simples ao mais complexo ) talvez pessoas se interessem em usar. de qq forma a melhor maneira de isolar e expor uma API as vezes é via um exemplo que funciona. o resto é consequencia.
Por que usar .dll? Bom, primeiramente é necessário entender um pouco do conceito. DLL significa Dynamic-Link Library (biblioteca de vínculo dinâmico [na própria wikipédia tem um ótimo artigo sobre]), elas são um conjunto de recursos. Em projetos grandes é indispensável a utilização desse tipo de arquivo, uma das grandes vantagens em utiliza-lo, é que como eu disse acima, ela é compartilhada, ou seja, ela ocupa um espaço único na memória e todos os seus recursos são carregados quando requisitados.
Quanto a API’s de computação gráfica: SIM, para criar aplicações como uma Engine, é indispensável a utilização de de API’S como DirectX e/ou OpenGL (eu utilizaria as duas para dar a opção ao usuário).
Na internet existe um vasto material (em inglês) sobre ambas. Dá uma pesquisada lá.
Inclusive, nesses materiais sobre computação gráfica, se não me engano há certas explicações quanto as manipulações do WinUser.h.
Pelo que entendi, você quer utilizar a WinUser para criar janelas personalizadas e não as padrões do Windows. Estou certo?
Uma das formas é utilizar bibliotecas de terceiros como GTK ou Qt.
Até a OpenGL e o DirectX possuem recursos para fazer isso. Dê uma pesquisada e irá encontrar.