Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
art538
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 48
1

Многопоточность в Visual Basic 6

26.05.2014, 20:36. Просмотров 1017. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток. При написании игры в Visual Basic 6 столкнулся с проблемой. Есть объект который движется по форме при нажатии на стрелки и стреляет при нажатии на клавишу пробела. Проблема в том, что двигаться и стрелять одновременно он не может: если зажать клавишу движения и затем нажать пробел, объект останавливается и начинает стрелять, если же зажать пробел и нажать стрелку, объект движется и не стреляет. Одновременно ни как не получается. Кто-нибудь может подсказать, как справиться с данным ограничением? Правильно ли я понимаю, что её решение связано с реализацией многопоточности? К сожалению, очень мало знаю об этом.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2014, 20:36
Ответы с готовыми решениями:

Вычисление значений функции двух переменных в Visual Basic - Visual Basic
Помогите пожалуйста! В среде VB написать программу вычисления значений функции двух переменных....

Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net ?
Где бесплатно скачать учебник по Visual Basic 6 и Visual Basic .Net

Visual Basic 6 и Visual Basic .NET - в чем различия?
Visual Basic и Visual studio это не одно и тоже? если нет то в чём разница, по мимо оформления?

Отличия версий Visual Basic 6.0 от Visual Basic 6.5?
У меня 3 вопроса: 1.Чем отличается версия Visual Basic 6.0 от Visual Basic 6.5? 2.Можно ли...

Кто пишет программы в Visual Studio 2010 на Visual Basic?
Кто пишет программы в Visual Studio 2010 на Visual Basic?

7
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
26.05.2014, 20:45 2
Цитата Сообщение от art538 Посмотреть сообщение
Правильно ли я понимаю, что её решение связано с реализацией многопоточности? К сожалению, очень мало знаю об этом.
Твоя проблема элементарно решается без многопоточности. Многопоточность здесь вообще не нужна.
0
art538
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 48
26.05.2014, 21:07  [ТС] 3
Будь добр, подскажи как?
0
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
26.05.2014, 21:08 4
Цитата Сообщение от art538 Посмотреть сообщение
Будь добр, подскажи как?
Покажи код свой, я тебе скажу как надо сделать.
0
art538
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 48
26.05.2014, 21:46  [ТС] 5
Visual Basic
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
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Dim fX As Single, fY As Single 'позиция ввода
Dim fW As Single, fH As Single 'ширина/высота картинки
Dim Bullet() As Boolean 'если снаряд взорван, в элементе массива с его индексом - false, если снаряд ещё летит - true
Dim n1 As Boolean
 
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
     Select Case KeyCode
     Case 32 And n1 = True 'выстрел
     For i = 1 To UBound(Bullet)         'массив проверяется на наличие свободных ячеек
            If Bullet(i) = False Then       'если найдена свободная ячейка
                Load Shape(i)               'создаётся снаряд с соответствующим индексом
                Shape(i).Visible = True
                Bullet(i) = True            'ячейка помечается как занятая
                n1 = False
                Exit Sub                    ' процедура заканчивает работу
            End If
        Next
        Load Shape(UBound(Bullet) + 1)                          'если все ячейки массива заняты, создаётся снаряд с номером
        Shape(UBound(Bullet) + 1).Visible = True                ' наибольший индекс в массиве + 1
        ReDim Preserve Bullet(UBound(Bullet) + 1) As Boolean    ' размер массива возрастает на 1
        Bullet(UBound(Bullet)) = True                           ' новая ячейка помечается как занятая
        n1 = False
    Case 37 'движение влево
        fX = fX - 10 'движение корабля
        Form1.Cls
        BitBlt Form1.hDC, fX, fY, fW, fH, LeftPictMask.hDC, 0, 0, vbMergePaint
        BitBlt Form1.hDC, fX, fY, fW, fH, LeftPict.hDC, 0, 0, vbSrcAnd
        Shape(0).Left = fX + Picture1.Width / 2 - 4
    Case 38 'движение вверх
        fY = fY - 10 'движение корабля
        Form1.Cls
        BitBlt Form1.hDC, fX, fY, fW, fH, ForwPictMask.hDC, 0, 0, vbMergePaint
        BitBlt Form1.hDC, fX, fY, fW, fH, ForwPict.hDC, 0, 0, vbSrcAnd
        Shape(0).Top = fY
    Case 39 'движение вправо
        fX = fX + 10 'движение корабля
        Form1.Cls
        BitBlt Form1.hDC, fX, fY, fW, fH, RightPictMask.hDC, 0, 0, vbMergePaint
        BitBlt Form1.hDC, fX, fY, fW, fH, RightPict.hDC, 0, 0, vbSrcAnd
        Shape(0).Left = fX + Picture1.Width / 2 - 4
    Case 40 'движение назад
        fY = fY + 10 'движение корабля
        Form1.Cls
        BitBlt Form1.hDC, fX, fY, fW, fH, Picture2.hDC, 0, 0, vbMergePaint
        BitBlt Form1.hDC, fX, fY, fW, fH, Picture1.hDC, 0, 0, vbSrcAnd
        Shape(0).Top = fY
    End Select
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    If KeyCode >= 37 And KeyCode <= 40 Then 'выравнивание звездолёта
        Form1.Cls
        BitBlt Form1.hDC, fX, fY, fW, fH, Picture2.hDC, 0, 0, vbMergePaint
        BitBlt Form1.hDC, fX, fY, fW, fH, Picture1.hDC, 0, 0, vbSrcAnd
    End If
End Sub
 
Private Sub Form_Load()
  'устанавливаем размер рисуемой картинки в зависимости от размера первой картинки
  fW = Picture1.Width
   fH = Picture1.Height
   'забиваем данные в fX и fY, чтобы картинка была по центру формы
  fX = Round((Form1.ScaleWidth - Picture1.Width) / 2)
  fY = Round((Form1.ScaleHeight - Picture1.Height) / 2)
  BitBlt Form1.hDC, fX, fY, fW, fH, Picture2.hDC, 0, 0, vbMergePaint  'Затем картинку
  BitBlt Form1.hDC, fX, fY, fW, fH, Picture1.hDC, 0, 0, vbSrcAnd
  ReDim Bullet(1)
  n1 = True
  Shape(0).Top = fY
  Shape(0).Left = fX + Picture1.Width / 2 - 4
End Sub
 
Private Sub Timer1_Timer()                      'проверяются все элементы массива Bullet
    For i = 1 To UBound(Bullet)
        If Bullet(i) = True Then                'если элемент = true (то есть, снаряд с соответствующим индексом существует)
            Shape(i).Top = Shape(i).Top - 20    'снаряд летит вперёд
            If Shape(i).Top <= 0 Then Vzriv i   'когда снаряд достигает верхнего края вызывается процедура Vzriv с индексом снаряда
        End If
    Next
    If ProvArr1 = False Then ReDim Bullet(1)    'если все снаряды взорваны, массив сжимается до 2 элементов
End Sub
             
Sub Vzriv(i As Variant)
    Unload Shape(i)     'снаряд уничтожается
    Bullet(i) = False   'соответствующая ячейка массива = 0
End Sub
 
Private Function ProvArr1() As Boolean 'если все снаряды взорваны, массив сжимается до 2 элементов
    For i = 1 To UBound(Bullet)
        If Bullet(i) = True Then ProvArr1 = True: Exit Function
    Next
    ProvArr1 = False
End Function
 
Private Sub Timer2_Timer()   'контролирует частоту выстрелов
    If n1 = False Then n1 = True
End Sub
0
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
26.05.2014, 21:55 6
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Можно многими способами сделать, можно вести переменную в которой содержится состояние нажатых клавиш, при нажатии устанавливать, при отпускании снимать и двигать исходя из зажатых клавиш, либо использовать Get(Async)KeyState.
0
Апострофф
Заблокирован
26.05.2014, 22:00 7
Как отловить сочетание клавиш
0
The trick
Модератор
7371 / 2587 / 757
Регистрация: 22.02.2013
Сообщений: 3,801
Записей в блоге: 76
26.05.2014, 22:24 8
Это нужно делать не в каком-нибудь цикле или таймере, а в процедуре Form_KeyDown в данном случае.
0
26.05.2014, 22:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2014, 22:24

Проблема с установкой Visual Studio вообще и Visual Basic
Точнее, с установкой Visual Studio вообще и Visual Basic в частности. В самом конце установки, при...

Visual Basic в Visual studio
Как реализовать корректность введенных данных ? В форме регистрации есть поля, как email, пароль...

Visual basic 6
Какой надо написать код чтобы каждые 5 минут программа заходила на определённый сайт.


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru