Просмотр полной версии : Необычное столкновение
Я новичок, уже много чего изучил, но со столкновением не сталкивался. Еле нашёл поиск на этом сайте) Там вывелось много тем я посмотрел, но не одна тема не подходит к моей ситуации. Вообщем как сделать столкновение как в этой игре (http://games.mir46.ru/?com=games&act=play&gid=1943)? Цель не скопировать игру, как подумают не которые а понять, как это работает. Ещё еслив это реализовано при помощи box2d то можно как нить по другому, без box2d? box2d - я пробовал изучить или даж хотя бы понять, но пока трудно, потому что не могу освоить, понять class,ы.
Например так: хранить в модели текущее состояние доски, как двумерный массив булевых значений – ячейка свободна / занята. Про каждый блок мы можем сказать на каких координатах он находится и как сориентирован (вертикально / горизонтально). Этих данных достаточно, чтобы сформировать dragRect (если осуществлять перетаскивание методом startDrag). После отпускания кнопки мышки, смотрим на текущие визуальные координаты блока, вычисляем соответствующие координаты в модели, подгоняем их до целых и перемещаем блок на положенное место. Обновляем модель.
Нет ли на этом форуме подобной темы? что бы хотя бы понять не которые ваши слова. Допустим эти "хранить в модели текущее состояние доски". Щас по гуглю/поищу на сайте, отпишусь о результатах. Спасибо за ответ.
Добавлено через 7 минут
Вот пока что реализовано:
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 позволяющий таскать объект автоматически в указаной области
function mouseDownHandler(event:Event):void
{
startDrag(false, new Rectangle(0, 0, width, height + freeHeight);
}
function mouseUpHandler(event:Event):void
{
stopDrag();
fitToPosition();
}
Александр Мостовой, спасибо за ответ. а что означает 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 пример (http://tinyurl.com/bs2sz2u)
Александр Мостовой, да с MVC напряг не могу понять смысла его использования, точнее как он действует. Щас по гуглю мож дойдёт.
caseyryan, учту спасибо.
Александр Мостовой
07.04.2013, 11:12
Александр Мостовой, да с MVC напряг не могу понять смысла его использования, точнее как он действует. Щас по гуглю мож дойдёт.
caseyryan, учту спасибо.
В общем не заморачивайтесь пока над этим :)
Суть в том что вам нужно решить для начала задачу на уровне логики-математики - без какого либо визуального представления. У вас есть некторое абстрактное поле
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
Александр Мостовой, спасибо щас буду разбираться, я уже думал, что придётся изучать MVC))) это получается как массив, точнее управлять массивами? вот нашёл про Array
var oneArray:Array = new Array("a", "b", "c");
var twoArray:Array = oneArray;
twoArray[0] = "z";
trace(oneArray);
Добавлено через 2 минуты
Сори, сразу и не понял это же многомерные массивы)
Добавлено через 10 минут
так, всё я понял как этим пользоваться.
Вот:
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 минуту
вот у меня кодик получился:
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);
}
ток до меня не доходит как этим можно пользоваться)
Александр Мостовой
07.04.2013, 12:56
Я научился управлять, что дальше?
Я понял, речь шла о на несколько порядков большем объеме работы :) Смысл в том что бы сделать игру вначале исключительно в абстрактных цифрах. как в шахматах вводить (e2-e4), а получать (c7 - c5)
Если не пользовались до этого массивами и игра для вас средство научиться рекмомендую пройти какие-нибудь уроки шаг за шагом. Здесь в разделе "статьи", например, много полезных материалов.
заметил одну особенность в этой игре. Там есть сетка. Может с помощью её будет легко реализовать это?
Добавлено через 1 минуту
Александр Мостовой, да я не пользовался массивами ни разу) Щас пороюсь может что то интересное найду)
Добавлено через 57 минут
Ладно тему закрывайте. Надо мне и вправду выучить до конца AS. Я хочу изучить class,ы и package. Еслив можно то я спрошу здесь. Допустим создаю класс GamesClass.as в нём одна переменная
package
{
public class GamesClass
{
public var _picture:Number = 15;
}
}
И вот вопрос как обратится к ней допустим, что бы просто её вывести на экране в .fla
Я написал вот что:
import GamesClass._picture;
_picture.text = "P:" + _picture;
Я чувствую, что не правильно, но больше не знаю как.
Александр Мостовой
07.04.2013, 14:23
trace(_picture); :) Выведет значение в окно output
Странно не работает =(
попробовал так:
import GamesClass.Picture;
trace(_picture);
и так
trace(_picture);
ошибка.
Александр Мостовой
07.04.2013, 14:34
ПО правилам, насколько я знаю, здесь предполагается одна тема один вопрос :)
import GamesClass.Picture; - так неверно.
package
{
import flash.display.Sprite;
public class GamesClass extends Sprite
{
private var picture:Number = 15;
public function GamesClass()
{
super();
trace(picture);
}
}
}
Александр Мостовой, спасибо. Буду знать на счёт правил.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.