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

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

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

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток.
Хочу написать маленькую игрушку - платформер, типа того, что про знаменитого итальянского водопроводчика Марио.
Столкнулся я с проблемой: в прыжке персонаж не двигается в стороны, т.е. прыгает строго вертикально.
Получается, что прога адекватно выполняет все действия по отдельности, но, пока она не выполнит алгоритм, предназначенный для конкретного события, она не воспринимает новых. Как быть?
черновой вариант кода:
в кратце:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2011, 20:38
Ответы с готовыми решениями:

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

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

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

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

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

делаешь таймер.
и по таймеру - отображаешь картинку в текущих координатах.
а по нажатию на кнопки - только меняешь эти координаты.
никаких Sleep()
1
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
23.02.2011, 19:36  [ТС] 3
Нагуглил про таймеры, спасибо за совет: так, действительно, на много корректнее. Однако, основная проблема останется: программа не будет воспринимать ОДНОВРЕМЕННОГО нажатия двух клавиш. Точнее, как мне кажется, если держать стрелку в сторону, персонаж будет двигаться в сторону. нажатие стрелки вверх даже вызовет прыжок, однако если не отпускать при этом ни одну из кнопок, движение в сторону прекратиться и он будет прыгать на месте...
как, всё-таки, быть?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
23.02.2011, 21:01 4
Цитата Сообщение от 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  [ТС] 5
Ещё раз спасибо.
создал я приложение win32 в VC2010 и искренне поразился количеству "букав". есть какое-нибудь издание, где ЛАКОНИЧНО изложено суть того, как с этим работать? Задавать тонну глупых вопросов тут смысла я не вижу...

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

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

встроенная в Студию справка, да несколько примеров - все что нужно для настойчивого ума.
0
23.02.2011, 21:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.02.2011, 21:51
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru