Игра на VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Человек
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 02.01.2004 (Пт) 15:34
Откуда: Russia. Saint-Petersburg

Игра на VB

Сообщение Человек » 06.02.2004 (Пт) 21:26

Предистория:
1. Решил делать "танчики" но бота написать не могу.
2. Потом решил сделать двух игроков (W,A,S,D и Стрелки), но одновременно нельзя нажать две кнопки, то есть поедет тот игрок, который первее нажал!
3. Теперь всё свелось к танку, который должен доехать до определённой точки за минуту, а в это время его обстреливают...
4. Понял, что получилось весьма глупо...

Вопрос: А как вообще возможно сделать достойную игру на VB.
(кроме экономических стратегий)
--<Более мощный компьютер глючит быстрее и точнее>--

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 06.02.2004 (Пт) 21:34

1. Простейший вариант - сравнивать координаты танков, управляемых игроком и компьютером и двигать компьютерный танк в соответствующем направлении (простая тригонометрия). Время от времени проверять, не попадает ли танк игрока на линию огня и, если да - стрелять по нему до победного.
2. Каким образом Вы опрашиваете клавиатуру??
3. No comments.
4. Согласен.
Ответ: определенно да! Все дело в энтузиазме и свободном времени.
Листинги не горят!

Человек
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 02.01.2004 (Пт) 15:34
Откуда: Russia. Saint-Petersburg

Сообщение Человек » 06.02.2004 (Пт) 22:01

Faust писал(а):2. Каким образом Вы опрашиваете клавиатуру??

Вот так:

Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
code = KeyCode
    'Player1
    If code = 37 Then Player1.Left = Player1.Left - 10
    If code = 39 Then Player1.Left = Player1.Left + 10
    If code = 38 Then Player1.Top = Player1.Top - 10
    If code = 40 Then Player1.Top = Player1.Top + 10
    'Player2
    If code = 65 Then Player2.Left = Player2.Left - 10
    If code = 68 Then Player2.Left = Player2.Left + 10
    If code = 87 Then Player2.Top = Player2.Top - 10
    If code = 83 Then Player2.Top = Player2.Top + 10
End Sub
--<Более мощный компьютер глючит быстрее и точнее>--

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 06.02.2004 (Пт) 22:22

Вот так:

Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
code = KeyCode
    'Player1
    If code = 37 Then Player1.Left = Player1.Left - 10
    If code = 39 Then Player1.Left = Player1.Left + 10
    If code = 38 Then Player1.Top = Player1.Top - 10
    If code = 40 Then Player1.Top = Player1.Top + 10
    'Player2
    If code = 65 Then Player2.Left = Player2.Left - 10
    If code = 68 Then Player2.Left = Player2.Left + 10
    If code = 87 Then Player2.Top = Player2.Top - 10
    If code = 83 Then Player2.Top = Player2.Top + 10
End Sub

Всё-таки я не понимаю, как это должно работать - надо часто-часто жать на клавиши?
Если да, то советую по событию KeyDown изменять не координаты, а скорость танков, то есть:
Код: Выделить всё
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
     Case 37: VX1 = - 10
     Case 39: Then VX1 = 10
     Case 38: Then VY1 =  - 10
     Case 40: Then VY1 = 10
     Case 65: Then VX2 = - 10
     Case 68: Then VX2 = 10
     Case 87: Then VY2 = - 10
     Case 83: Then VY2 = 10
End Select
End Sub

Sub Timer1_Timer
     Player1.Left = Player1.Left + VX1
     Player1.Top = Player1.Top + VY1
     Player2.Left = Player2.Left + VX2
     Player2.Top = Player2.Top + VY2
End Sub

Предварительно следует, естественно, втыкнуть на форму Timer, выставить у него соответствующий период и объявить переменные VX1, VX2, VY1, VY2 с необходимым уровнем видимости.[/quote]
Листинги не горят!

Человек
Обычный пользователь
Обычный пользователь
 
Сообщения: 57
Зарегистрирован: 02.01.2004 (Пт) 15:34
Откуда: Russia. Saint-Petersburg

Сообщение Человек » 06.02.2004 (Пт) 23:11

Всё-таки я не понимаю, как это должно работать - надо часто-часто жать на клавиши?

Нет.
Просто держишЪ нажатой кнопку UpArrow и танк двигается вверх...
--<Более мощный компьютер глючит быстрее и точнее>--

Cornplay
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 03.01.2004 (Сб) 5:13
Откуда: Из дома

Сообщение Cornplay » 07.02.2004 (Сб) 3:11

Обычно для игр используют API функцию GetAsyncKeyState - позволяет узнавать, нажата ли конкретная клавиша в данный момент. Подробнее см. где-нибудь в описаниях API функций.

Что касается вообще написания приличной игрушки на VB, то лично я еще не видел ни одной. Не исключаю возможность их существования, особенно с использованием DirectX, но боюсь, что эти игры в лучшем случае будут представлять из себя жалкие подобия уже существующих. И это не столько из-за недостатка быстродействия VB, сколько из-за чисто физических возможностей отдельного человека, занимающегося подобной разработкой.

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

Мне очень нравились двумерные танки TankBattle в сборнике Future Collection 1 (начало 90-х годов): игра вдвоем и против компьютера там были сделаны очень неплохо.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.02.2004 (Сб) 11:35

GetAsyncKeyState, конечно, поможет более корректно опросить клаву, но не избавит от блокировки одних клавишь другими. И виноват тут не бейсик, а сами клавиатуры. Можно попробовать сделать keyboard setup, чтобы искать взаимно не влияющие сочетания клавишь, но сомневаюсь, что возможно найти полностью независимые 10 клавишь(2*4 - управление, 2 - стрельба).
Я бы попробовал использовать джойстик.

dxvb
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 07.02.2004 (Сб) 16:28

Сообщение dxvb » 03.03.2004 (Ср) 20:16

Проблему с клавиатурой можно решить, используя DirectInput (про него можно прочитать здесь). DirectInput позволяет обрабатывать одновременно нажатия нескольких клавиш.
А если хочешь сделать 3d танчики, то см. сайт:
:idea: directx-vb.narod.ru

**Black-Van**
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 05.05.2004 (Ср) 12:32
Откуда: Эстония

Сообщение **Black-Van** » 06.05.2004 (Чт) 12:06

Насчет проблем с клавиатурой попробуй зделать движения через Timer и чтобы танк к примеру постоянно двиголся.Если надо могу обьяснить подробние.
Не обращайте внимания на грамотность.(Каждому своё)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.05.2004 (Чт) 15:50

Никакой DirectInput не поможет, если клавиши взаимно блокируются.

Насчет проблем с клавиатурой попробуй зделать движения через Timer и чтобы танк к примеру постоянно двиголся

Сам понял, что написал :roll: :?:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 06.05.2004 (Чт) 21:06

Mikle, он имел ввиду, что танк двигается по таймеру: при нажатии клавиши просто ставится какой-то флаг, а в таймере эти флаги обрабатываются соответствующим образом. Это самый простой и самый "не очень" метод.
Нет меня больше

**Black-Van**
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 05.05.2004 (Ср) 12:32
Откуда: Эстония

Сообщение **Black-Van** » 10.05.2004 (Пн) 9:46

А почему неочень :?: Помойму очень даже нечего и при этом просто.
Не обращайте внимания на грамотность.(Каждому своё)

Keen
Обычный пользователь
Обычный пользователь
 
Сообщения: 83
Зарегистрирован: 25.04.2004 (Вс) 10:45
Откуда: Россия => Москва

Сообщение Keen » 10.05.2004 (Пн) 10:22

Не знаешь как сделать чтоб можно было зажимать несколько клавишь? Очень просто, хотя и глючно :wink: :
Создай массив Keys(200) as boolean, а на форме, в процеде нажатия клавишы впиши Keys(KeyCode)=true или Keys(KeyAscII)=true (если не ошибаюсь). Какой из вариантов не помню... Кажется тот, где KeyDown. Хотя проверь - где будет работать, значит тот и правильный :).
А в конце процедуры таймера "отлючи" все клавишы: Keys(КодКлавишы)=false и далее также.
На самом деле, A.A.Z. прав, таймер - не очень хорошая вещь- глючит. Лично я использую цикл:

Do

DoEvents()
...действия...

Loop while me.visible=true

и подобное...

Да, кстати, исходника нет, но могу изваять 8) . Пиши, Человек На andrey_rare@mail.ru.
Или можно для общего блага поместить на vbstreets?

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 10.05.2004 (Пн) 15:30

**Black-Van** писал(а):А почему неочень :?: Помойму очень даже нечего и при этом просто.

По опыту своему сужу 8)
На самом деле, делал я как-то гонки, давно это было, так я поставил таймер, на каждое нажатие клавиши реагировал изменением флагов и в таймере смотрел, как флаги изменились и что-то делал, например:
Код: Выделить всё
Enum Going
Forward
Backward
No
End Enum

Enum Turning
Left
Right
No
End Enum

Dim Go As Going, Turn As Turning

Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyUp
  Go = Forward
Case vbKeyDown
  Go = Backward
Case vbKeyLeft
  Turn = Left
Case vbKeyRight
  Turn = Right
End Select
End Sub

Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyUp, vbKeyDown
  Go = No
Case vbKeyLeft, vbKeyRight
  Turn = No
End Select
End Sub

Sub Timer1_Timer()
Select Case Go
Case Forward
  Call GoForward()
Case Backward
  Call GoBackward()
Case No
  Call StopCar()
End Select

Select Case Turn
Case Left
  Call GoLeft()
Case Right
  Call GoRight()
Case No
  Call NotTurnCar()
End Select
End Sub

Примерно так. Пишу без VB - могу где-то ошибиться. :oops:

Так вот. На большой скорости машина двигалась рывками, и врезания в ограждения, попадание на финиш да и вообще, лицезрение этого дергания были не очень хорошими. :?

Так что, отказался я от таймера в конце концов. 8)
Нет меня больше

**Black-Van**
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 15
Зарегистрирован: 05.05.2004 (Ср) 12:32
Откуда: Эстония

Сообщение **Black-Van** » 18.05.2004 (Вт) 12:58

Ясно я таймер вобщем то, тоже уже не использую, но начинающим всё равно полезно
Не обращайте внимания на грамотность.(Каждому своё)

all
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 01.06.2004 (Вт) 18:48

Сообщение all » 12.06.2004 (Сб) 15:56

вобще то программирование игр стоит начинать
с болле простого например тетриса, а у же потом
переходить к играм с элементами искусственного
интелекта

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2056
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.06.2004 (Сб) 19:15

Пиплы... Энтузазизьм это конечно хорошо, но написание таничков по 10000000 разу не выход.

За время моих попыток написать более менее нормальную игру на VB я сделал вывод - или нужно долго парится и юзать DirectX чтобы хотя бы на 5% по графике игра дотягивала до нормальных или писать что то типа Lines где графика практически статична и не требует обратботки больших изображений.

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.06.2004 (Вс) 10:48

нужно долго парится и юзать DirectX чтобы хотя бы на 5% по графике игра дотягивала до нормальных

Совершенно верно, но это касается не только VB, но и любого языка. Без D3D\OpenGL сейчас никуда. Софтовые растеризаторы, имхо, ушли в прошлое. Я имею ввиду в 3D играх.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 16

    TopList