Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23

Параллельное выполнение алгоритмов

22.02.2011, 20:38. Показов 3908. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Хочу написать маленькую игрушку - платформер, типа того, что про знаменитого итальянского водопроводчика Марио.
Столкнулся я с проблемой: в прыжке персонаж не двигается в стороны, т.е. прыгает строго вертикально.
Получается, что прога адекватно выполняет все действия по отдельности, но, пока она не выполнит алгоритм, предназначенный для конкретного события, она не воспринимает новых. Как быть?
черновой вариант кода:
в кратце:
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
while (1) 
        {switch (int arrow=getch())
    {
    case (72) :
        {
            for (int i=0, j=3; i<100; i++) 
        {
 
            b1->move(0,-2);
            Sleep(j);
            if (i>88) j++;
        }
            for (int i=0, j=14; i<100; i++) 
        {
 
            b1->move(0,2);
            Sleep(j);
            if (i<12) j--;
        }
        };
        break;
    case (77) :{for (;arrow==77;) {b1->move(2,0); Sleep(2);}} break;
    case (75) :{b1->move(-2,0); Sleep(2);} break;
    case (80) :{b1->move(0,2); Sleep(2);} break;
    }
    }
полностью:
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "stdafx.h"
#include <winbgim.h>
#include "windows.h"
class character{
  int c; // цвет
  bool visible;
protected:
  int x,y,z; // базовая точка
  virtual void draw()=0;
public:
  character(int c, int x, int y, int z):c(c),x(x),y(y),z(z),visible(0){}
  virtual ~character(){} 
  void move(int dx, int dy); // сместить фигуру на (dx,dy)
               // видимая фигура гасится, затем рисуется в другом месте
               // у невидимой просто меняются поля x,y
  void setcolor(int c); // установить цвет фигуры
                        // видимая фигура рисуется новым цветом
                        // у невидимой просто меняется поле c
  int getcolor() const {return c;} // получить цвет
  void hide();    // спрятать: нарисовать черный прямоугольник
                  //           по размерам area()
  void show();    // показать
  bool isvisible() const {return visible;} // видима?
  virtual void area(int &x1,int &y1,int &x2,int &y2)=0;
                 // получить размеры прямоугольной области, содержащей фигуру
};
 
void character::move(int dx,int dy){
   if(visible){
      hide();
      this->x+=dx;
      this->y+=dy;
      show();
   }
   else{
      this->x+=dx;
      this->y+=dy;
   }
}
 
void character::setcolor(int c){
   this->c=c;
   if(visible)draw();
}
 
void character::hide(){
   if (!visible)return;
   int x1,y1,x2,y2;
   visible=0;
   area(x1,y1,x2,y2);
   setfillstyle(SOLID_FILL,BLACK);
   bar(x1,y1,x2,y2);
}
 
void character::show(){
   if(visible)return;
   visible=1;
   draw();
}
 
class Player:public character{
   protected:
   int h,w;
   void draw();
public:
   Player(int c,int x,int y,int z,int h,int w):character(c,x,y,z),h(h),w(w){}
   ~Player(){hide();}
   void setsizes(int h, int w, int z);
   void area(int&,int&,int&,int&);
};
 
void Player::area(int &x1,int &y1,int &x2,int &y2){
   x1=x;
   y1=y-z;
   x2=x+w+z;
   y2=y+h;
}
 
void Player::setsizes(int h, int w, int z){
   bool v1=isvisible();
   if(v1) hide();
   this->h=h;
   this->w=w;
   this->z=z;
   show();
}
 
void Player::draw(){
   ::setcolor(getcolor());
   moveto(x,y);
   lineto(x+z,y-z);
   lineto(x+w+z,y-z);
   lineto(x+w,y);
   lineto(x,y);
   lineto(x,y+h);
   lineto(x+w,y+h);
   lineto(x+w,y);
   moveto(x+w+z,y-z);
   lineto(x+w+z,y+h-z);
   lineto(x+w,y+h);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    initwindow(640,480);
    character *b1; 
    b1=new Player(RED, 250,350,20,50,50);
    b1->show();
    while (1) 
        {switch (int arrow=getch())
    {
    case (72) :
        {
            for (int i=0, j=3; i<100; i++) 
        {
 
            b1->move(0,-2);
            Sleep(j);
            if (i>88) j++;
        }
            for (int i=0, j=14; i<100; i++) 
        {
 
            b1->move(0,2);
            Sleep(j);
            if (i<12) j--;
        }
        };
        break;
    case (77) :{for (;arrow==77;) {b1->move(2,0); Sleep(2);}} break;
    case (75) :{b1->move(-2,0); Sleep(2);} break;
    case (80) :{b1->move(0,2); Sleep(2);} break;
    }
    }
    getch();
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2011, 20:38
Ответы с готовыми решениями:

параллельное выполнение
приветствую вас. есть проблема.. написал программку в c builder. Там есть цикл, который крутит выполнение некоторых операций - сканирует...

Параллельное выполнение
Добрый вечер, у меня есть код; while (true) { F (Handle_ArcheAge); //поднять предмет health90 (Handle_ArcheAge); mana30...

Параллельное выполнение метода
Здравствуйте! Пишу многопоточное приложение, в котором есть основной поток, поток управляющий рабочими потоками и рабочие потоки....

7
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2011, 15:21
Цитата Сообщение от SentineL-88 Посмотреть сообщение
Как быть?
сделать по-человечески.

делаешь таймер.
и по таймеру - отображаешь картинку в текущих координатах.
а по нажатию на кнопки - только меняешь эти координаты.
никаких Sleep()
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
23.02.2011, 19:36  [ТС]
Нагуглил про таймеры, спасибо за совет: так, действительно, на много корректнее. Однако, основная проблема останется: программа не будет воспринимать ОДНОВРЕМЕННОГО нажатия двух клавиш. Точнее, как мне кажется, если держать стрелку в сторону, персонаж будет двигаться в сторону. нажатие стрелки вверх даже вызовет прыжок, однако если не отпускать при этом ни одну из кнопок, движение в сторону прекратиться и он будет прыгать на месте...
как, всё-таки, быть?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2011, 21:01
Цитата Сообщение от SentineL-88 Посмотреть сообщение
Однако, основная проблема останется: программа не будет воспринимать ОДНОВРЕМЕННОГО нажатия двух клавиш. Точнее, как мне кажется, если держать стрелку в сторону, персонаж будет двигаться в сторону. нажатие стрелки вверх даже вызовет прыжок, однако если не отпускать при этом ни одну из кнопок, движение в сторону прекратиться и он будет прыгать на месте...
не совсем так.
просто getch возвращает лишь один символ, и две нажатые клавиши через него передать ну никак не получится.
а передает он код той клавиши, которая нажата последней.

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

пишите уже в win32, что-ли.
хотя, можно, конечно, и в консоли перегрузить функцию окна и ловить нажатия кнопок.

Добавлено через 39 минут
судя по тишине, успеха не добился.
попробуй вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
        UINT key_1 = MapVirtualKey(72,1);
        UINT key_2 = MapVirtualKey(77,1);
        UINT key_3 = MapVirtualKey(75,1);
        UINT key_4 = MapVirtualKey(80,1);
      while (1)
      {
          if(GetAsyncKeyState(key_1)) printf("eee");
          if(GetAsyncKeyState(key_2)) printf("ddd");
          if(GetAsyncKeyState(key_3)) printf("fff");
          if(GetAsyncKeyState(key_4)) printf("ggg");
      }
само-собой, требует подключения
#include "windows.h"
#include "winuser.h"
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
23.02.2011, 21:16  [ТС]
Ещё раз спасибо.
создал я приложение win32 в VC2010 и искренне поразился количеству "букав". есть какое-нибудь издание, где ЛАКОНИЧНО изложено суть того, как с этим работать? Задавать тонну глупых вопросов тут смысла я не вижу...

Добавлено через 1 минуту
спасибо, попробую
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2011, 21:20
Цитата Сообщение от SentineL-88 Посмотреть сообщение
создал я приложение win32 в VC2010 и искренне поразился количеству "букав". есть какое-нибудь издание, где ЛАКОНИЧНО изложено суть того, как с этим работать? Задавать тонну глупых вопросов тут смысла я не вижу...

боюсь, что программирование под win32 лаконично описать невозможно.
про MFC/ATL/.NET вообще молчу.
0
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
23.02.2011, 21:29  [ТС]
и, всё-таки, что можно почитать? Рано или поздно мне всё равно придётся с этим столкнуться... Мне понравилось как Герберд Шилдт (если не ошибаюсь) пишет. У него есть подобные издания?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2011, 21:51
Цитата Сообщение от SentineL-88 Посмотреть сообщение
и, всё-таки, что можно почитать? Рано или поздно мне всё равно придётся с этим столкнуться... Мне понравилось как Герберд Шилдт (если не ошибаюсь) пишет. У него есть подобные издания?
если честно - понятия не имею.
я учился в ту пору, когда интернета еще толком небыло.
и книг тоже.

встроенная в Студию справка, да несколько примеров - все что нужно для настойчивого ума.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2011, 21:51
Помогаю со студенческими работами здесь

параллельное выполнение запросов
Доброе время суток. Подскажите пожалуйста. Делаю выполнение внешней программы через shell_exec с последующим выводом в браузер. Тоесть PHP...

Параллельное выполнение ajax
Есть такой код, но при выполнении второй ajax запрос перекрывает данные первого. Как разделить или указать контекст или что еще нужно? ...

Параллельное выполнение задач
Всех приветствую, только начал изучать C++ и вообще Linux (работаю под Ubuntu), хочу написать консольную программу, появилось несколько...

Параллельное выполнение сортировки
Есть код внешней сортировки. Нужно сделать ее многопоточное выполнение. Моя идея заключается в том, чтобы параллельно выполнить...

Параллельное выполнение потоков
Привет всем. Знаю что тема избитая уже, но что то не выходит все равно. Суть в том что в обработчике события есть 2 потока. Один поток...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru