Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
avvvl
3 / 3 / 0
Регистрация: 16.06.2013
Сообщений: 185
1

Перетаскивание предмета по "сетке"

24.09.2013, 16:22. Просмотров 1054. Ответов 8
Метки нет (Все метки)

Есть квадрат, я его перетаскиваю мышкой, и нужно что б когда я его отпустил он стал ровно. Например квадрат 50х50. и поле разделено на квадратики 50х50. Ну и что б он "прилипал" к ближнему квадрату. Нашел я один код, но он "кривой". Там нужно создать кучу этих клеточек и каждой дать название - place1, place2 и тд. ну пускай даже так. но есть проблема по которой и вопрос: Мой 'герой' притягивается к клеточке с меньшим номером(ну там по циклу. код ниже). Если рядом клетка1 и клетка2 - если я отпущю квадрат касается обоих клеток. то он в любом случае окажется на месте клетки1. даже если его большая часть находится на клетке 2.
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kvadrat.onPress = function() {
 this.startDrag();
};
kvadrat.onRelease = function() {
 this.stopDrag();
 _checkCollision();
};
function _checkCollision() {
 for (var i = 1; i<5; i++) {
  if (kvadrat.hitTest(this["place"+i])) {
   kvadrat._x = this["place"+i]._x;
   kvadrat._y = this["place"+i]._y;
  }
 }
}
нужно создать мувиклипы - kvadrat, place1, place2, place3, place4
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 16:22
Ответы с готовыми решениями:

Перетаскивание оъекта по сетке (теория)
На сцене есть сетка, и объект, который надо перетаскивать. Хочется сделать так,...

Составить несколько копий символа "Спутник" разных цветов и размеров, и разместить их вокруг планеты "Сатурн"
доброго всем времени суток) впервые встретилась с Flash и вообще ничего не...

Отключить кнопки "Воспроизвести", "Цикл" в контекстном меню плеера
В флеш плеере если нажать правкой кнопкой есть варианты &quot;Воспроизвести&quot;, &quot;Цикл&quot;...

Создать классы "Подъемный кран" и "Грузовик".
Здравствуйте, товарищи. Создать классы &quot;Подъемный кран&quot; и &quot;Грузовик&quot;....

Ошибка со stage "Не удается вызвать свойство или метод со ссылкой на объект "null"
as файл package { import flash.display.*; import flash.events.*; ...

8
ichgo
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
24.09.2013, 16:43 2
Ну это вопрос математики, скорее всего, а не программирования. Нужно еще добавить проверку, к центру какого кубика ближе центр твоего "героя"
0
avvvl
3 / 3 / 0
Регистрация: 16.06.2013
Сообщений: 185
24.09.2013, 16:57  [ТС] 3
Цитата Сообщение от ichgo Посмотреть сообщение
Ну это вопрос математики, скорее всего, а не программирования. Нужно еще добавить проверку, к центру какого кубика ближе центр твоего "героя"
тогда вот еще вопрос - а как сделать сразу много кубиков(или точек) по игровому полю к которым притягивался бы "герой". В приведенном выше коде я делал два place1 - но он лип все равно к одному из них, а на второй не реагировал. Неужели надо каждую клетку вручную?
0
ichgo
16 / 16 / 0
Регистрация: 08.01.2011
Сообщений: 183
24.09.2013, 17:04 4
Цитата Сообщение от avvvl Посмотреть сообщение
тогда вот еще вопрос - а как сделать сразу много кубиков(или точек) по игровому полю к которым притягивался бы "герой". В приведенном выше коде я делал два place1 - но он лип все равно к одному из них, а на второй не реагировал. Неужели надо каждую клетку вручную?
Вручную что? Создавать? Нет, можно в цикле насоздавать столько, сколько нужно, каждый раз изменяя название кубика и его координаты X и Y на определенное значение.
Если проверять, то только с теми, с которыми есть hitTest.

А вообще я сейчас насоветую, со своим АС2
0
TanaTiX
Модератор
2798 / 1652 / 168
Регистрация: 19.02.2011
Сообщений: 6,011
Завершенные тесты: 2
24.09.2013, 17:04 5
Цитата Сообщение от ichgo Посмотреть сообщение
Нужно еще добавить проверку
Цитата Сообщение от avvvl Посмотреть сообщение
Там нужно создать кучу этих клеточек и каждой дать название - place1, place2
Зачем? Как правильно ответил ichgo, вопрос чисто математический.
По событию onRelease определяем координаты объекта. Размер ячейки, к которой должен прилипать объект известен, координаты героя также известны. Делим его координаты на размер ячейки, округляем полученное значение до целого и полученный результат опять умножаем на размер ячейки - это и будут интересующие координаты.
1
aaatorisss
229 / 26 / 9
Регистрация: 22.01.2013
Сообщений: 90
25.09.2013, 18:57 6
вот так должно работать это по сетке

ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
if (e.target.x % CW < CW/2) {
           e.target.x = int(e.target.x / CW) * CW;
}else {
    e.target.x = int(e.target.x / CW) * CW+CW;
}
                
if (e.target.y % CW < CW/2) {
    e.target.y = int(e.target.y / CW) * CW;
}else {
    e.target.y = int(e.target.y / CW) * CW+CW;
}
где e.target это обьект который мы перемещаем
CW это ширина и высота ячейки допустим равна 32

вот сам код перетаскивание предмета по сетке а также по клеткам на AS 3.0
правда коментировать код у меня не очень выходит

если testGrid=true то проверка идет по координатам
если testGrid=false то проверка идет по клеткам(спрайтам)
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package  
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    /**
     * ...
     * @author Atoris
     */
    public class Cage extends Sprite
    {
        private var _cage:Sprite; 
        private var _grid:Sprite;
        private var _arrCage:Vector.<Sprite>; // массив клеточек(тип Sprite)
        private var _mouseCage:Sprite;
        private var _mMove:Boolean = false;
        private var _testGrid:Boolean = true; // если true то проверка идет по координатам сетки, false проверка по клеткам 
        
        private const CW:int = 32; // размер клетки
        private const SW:int = 640; //ширина экрана
        private const SH:int = 480; // высота экрана
        
        public function Cage() 
        {
            _arrCage = new Vector.<Sprite>();
            addCage();
            addMouseCage();
            _mouseCage.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
            
        }
        // если зажали клавишу мышки
        private function mDown(e:MouseEvent):void {
            _mMove = true;
            addEventListener(Event.ENTER_FRAME, update);
            _mouseCage.addEventListener(MouseEvent.MOUSE_UP, mUp);
        }
        // если отпустили клавишу мышки
        private function mUp(e:MouseEvent):void {
            _mMove = false;
            // проверка  
            if (!_testGrid) {
                // проверка элементо массива
                for (var i:int = 0; i < _arrCage.length; i++) {
                    //сама проверка
                    if (_arrCage[i].hitTestPoint(_mouseCage.x+_mouseCage.width/2,_mouseCage.y+_mouseCage.height/2,true)) {
                        _mouseCage.x = _arrCage[i].x;
                        _mouseCage.y = _arrCage[i].y;
                    }
                }
            }else {
                // проверка по координатам
                
                // тут мы проверяем координаты квадрата, незнаю как написать
                // если остача квадрата по х меньше ширины сетки(16) 
                if (e.target.x % CW < CW/2) {
                    e.target.x = int(e.target.x / CW) * CW;
                }
                else {
                    e.target.x = int(e.target.x / CW) * CW+CW;
                }
                
                if (e.target.y % CW < CW/2) {
                    e.target.y = int(e.target.y / CW) * CW;
                }else {
                    e.target.y = int(e.target.y / CW) * CW+CW;
                }
            }
            
        }
        // функция движения красного квадрата за мышкой
        private function update(e:Event):void {
            if (_mMove) {
                _mouseCage.x = mouseX-_mouseCage.width/2;
                _mouseCage.y = mouseY-_mouseCage.height/2;
            }else {
                removeEventListener(Event.ENTER_FRAME, update);
            }
        }
        // рисуем красный квадрат
        private function addMouseCage():void {
            _mouseCage = new Sprite();
            _mouseCage.graphics.beginFill(0xff0000);
            _mouseCage.graphics.drawRect(0, 0, CW, CW);
            _mouseCage.graphics.endFill();
            addChild(_mouseCage);
        }
        
        // рисуем и добавляем клетки на сцену или сетку
        
        private function addCage():void {
            
            if (!_testGrid) {
                //клетки
                for (var i:int = 0; i < SW/CW; i++) 
                {
                    for (var j:int = 0; j < SH/CW; j++) 
                    {
                        
                        _cage = new Sprite();
                        _cage.graphics.lineStyle(1, 0x000000);
                        _cage.graphics.beginFill(0xffffff);
                        _cage.graphics.drawRect(0, 0, CW, CW);
                        _cage.graphics.endFill();
                        _cage.x = CW * i;
                        _cage.y = CW * j;
                        addChild(_cage);
                        _arrCage.push(_cage);// добавляем каждую клетку в массив
                    }
                }
            }else {
                //сетка
                _grid = new Sprite();
                _grid.graphics.clear();
                _grid.graphics.lineStyle(1, 0x000000);
                
                for (i = 0; i < SW/CW+1; i++) 
                {
                    for (j = 0; j < SH/CW+1; j++) 
                    {
                        
                        _grid.graphics.moveTo(i * CW, 0);
                        _grid.graphics.lineTo(i * CW, CW * SH/CW);
                        _grid.graphics.moveTo(0, j * CW);
                        _grid.graphics.lineTo(CW * SW/CW, j * CW);
                        
                    }
                }
                addChild(_grid);
            }
            
        }
        
        
    }
 
}
1
TanaTiX
Модератор
2798 / 1652 / 168
Регистрация: 19.02.2011
Сообщений: 6,011
Завершенные тесты: 2
25.09.2013, 19:21 7
aaatorisss, а если в ячейке есть еще какой-то объект, размером больше, чем сама ячейка? Как будет выглядеть тогда? Сдается, что вы слишком много кода написали (даже если он рабочий, что похоже на правду), как для такой задачи.
0
aaatorisss
229 / 26 / 9
Регистрация: 22.01.2013
Сообщений: 90
25.09.2013, 19:50 8
Цитата Сообщение от TanaTiX Посмотреть сообщение
aaatorisss, а если в ячейке есть еще какой-то объект, размером больше, чем сама ячейка? Как будет выглядеть тогда? Сдается, что вы слишком много кода написали (даже если он рабочий, что похоже на правду), как для такой задачи.
если в ячейке есть какой то обьект то честно сказать не знаю не проверял(думаю, что будут проблеммы), по этому я написал сдесь два метода проверки по ячейкам и координатам

