Форум программистов, компьютерный форум CyberForum.ru

делаю игру,но мешает getch - C++

Восстановить пароль Регистрация
 
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
10.02.2011, 17:42     делаю игру,но мешает getch #1
Здравствуйте господа програмисты!делаю игру и вот какая штука-на экране должно быть движение,но getch ждёт от меня нажатия клавиши.Как это обойти,но так что бы если я нажимал на клавишу всё работало,т.е.что бы и движение было и клавиатура работала?Заранее всем огромное спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2011, 17:42     делаю игру,но мешает getch
Посмотрите здесь:

getch C++
C++ делаю игру,но...
getch и коды C++
C++ getch()
getch() C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
10.02.2011, 18:04     делаю игру,но мешает getch #2
kbhit() //Возвращает не ноль в случае нажатия клавиши клавиатуры и ноль в противном случае.
лежит в <conio.h>
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.02.2011, 18:29     делаю игру,но мешает getch #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Игорь с++, Вот например: движение звездочки по оси Ox.
Управление: клавиша "a" - в лево, "d" - в право.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <iomanip>
 
#include <conio.h>
#include <windows.h>
 
#define RIGHT 'd'
#define LEFT  'a'
 
int main(){
  int x = 0;
  for(;;){
    switch(getch()){
      case LEFT:
        while(!kbhit()){
          if(!x)
            x = 80;
          std::cout << std::setw(x--) << '*';
          Sleep(125);
          system("cls");
        }
      case RIGHT:
        while(!kbhit()){
          if(x == 80)
            x = 0;
          std::cout << std::setw(x++) << '*';
          Sleep(125);
          system("cls");
        }
    }
  }
  return 0;
}
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
10.02.2011, 18:44     делаю игру,но мешает getch #4
asics, напишите пожалуйста коментарии к вашей программе
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.02.2011, 18:54     делаю игру,но мешает getch #5
Sokolov, Да тут все просто, з вашего первого поста вижу, что з функцией kbhit() Вы знакомы, так что ее обяснять не буду.По сути: отлавливаем две клавиши("a" и "d"), делаем все это в бесконечном цыкле, затем в цыкле "пока не нажата клавиша("a" если мы до того нажали "d" и наоборот)" двигаем звездочку в соответствее з нажатой клавишей(ну не совсем двигаем, просто предедущую звездочку стираем, прибавляем к ширине поля 1 или удаляем, ну и задержка между этим делом - 125 милисекунд).
Sokolov
 Аватар для Sokolov
42 / 42 / 3
Регистрация: 04.01.2011
Сообщений: 125
10.02.2011, 19:06     делаю игру,но мешает getch #6
asics, Эту функцию сам только сегодня узнал.
Если я правильно понял, то по оси Ох вы передвигали звездочку, просто отступая от начала спомощью setw() (если не так поправьте)
А как передвигать по Оу?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
10.02.2011, 19:13     делаю игру,но мешает getch #7
Цитата Сообщение от Sokolov Посмотреть сообщение
Если я правильно понял, то по оси Ох вы передвигали звездочку, просто отступая от начала спомощью setw() (если не так поправьте)
Да, все правильно.
Цитата Сообщение от Sokolov Посмотреть сообщение
А как передвигать по Оу?
Увы, сам не знаю, но догадывюсь что как-то стредствами WinAPI.
Если кто знает, от примера не откажусь
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
01.03.2011, 23:45  [ТС]     делаю игру,но мешает getch #8
да так же только при помощи SetConsoleCursorPosition увеличивая или уменьшая координаты,а прежнюю стирая.я игру делал там всё великолепно работало
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 06:31     делаю игру,но мешает getch
Еще ссылки по теме:

C++ getch() error
аналог getch() C++
getch C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Vandris
 Аватар для Vandris
63 / 63 / 13
Регистрация: 19.01.2011
Сообщений: 90
02.03.2011, 06:31     делаю игру,но мешает getch #9
А как передвигать по Оу?
Увы, сам не знаю, но догадывюсь что как-то стредствами WinAPI.
ну если интерпретировать поле, где бегает точка как матрицу, то все просто и без привлечения WinAPI

могу для примера показать движение той же точки, но по всем осям координат, правда в пределах матрицы, но ведь ничто не мешает сделать ее в аккурат под размер консоли

все проверки выхода за границы массива на вашей совести, так же по желанию прикрутите очистку экрана ну и обсуждаемый здесь kbhit(), я бы прикрутил да мне надо бежать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <conio.h>
 
void show(int**, size_t, size_t);
 
int main()
{
    size_t n, m; //n, m - размеры матрицы
    std::cin >> n >> m;
    int **field = new int *[n];
    for (size_t i = 0; i < n; i++)
    {
        field[i] = new int[m];
        for (size_t j = 0; j < m; j++)
            field[i][j] = 0;  //будет матрицы состоящая из нулей и единицы - нашей точки
    }
 
    int x, y; //пусть x, y - координаты нашей точки
    std::cin >> x, y;
    field[x][y] = 1;
 
    while (1e-5)
    {
        switch (getch())
        {
        case 'a': //движение влево
        case 'A':
            field[x][y] = 0; //старое значение обнуляем, точки там уже нет.
            field[x][--y] = 1;
            break;
        case 'd': //движение вправо
        case 'D':
            field[x][y] = 0;
            field[x][++y] = 1;
            break;
        case 'w':  //движение вверх
        case 'W':
            field[x][y] = 0;
            field[--x][y] = 1;
            break;
        case 's': //движение вниз
        case 'S':
            field[x][y] = 0;
            field[++x][y] = 1;
            break;
        }
        show(field, n, m);
        std::cout << std::endl << "_____________________________________________" << std::endl;
    }
    return 0;
}
 
void show(int **array, size_t n, size_t m)
{
    for (size_t i = 0; i < n; i++)
    {
        for (size_t j = 0; j < m; j++)
            std::cout << (array[i][j] ? "*" : " ") << " ";
        std::cout << std::endl;
    }
}
Yandex
Объявления
02.03.2011, 06:31     делаю игру,но мешает getch
Ответ Создать тему
Опции темы

Текущее время: 04:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru