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

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

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

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Attention Движение по ландшафту

Здравствуйте! У меня снова возник вопрос - как осуществить движение по заранее нарисованному ландшафту. Я уже пробовал гайдлайн с обычным и обратным проигрыванием ролика, все получилось, но тут проблема: ландшафт должен разрушаться. Для осуществления этого мне посоветовали движок с функцией "вырезания" фигур одна из другой. Мне необходимо применить то же самое и к гайдлайну? Но тогда как? А если нет, то чем заменить движение по направляющей? Мне удобнее первое, так как половину проекта переделывать заново не придется , но логичней замена, так как кадры тратить на анимацию не хочется, надо бы сделать в одном кадре. Вообщем, жду ответа на вопросы. Заранее спасибо.

Старый 16.06.2014, 18:13
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Всё плохо.
Гайдлайны здесь непричем и никак не помогут. Нельзя нарисовать путь для героя так, чтобы он подходил для любого ландшафта. Вам нужно писать матёрый код. Очень матёрый. Суперматёрый код!

Задача правда сложная, даже для людей в теме.

Старый 16.06.2014, 18:32
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 3  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Гайдлайны здесь непричем и никак не помогут.
Но ведь я могу изменять форму гайдлайна с помощью as3 Я понимаю в триале ничего не меняется и с помощью гайдлайна можно сделать. Но ведь есть такие игры во flash, как worms.
Цитата:
Вам нужно писать матёрый код. Очень матёрый. Суперматёрый код!
И все же, в каком направлении копать? Я готов написать суперматерый код, но пусть все будет работать как надо

Старый 16.06.2014, 18:52
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Нужно позиционировать элемент исключительно кодом.
Описывать ландшафт математически, вычитая из него фигуры. Наверное, самым простым вариантом здесь будет pixel-collision – из растрового изображения (BitmapData) сделать маску (скажем, где черное – пусто, где белое – ландшафт). При взрыве менять цвета "ушедшей местности" на черное.
Отсюда, объект "сидящий" на этой маске по команде "сдвинься влево-вправо" может понять, в какую точку ему попасть – забраться чуть выше или чуть ниже. Как то так.

Старый 16.06.2014, 19:04
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 5  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Цитата:
Сообщение от Wormhole Посмотреть сообщение
Но ведь я могу изменять форму гайдлайна с помощью as3
нет.
вообще, механика червей не сложная, но у Wormhole явно недостаточно опыта

Старый 16.06.2014, 20:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Я только сейчас понял иронию. Вопрос о дырках, как в червячках от пользователя WormHole.

Старый 17.06.2014, 00:21
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 7  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Можно просто проверять, не превышает ли максимальную разницу следующий нарисованый пиксель(текущее положение + вектор скорости), получаем самый верхний пиксель и проверяем его положение относительно нашего текущего положения. Если превышает, то двигаться нельзя.

А по главной теме - как реализовать перемещение - смотрите мой ответ сначала + если не превышает, то совершить перемещение(а если отрицательная разница, значит следующий пиксель слишком низко, чтобы спуститься без падения).
__________________
There is no thing in this world that is not simple.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Особо сложного в реализации движения как в червяках, ничего нет. Вот простой пример. Просто проверяется значение цвета пикселя у определенной картинки
DifferentTests.swf   (28.7 Кб)


