Ir ao conteúdo

Posts recomendados

Postado

Oi, sou novo no fórum, e estou aprendendo a usar C, como meu primeiro projeto, eu estou fazendo um simples rpg, eu gostaria de implementar uma colisão precisa, então eu precisaria pegar um caractere em uma coordenada do buffer, teria como fazer? Agradeço!
Na foto pode se ver o personagem (P) e um soldado (S), precisaria achar o S no buffer, para fazer o sistema de diálogo e colisão. 

image.png.dc6c95f1bd61a57281b38398dfd30d97.png

  • Curtir 1
Postado

Aqui: 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int a, b, x, y, dx, dy, fx, fy, maxx, maxy, ox, oy, gam, player, kkey;
player = "P";
x = 1;
y = 3;
dx = 1;
dy = 1;
ox = 0;
oy = 0;
fy = 3;
int main()
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    maxx = csbi.srWindow.Right - csbi.srWindow.Left + 1;
    maxy = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
    gam = 1;
    while ((fx - 1) != maxx) {
        gotoxy(fx, 2);printf("=");
        fx++;
    }
    fx = 0;
    while ((fx - 1) != maxx) {
        gotoxy(fx, maxy - 1);printf("=");
        fx++;
    }
    while (gam == 1){
    gotoxy(3, 5);printf("S");
    gotoxy(1, maxy);printf("Life: 100/100; Mana: 50/50; Press <I> to open the inventory.");
    gotoxy(dx, dy);printf("x = %d; y = %d; ox = %d; oy = %d; key = %d               ", x,y,ox,oy,b); //Esse espaço extra é pra apagar possíveis vestígios.

    hidecursor();
    gotoxy(x, y);printf(player);
    b = _getch();
    if(b == 224){
        a = _getch();
        b = a;
    }
    kkey = checka(b);
    }
}
void checka(int c) {
    switch (c){
    case 72:
        if(y - 1 == 2){
            return;
        } else {
            y = y - 1;
            oy = y + 1;
            gotoxy(x, oy);printf(" ");
            return;
        }
        break;
    case 80:
        //gotoxy(dx, dy);printf("Baixo");
        if(y == maxy - 2){
            return;
        } else {
            y = y + 1;
            oy = y - 1;
            gotoxy(x, oy);printf(" ");
            return;
        }
        break;
    case 77:
        //gotoxy(dx, dy);printf("Direita");
        if(x + 1 > maxx){
            return;
        } else {
            x = x + 1;
            ox = x - 1;
            gotoxy(ox, y);printf(" ");
            return;
        }
        break;
    case 75:
        //gotoxy(dx, dy);printf("Esquerda");
        if(x - 1 == 0){
            return;
        } else {
            x = x - 1;
            ox = x + 1;
            gotoxy(ox, y);printf(" ");
            return;
        }
        break;
    case 105:
        drawinv();
        break;
    default:
        return 5;
    break;
    }
}
void gotoxy(int x, int y){
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){x-1,y-1});
}
void hidecursor()
{
   HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
   CONSOLE_CURSOR_INFO info;
   info.dwSize = 100;
   info.bVisible = FALSE;
   SetConsoleCursorInfo(consoleHandle, &info);
}

 

  • Amei 1
Postado
  Em 31/03/2020 às 19:38, KXSY disse:

Mas é o mingw32 ou o que já vem com o code blocks?

Expandir  

mingw32

adicionado 0 minutos depois
  Em 31/03/2020 às 19:36, KXSY disse:

Isso já está genérico!

É como o @vangodp mencionou "esse é o caminho mais complicado".

Expandir  

Sim.. Esse programa é uma "transcrição" de um parecido que fiz em batch

adicionado 1 minuto depois

Tem muito pra mudar ainda, estava lendo sobre COORD, para tentar usar.

  • Curtir 1
Postado

Todas as estruturas e chamadas da console estão bem descritas em https://docs.microsoft.com/en-us/windows/console/console-reference eu acho.

 

Mas eu acho que você não deve usar essas estruturas diretamente para armazenar status do jogo. Crie uma estrutura pequena que representa o que você precisa. É mais versátil. E a partir do seu mapa você cria as funções de comando. E aí vai incluindo a interface de entrada com as teclas que vai aceitar, e a de saída com as mudanças na tela no decorrer do jogo. E a de controle que salva o estado do jogo, para, reinicia e tal. E assim fica mais fácil de portar o jogo de uma solução para outra, como por exemplo se desistir do modo caracter e for usar uma interface gráfica.

 

De todo modo, para ler o buffer de entrada você usa antes de tudo PeekConsoleInput() e na saida acho que GetConsoleScreenBufferInfoEx() e outras. Estou escrevendo de memória. Postei muitos códigos sobre isso aqui nos últimos meses, em C ou C++.  Se precisa de algo específico posso procurar nos programas depois, ou você pode ver aqui na pesquisa por conteúdo por autor no forum.

 

 

 

 

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades sobre tecnologia do Brasil. Leia mais

Mostrar 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

Mostrar mais  
×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!