Ir ao conteúdo

Dúvida em C


WesleyWonka15

Posts recomendados

Postado

Olá, estou fazendo um jogo em C.

Em um determinado trecho do código preciso que o usuário aperte uma tecla, porém o jogo não pode parar para que o usuário digite, tem que continuar atualizando a tela. E eu quero saber se é possível fazer algo do tipo em C?

Agradecido

Postado

Cara você precisa usar Thread . . . O conceito dele é o seguinte: Quando você defini uma thread para uma função você esta basicamente trabalhando com referencias de memória . . . Em linguagens orientadas a objetos o conceito de thread esta ligado a endereço de memoria também, mas seria uma junção de "delegate" com "event". Então resumindo a thread permite que uma função rode "SUPOSTAMENTE" ao mesmo tempo que outras funções =) . . . Mas na verdade é só uma orientação pro processador rodar dizendo "O cara . . . Roda essa função ao mesmo tempo (supostamente) com outras =P" e isso faz com que o processador além disso rode aquela função (bloco na memória) mais rápido que o normal dando a impressão que esta sendo rodada ao mesmo tempo.

Segue um exemplo fulero do uso disso

#include <windows.h> // Pra usar Thread voce precisa dessa biblioteca "windows.h".
#include <stdio.h>
DWORD WINAPI Thread(LPVOID);

int main()
{
DWORD id; // ID da thread !
int valor = 100; // Valor passado !

HANDLE th = CreateThread(0,0,Thread,(LPVOID)valor,0,&id);

if(th == 0)
{
printf("erro");
system("PAUSE");
return -1;
}

WaitForSingleObject(th,INFINITE); // A função WaitForSingleObject() faz com que o programa aguarde um determinado ou um indeterminado tempo, a execução da Thread.
TerminateThread(th,0); // Para terminarmos uma Thread, utilizamos a função TerminateThread(HANDLE thread_handle, DWORD codigo_saida)
CloseHandle(th); // Obviamente termina a execução "digamos assim" do thread
return 0;
}

DWORD WINAPI Thread(LPVOID p)
{
printf("O valor passado e: %d\n",(int)p);
system("PAUSE");
return 0;
}

HANDLE WINAPI CreateThread(
LPSECURITY_ATTRIBUTES ThreadAtt,
SIZE_T StackSize,
LPTHREAD_START_ROUTINE Addr_Funcao,
LPVOID argumento,
DWORD flags,
LPDWORD ThreadId
);

ThreadAtt:
ponteiro para uma estrutura do tipo LPSECURITY_ATTRIBUTES que contém atributos de segurança da Thread. Se passado como ZERO, a Thread é criada com atributos padrões.


StackSize:
tamanho inicial da stack em bytes. Se ZERO, o sistema utiliza um tamanho padrão.

Argumento:
um argumento opcional para a função.

Flags:
define o comportamento da Thread logo após ser criada. Se a flag "CREATE_SUSPENDED" for definida, a thread é pausada assim que é criada, permanecendo neste estado até que a função ResumeThread() seja chamada. Se for ZERO, a thread é executada logo após ser criada.

ThreadId:
ponteiro para uma variível do tipo DWORD que irí armazenar a identificação da Thread. Se ZERO, o argumento é ignorado.

A função CreateThread() retorna um Handle para a thread criada, do contrírio, é retornado um Handle Nulo, ou seja, ZERO.

O conceito do "Handle" seria como "GANCHO" . . . É mais ou menos como uma referencia a sua thread . . .

Mas pra fazer umas maracutaia "OP" vai no google que vai ter mais coisas =) . . . ^_^ falou CARA

Postado

Outra solução pra gerenciar os threads seria usando OpenMP. Talvez seja até mais pratico.

Nem precisa adicionar uma biblioteca a mais ao projeto. Se o teu compilador trabalha com OpenMP, basta algo do tipo:


#pragma omp parallel sections num_threads(2)
{
#pragma omp section
{
[COLOR="Blue"]// Atualizo a tela aqui.[/COLOR]
}
#pragma omp section
{
[COLOR="blue"]// Enquanto o usuário aperta a tecla aqui.[/COLOR]
}
}

Na primeira linha você pede a criação de dois threads, num_threads(2), e dentro do escopo de cada #pragma omp section, você executa alguma coisa diferente. Na pratica as duas coisas acontecerão ao mesmo tempo.

Se o teu compilador é o gcc, use a flag -fopenmp na linha de comando pra avisa-lo de que você está usando OpenMP. Se não é gcc, consulte a documentação, pra saber como compilar usando OpenMP.

Postado
Cara você precisa usar Thread . . .

Usar Thread em jogo para capturar eventos é um pessima pratica de programação.

Sem registro de eventos! Não insista!

Outro aspecto provavelmente novo para quem começa a desenvolver games é a inexistência de registro de eventos.

Geralmente, aplicações desktop são programadas apenas para responder eventos do usuário. Por exemplo, se estiver escrevendo um formulário de cadastro, provavelmente fará o projeto da interface adicionando campos que precisam ser preenchidos, um botão para Salvar, outro para Descartar. Seu programa fará alguma coisa apenas quando um desses botões for pressionado, ou enquanto usuário faz alguma digitação, ou na mudança de foco. De qualquer forma, seu programa apenas reage a eventos disparados por ações dos usuários.

Por outro lado, desenvolvimento de games é apenas “influenciado” pelos eventos do usuário. O programa “continua rodando” no lugar de ficar esperando que alguma coisa aconteça. Por exemplo, no lugar de esperar que o sistema “anuncie” que o usuário moveu o mouse, o jogo precisa “perguntar” para o sistema se o mouse foi movido. Importante: um jogo sempre está executando alguma ação, independente de qualquer entrada do usuário.

Uma lógica mal implementada faz com que um jogo fique pouco responsivo. A “culpa” não é do dispotivo e sim do código mal-feito.

fonte: http://elemarjr.net/2011/02/22/vamos-aprender-xna-parte-1-back-to-basics/

você deve analisar o estado do teclado/mouse, e dependendo deste estado você vai executar certas tarefas.

Postado

O cara de cima tem razão. Não é "BOM" usar thread(s) em jogos, não é que o seu jogo não vai funcionar, mas "PODE" deixar o jogo com um desempenho menor. O ideal é que se você for fazer um jogo (tipo BOM) ache alguma biblioteca pra isso ! Eu sei que jogos como Final Fantasy, Super Mario, Street Fighter e Mortal Combat (esse é da hora) do Super Nintendo, podem ser (Super Mario World eu sei que tem, te garanto) feitos com uma biblioteca chamada: "CHIEN2D2". Inclusive eu já tive que fazer 1 joguinho de carro (com gráficos do Super Nintendo), que a nossa equipe (uns moleque fulero. . . ) fez. Também tive que simular um "objeto" sendo arremessado, de vários ângulos diferentes, ai tinha que calcular o tempo em que o objeto demorava para chegar ao chão. Ai tinha força (do arremesso), ângulo, gravidade, peso do objeto, e ai velocidade, que era calculada 10 vezes por segundo enquanto objeto estava no "Ar", ai tinha que calcular "queda livre", antes da queda livre o objeto chegava até o seu "ponto máximo de altura" antes de entrar na queda livre . . . Enfim a Chien2d2 não deixou a desejar !!! Foi em C, ai você usa Sprite pra fazer os personagens e objetos !!! E na biblioteca já tem várias funções pra trabalhar com "COLISÕES" , e as Sprites. Claro isso se o jogo for 2D . . . 3D Ai o troço fica tenso, você vai ter que mexer com polígono renderização etc . . . Pra isso tem o "CryENGINE SDK"

CryENGINE SDK: A engine utiliza as mesmas ferramentas e propriedades utilizadas pelo grupo de criação responsável pelo Crysis 2. O game é conhecido por sua fidelidade visual, física realística e inteligência artificial avançada.

Além de poder criar modelos na ferramenta, você pode exportá-los a partir do Autodesk Maya Ouro ou Autodesk 3ds Max (3D Studio Max). A linguagem utilizada pelo programa é o C++ e o Lua. Algumas das ferramentas disponibilizadas são:

Inteligência artificial;

Estereoscópico total;

Luminosidade de área;

Sombreamento múltiplo;

Renderização de saída;

Controle de física.

Fonte: http://www.superdownloads.com.br/materias/descubra-ferramentas-criar-proprio-jogo.html#ixzz2iCCQYxGN

// Esse trecho vai te ajudar pegar as teclas que SÃO pressionadas. O GetKeyState te da o "estado" da tecla, ou seja, pressionada ou não pressionada

while(1)
{
if(GetKeyState(VK_UP) & 0x8000) key_pressed=KEY_UP;
if(GetKeyState(VK_DOWN) & 0x8000 ) key_pressed=KEY_DOWN;
if(GetKeyState(VK_LEFT) & 0x8000) key_pressed=KEY_LEFT;
if(GetKeyState(VK_RIGHT) & 0x8000) key_pressed=KEY_RIGHT;
if(GetKeyState(VK_ESCAPE) & 0x8000) key_pressed=KEY_ESC;
if(GetKeyState(VK_RETURN) & 0x8000) key_pressed=KEY_RETURN;
if(GetKeyState('S') & 0x8000) key_pressed=KEY_S;
}

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!