Пятница, 15 Ноября 2024, 01:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Управление мышью - стены, остановка движения.
B@rneyДата: Четверг, 08 Ноября 2012, 20:20 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Всем привет, есть маленький вопрос по столкновению объектов, никак не могу с этим разобраться. Допустим есть объект, который движется при нажатии мыши, соответственно за ней же. Есть "Стены", которые должны останавливать этот объект, просто не пропускать его дальше, но чтобы не пришлось опять нажимать на него для движения. Надеюсь понятно объяснил, вот код движения:
Code

import com.greensock.*;
import flash.events.MouseEvent;
import flash.events.Event;

fish.addEventListener(MouseEvent.MOUSE_DOWN, onDown);

function onDown(e:MouseEvent):void{
addEventListener(Event.ENTER_FRAME, update);
stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
}

function update(e:Event):void {
TweenMax.to(fish, 2 ,{x :mouseX, y: mouseY});
}

function onUp(e:MouseEvent):void {
removeEventListener(Event.ENTER_FRAME, update);
stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
}

Мм.. Буду признателен если покажите статьи или примеры по моему вопросу. Обычные столкновения и остановка движения не подойдут, т.к. везде задействованы клавиши, а не мышка. Тут, как я думаю, нужно действовать по другому, а так как я новичок в флеше, то как именно не вкурсе cry


Правильного решения порой нет, но лучшее решение есть всегда.
anton-garДата: Четверг, 08 Ноября 2012, 20:40 | Сообщение # 2
WEBmaster
Сейчас нет на сайте
Не очень понял вопрос, но вот держи - может пригодится.

B@rneyДата: Четверг, 08 Ноября 2012, 21:00 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
anton-gar, эм... там поиск пути, сетка и обход препятствий, остановки там нету. Хотя если ты намекаешь на проверку при движении, есть ли объект стены и тогда совершать действие. Но.. Ну.. есть объект, которым я управляю с помощью мыши и есть стены, через которые мне нельзя проходить, как это реализовать? то есть, проверку через хиттест и т.п. я могу сделать, но как именно останавливать объект? Если бы управление было клавишами, то это проще и понятно. Но когда мышью я не представляю что делать.

Правильного решения порой нет, но лучшее решение есть всегда.
anton-garДата: Четверг, 08 Ноября 2012, 21:12 | Сообщение # 4
WEBmaster
Сейчас нет на сайте
Quote (B@rney)
но как именно останавливать объект?


Запускать функцию передвижения только, если герой не касается стенки.


TreinDSMДата: Четверг, 08 Ноября 2012, 21:16 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Если пользоваться для перемещением не твином, а просто прибавлять по ENTER_FRAME некоторый шаг по направлению к позиции мыши, то можно каждый раз проверять на столкновение с препятствием. Если подобное столкновение произошло, то ставить объект на позицию предшествующую препятствию. Однако при большом шаге и маленьких размерах препятствия есть опасность его просто "проскочить".
Если пользоваться твином, то нужно туда передавать не координаты мыши, а координаты просчитанные с учетом возможного препятствия. Если препятствие на векторе движения нет, то это будут координаты мыши, если есть, то координаты точки пересечения вектора направления и стороны препятствия.
B@rneyДата: Четверг, 08 Ноября 2012, 21:21 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
anton-gar, какую именно функцию лучше использовать для проверки столкновения? hitTest или hitTestObject, там 2 мувиклипа. То бишь 1 маленький, а второй стены, маленький мувиклип внутри.

Добавлено (08.11.2012, 21:21)
---------------------------------------------
TreinDSM, ох, мне бы сейчас все переварить) Буду пользоваться твином 99%. Но нужно просчитывать не столкновении мыши с объектом, а столкновении объекта которым управляет мышь и вторым. Управляемый объект только за 2 секунды догоняет мышь, есть какие-нибудь примеры к этому? Мне так легче понимать и разбираться happy


Правильного решения порой нет, но лучшее решение есть всегда.
ggmanДата: Четверг, 08 Ноября 2012, 21:22 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
твойПерсонаж.hitTestObject(стена)
Но, если хочешь, чтобы все было красиво, лучше используй какой-нибудь физ. движок. Лично я совтую nape.
TreinDSMДата: Четверг, 08 Ноября 2012, 21:29 | Сообщение # 8
почетный гость
Сейчас нет на сайте
B@rney,
Я про столкновение с мышью и не говорил.

Ну поскольку твин все одно по каждому ENTER_FRAME запускается, то можешь проверять, как сказал ggman: твойПерсонаж.hitTestObject(стена). Однако, как я уже говорил, нужно учитывать возможность "проскочить препятствие" при малых размерах персонажа и препятствия.
B@rneyДата: Четверг, 08 Ноября 2012, 21:37 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
TreinDSM, то есть в EF
if (fish.hitTestObject(wall))
{fish.x=что тут для остановки? Проверку я сделать и сам мог, я не знаю как именно останавливать}
else
{мой код движения}


Правильного решения порой нет, но лучшее решение есть всегда.
TreinDSMДата: Четверг, 08 Ноября 2012, 22:15 | Сообщение # 10
почетный гость
Сейчас нет на сайте
Ну например вот так:
Code

var oldPoint:Point = new Point(0,0);   // Тут нужны стартовые координаты объекта. Появляется он, надеюсь, в свободной точке

function update(e:Event):void
{
if (fish.hitTestObject(wall))
{
if(oldPoint.x+fish.width < wall.x && fish.x+fish.width>wall.x)    // врезались в стену слева
{
fish.x = wall.x-fish.width;
}
else if(oldPoint.x > wall.x+wall.width && fish.x < wall.x+wall.width)    // врезались в стену справа
{
fish.x = wall.x+wall.width;
}
else if(oldPoint.y+fish.height < wall.y && fish.y+fish.height>wall.y)     // врезались в стену сверху
{
fish.y = wall.y+fish.height;
}
else if(oldPoint.y > wall.y+wall.height && fish.y < wall.y+wall.height)    // врезались в стену снизу
{
fish.y = wall.y+wall.height;
}
oldPoint = new Point(fish.x, fish.y);
}
else
{
oldPoint = new Point(fish.x, fish.y);
TweenMax.to(fish, 2 ,{x :mouseX, y: mouseY});
}
}


Достаточно топорно, но почему бы и нет. Честно говоря, на работоспособность не проверял, но явных косяков вроде как не вижу.
B@rneyДата: Четверг, 08 Ноября 2012, 22:36 | Сообщение # 11
заслуженный участник
Сейчас нет на сайте
TreinDSM, эм.. с этим будет маленькая проблемка, код конечно работает, только рыба у меня находиться внутри мувиклипа wall, по этому этот способ не сработает) погуглил хорошенько, поискал, нашел как решить мою проблему, но это только с проверкой столкновения, как остановить рыбу я так и не разобрался
Code
import com.greensock.*;
import flash.events.MouseEvent;
import flash.events.Event;

var wallz:Rectangle = wall.getBounds(this);
var wallzData = new BitmapData(wallz.width, wallz.height, true, 0);
wallzData.draw(wall);
   
var fishz:Rectangle = fish.getBounds(this);
var fishzData = new BitmapData(fishz.width, fishz.height, true, 0);
fishzData.draw(fish);

addEventListener(Event.ENTER_FRAME, enterFrame);
   
function enterFrame(e:Event):void
{
fish.addEventListener(MouseEvent.MOUSE_DOWN, onDown);

function onDown(e:MouseEvent):void{
addEventListener(Event.ENTER_FRAME, update);
stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
}

function update(e:Event):void {
  TweenMax.to(fish, 2 ,{x :mouseX, y: mouseY});
}

function onUp(e:MouseEvent):void {
removeEventListener(Event.ENTER_FRAME, update);
stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
}
   
     if(wallzData.hitTest(new Point(wall.x, wall.y),
                    255,
                    fishzData,
                    new Point(fish.x, fish.y),
                    255
   
                           ))
     {
   fish.x=300;
   fish.y=200;
     }
     else
     {
     }
}

смещение на заданные координаты делал просто для проверки работоспособности, как рыбу остановить? можно конечно исходя из твоего примера найти координату столкновения, но опять же, мне это ни о чем не говорит happy


Правильного решения порой нет, но лучшее решение есть всегда.
anton-garДата: Четверг, 08 Ноября 2012, 22:37 | Сообщение # 12
WEBmaster
Сейчас нет на сайте
Quote (TreinDSM)

