|
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Помогите с алгоритмом пожалуйста
Доброго времени суток, друзья.
Решил написать небольшую игрушку. Все в принципе нормально но хотелось бы немного красоты. Задача простая. Игрок стреляет, но к сожалению пока когда он стреляет очередью у меня все происходит моментально. Я почему-то не могу придумать алгоритм по которому можно было бы разделить выстрелы друг от друга. то есть если стрелять из автомата то все 30 выстрелов проходят менее чем за секунду. Помогите с алгоритмом как сделать действительно похожее на очередь. Уже второй день мозг ломаю, но чет до сих пор не родилось действительно стоящего алгоритма. Может кто поделиться опытом. Буду благодарен. Заранее спасибо. |
|
|||||
Первое, что нужно знать автомату - это сколько пуль в секунду он выстреливает.
Затем, ему нужно знать, стреляет ли он в данный момент. И последнее - это сколько секунд прошло с последнего выстрела. Затем, всё делается в этом методе.
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
идея интересная. в принципе даже вполне осуществимая в моем варианте. Вот только немного затруднительная. Дело в том что у меня есть оружие, но оно не оружие как таковое а карточка с параметрами. У меня выстрел подразумевает получение урона игроком, то есть оружие по сути не стреляет. можно конечно поместить кулдаун на получение урона, но это вроде то же самое что и ваш вариант.
Одна из лучших моих идей подразумевала под собой процесс выстрела, но я не могу придумать как организовать повторную инициацию выстрела после его окончания. То есть хотелось бы организовать что-то вроде Вот только я не уверен что такая конструкция допустима в плане работы и в плане чистоты кода. Или я ошибаюсь? |
|
|||||
Цитата:
Ключ тут именно отталкивание от дельты. Цитата:
Если бы вы не игру писали, а баннер, то я бы посоветовал почитать про функцию setTimeout(...). Но в играх нужно отталкиваться от дельты, иначе всё станет запутанным, ужасно запутанным. Цитата:
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 17.11.2015 в 23:19. |
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
Цитата:
Если не будет других более интересных и элегантных примеров то использую ваш. Меня только заинтересовал вопрос, поскольку пока не сталкивался с этим и даже не думал об этом, как рекурсия убивает плеер? можешь обьяснить в кратце если можно. |
|
|||||
Ну, на самом деле, не убьёт, но рантайм ошибку выбьет после определённого количества рекурсий, от этого они защиту поставили.
Почему по идее должна убить? Потому, что конструкция идентична col уйдёт в минус бесконечность математически, так как ничто не останавливает рекурсию. Рекурсия не убивает ничего, если нет ошибки в логике. Исправленный вариант рекурсии(который так или иначе никак не решает задачу)
__________________
There is no thing in this world that is not simple. |
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
с рекурсией понятно. я думал дело обстоит куда серьезнее и глубиннее чем просто бесконечный цыкл. Я вот одного понять не могу. Смотрю на ваш код и не могу понять одного
что значит единица? 1 секунда?
|
|
|||||
Цитата:
Если будешь пытаться сымитировать реальное оружие, то сразу поймешь, что везде указывается именно минута. То есть для того, чтобы указать реальный тем стрельбы, тебе сначала из минуты придется перевести в секунду, и уже потом считать промежутки между выстрелами. По мне, так это ненужная заморочка. По теме: вот уж не думал, что такая простая задача, может вызывать такие трудности package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.utils.getTimer; public class AutomaticWeapon extends Sprite { private var _isShooting: Boolean = false; // количество выстрелов в минуту, именно так измеряется темп стрельбы в реальном оружии, а не в секундах private var _tempo: int = 0; // время между выстрелами private var _delta: int = 0; // время совершения последнего выстрела private var _lastShot: int = 0; private var _counter:int = 0; public function AutomaticWeapon() { // например у автомата калашникова, темп стрельбы 600 / мин tempo = 600; stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseAction); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseAction); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(e:Event):void { if (isShooting) { var curTime:int = getTimer(); if (curTime >= _lastShot + _delta) { shoot(); _lastShot = curTime; } } } private function shoot():void { trace("выстрел", ++_counter); } private function onMouseAction(e:MouseEvent):void { isShooting = (e.type == MouseEvent.MOUSE_DOWN); } public function get tempo():Number { return _tempo; } public function set tempo(value:Number):void { _tempo = value; _delta = (60000 / _tempo); } public function get isShooting():Boolean { return _isShooting; } public function set isShooting(value:Boolean):void { _isShooting = value; if (value) _counter = 0; } } } Последний раз редактировалось caseyryan; 18.11.2015 в 12:38. |
|
|||||
Регистрация: Aug 2014
Адрес: Где-то на поверхности планеты, какой хз
Сообщений: 113
|
ладно. мне все понятно. правда у caseyryan пример более подробно описан и более понятен. Всем спасибо пойду дальше кодить.
|
Часовой пояс GMT +4, время: 23:08. |
|
« Предыдущая тема | Следующая тема » |
|
|