Форум 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=187813)

Tetraeon 24.11.2012 17:22

Заполнение элементов Массива массивов (изометрическая сетка)
 
Подскажите, каким образом можно правильно заполнить ячейки изометрической сетки (массива массивов) перетаскивая на нее объект определенного размера (1х6 и т.д.) как только я не пробовал это делать.
Код AS3:

        public function Click(e:MouseEvent):void
        {
                if (! drag)
                {
                        if (e.target == osel)
                        {
                                curX = 16;
                                curY = 10;
                                objectMass = new Array();
 
                                for (var rows:int=0; rows<curX; rows++)
                                {
                                        objectMass.push(new Array());
                                }
                                while (true)
                                {
                                        var tempCont = new MovieClip();
                                        for (var col:int=0; col<curX; col++)
                                        {
                                                for (var row:int=0; row<curY; row++)
                                                {
                                                        var ball2x2 = new ball2x2_mc  ;
                                                        objectMass[col][row] = ball2x2;
                                                        ball2x2.x = col * 24;
                                                        ball2x2.y = row * 24;
                                                        ball2x2.mouseEnabled = false;
                                                        tempCont.addChild(ball2x2);
 
                                                }
                                        }
                                        break;
                                }
                                gameMovieClip.addChild(tempCont);
                                targ = tempCont;
                                targ.startDrag(true);
                                targ.mouseEnabled = false;
                                drag = true;
                        }
                        if (e.target == tile)
                        {
                                curX = 1;
                                curY = 1;
                                objectMass = new Array();
                                for (rows=0; rows<1; rows++)
                                {
                                        objectMass.push(new Array());
                                }
                                while (true)
                                {
                                        tempCont = new MovieClip();
                                        for (col=0; col<1; col++)
                                        {
                                                for (row=0; row<1; row++)
                                                {
                                                        ball2x2 = new ball2x2_mc  ;
                                                        objectMass[col][row] = ball2x2;
                                                        ball2x2.x = col * 24;
                                                        ball2x2.y = row * 24;
                                                        ball2x2.mouseEnabled = false;
                                                        tempCont.addChild(ball2x2);
 
                                                }
                                        }
                                        break;
                                }
                                gameMovieClip.addChild(tempCont);
                                targ = tempCont;
                                targ.startDrag(true);
                                targ.mouseEnabled = false;
                                drag = true;
                        }
                }
                else
                {
                        var score:int = 0;
                        for (col=0; col<slots; col++)
                        {
                                for (row=0; row<slots; row++)
                                {
                                        if (grid[col][row] == e.target)
                                        {
                                                for (var cur1:int=0; cur1<curX; cur1++)
                                                {
                                                        for (var cur2:int=0; cur2<curY; cur2++)
                                                        {
                                                                if (grid[col + cur1][row + cur2].full == false)
                                                                {
                                                                        score++;
                                                                        if (curX >= curY)
                                                                        {
                                                                                if (score == curX)
                                                                                {
                                                                                        targ.x = e.target.x;
                                                                                        targ.y = e.target.y;
                                                                                        targ.stopDrag();
                                                                                        targ = new MovieClip();
                                                                                        for (var cur3:int=0; cur3<curX; cur3++)
                                                                                        {
                                                                                                for (var cur4:int=0; cur4<curY; cur4++)
                                                                                                {
                                                                                                        grid[col + cur3][row + cur4].full = true;
                                                                                                }
                                                                                        }
                                                                                        drag = false;
                                                                                }
                                                                        }
                                                                        if (curX < curY)
                                                                        {
                                                                                if (score == curY)
                                                                                {
                                                                                        targ.x = e.target.x;
                                                                                        targ.y = e.target.y;
                                                                                        targ.stopDrag();
                                                                                        targ = new MovieClip();
                                                                                        for (cur3=0; cur3<curX; cur3++)
                                                                                        {
                                                                                                for (cur4=0; cur4<curY; cur4++)
                                                                                                {
                                                                                                        grid[col + cur3][row + cur4].full = true;
                                                                                                }
                                                                                        }
                                                                                        drag = false;
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }


expl 24.11.2012 17:48

Код AS3:

for (var col:int=0; col<curX; col++)
{
    objectMass[col] = [];// Надо массив для каждой колонки сделать

В as3 не бывает двумерных массиов - бывают только массивы, содержащие другие массивы, и то это не массивы а хитрореализованные списки. Причём списки со свойствами хеш-таблиц. 2 в одном.

Storfus13 24.11.2012 18:07

Любой линейный массив, соответственно струтурированный можно рассматривать как псевдо- 2-х, 3-х, n-мерный. Хотя по сути остается линейным (одномерным).
Код AS3:

mas = [[0xffcc99,0xffe8ce,0xffcc99], 
        [0xff9900,0xfebc5a,0xc17402],
        [0x8899bb,0xAABBDD,0x8899bb],
        [0x00ff00,0x008800,0x005500],
        [0xABB9F3,0xffffcc,0xABB9F3],
        [0x57fd8c,0xc7fed8,0x57fd8c]];


expl 24.11.2012 18:24

Хотя я проглядел, у Вас вроде есть инициализация массива
Цитата:

objectMass.push(new Array());
Короче проблема х.з. где, учитывая такие конструкции:
Код AS3:

while (true)
                                {
                                        ...
                                        break;
                                }

Не, while(true) или do while(false) как только и для чего только не используют и оно бывает к месту.
Но в этом конкретном случае мотивация непонятна.

Если ещё не нашли ошибку, попробуйте запихнуть всё, что написали в один класс, который можно запустить отдельно от приложения. Тогда если не форумчанам, то Вам будет проще найти ошибку.

Tetraeon 24.11.2012 18:46

Да конструкция кода слишком большая для такого простого действия, на мой взгляд, но за неимением альтернативы пришлось пойти на эту адскую фантасмагорию которую выдал мой мозг... Я подумал наверняка найдутся люди которые уже делали это и показали бы мне правильный вариант. Я опирался от ячейки на которую попадает курсор при нажатии if (grid[col][row] == e.target) далее нужно просто сделать проверку рядом находящихся ячеек на заполненность и заполнить если они свободны, попутно ставя туда изображение объекта. Только с этой частью кода у меня проблема.

expl 24.11.2012 19:00

Для начала сохраните coll и row прямо на объекте по которому кликаете, чтобы не было этих пробежек в цикле.

Tetraeon 24.11.2012 19:45

А как же проверять соседние ячейки не пробегаясь по циклу? Мне же нужно сканировать всю сетку на наличие свободных/занятых мест перед установкой объекта?

expl 24.11.2012 19:56

Я про определение coll и row по event.target
По остальному - ищите ошибку

wvxvw 24.11.2012 20:15

Ищите в гугле / википедии по ключу fitting problem, их есть множесто разнообразных и разнообразных решений, но уж наверняка можно лучше, чем шесть вложенных циклов... Просто с таким кодом, пусть даже нормально оформленным не особенно можно разбираться, т.как кроме большой вложенности, есть всякие конструкции, которые выглядят на первый взгляд бессмысленными, как уже говорилось - безусловный выход из while на первой же итерации, или создание какого-то астрономического количества MovieClipов и моментального их уничтожения...


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

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