Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > FAQ

FAQ Туториалы и часто задаваемые вопросы

Ответ
 
Опции темы
Старый 18.03.2012, 23:46   #1
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Пули.

Пули? Да, да. Тема-то заезжена, но не все знают как их правильно реализовывать. При стрельбе медленными снарядами( ракетами

и т.п. ) обычная блицевская коллизия работает прекрасно. С повышением скоростей объект часто не успевает столкнуться из-за

больших временных шагов при обработке столкновений. Как же этого избежать? Очень просто. Использовать комбинацию луч +

ентити.

Type Bullet
 Field entity
 Field target
 Field lifeTime
 Field speed
End Type
Это наша структура пули. Поле target предназначено для пивота с помощью которого определяются конечные координаты луча.

Инициализация происходит так.

Function CreateBullet( from% )
 bul.Bullet = New Bullet
 bul\entity = CreateSphere()
 bul\target = CreatePivot( bul\entity )
 bbPositionEntity( bul\target, 0, 0, 1000 ) ; отодвигаем "цель" подальше

 bbPositionEntity( bul\entity, EntityX( from, 1 ), EntityY( from, 1 ), EntityZ( from, 1 )
 bbRotateEntity( bul\entity, EntityPitch( from, 1 ), EntityYaw( from, 1 ), EntityRoll( from, 1)

 lifeTime = 0
 speed = 2
End Function
from - тот объект из которого пускается пуля - например моделька оружия
Теперь самая главная часть
Function UpdateBullets()
 For bul.Bullet = Each Bullet

  

  sx# = bbEntityX( bul\entity, 1 )
  sy# = bbEntityY( bul\entity, 1 )
  sz# = bbEntityZ( bul\entity, 1 )

  ex# = bbEntityX( bul\target, 1 )
  ey# = bbEntityY( bul\target, 1 )
  ez# = bbEntityZ( bul\target, 1 )

  MoveEntity( bul\entity, 0, 0, speed )
  dx# = sx - ex
  dy# = sy - ey
  dz# = sz - ez

  ent = LinePick( sx, sy, sz, dx, dy, dz, 1000 )
  if ent <> 0
  px# = PickedX()
  py# = PickedY()
  pz# = PickedZ()

  dx# = sx - px
  dy# = sy - py
  dz# = sz - pz

  dist2# = dx * dx + dy * dy + dz * dz
  
  if dist2 < speed * speed ; Попали
    FreeEntity bul\entity
    delete bul
  end if
 end if
 Next
End function
Как это работает? Пуля двигается как обычно - MoveEntity. В каждую итерацию цикла происходит проверка пересечения луча( пущенного из центра пули до цели ) с объектами сцены. Если пересечение есть, и расстояние от точки пересечения до центра пули меньше её скорости, то пуля попала в цель.

Почему условием попадания является "расстояние меньше скорости". Чтобы "столкновение" пули с объектом было устойчивым даже при маленьких дистанциях до цели. Пример: стрельба в упор из пистолета

Все объекты сцены должны быть "пикабельны" - EntityPickMode entity, 2

зы. Давно на блице не писал, поэтому могут быть ошибки в синтаксисе

Я сказал всё.
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
RlexGm (22.06.2012), St_AnGer (20.03.2012)
Старый 19.03.2012, 05:30   #2
Платон Александрович
Нуждающийся
 
Аватар для Платон Александрович
 
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений
(для 83 пользователей)
Ответ: Пули.

mr.DIMAS
Открою тебе страшный секрет, в блице и так используется рейкаст для коллизий, и там ничего друг через друга не пролетает, даже на космической скорости
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
L-ee-X (19.03.2012), Жека (19.03.2012)
Старый 19.03.2012, 07:21   #3
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: Пули.

Сообщение от Платон Александрович Посмотреть сообщение
mr.DIMAS
Открою тебе страшный секрет, в блице и так используется рейкаст для коллизий, и там ничего друг через друга не пролетает, даже на космической скорости
а можеш пример запилить?
(Offline)
 
Ответить с цитированием
Старый 19.03.2012, 07:39   #4
Платон Александрович
Нуждающийся
 
Аватар для Платон Александрович
 
Регистрация: 05.10.2011
Адрес: Россия, Южно-Сахалинск
Сообщений: 66
Написано 42 полезных сообщений
(для 83 пользователей)
Ответ: Пули.

Сообщение от pepel Посмотреть сообщение
а можеш пример запилить?
Гм, а что там пилить-то? Ну вот например, сойдет?
Const CL_WALL% = 1
Const CL_BULLET% = 2

Graphics3D ( 800, 600, 0, 2 )

Local Wall% = CreateCube ( )
EntityColor ( Wall, 64, 64, 64 )
PositionEntity ( Wall, 5.0, 0, 0 )
EntityType ( Wall, CL_WALL )

Local Bullet% = CreateSphere ( 3 )
EntityColor ( Bullet, 255, 200, 100 )
EntityFX ( Bullet, 1 )
ScaleEntity ( Bullet, 0.05, 0.05, 0.05 )
EntityRadius ( Bullet, 0.05, 0.05 )
PositionEntity ( Bullet, -1.0, 0, 0 )
EntityType ( Bullet, CL_BULLET )

Collisions ( CL_BULLET, CL_WALL, 2, 1 )

Local Camera% = CreateCamera ( )
PositionEntity ( Camera, 0, 0, -10.0 )

Repeat
	
	If KeyDown ( 57 ) Then MoveEntity ( Bullet, 1000000.0, 0, 0 )
	
	UpdateWorld ( )
	
	RenderWorld ( )
	
	Text ( 10, 10, Str ( EntityX ( Bullet ) ) )
	
	Flip ( False )
	
Until KeyDown ( 1 )

End
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Платон Александрович за это полезное сообщение:
johnk (20.03.2012), LLI.T.A.L.K.E.R. (19.03.2012)
Старый 19.03.2012, 07:44   #5
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: Пули.

Сообщение от Платон Александрович Посмотреть сообщение
Гм, а что там пилить-то? Ну вот например, сойдет?
Const CL_WALL% = 1
Const CL_BULLET% = 2

Graphics3D ( 800, 600, 0, 2 )

Local Wall% = CreateCube ( )
EntityColor ( Wall, 64, 64, 64 )
PositionEntity ( Wall, 5.0, 0, 0 )
EntityType ( Wall, CL_WALL )

Local Bullet% = CreateSphere ( 3 )
EntityColor ( Bullet, 255, 200, 100 )
EntityFX ( Bullet, 1 )
ScaleEntity ( Bullet, 0.05, 0.05, 0.05 )
EntityRadius ( Bullet, 0.05, 0.05 )
PositionEntity ( Bullet, -1.0, 0, 0 )
EntityType ( Bullet, CL_BULLET )

Collisions ( CL_BULLET, CL_WALL, 2, 1 )

Local Camera% = CreateCamera ( )
PositionEntity ( Camera, 0, 0, -10.0 )

Repeat
	
	If KeyDown ( 57 ) Then MoveEntity ( Bullet, 1000000.0, 0, 0 )
	
	UpdateWorld ( )
	
	RenderWorld ( )
	
	Text ( 10, 10, Str ( EntityX ( Bullet ) ) )
	
	Flip ( False )
	
Until KeyDown ( 1 )

End
спасиб
(Offline)
 
Ответить с цитированием
Старый 19.03.2012, 10:51   #6
Markova
ПроЭктировщик
 
Аватар для Markova
 
Регистрация: 11.10.2011
Адрес: Мурманск
Сообщений: 154
Написано 74 полезных сообщений
(для 218 пользователей)
Ответ: Пули.

Сообщение от Платон Александрович Посмотреть сообщение
mr.DIMAS
Открою тебе страшный секрет, в блице и так используется рейкаст для коллизий, и там ничего друг через друга не пролетает, даже на космической скорости
А вот и неправда, на космических пролетает If KeyDown ( 57 ) Then MoveEntity ( Bullet,9^50, 0, 0 =))
__________________
Острый психоз- это когда вы разговариваете с кошкой.
Острый галлюцинаторный психоз - вы говорите с кошкой, которой не существует.
Паранойя - вы боитесь ляпнуть лишнего при кошке.
Шизофрения - иногда у вас появляется кошка, которая разговаривает.
Неврастения - вы жалуетесь кошке, она молчит, игнорирует вас и это для вас невыносимо!!!
Навязчивый невроз - вы уверены, что кошка не одна и они что-то замышляют!
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Markova за это полезное сообщение:
LLI.T.A.L.K.E.R. (19.03.2012), pepel (19.03.2012), St_AnGer (20.03.2012)
Старый 19.03.2012, 11:47   #7
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: Пули.

Сообщение от Markova Посмотреть сообщение
А вот и неправда, на космических пролетает If KeyDown ( 57 ) Then MoveEntity ( Bullet,9^50, 0, 0 =))
аххахаххха))
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:44.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com