Показать сообщение отдельно
Старый 18.11.2015, 10:17
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Первое, что нужно знать автомату - это сколько пуль в секунду он выстреливает.
Зак, так, на заметку, темп стрельбы измеряется в выстрелах в минуту, а не в секунду.
Если будешь пытаться сымитировать реальное оружие, то сразу поймешь, что везде указывается именно минута. То есть для того, чтобы указать реальный тем стрельбы, тебе сначала из минуты придется перевести в секунду, и уже потом считать промежутки между выстрелами. По мне, так это ненужная заморочка.


По теме: вот уж не думал, что такая простая задача, может вызывать такие трудности
Код AS3:
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.