Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Необычное столкновение (http://www.flasher.ru/forum/showthread.php?t=197398)

WinSTOP 06.04.2013 20:04

Необычное столкновение
 
Я новичок, уже много чего изучил, но со столкновением не сталкивался. Еле нашёл поиск на этом сайте) Там вывелось много тем я посмотрел, но не одна тема не подходит к моей ситуации. Вообщем как сделать столкновение как в этой игре? Цель не скопировать игру, как подумают не которые а понять, как это работает. Ещё еслив это реализовано при помощи box2d то можно как нить по другому, без box2d? box2d - я пробовал изучить или даж хотя бы понять, но пока трудно, потому что не могу освоить, понять class,ы.

bav 06.04.2013 20:48

Например так: хранить в модели текущее состояние доски, как двумерный массив булевых значений – ячейка свободна / занята. Про каждый блок мы можем сказать на каких координатах он находится и как сориентирован (вертикально / горизонтально). Этих данных достаточно, чтобы сформировать dragRect (если осуществлять перетаскивание методом startDrag). После отпускания кнопки мышки, смотрим на текущие визуальные координаты блока, вычисляем соответствующие координаты в модели, подгоняем их до целых и перемещаем блок на положенное место. Обновляем модель.

WinSTOP 06.04.2013 20:56

Нет ли на этом форуме подобной темы? что бы хотя бы понять не которые ваши слова. Допустим эти "хранить в модели текущее состояние доски". Щас по гуглю/поищу на сайте, отпишусь о результатах. Спасибо за ответ.

Добавлено через 7 минут
Вот пока что реализовано:
Код AS3:

mascot.addEventListener(MouseEvent.MOUSE_DOWN, startMascotDrag);
stage.addEventListener(MouseEvent.MOUSE_UP, stopMascotDrag);
mascot.addEventListener(Event.ENTER_FRAME, dragMascot);
 
var clickOffset:Point = null;
 
function startMascotDrag(event:MouseEvent) {
clickOffset = new Point(event.localX, event.localY);
}
 
function stopMascotDrag(event:MouseEvent) {
clickOffset = null;
}
 
function dragMascot(event:Event) {
if (clickOffset != null) {
mascot.x = mouseX - clickOffset.x;
}
}


Александр Мостовой 06.04.2013 21:22

Цитата:

но пока трудно, потому что не могу освоить, понять class
В AS3 есть встроенній методо startDrag позволяющий таскать объект автоматически в указаной области
Код AS3:

                        function mouseDownHandler(event:Event):void
                        {
                                startDrag(false, new Rectangle(0, 0, width, height + freeHeight);
                        }
 
                        function mouseUpHandler(event:Event):void
                        {
                                stopDrag();
                                fitToPosition();
                        }


WinSTOP 06.04.2013 21:29

Александр Мостовой, спасибо за ответ. а что означает freeHeight?

Добавлено через 24 минуты
со startDrag разобрался, огромнейшее спасибо) щас буду думать над столкновением.

Александр Мостовой 06.04.2013 22:58

Цитата:

Александр Мостовой, спасибо за ответ. а что означает freeHeight?
Ну свободное поле для ваших плиток
startDrag(false, rectangle);
rectangle - это прямоугольник в пределах которого вы можете таскать объект. В вашем случае он совпадает с обстью объекта + дополнительное поле

Цитата:

что бы хотя бы понять не которые ваши слова. Допустим эти "хранить в модели текущее состояние доски"
Речь шла о шаблоне программирования. Смысл в том что бы логику игры высчитывать в отдельной структуре кода, не связанной с отрисовкой и конкретными визуальными объектами. Рано или поздно при усложнении логики придется перейти на такую структуру. Ключевые слова для поиска MVC (Model View Controller)

caseyryan 07.04.2013 08:10

Цитата:

Еле нашёл поиск на этом сайте) Там вывелось много тем я посмотрел, но не одна тема не подходит к моей ситуации.
Не надо пользоваться поиском на форуме, он в этих движках форума полный отстой. Лучше правильно пользоваться гуглом. Для поиска с помощью гугла на этом форуме нужно писать так: ваш поисковый запрос site:flasher.ru пример

WinSTOP 07.04.2013 10:36

Александр Мостовой, да с MVC напряг не могу понять смысла его использования, точнее как он действует. Щас по гуглю мож дойдёт.
caseyryan, учту спасибо.

Александр Мостовой 07.04.2013 11:12

Цитата:

Сообщение от WinSTOP (Сообщение 1128588)
Александр Мостовой, да с MVC напряг не могу понять смысла его использования, точнее как он действует. Щас по гуглю мож дойдёт.
caseyryan, учту спасибо.

В общем не заморачивайтесь пока над этим :)
Суть в том что вам нужно решить для начала задачу на уровне логики-математики - без какого либо визуального представления. У вас есть некторое абстрактное поле
Код AS3:

var modelScene:Array= 
[
                                1,0,1,1,1,0,
                                1,0,0,0,0,0,
                                1,0,0,0,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0
                        ]

И вам нужно используя абстрактные данные двигать эти виртуальные нолики и единички.
После того как сможете решить на уровне математики, потом просто будет передавать в StartDrag rectangle который легко можно будет вычислить умножая число клеточек на ширину ячейки . Если поступите таким образом сможете вдальнейшем отрисовывать объекты хоть в пикселях, хоть в 3Д, будет очень просто генерировать уровни.

Вы могли бы тут, конечно, "схалявить" и просто прибавлять к текущему rectangle объекта расстояние до ближайших границ по наибольшей длине, но это тупиковый путь.


Да, термин который вы используете - столкновение - совершенно не подходит к задаче. Не знаю какой другой предложить, но столкновения относятся больше к физике, у вас просто свободная область и rectanglesIntersection

WinSTOP 07.04.2013 12:05

Александр Мостовой, спасибо щас буду разбираться, я уже думал, что придётся изучать MVC))) это получается как массив, точнее управлять массивами? вот нашёл про Array
Код AS3:

 var oneArray:Array = new Array("a", "b", "c");
 var twoArray:Array = oneArray;
 twoArray[0] = "z";           
 trace(oneArray);

Добавлено через 2 минуты
Сори, сразу и не понял это же многомерные массивы)

Добавлено через 10 минут
так, всё я понял как этим пользоваться.
Вот:
Код AS3:

 var oneArray:Array= 
[
                                1,0,1,1,1,0,
                                1,0,0,0,0,0,
                                1,0,0,0,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0
                        ];
 var twoArray:Array = oneArray;
 twoArray[1] = "1";           
 trace(oneArray);

и у нас получится
1,1,1,1,1,0, // изменилось второе число.
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0
Я научился управлять, что дальше? нужно их передавать в StartDrag?

Добавлено через 31 минуту
вот у меня кодик получился:
Код AS3:

var oneArray:Array= 
[
                                1,1,1,1,1,1,
                                0,0,0,0,0,0,
                                1,0,0,0,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0,
                                0,1,0,1,0,0
                        ];
 var twoArray:Array = oneArray;
 twoArray[5] = twoArray[1]
 trace(oneArray);
 mascot2.y = twoArray[6] + twoArray[11];
 
 
var LOCKY:Number = mascot2.y;
 
 
stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseMove);
function _mouseMove(e:MouseEvent):void
{
    if(mascot2.y != LOCKY) mascot2.y = LOCKY;
}
 
mascot2.addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
function _mouseDown(e:MouseEvent):void
{
    mascot2.startDrag();
}
 
stage.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
function _mouseUp(e:MouseEvent):void
{
    mascot2.stopDrag();
    mascot2.removeEventListener(MouseEvent.MOUSE_UP, _mouseUp);
}

ток до меня не доходит как этим можно пользоваться)


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

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