Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Движение пули в игре (http://www.flasher.ru/forum/showthread.php?t=166636)

CrazyPHP 04.09.2011 21:03

Движение пули в игре
 
Имеется такая проблемка. Пуля передвигается по сцене вот таким образом в обработчике ENTER_FRAME:
Код AS3:

                      private function move_bullet(e:Event):void{
                        x += Math.cos(radians)*speed;
                        y += Math.sin(radians)*speed;
                }

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

А если поставить скорость 1 пиксель, то пуля соответственно двигается очень медленно.

как быть?

Vishapakahr 04.09.2011 21:23

какой у тебя фрайм рейт ? можно увеличить его , оставив скорость 1 или чуть больше но не 100.

CrazyPHP 04.09.2011 21:26

Цитата:

какой у тебя фрайм рейт ? можно увеличить его , оставив скорость 1 или чуть больше но не 100.
фреймрейт стандартный 24, и им решать проблему не есть правильно. Если его повысить повысятся скоростя всех остальных объектов. А мне нужна только пуля. Расстояние передвижения пули тоже нужно оставить 1 пиксель, иначе не будет гарантирован отлов события соприкосновения с врагом.

derhab 04.09.2011 21:32

столкновение можно определять математически, не привязываясь к "физическому" телу пули. Есть объект-цель, есть вектор по которому пуля перемещается, надо найти пересечение... как-то так

CrazyPHP 04.09.2011 21:35

Цитата:

столкновение можно определять математически, не привязываясь к "физическому" телу пули. Есть объект-цель, есть вектор по которому пуля перемещается, надо найти пересечение... как-то так
так враг же не один, пуля летит, в каждый тик определяется есть ли в точке где пуля какие либо объекты, если какойто из них враг, он умирает. Я не могу знать какой объект окажется на пути пули, они все движутся.

Bgg 04.09.2011 21:39

Пусть враг спрашивает у локации есть ли в его радиусе пуля, если есть, то помирает. Радиус - это минимальная площадь которую успевает пролететь пуля за кадр.

И не понятно что и как у вас вообще. Возможно необязательно попиксельно расчитывать пересечения объектов с пулями, а можно поедилть территорию на более крупные состовляющие.

saikspaik 04.09.2011 21:54

Цитата:

Сообщение от Bgg (Сообщение 1028200)
Пусть враг спрашивает у локации есть ли в его радиусе пуля, если есть, то помирает. Радиус - это минимальная площадь которую успевает пролететь пуля за кадр.

Тогда будет засчитываться попадание когда пуля сбоку будет.

Bgg 04.09.2011 21:58

Цитата:

Сообщение от saikspaik (Сообщение 1028203)
Тогда будет засчитываться попадание когда пуля сбоку будет.

Не программу наведения спутника на орбиту марса пишет автор наверно уж. В WOW меч главного героя не попадает в тело npc иногда и ничего, npc покорно получает урон.

saikspaik 04.09.2011 22:29

Bgg, да не, ты наверное не понял, я вот что имею ввиду:
http://savepic.org/2283944.png
Пуля явно сбоку, и видно что во врага не попала.

CrazyPHP 05.09.2011 00:08

неужели нужно какойто костыль невнятный приделывать.. эххх..

Gaen 05.09.2011 00:59

Цитата:

Я не могу знать какой объект окажется на пути пули, они все движутся.
Зато можете знать, какой объект был на пути пули между предыдущим и текущим тиком.

1. Любая прямая описывается функцией y = k*x + b

2. Находим k и b для прямой, по которой летит пуля, решив систему уравнений:
yPast == k*xPast + b && yNow == k*xNow + b

3. Аналогично находим k и b для прямой, по которой движется враг

4. Ищем координаты пересечения прямых:
y == kBullet*x + bBullet && y == kEnemy*x + bEnemy

5. Проверяем, принадлежит ли точка пересечения к отрезкам, которые враг и пуля прошли за 1 тик:
(x между xBulletPast и xBulletNow) && (y между yBulletPast и yBulletNow) && (аналогично для enemy)

На этом в принципе можно и остановиться, но если пули летают ОЧЕНЬ быстро, то можно продолжить:

6. Вычисляем соотношение, в котором точка пересечения делит отрезок пули
7. Через это соотношение получаем точку на отрезке врага
8. Ставим пулю на точку пересечения отрезков, а врага - на только что вычисленную точку
9. Проверяем на столкновение.

randomnoob 05.09.2011 09:27

Может попробовать по таймеру двигать и просчитывать? Так можно хоть каждую миллисекунду делать проверки.

SvetozarPNZ 05.09.2011 10:00

Gaen, мне кажется там нужно измерять время движения пули и оъекта до точки столкновения. И если оно с определенным приблежением одинаково, то фиксировать столкновения. А так даже внутри одного тика зрительно пуля может пролетать мимо врага. Все много проще если враги медленнее пули, а если наш перс попал в бушующее астероидное поле. Короче, во многих случаях решение Bgg было бы исчерпывающим.

Tr1te 05.09.2011 12:23

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

rastapure 05.09.2011 21:28

Можно совсем извращенным путем. На онФрейме каждый раз продвигать попиксельно циклом, проверяя столкновения. :)

npou 11.10.2011 21:18

Цитата:

Сообщение от Gaen (Сообщение 1028234)
2. Находим k и b для прямой, по которой летит пуля, решив систему уравнений:
yPast == k*xPast + b && yNow == k*xNow + b

а если
yPast = 10 xPast = 10

yNow = 30 xNow = 10

как быть тогда?

botbot 11.10.2011 21:44

1 использовать детектор столкновений из физического двига.
2 каждый фрейм сравнивать пересечение не с пулей, а с отрезком, который пуля пролетает.
Пункт 2 тебе тут как раз пытаются расписать подробнее.

Котяра 12.10.2011 00:48

Цитата:

1 использовать детектор столкновений из физического двига.
А там прям совсем другая математика, и вообще другая вселенная)

botbot 12.10.2011 14:02

Цитата:

Сообщение от Котяра (Сообщение 1038579)
А там прям совсем другая математика, и вообще другая вселенная)

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

yo3o 12.10.2011 14:30

Вот тебе самый простой способ!
И так у тебя есть пуля! её скорость движения 100п верно?
Решения проблемы: создаем пустой мувиклип в нем пулю и еще один объект длиной 100пикселей (невидимый! (visible=false; или просто шириной 0.1)) двигаем пулю по 100пикселей и невидимый объект и если у нас есть тихтест врага с невидимым объектом то удаляем мувиклип в котором пуля и невидимым объект! вот и все!


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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.