var oldPoint:Point = new Point(0,0); // Тут нужны стартовые координаты объекта. Появляется он, надеюсь, в свободной точке

function update(e:Event):void
{
if (fish.hitTestObject(wall))
{
if(oldPoint.x+fish.width < wall.x && fish.x+fish.width>wall.x) // врезались в стену слева
{
fish.x = wall.x-fish.width;
}
else if(oldPoint.x > wall.x+wall.width && fish.x < wall.x+wall.width) // врезались в стену справа
{
fish.x = wall.x+wall.width;
}
else if(oldPoint.y+fish.height < wall.y && fish.y+fish.height>wall.y) // врезались в стену сверху
{
fish.y = wall.y+fish.height;
}
else if(oldPoint.y > wall.y+wall.height && fish.y < wall.y+wall.height) // врезались в стену снизу
{
fish.y = wall.y+wall.height;
}
oldPoint = new Point(fish.x, fish.y);
}
else
{
oldPoint = new Point(fish.x, fish.y);
TweenMax.to(fish, 2 ,{x :mouseX, y: mouseY});
}
}


Ну в принципе, я примерно про это и говорил.


B@rneyДата: Четверг, 08 Ноября 2012, 22:40 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
anton-gar,
Quote
код конечно работает, только рыба у меня находиться внутри мувиклипа wall, по этому этот способ не сработает)


Правильного решения порой нет, но лучшее решение есть всегда.
TreinDSMДата: Пятница, 09 Ноября 2012, 09:53 | Сообщение # 14
почетный гость
Сейчас нет на сайте
B@rney,
Quote

только рыба у меня находиться внутри мувиклипа wall

Объект, который нужно проверять на столкновение с препятствием, находится внутри самого препятствия?
B@rneyДата: Пятница, 09 Ноября 2012, 14:49 | Сообщение # 15
заслуженный участник
Сейчас нет на сайте
TreinDSM, мм... да, могу кинуть исходник для наглядности, но столкновения я уже сделал, теперь бы останавливать объект happy

Правильного решения порой нет, но лучшее решение есть всегда.
TreinDSMДата: Пятница, 09 Ноября 2012, 17:27 | Сообщение # 16
почетный гость
Сейчас нет на сайте
B@rney,
От такой архитектуры попахивает скверной. Корректней было бы иметь модуль, представляющий собой игровую локацию, внутри которого находились бы модули препятствия, стены, персонажи. Персонаж перемещался бы внутри игровой локации и сталкивался с объектами препятствиями.
B@rneyДата: Пятница, 09 Ноября 2012, 17:39 | Сообщение # 17
заслуженный участник
Сейчас нет на сайте
TreinDSM, я 2 неделю на флеше, еще не знаю всех тонкостей. Все же уже начал разбираться с таким методом, буду его разбирать и добивать до конца. На будущее буду учитывать твой совет, спасибо. Идей по тому как остановить рыбу при столкновении нет? happy
P.S. Просто первой игрой которую я рассматривал на примере был лабиринт, оттуда и пошли мысли про то что так и нужно. Там был мувиклип в мувиклипе, как у меня. happy


Правильного решения порой нет, но лучшее решение есть всегда.
TreinDSMДата: Пятница, 09 Ноября 2012, 20:25 | Сообщение # 18
почетный гость
Сейчас нет на сайте
B@rney,
Еще раз уточню. Объект перемещения (fish), является child'ом объекта wall? И ты проверяешь столкновение wall и fish? Что из себя вообще представляет wall?
B@rneyДата: Пятница, 09 Ноября 2012, 20:31 | Сообщение # 19
заслуженный участник
Сейчас нет на сайте
TreinDSM, нет. Внутри объекта... имеется в виду перемещается по объекту wall, кинул тебе в ЛС ссыль, посмотришь - поймешь happy

Правильного решения порой нет, но лучшее решение есть всегда.

Сообщение отредактировал B@rney - Пятница, 09 Ноября 2012, 20:32
TreinDSMДата: Пятница, 09 Ноября 2012, 20:44 | Сообщение # 20
почетный гость
Сейчас нет на сайте
B@rney,
У меня CS5. Под меньшую версию можно пересохранить?
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг