Habilitar entrada em qualquer momento

1. Habilitar entrada em qualquer momento

Matth
MattF

(usa Slackware)

Enviado em 30/04/2015 - 18:58h

Estou afim de produzir um mini jogo em c esrilo river rade usando apenas caracteres. Sim, estou muito animado e quero usar só o básico, ou seja, o necessàrio. Eis aqui a minha nave:

| |
< // W \\ >
V

Estou aberto a sugestões principalmente a respeito de uma coisa que não tenho a mínima idéia de como fazer: como fazer o usuàrio poder dar wntrada a qualquer momento?

Estou pensando em criar uma matriz bidimensional que contenha o cenàrio a nave e os inimigos. os coma dos serão virar para um lado e outro e talvez cima baixo e atirar. Tudo feito com caracteres. Como tudo està dentro de um loop que faz o cenàrio se mexer, tudo com caracteres. De resto são detalhes que posso cuidar, mas como dar uma entrada a qualquer momento dentro do loop?

Caso for interessante poderia usar script bash, ou qualquer coisa que não seje muito avançada. Tudo na maneira hardcore mesmo.


  


2. Re: Habilitar entrada em qualquer momento

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 30/04/2015 - 19:11h

Amigo, pode fazer algo assim :


int c;
while(1){
c = getchar();
if( c == 'q'){printf("Saindo ...\n";break}
// E os outros comandos aqui
}


Ou se for mais em especifico para linux, pode fazer algo assim:


#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int khun_getch(void)
{
struct termios velho, novo;
int x;

tcgetattr( STDIN_FILENO, &velho );
novo= velho;
novo.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &novo );
x= getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &velho );
return x;
}

int main (void)
{
char c ;

do{

fprintf(stderr,"\n -Digite algo [AscII]: ");
c= khun_getch();

fprintf(stderr, "\n\n Caractere digitado: %c \n\n", c);
}while(c != 'q');
return 0;
}



Amigo, fiquei interessando nesse projeto, topa fazer comigo ?

E se tiver qualquer outra dúvida é só me dar um toque =D

Me adicione no Skype: thihup

Espero ter ajudado

[]'s

T+


3. Re: Habilitar entrada em qualquer momento

Paulo
paulo1205

(usa Ubuntu)

Enviado em 30/04/2015 - 22:09h

Thihup escreveu:

( ... )

Ou se for mais em especifico para linux, pode fazer algo assim:

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int khun_getch(void)
{
struct termios velho, novo;
int x;

tcgetattr( STDIN_FILENO, &velho );
novo= velho;
novo.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &novo );
x= getchar(); // <--- ERRADO!
tcsetattr( STDIN_FILENO, TCSANOW, &velho );
return x;
}


Essa função tem um problema: simplesmente não se deve misturar acessos de baixo nível com acessos de E/S atavés de streams. A razão disso é que você usar tcsetattr() para desligar buffers do sistema operacional, mas os streams de <stdio.h> têm seus próprios buffers.

Note que eu não estou afirmando que não vá funcionar, mas somente que não dá para saber se vai funcionar ou não. Para ter certeza de que vai funcionar, não apenas no jogo em questão, mas em qualquer tipo de aplicação, é importante ser consistente: ou se usam apenas chamadas nativas ao SO, ou apenas E/S via streams. Misturar é pedir para ter problema mais cedo ou mais tarde.

Assim sendo, eu faço a você as mesmas recomendações que fiz no seguinte tópico aqui no VoL: http://www.vivaolinux.com.br/topico/C-C++/Como-ler-dados-do-teclado-sem-interromper-execucao-do-prog... (veja o programa original na postagem nº 7 e meus comentários na nº 8).


4. Re: Habilitar entrada em qualquer momento

Matth
MattF

(usa Slackware)

Enviado em 04/05/2015 - 13:15h


Valeu pela ajuda pessoal, mas não quero nada específico para o linux. Teria como criar um prompt que fosse limitado? Tipo, que durasse 0.1 segundas e caso ouvesse uma entrada ele reatribuiria o valor da variável, caso não ele materia o valor previamente atribuído.


5. Re: Habilitar entrada em qualquer momento

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/05/2015 - 17:53h

MattF escreveu:

Valeu pela ajuda pessoal, mas não quero nada específico para o linux. Teria como criar um prompt que fosse limitado? Tipo, que durasse 0.1 segundas e caso ouvesse uma entrada ele reatribuiria o valor da variável, caso não ele materia o valor previamente atribuído.


Olha, é difícil não ser específico com relação ao SO num caso desses. A linguagem C padrão e a sua biblioteca padrão são pensadas para um computador muito genérico, sem entrar em detalhes de implementação como teclado, vídeo, mouse, rede e outros -- como o próprio nome indica -- periféricos.

Das duas, uma: ou você usa serviços particulares do seu sistema operacional -- Linux, Windows, IOS ou qualquer outro -- ou usa uma biblioteca de abstração que possa ser implementada sobre vários sistemas operacionais diferentes, escondendo as peculiaridades de cada SO por trás de uma interface comum a todas as plataformas (algo parecido com o que faz o Qt, por exemplo).






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts