Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.04.2016, 01:39
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 1  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
По умолчанию странное поведение мувика, при смещении

Доброго! Помогите разобраться
Ковыряюсь с задним фоном и столкнулся со странной штукой. Мир у меня смещается, за отклонениеотвечает одна статическая переменная(offset) в игре. Все объекты, которые должны смещаться соответсвенно имеют к ней доступ. До сегодня это были Body из Nape и всё работало великолепно. Решил добавить задний фон, он соответственно тоже должен смещаться, ну вот незадача, накапливается погрешность в координатах со временем и задний фон уходит. НО ведь переменная одна для всех и Body не накапливают это погрешность. Так вот, если в итоге вместо напрямую писать Мувик.y +=offset, я беру тело Body, в котором есть смещение Body.position.y+=offset; а в классе мувика кину ссылку на него и напишу Мувик.y = Body.position.y, то погрешности нет - это таинственная магия мне не понятна, КАК так выходит?

Старый 05.04.2016, 06:01
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

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

Либо, второй вариант, у тебя неправильная математика
__________________
Ко мне можно и нужно обращаться на ты)

Старый 05.04.2016, 10:29
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Ты уже не новичок на этом форуме, а тему создал как новичок. Откуда нам знать что у тебя там за смещения и как они происходят?
Могу лишь предположить, что где-то есть привязка к ширине или высоте контейнера, которая меняется при добавлении чего-либо внутрь. Это решается банальным оверрайдом геттеров высоты и ширины.

Либо, второй вариант, у тебя неправильная математика
ну мне ещё учиться и учиться=)

математику я всё же склонен откинуть, т.к. при написании кода я столкнулся изначально с этим, пока работал только с Body, и учёл это. До сего момента всё оставалось в точности до пикселя

вот код с расчётом offset
отрывок кода - отдельный класс, в котором лежат общие переменные для всей игры
Код AS3:
		public static var lowHeight:int = 150;//минимальная высота для смещения
		public static var maxHeight:int = 1300; //максимальная высота смещения
		public static var allOffset:Number = 0; //общее смещение
		public static var tempOffset:Number = 0; //смещение за один frame
