![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Здравствуйте! У меня снова возник вопрос - как осуществить движение по заранее нарисованному ландшафту. Я уже пробовал гайдлайн с обычным и обратным проигрыванием ролика, все получилось, но тут проблема: ландшафт должен разрушаться. Для осуществления этого мне посоветовали движок с функцией "вырезания" фигур одна из другой. Мне необходимо применить то же самое и к гайдлайну? Но тогда как? А если нет, то чем заменить движение по направляющей? Мне удобнее первое, так как половину проекта переделывать заново не придется
, но логичней замена, так как кадры тратить на анимацию не хочется, надо бы сделать в одном кадре. Вообщем, жду ответа на вопросы. Заранее спасибо. |
|
|||||
|
Всё плохо.
Гайдлайны здесь непричем и никак не помогут. Нельзя нарисовать путь для героя так, чтобы он подходил для любого ландшафта. Вам нужно писать матёрый код. Очень матёрый. Суперматёрый код! Задача правда сложная, даже для людей в теме.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Цитата:
Я понимаю в триале ничего не меняется и с помощью гайдлайна можно сделать. Но ведь есть такие игры во flash, как worms. Цитата:
|
|
|||||
|
Нужно позиционировать элемент исключительно кодом.
Описывать ландшафт математически, вычитая из него фигуры. Наверное, самым простым вариантом здесь будет pixel-collision – из растрового изображения (BitmapData) сделать маску (скажем, где черное – пусто, где белое – ландшафт). При взрыве менять цвета "ушедшей местности" на черное. Отсюда, объект "сидящий" на этой маске по команде "сдвинься влево-вправо" может понять, в какую точку ему попасть – забраться чуть выше или чуть ниже. Как то так.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Jan 2013
Сообщений: 322
|
нет.
вообще, механика червей не сложная, но у Wormhole явно недостаточно опыта |
|
|||||
|
Я только сейчас понял иронию. Вопрос о дырках, как в червячках от пользователя WormHole.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Можно просто проверять, не превышает ли максимальную разницу следующий нарисованый пиксель(текущее положение + вектор скорости), получаем самый верхний пиксель и проверяем его положение относительно нашего текущего положения. Если превышает, то двигаться нельзя.
А по главной теме - как реализовать перемещение - смотрите мой ответ сначала + если не превышает, то совершить перемещение(а если отрицательная разница, значит следующий пиксель слишком низко, чтобы спуститься без падения).
__________________
There is no thing in this world that is not simple. |
|
|||||
|
Особо сложного в реализации движения как в червяках, ничего нет. Вот простой пример. Просто проверяется значение цвета пикселя у определенной картинки
Вот сам код этого примера 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; } } } } 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(); } } } С некоторыми доработками можно сделать гораздо прикольнее. Можно так же прыжки добавить или что-то еще
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Цитата:
Добавлено через 3 часа 18 минут Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 17:34. |
|
|
« Предыдущая тема | Следующая тема » |
|
|