Вот сам код этого примера
Код AS3:
package worms {
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.ui.Keyboard;
 
	[SWF(width = 676, height = 465)]
	public class Worms extends Sprite {
 
		[Embed(source = "img/bg.png")]
		private static const Bg:	Class;
		private var _bg:			Bitmap 	= new Bg();
		[Embed(source = "img/worm.png")]
		private static const Worm:	Class;
		private var _wormImg:		Bitmap 	= new Worm();
		private var _worm:			Sprite	= new Sprite();
		private var _fallSpeed:		int		= 8; 
		private var _walkSpeed:		int		= 5; 
		private var _maxObstacleHeight:int 	= 20;
 
		public function Worms() {
			Key.initialize(stage);
			_wormImg.x 	= -_wormImg.width / 2;
			_wormImg.y 	= -_wormImg.height;
			_worm.addChild(_wormImg);
			addChild(_bg);
			_worm.x 	= 80;
			_worm.y 	= 80;
			addChild(_worm);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		private function onEnterFrame(e:Event):void {
 
			var posX:		int 	= _worm.x;
			var posY:		int 	= _worm.y;
			var allowedWalk:Boolean	= false;
			for (var i:int = 0; i < _maxObstacleHeight; i++) {
 
				if (Key.isDown(Keyboard.RIGHT)) {
					posX += _walkSpeed;
					_worm.scaleX = 1;
				} else if (Key.isDown(Keyboard.LEFT)) {
					posX -= _walkSpeed;
					_worm.scaleX = -1;
				}
				var pixel32:uint = _bg.bitmapData.getPixel32(posX, posY);
				if (pixel32 > 0) {
					posY = _worm.y - i;
					posX = _worm.x;
				} else {
					posY += _fallSpeed;
					allowedWalk = true;
					break;
				}
			}
			if (allowedWalk) {
				_worm.x = posX;
				_worm.y = posY;
			}
		}	
	}
}
Код AS3:
package worms {
 
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
 
	public class Key {
 
		private static var initialized:Boolean = false;		
		private static var keysDown:Object = new Object();	
 
		public static function initialize(stage:Stage):void {
			if (!initialized) {
				stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
				stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
				stage.addEventListener(Event.DEACTIVATE, clearKeys);
				initialized = true;
			}
		}
 
		public static function isDown(keyCode:uint):Boolean {
			if (!initialized) {
				throw new Error("Key class has not yet been initialized.");
			}
			return Boolean(keyCode in keysDown);
		}
		private static function keyPressed(event:KeyboardEvent):void {
			keysDown[event.keyCode] = true;
		}
		private static function keyReleased(event:KeyboardEvent):void {
			if (event.keyCode in keysDown) {
				delete keysDown[event.keyCode];
			}
		}
 
		private static function clearKeys(event:Event):void {
			keysDown = new Object();
		}
	}
}


С некоторыми доработками можно сделать гораздо прикольнее. Можно так же прыжки добавить или что-то еще
Миниатюры
Нажмите на изображение для увеличения
Название: bg.png
Просмотров: 70
Размер:	15.5 Кб
ID:	30958  
Изображения
 
Вложения
Тип файла: swf DifferentTests.swf (28.7 Кб, 100 просмотров)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 17.06.2014, 12:54
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 9  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Особо сложного в реализации движения как в червяках, ничего нет. Вот простой пример. Просто проверяется значение цвета пикселя у определенной картинки
DifferentTests.swf   (28.7 Кб)


Вот сам код этого примера
Код AS3:
package worms {
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.ui.Keyboard;
 
	[SWF(width = 676, height = 465)]
	public class Worms extends Sprite {
 
		[Embed(source = "img/bg.png")]
		private static const Bg:	Class;
		private var _bg:			Bitmap 	= new Bg();
		[Embed(source = "img/worm.png")]
		private static const Worm:	Class;
		private var _wormImg:		Bitmap 	= new Worm();
		private var _worm:			Sprite	= new Sprite();
		private var _fallSpeed:		int		= 8; 
		private var _walkSpeed:		int		= 5; 
		private var _maxObstacleHeight:int 	= 20;
 
		public function Worms() {
			Key.initialize(stage);
			_wormImg.x 	= -_wormImg.width / 2;
			_wormImg.y 	= -_wormImg.height;
			_worm.addChild(_wormImg);
			addChild(_bg);
			_worm.x 	= 80;
			_worm.y 	= 80;
			addChild(_worm);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		private function onEnterFrame(e:Event):void {
 
			var posX:		int 	= _worm.x;
			var posY:		int 	= _worm.y;
			var allowedWalk:Boolean	= false;
			for (var i:int = 0; i < _maxObstacleHeight; i++) {
 
				if (Key.isDown(Keyboard.RIGHT)) {
					posX += _walkSpeed;
					_worm.scaleX = 1;
				} else if (Key.isDown(Keyboard.LEFT)) {
					posX -= _walkSpeed;
					_worm.scaleX = -1;
				}
				var pixel32:uint = _bg.bitmapData.getPixel32(posX, posY);
				if (pixel32 > 0) {
					posY = _worm.y - i;
					posX = _worm.x;
				} else {
					posY += _fallSpeed;
					allowedWalk = true;
					break;
				}
			}
			if (allowedWalk) {
				_worm.x = posX;
				_worm.y = posY;
			}
		}	
	}
}
Код AS3:
package worms {
 
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
 
	public class Key {
 
		private static var initialized:Boolean = false;		
		private static var keysDown:Object = new Object();	
 
		public static function initialize(stage:Stage):void {
			if (!initialized) {
				stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
				stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
				stage.addEventListener(Event.DEACTIVATE, clearKeys);
				initialized = true;
			}
		}
 
		public static function isDown(keyCode:uint):Boolean {
			if (!initialized) {
				throw new Error("Key class has not yet been initialized.");
			}
			return Boolean(keyCode in keysDown);
		}
		private static function keyPressed(event:KeyboardEvent):void {
			keysDown[event.keyCode] = true;
		}
		private static function keyReleased(event:KeyboardEvent):void {
			if (event.keyCode in keysDown) {
				delete keysDown[event.keyCode];
			}
		}
 
		private static function clearKeys(event:Event):void {
			keysDown = new Object();
		}
	}
}


С некоторыми доработками можно сделать гораздо прикольнее. Можно так же прыжки добавить или что-то еще
Спасибо. Помогли. Просто у меня пока мало опыта

Добавлено через 3 часа 18 минут
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Особо сложного в реализации движения как в червяках, ничего нет. Вот простой пример. Просто проверяется значение цвета пикселя у определенной картинки
DifferentTests.swf   (28.7 Кб)


Вот сам код этого примера
Код AS3:
package worms {
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.ui.Keyboard;
 
	[SWF(width = 676, height = 465)]
	public class Worms extends Sprite {
 
		[Embed(source = "img/bg.png")]
		private static const Bg:	Class;
		private var _bg:			Bitmap 	= new Bg();
		[Embed(source = "img/worm.png")]
		private static const Worm:	Class;
		private var _wormImg:		Bitmap 	= new Worm();
		private var _worm:			Sprite	= new Sprite();
		private var _fallSpeed:		int		= 8; 
		private var _walkSpeed:		int		= 5; 
		private var _maxObstacleHeight:int 	= 20;
 
		public function Worms() {
			Key.initialize(stage);
			_wormImg.x 	= -_wormImg.width / 2;
			_wormImg.y 	= -_wormImg.height;
			_worm.addChild(_wormImg);
			addChild(_bg);
			_worm.x 	= 80;
			_worm.y 	= 80;
			addChild(_worm);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		private function onEnterFrame(e:Event):void {
 
			var posX:		int 	= _worm.x;
			var posY:		int 	= _worm.y;
			var allowedWalk:Boolean	= false;
			for (var i:int = 0; i < _maxObstacleHeight; i++) {
 
				if (Key.isDown(Keyboard.RIGHT)) {
					posX += _walkSpeed;
					_worm.scaleX = 1;
				} else if (Key.isDown(Keyboard.LEFT)) {
					posX -= _walkSpeed;
					_worm.scaleX = -1;
				}
				var pixel32:uint = _bg.bitmapData.getPixel32(posX, posY);
				if (pixel32 > 0) {
					posY = _worm.y - i;
					posX = _worm.x;
				} else {
					posY += _fallSpeed;
					allowedWalk = true;
					break;
				}
			}
			if (allowedWalk) {
				_worm.x = posX;
				_worm.y = posY;
			}
		}	
	}
}
Код AS3:
package worms {
 
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
 
	public class Key {
 
		private static var initialized:Boolean = false;		
		private static var keysDown:Object = new Object();	
 
		public static function initialize(stage:Stage):void {
			if (!initialized) {
				stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
				stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
				stage.addEventListener(Event.DEACTIVATE, clearKeys);
				initialized = true;
			}
		}
 
		public static function isDown(keyCode:uint):Boolean {
			if (!initialized) {
				throw new Error("Key class has not yet been initialized.");
			}
			return Boolean(keyCode in keysDown);
		}
		private static function keyPressed(event:KeyboardEvent):void {
			keysDown[event.keyCode] = true;
		}
		private static function keyReleased(event:KeyboardEvent):void {
			if (event.keyCode in keysDown) {
				delete keysDown[event.keyCode];
			}
		}
 
		private static function clearKeys(event:Event):void {
			keysDown = new Object();
		}
	}
}


С некоторыми доработками можно сделать гораздо прикольнее. Можно так же прыжки добавить или что-то еще
Я немного не понял. Когда вызывать внутриклассовые функции?

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Какие такие внутриклассовые функции?
Мне кажется, рановато вы в геймдев залезли. Язык бы выучили
__________________
There is no thing in this world that is not simple.

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

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

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


 


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


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