вот класс offset
Код AS3:
package classesGame.offset
{
	import classesGame.options.OptionsUnits;
	import ParentCommon;
	import classesGame.userEvent.UserEvent;
	import flash.events.Event;
	import nape.phys.Body;
	import singleton.sHero.SHero;
 
	public class Offset extends ParentCommon
	{
		private var _hero:Body = SHero.getSHero.getHero.getBody;
 
		public function Offset()
		{
		}
 
		override public function init(e:Event):void
		{
			super.init(e);
			this.addEventListener(Event.ENTER_FRAME, offset);
			stage.addEventListener(UserEvent.START_FLAG_1, startFlag1);
		}
 
		private function offset(e:Event):void
		{
			OptionsUnits.tempOffset = 0;
			if (OptionsUnits.allOffset < OptionsUnits.maxHeight)
			{
				if (_hero.position.y < OptionsUnits.lowHeight)
				{
					if (_hero.velocity.y < 0)
					{
						OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y;
						OptionsUnits.allOffset += OptionsUnits.tempOffset;
						_hero.position.y = OptionsUnits.lowHeight;
					}
				}
				else if ((_hero.velocity.y > 0) && (OptionsUnits.allOffset > 0))
				{
					OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y;
					OptionsUnits.allOffset += OptionsUnits.tempOffset;
					_hero.position.y = OptionsUnits.lowHeight;
				}
			}
			if ((OptionsUnits.allOffset >= OptionsUnits.maxHeight) && (_hero.velocity.y >= 0))
			{
				if (_hero.position.y > OptionsUnits.lowHeight)
				{
					OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y;
					OptionsUnits.allOffset += OptionsUnits.tempOffset;
					_hero.position.y = OptionsUnits.lowHeight;
				}
			}
			if (OptionsUnits.allOffset < 0)//здесь, если после смещения находится погрешность, она невелируется
			{
				OptionsUnits.tempOffset -= OptionsUnits.allOffset;
				OptionsUnits.allOffset = 0;
			}
		}
 
		private function startFlag1(e:UserEvent):void
		{
			OptionsUnits.allOffset = 0;
		}
 
		override public function removeInit(e:Event):void
		{
			super.removeInit(e);
		}
	}
}
вот класс cover, там 2 копии заднего фона, которые я чередую
Код AS3:
package classesGame.cover
{
	import classesGame.options.OptionsUnits;
	import classesGame.userEvent.UserEvent;
	import flash.events.Event;
	import nape.phys.Body;
	import singleton.sFloor.SFloor;
 
	public class Cover extends ParentCommon
	{
 
		public function Cover()
		{
		}
 
		private var cover1:cover_mc = new cover_mc();
		private var cover2:cover_mc = new cover_mc();
 
		override public function init(e:Event):void
		{
			super.init(e);
 
			stage.addEventListener(UserEvent.START_FLAG_1, userEvent);
			stage.addEventListener(UserEvent.START_FLAG_3, userEvent);
			stage.addEventListener(UserEvent.PAUSE, userEvent);
			stage.addEventListener(UserEvent.PLAY, userEvent);
		}
 
		private function userEvent(e:UserEvent):void
		{
			switch (e.type)
			{
			case "startFlag1": 
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				startFlag1();
				break;
			case "startFlag3": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "pause": 
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "play": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			}
		}
 
		private function startFlag1():void
		{
			if (cover1.stage == null)
			{
				this.addChild(cover1);
				this.addChild(cover2);
			}
			cover1.y = stage.stageHeight;
			cover1.x = 0;
 
			cover2.y = stage.stageHeight;
			cover2.x = cover1.width;
		}
		private var bodyFloor:Body = SFloor.getSFloor.getFloor.getBody;//вот тут пришлось ввести ссылку на один из объектов body, ради того, чтобы смещение исчезло
		private function updateCover(e:Event):void
		{
			cover1.y = cover2.y = bodyFloor.position.y + 50;//тут следит за смещением Body
			cover1.x -= OptionsUnits.tempGameSpeed / 200;
			cover2.x -= OptionsUnits.tempGameSpeed / 200;
 
			if (cover1.x < -cover1.width)
				cover1.x = cover2.x + cover2.width;
			if (cover2.x < -cover2.width)
				cover2.x = cover1.x + cover1.width;
		}
 
		override public function removeInit(e:Event):void
		{
			super.removeInit(e);
		}
	}
}
в самом Body
Код AS3:
package classesGame.addActionUnits
{
	import classesGame.options.OptionsUnits;
	import ParentCommon;
	import flash.events.Event;
	import nape.phys.Body;
	import singleton.sFloor.SFloor;
 
	public class AddActionFloor extends ParentCommon
	{
 
		private var body:Body = SFloor.getSFloor.getFloor.getBody;
 
		public function AddActionFloor()
		{
		}
 
		override public function init(e:Event):void
		{
			super.init(e);
			this.addEventListener(Event.ENTER_FRAME, updateFloor);
		}
 
		private function updateFloor(e:Event):void
		{
			body.position.y += OptionsUnits.tempOffset; //сюда лишь передаётся offset  за 1 frame
		}
 
		override public function removeInit(e:Event):void
		{
			super.removeInit(e);
		}
	}
}
если в коде Cover сменить на
Код AS3:
cover1=cover2+=OptionsUnits.tempOffset;
то появляется неточность положения, за 1 минуту набегает до 20-30 пикселей в верх

п.с. я знаю, что не соблюдаю конвенцию, но прям не переношу нижнее подчёркивание, простите

Добавлено через 1 час 52 минуты
ещё момент, точка начала координат в cover1/2 находит в левом нижнем углу, хотя думаю это не должно мешать

Старый 05.04.2016, 14:23
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
А числа целые везде?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 05.04.2016, 18:18
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Поля x и y экранных объектов флэша округляются до 1/20, а у нейпа — нет.
__________________
Поймай яблоко 2!

Старый 05.04.2016, 22:26
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 6  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Код:
А числа целые везде?
нет, там же в коде прям в самом начале

Код:
Поля x и y экранных объектов флэша округляются до 1/20, а у нейпа — нет.
выходит, придётся оставить привязку к нейпу?

Старый 06.04.2016, 02:37
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Да, привязываться к нейпу здесь будет наиболее уместным.
__________________
Поймай яблоко 2!

Старый 06.04.2016, 12:24
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 8  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
либо хранить координаты отдельно от свойств x,y дисплейОбжектов.

Старый 06.04.2016, 14:04
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Это беспроигрышный вариант. Просто здесь для того как раз нейп и подойдет, у него все точно.
__________________
Поймай яблоко 2!

Старый 06.04.2016, 14:18
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 10  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
спасибо всем, оставлю привязку к нейпу, т.к. решение в 2 строчки кода будет самое разумное

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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