Ir ao conteúdo
  • Cadastre-se
s4lezardv1A

C 2 eventos ao mesmo tempo na tela

Recommended Posts

Gostaria de encontrar um jeito para deixar 2 eventos acontecerem ao mesmo tempo na tela. Quero fazer uma animação em loop e abaixo dela quero deixar algumas informações para receber valores:

while(x<10){
Animação
  x++;
}

printf("Digite o nome: ");
gets(nome);

mas só consigo digitar alguma coisa quando a animação acabar. Tem algum jeito de deixar rodar a animação indefinidamente e enquanto isso eu possa digitar embaixo sem ter que esperar a animação acabar?

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@s4lezardv1A    para isso você pode usar o comando :

if( kbhit() )
letra = getch();

para ir pegando as letras do nome uma por uma e ir montando a string colocando os caracteres nas posições crescente e no final quando pressionar enter coloca " \0 " no final da string para que o programa saiba que ali é o final da string , enquanto não digitar nada a animação continuará rodando , mas que animação você colocou ?    se você puder poste o código  .

Compartilhar este post


Link para o post
Compartilhar em outros sites

por enquanto estou só no prototipo da animação. Mas é bem simples, só para aparecer rodando um texto. E caso eu queria que a animação rodando junto com funçoes do mouse? Por exemplo , se posiciono em uma posição da tela, o texto daquela posição fica de outra cor, e se eu clicar ele vai para um evento. Como posso utilizar a função kbhit para ficar rodando enquanto eu vou posicionando o mouse em varias posições,etc?

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@s4lezardv1A     se for só para posicionar o mouse então não precisa de nada pois você pode mover o mouse normalmente enquanto roda o seu programa na tela do DOS onde estará a animação ,  veja nesse poste aqui um código parecido com esse que você disse :

mas se você quer por exemplo pegar o nome de uma pessoa enquanto roda uma animação aí você usa o kbhit(); junto com getch();  pois o kbhit verifica se foi pressionado alguma tecla e de acordo com o que for estipulado ele fará alguma coisa se pressionar alguma tecla e nesse caso ele faria o  getch(); que pega um caractere digitado do teclado e continua a rodar o programa sem precisar digitar enter ,  como no seu código que você postou :


    while( (int)letra !=13 ){
        Animação
        gotoxy(0,23);
        printf("Digite o nome : %s",nome);
        if(kbhit()){
            letra=getch();
            nome[p] = letra;
            p++;
            nome[p] = '\0';
        }
    }
    printf("\n\nO nome eh  : %s\n\n ");
    getch();
    return;
}

crie a variável nome com 30 espaço e inicialize ela com um espaço vazio na posição zero , e use essa função gotoxy();   que precisa ser criada , mas você a encontra fácil na internet   .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não da. O que acontece é o seguinte: no meu programa , quando posiciono o mouse em cima de um ponto(40,50) a letra que está lá muda de cor, e quando clico nesse mesmo ponto, o programa inicia um evento que eu determinei. 

 

Mas...... quando eu coloco essa animação em um loop, não acontece mais isso... se eu for por exemplo no ponto(40,50) a letra nem muda de cor nem quando eu clico inicia o evento, eu tenho que obrigatoriamente esperar o loop da animação acabar para poder usar essas outras funcoes. 

 

Li sobre uma função chamada ReadConsoleNput e outra chamada peekconsoleinput, eu não poderia usar alguma dessas para caso a animação estiver rodando , o programa ler que eu posicionei o console em cima da letra, ela ainda vai mudar de cor enquanto a animação roda e quando eu clicar também, tanto a função de clicar quanto a animação continuem funcionando ?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@s4lezardv1A   aí depende dessa animação , se ela for feita usando os comandos do  então você pode ajeitar para que funcione assim , mas se a animação for tipo um vídeo  aí já é mais complicado de fazer , e essas funções que você disse são usadas na api do windows , ainda não estudei sobre elas , então não sei como funcionam .     poste a animação e o código , assim podemos ver o que podemos fazer .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui tem um prototipo de uma parte do programa:

#include <windows.h>
int main{
  if ( ( ir_Evento->Event.MouseEvent.dwMousePosition.X == 40) && ( ir_Evento->Event.MouseEvent.dwMousePosition.Y == 50){


 //here if the mouse is on position, the text change color.

    SetConsoleTextAttribute(hConsole, BACKGROUND_RED);

    if (MOUSE_EVENT == ir_func.EventType && ir_func.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){
 //here if the mouse is on position and after press the left button on mouse,it starts the MENU function.
menu();
}}
while(1){
gotoxy(10,20);
printf("testing animation");
gotoxy(10,20);
printf("animation testing");
}
return 0;
}

É uma animação de texto, ainda estou pensando no que vou fazer, mas ela vai ficar em um loop infinito la embaixo da tela.  Com isso, todas as outras funções do mouse não recebem comandos infelizmente. Estou usando o header windows.h e para controlar o mouse uso a Winapi. É novo pra mim tambem. O kbhit espera um comando no teclado, para o mouse não da certo, então to buscando formas de funcionar.

adicionado 0 minutos depois
11 horas atrás, vangodp disse:

também pode usar threads, mas é algo complexo de se usar.

Entaõ, não queria ir por esse caminho, acredito que tenha alguma forma assim como existe o KBHIT para o teclado, deve existir algo para o movimento do mouse.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010      estou estudando essa winApi  e vou ver sobre esse controle com mouse mas vai demorar , então  veja essa animação , talvez te sirva  :

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,   /* nome das cores */
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int letra, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letra;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letra + (__BACKGROUND << 4));
}
void gotoxy(int x, int y){
    COORD c;
    c.X = x;    
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
int player[3][5],u;
int main(){
    int k,y,p=14;
    char letra=' ',nome[100];
    nome[0]=' ';
    player[0][0]=10;player[0][1]=10;/* bola  1 */
    player[1][0]=35;player[1][1]=20;/* bola  2 */
    player[2][0]=70;player[2][1]= 4;/* bola  3 */
    player[0][2]= 0;player[1][2]= 0;player[2][2]=0;/* controla as colunas */
    player[0][3]= 0;player[1][3]= 0;player[2][3]=0;/* controla as  linhas */
    player[0][4]=11;player[1][4]=12;player[2][4]=15;/* cor de cada bola   */
    srand(time(NULL));
    do{        
        for(u=0;u<3;u++){
            textcolor(0,0);
            gotoxy(player[u][0],player[u][1]);
            printf(" ");

            if(     player[u][0]>78){player[u][0]=78;player[u][2]=1;}
            else if(player[u][0]< 1){player[u][0]= 0;player[u][2]=0;}
            if(     player[u][1]>22){player[u][1]=22;player[u][3]=1;}
            else if(player[u][1]< 1){player[u][1]= 0;player[u][3]=0;}
        
            if(  player[u][2]==0)player[u][0]++;
            else player[u][0]--                ;
            if(  player[u][3]==0)player[u][1]++;
            else player[u][1]--                ;

            textcolor(player[u][4],0);
            gotoxy(player[u][0],player[u][1]);/*  coluna e linha de cada bola */
            printf("O");
            for(y=0;y<65;y++){
                if(kbhit()){
                    letra=getch();
                    if((int)letra==8){
                        nome[p-14]=' ';
                        p--;
                    }
                    else{
                        p++;
                        nome[p-14]=letra;
                        break;
                    }
                }
            }
        }
        nome[p-13] = '\0';
        textcolor(11,0);
        gotoxy(0,18);
        printf("Digite O Nome");
        gotoxy(14,18);
        textcolor(14,0);
        printf("%s",nome);
        for(k=0;k<50;k++)printf(" ");
        gotoxy(14,18);
        for(k=0;k<14-p;k++)printf("%c",letra);
        gotoxy(79,24);
        Sleep(30);        
    }while((int)letra != 13);

    gotoxy(0,23);
    textcolor(15,0);
    printf("O Nome eh --> ");
    textcolor(12,15);
    printf("%s",nome);
    textcolor(7,0);
    getch();    
    
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa, muito bonito esse codigo. Tipo isso que eu queria, so que ao invés de poder digitar eu quero poder selecionar uma posição e poder clicar. Vou pesquisar a função peekconsoleinput e readconsoleinput final de semana. Eu to bem no começo na parte de programação então não sei nada de nada. Mergulhei sem saber na parte de api do windows. Mas imagino que eu tenha que ao invés de usar o kbhit seria talvez. while(readinput != mouse event) algo assim talvez... n sei ...

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×