Так много кода, потому что все рисовалось программно функция addCage(), также сдесь два разных метода: проверка по ячейкам и проверка по координатам, при изменении testGrid-а проверка идет либо по координатам, либо по ячейкам, ну плюс функции мышки и ентер фрейм.
сам код проверки выглядит так:
для ячеек
ActionScript 3
1
2
3
4
5
6
7
for (var i:int = 0; i < _arrCage.length; i++) {
                    //сама проверка
                    if (_arrCage[i].hitTestPoint(_mouseCage.x+_mouseCage.width/2,_mouseCage.y+_mouseCage.height/2,true)) {
                        _mouseCage.x = _arrCage[i].x;
                        _mouseCage.y = _arrCage[i].y;
                    }
                }
и для координат
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
if (e.target.x % CW < CW/2) {
                    e.target.x = int(e.target.x / CW) * CW;
                }
                else {
                    e.target.x = int(e.target.x / CW) * CW+CW;
                }
                
                if (e.target.y % CW < CW/2) {
                    e.target.y = int(e.target.y / CW) * CW;
                }else {
                    e.target.y = int(e.target.y / CW) * CW+CW;
                }
добавил исходник и результат(по координатам)
1
Вложения
Тип файла: rar Cage.rar (11.6 Кб, 15 просмотров)
Тип файла: swf Cage.swf (2.2 Кб, 15 просмотров)
avvvl
3 / 3 / 0
Регистрация: 16.06.2013
Сообщений: 185
25.09.2013, 23:30  [ТС] 9
спасибо. то, что нужно

Добавлено через 2 часа 58 минут
когда я нажимаю я квадрат то стрелка сразу становится по центру, как сделать что бы она взяла его в том месте, где нажму? не понимаю как сделать

Добавлено через 27 минут
upd: сори за глупый вопрос, с этим разобрался
0
25.09.2013, 23:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2013, 23:30

Небольшой блиц на тему "что такое флэш" или "вопросы от самых маленьких"))
Хочу начать изучение Flash (нужно создать сайт с использованием flash + MySQL)...

подгружаемый текст из "*.txt" в "*.swf"
Есть код который грузит внешний текст из файла myText1.txt, находящегося в той...

Как "заставить" понимать AS 2.0 отсутствие или наличие мыши?
Добрый день. AS понимает разные события мыши, но, к сожалению, я не могу найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru