Jump to content

C Windows Console SetTimer


goldspy98

Recommended Posts

Em suma o que eu pretendo e não consegui realizar em C após varias horas de pesquisa e tentativas é que o texto Mastermind mude de cor de 3 em 3 segundos sem afetar o funcionamento do jogo, permitindo ao utilizador usar o menu do jogo, pois o pretendido é que ao sair do menu o texto seja removido e o timer destruido.

 

Boa noite,

Estou a desenvolver um jogo simples em C para Windows que funcione na linha de comandos, no meu do jogo ao iniciar apresento uma tela de boas-vindas com o nome do jogo escrito em ASCII gerado neste site http://www.patorjk.com/software/taag/, eu gostaria que a cor do texto mudasse para uma cor aleatório de tantos em tantos segundos, no caso já tenho o código para mudar a cor a funcionar, no entanto não estou a conseguir criar um Timer para mudar a cor de tantos em tantos segundos.

No caso estou a usar funções da biblioteca Windows.h para trabalhar com a linha de comandos.

void CALLBACK changeWelcomeColor ( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime ) {
    FillConsoleOutputAttribute ( hStdout, FOREGROUND_BLUE, cCharsWritten, ( COORD ) { 0, 0 }, NULL );
}

void displayWelcome ( HANDLE hStdout ) {
    static const char asciiTitle [ ] = "\n\
    __  __           _                      _           _\n\
   |  \\/  |         | |                    (_)         | |\n\
   | \\  / | __ _ ___| |_ ___ _ __ _ __ ___  _ _ __   __| |\n\
   | |\\/| |/ _` / __| __/ _ \\ '__| '_ ` _ \\| | '_ \\ / _` |\n\
   | |  | | (_| \\__ \\ ||  __/ |  | | | | | | | | | | (_| |\n\
   |_|  |_|\\__,_|___/\\__\\___|_|  |_| |_| |_|_|_| |_|\\__,_|\n";

   LPDWORD cCharsWritten;
   WriteConsole ( hStdout, asciiTitle, sizeof ( asciiTitle ), cCharsWritten, NULL );

   SetTimer ( NULL, 0, 3 * 1000, changeWelcomeColor );
}

Este é o código que tenho momento, o que eu pretendo é que a função FillConsoleOutputAttribute seja executada de 3 em 3 segundos, no entanto este timer não pode interferir com o funcionamento do programa pois o menu tem de funcionar enquanto o timer é executado, por esse motivo eu tentei usar a função SetTimer para não interferir com o restante funcionamento do programa.

Nota que as variáveis hStdout e cCharsWritten da função FillConsoleOutputAttribute tem de ser passadas ao chamar o timer, algo que eu não consegui fazer, pesquisei varias formas de fazer isto mas a maioria das soluções são para C++ ou não funcionaram.

A parte da questão das variáveis não estarem definidas ao chamar a função existe um outra problema, pois eu testei o timer escrevendo umas letras e parece que o timer não funcionou.

Desde já agradeço o tempo disposto.

Edited by goldspy98
Link to comment
Share on other sites

Em 30/12/2016 às 09:50, HappyHippyHippo disse:

sabes o que são framebuffers ?

Não, pelo que percebi é uma parte da memoria dedicada a guardar a parte gráfica da aplicação, pesquisei como utiliza-los em C mas não encontrei nada que explica-se como realizar o que pretendo, no caso se percebi eu poderia mudar diretamente os valores no framebuffer, no entanto não percebi como é que ao usar framebuffers posso fazer como altere a cor de tantos em tanto tempo.

Edited by goldspy98
Link to comment
Share on other sites

a ideia não é usar framebuffers, mas fazer algo do género

tens um buffer com a info dos caracteres que de T em T "tempo" (frames) vais fazer refresh do que a consola apresenta

dessa forma basta que o SetTimer actualize o framebuffer de T2 em T2 "tempo"

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.