Делаю игру, проблема с анимацией...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Делаю игру, проблема с анимацией...

Сообщение cashman » 20.08.2005 (Сб) 0:20

Люблю файтинги, поэтому взял за основу MK3
Анимация персонажа (пример: Liu Kang) идет с проблемами.
Смотрел в других проектах, где используется анимация, но не получается скопировать, чтоб сработало.

Декларируем:
Код: Выделить всё
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
Const SRCAND = &H8800C6
Const SRCPAINT = &HEE0086


Принцип:
Picture1 - где идет анимация
Picture2 - картинка 1 (12 кадров) на белом фоне
Picture3 - картинка 2 (12 кадров) на черном фоне
Таймер с кодом:
Private
Код: Выделить всё
Sub Timer1_Timer()
BitBlt Picture1.hDC, 0, 0, 114, 222, Picture2.hDC, Counterx, Countery, SRCPAINT
BitBlt Picture1.hDC, 0, 0, 114, 222, Picture3.hDC, Counterx, Countery, SRCAND
'Picture1.Refresh  ' не понял для чего
Counterx = Counterx + 114 '
If Counterx >= 1368 Then Counterx = 0
End Sub


Подскажите, что не так (может картинки слишком большие для нормальной анимации)?..
P.S. зачем делается 2 картинки 2-мя цветами фона (черный и белый), почему не достаточно 1-го?
Вложения
Picture1 and Picture2.rar
Картинка 1 и 2 (12 кадров на белом фоне + 12 кадров на черном фоне)
(172.42 Кб) Скачиваний: 76
Rpg2.zip
Проект, анимацию которого я взял за основу
(59.23 Кб) Скачиваний: 54

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 20.08.2005 (Сб) 2:16

Делай всё в 3D, и забудь про это :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 20.08.2005 (Сб) 8:47

1) Картинки на черном фоне - это маска для правильного блиттинга. Все черные места будут обрезаны.
2) константы для рисования лучше использовать стандартные вб-ншние: vbSrcCopy, vbSrcAnd и т.д. Полный список в Object Browser.

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 20.08.2005 (Сб) 22:03

to BV
Как в 3D??? Зачем? Что это даст?
А может это идея, поскажи материал для чтения.
to Amed
А зачем, тогда картинки на белом фоне.
Может выложишь пример с использованием констант, чтобы и код посмотреть и сразу результат (+ неплохо бы тоже ссылку на интернет чтиво).

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 21.08.2005 (Вс) 1:14

const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

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

Сообщение ALX_2002 » 21.08.2005 (Вс) 1:39

Уфф ! Братуха. Я 2 часа потратил на то, что логично расписать, что и как.

Написал тебе пример с нуля :).

1) БЕЗ 3D

2) Без DIRECTX. На обычном TransparebBLT

4) Работает быстро.

5) Проц не грузит

6) С коментами


Картинки из Ragnarok-a взял с мобилы ( Ragnarok Mobile Merchant )

Сделал тебе пример управления персом.

Девчёнка ходит по травянистому полю. По пробелу вытворяет ужасные вещи. :D :D :D

P.S Попробуй ресайзить форму, во время игры + попробуй ускорить таймер до 1.

Думаю результат тебя не расстроит. ;)

По вопрам обращайся. :)
Вложения
Test.zip
Надеюсь как пример это подойдёт.

Там по полю ходит девчёнка.

Управление клавишами. По пробелу вообще непонятно что вытворяет.
(7.2 Кб) Скачиваний: 89
Последний раз редактировалось ALX_2002 21.08.2005 (Вс) 1:44, всего редактировалось 1 раз.

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 21.08.2005 (Вс) 1:43

Приступаю к изучению)))

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

Сообщение ALX_2002 » 21.08.2005 (Вс) 1:48

Ежли шо - я тут на пол часика ЫЩО :D

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 21.08.2005 (Вс) 1:58

Меня ШОКИРОВАЛО отсутствие контролов!!!
Даже не представлял, что так можно.
Весьма благодарен тебе и твоему альтруизму))).
Буду разбираться.
Вопросы на форуме скорей всего появятся завтра.

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 21.08.2005 (Вс) 2:47

Вопросы появились:
1.Моя анимация персонажа снабжена летающими вокруг "мухами" (белые точки, которые я видимо оставил при вырезании персонажа). У тебя в анимации идет чистая картинка, вопрос скорее графический - как ты этого добился (ведь я СТАРАЛСЯ)
2.Так как я собрался делать файтинг. То на экране будет 2 персонажа. Раньше я думал удары бойцов отлавливать в зависимость от расположения КОНТРОЛОВ (их содержащих) на форме.
Теперь полагаю, нужно через ПЕРЕМЕННЫЕ, которые используются для определения точки (от которой идет анимация). Так?
3.Насколько БОЛЬШИЕ файлы-исходники можно использовать. Ведь у меня только 12 кадров ушло на анимацию Стояния на месте. А с ударами, хождением и прыжками раз в 20 больше. Т.е. эта гифка будет весить ~ 2mb, а их 2-е + фон. Это не много??? Тормоза и глюки должны появиться при таком объеме???

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.08.2005 (Вс) 9:48

1. Картинки-то из Ragnarok. Да и вырезать можно по-разному.
3. Тормозов быть не должно даже при таких объемах. Ведь на экране 2 персонажа + фон. Итого каждый фрейм блиттится из 3х картинок.

Если будет тормозить, переходи на DirectX (DirectDraw).

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

Сообщение ALX_2002 » 21.08.2005 (Вс) 10:00

2 cashman:

1) на счёт мух - мухи появляются из-за того, что у тебя это ГИФ. Переделай в BMP и залей фон нужным тебе цветом. :)

2) Контролы юзать в таком случае очень неудобно, т.к они тянут за собой дикие тормоза. ;). + А представляешь как в таком случае растянуть изображение при ресайзе формы ? :D

3) На счёт 2-ух игроков.

Код: Выделить всё
'Структура для описания персонажа
Private Type CHARACTER
x As Long ' Положение персонажа по X
y As Long ' Положение персонажа по Y
Width As Long 'Ширина картинки персонажа
Height As Long 'Высота картинки персонажа
Frame As Long 'Счётчик кадров персонажа
SrcX As Long 'Координата по X для вырезания персонажа
SrcY As Long 'Координата по Y для вырезания персонажа
Action As Long 'Проигрываемое действие
End Type


Сделай двух игроков как типы

Код: Выделить всё
Dim Player1 as CHARACTER
Dim Player2 as CHARACTER


Лично мне нравятся такие типы тем, что в них можно добавить любое свойство. например

Код: Выделить всё
Private Type CHARACTER
.....
Kick as long
End Type


И у тебя у героев появится тип удара.

Для проверки попадания одного на другого у тебя есть все координаты каждого игрока. Его положение на поле по X,Y и его ширина и высота. :)

Хотя надо конечно поглядеть алгоритмы файтингов. Возможно есть уже отработанный алгоритм для этого. :wink:


P.S Возможно это не лучший вариант реализации, но для начала сойдёт. ;)

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

Сообщение ALX_2002 » 21.08.2005 (Вс) 10:09

Кстати !

Я там в рисовании бэкграунда напартачил :D

Код: Выделить всё
Sub DrawBackGround()
'Ôóíêöèÿ çàïîëíåíèÿ áýêãðàóíäà îäíîòèïíûì ðèñóíêîì
With BACKGROUNDSPRITE
'Stop
  For y = 0 To SCREENBUFFER.Height / .Height
   For x = 0 To SCREENBUFFER.Width / .Width
    BitBlt SCREENBUFFER.DC, x * .Width, y * .Height, .Width, .Height, .DC, 0, 0, vbSrcCopy
   Next
  Next
End With
End Sub

cashman
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 152
Зарегистрирован: 03.06.2004 (Чт) 0:57
Откуда: Россия, г.Екатеринбург

Сообщение cashman » 26.08.2005 (Пт) 4:13

Хотел спросить...
1)В файтингах, когда бойцы поменялись местами правый стал левым, а левым стал правым происходит переворот картинки (т.е. смотрящий влево теперь должен смотреть в право).
Как это сделать програмно или нужно рисовать BMPшку наоборот и грузить комп еще одной картинкой.
Есть возможность просто зеркально отображать?

2)Картинка заливает собой все Лейблы, можно ли их как-то вынести выше заливки?

3)Еще проблема, Запутался с нажатием клавишь, у тебя таймер отлавливает нажата ли клавиша:
Код: Выделить всё
Private Function KeyState(KEYN As Long) As Boolean
If GetKeyState(KEYN) = -127 Or GetKeyState(KEYN) = -128 Then KeyState = True
End Function

Private Sub DrawPlayer()
If KeyState(vbKeyUp) Then .Action = 2: .SrcX = .Width * 0
If KeyState(vbKeyDown) Then .Action = 4: .SrcX = .Width * 0
If KeyState(vbKeyLeft) Then .Action = 1: .SrcX = 0
If KeyState(vbKeyRight) Then .Action = 3: .SrcX = .Width * 0
If KeyState(vbKeySpace) Then .Action = 5: .SrcX = .Width * 0
End Sub

кое что я выбросил для краткости.

а до этого я делал так (на форме кнопки comLeft и сomRight):
Код: Выделить всё
Private Sub Form_KeyPress(KeyAscii As Integer)
Dim Char
Select Case m_CharMode
Case Is = 0
Char = Chr(KeyAscii)
KeyAscii = Asc(UCase(Char))
Case Is = 1                               
Char = Chr(KeyAscii)
KeyAscii = Asc(LCase(Char))
End Select

If KeyAscii = 65 Then comLeft_Click
If KeyAscii = 68 Then сomRight_Click
End Sub

Но этот код перестал работать, когда я в прогу вставил твой код.
А мне хотелось бы, чтобы код работал сразу, а не по интервалу таймера.
P.S. в чем отличие KeyAscii от KeyState?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 26.08.2005 (Пт) 11:41

2) Рисовать лейблы вручную
3) KeyState возвращает, нажата ли определенная клавиша. А KeyAscii - код клавиши, нажатой "на форме".

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 26.08.2005 (Пт) 12:36

cashman - 1) Сделать Flip картинки - очень просто StretchBlt/PaintPicture - только Width отрицательный укажи.
Программисты не глючат - глючат компиляторы...

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

Сообщение ALX_2002 » 26.08.2005 (Пт) 15:30

Во. Терь и я скажу пару слов. :)

1) На счёт KeyState я сделал эту функцию, т.к обычный KeyDown у формы мне не нравится как пашет.

Дело в том, что он ещё определяет время через которое клавиша счтается "зажатой". Т.е ты её нажал, а потом идёт пауза.

Возможно я неправильно обрабатывал нажатия, но мне GetKeyState больше понравился.

А без таймера или цикла тебе всё равно не обойтись. Тебе же графику постоянно перерисовывать надо. ;)

2) На счёт FLIP. StretchBlt / TransparentBlt это всё что тебе нужно.

Вот такие вот дела.


P.S Кстати я сейчас в своей RPG тоже файтинг делаю. :) . Так что как получится выложу. :)


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 104

    TopList