Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   сравнение Object с INT - Object to string (http://www.flasher.ru/forum/showthread.php?t=209774)

hellopaso 19.12.2014 12:52

сравнение Object с INT - Object to string
 
привет!

у меня игра в стиле Math-3
Код AS3:

private var array:Array = [];
                private static const EMPTY_FIELD:int = 0;
 
                private function createArray():void {
 
                        const COLS:int = 10;
                        const ROWS:int = 10;
 
                        for (var i:int = 0; i < COLS; i++){
 
                                array[i] = [];
 
                                for (var l:int = 0; l < ROWS; l++){
 
                                        array[i][l] = Math.random() > .5 ? EMPTY_FIELD  : new SomeObject();
 
 
                                }
 
                        }
 
                        private function check():void {
 
                                for (var i:int = 0; i < COLS; i++){
 
                                        for (var l:int = 0; l < ROWS; l++){
 
                                                if (array[i][l] == EMPTY_FIELD){ // этот фрагмент вызывает Object.toString()
 
                                                        trace("empty!");
                                                }
 
                                                else {
 
                                                        trace("object!")
 
                                                }
                                        }
                                }
                        }
                }

я вызываю check() очень часто так что получается много объектов Strng.

как этого избежать?

in4core 19.12.2014 13:10

Хотел дать отверт по решению через IndexOf. Но посмотрев внимательно, не понял, для чего вообще вызывается функция чек ? Когда она вызывается, при нажатии на кнопку или при нажатии на элемент... неясно

hellopaso 19.12.2014 13:14

Код AS3:

addEventListener(Event.ENTER_FRAME, loop);
 
 
private function loop(e:Event):void {
 
check();
 
}

то есть вызывается чтобы проверить есть свободное место (EMPTY) или нет (Object)

in4core 19.12.2014 13:22

зачем в интер_фрейме то чекать? Я так понимаю в состоянии стояния все равно ничего не происходит. Чекать после действий. И 1 раз наверное.
Ну а вообще так, как я и сказал
Код AS3:

if(array.indexOf(EMPTY) != "-1") trace("object")

Добавлено через 1 минуту
P.s. да и я бы избавился от [i][l] вообще. Двумерный массив можно держать в голове, как говорится - для себя представляя его одномерным, так проще понимать

samana 19.12.2014 14:20

Цитата:

Сообщение от hellopaso (Сообщение 1176576)
я вызываю check() очень часто так что получается много объектов Strng.

Вы ведь в методе check пробегаетесь по всему массиву, а пустых элементов в нём действительно может быть довольно много, ведь вы сами задали условие 50/50
Код AS3:

array[i][l] = Math.random() > .5 ? EMPTY_FIELD  : new SomeObject();


hellopaso 19.12.2014 14:43

1) двухмерный массив обязательно

2) check() в каждом frame обязательно

получается што этот способ лучшее
Код AS3:

 
private function check():void {
 
                                for (var i:int = 0; i < COLS; i++){
 
                                        for (var l:int = 0; l < ROWS; l++){
 
                                                if (array[i][l] is int){
 
                                                        var myInt:int = array[i][l];
 
                                                        if (myInt == EMPTY){
 
                                                                trace("empty!");
                                                          }
 
                                                }
 
                                                else {
 
                                                        trace("object!")
 
                                                }
                                        }
                                }
                        }


samana 19.12.2014 14:50

Этот код не лучше, он в общем-то такой же почти.
Объясните пожалуйста, для чего вам метод check? Вы хотите посчитать кол-во свободных мест на всём поле? Или хотите узнать какие клетки пустые? Или вы хотите узнать состояние конкретной клетки?
В данный момент, ваш код просто выведет кол-во пустых клеток.

Код AS3:

 var myInt:int = array[i][l];

Сомневаюсь, что это правильно, ведь если объект в массиве существует, то приведение его к int должно вызвать ошибку.

hellopaso 19.12.2014 15:53

а какой check() по вашему лучше по производительности?

проблема в том что первый создает много объектов String

in4core 19.12.2014 16:04

Цитата:

а какой check() по вашему лучше по производительности?

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

dimarik 20.12.2014 12:21

А так?
Код AS3:

if (array[i][l] === EMPTY_FIELD){


alatar 21.12.2014 19:03

Зачем вообще пихать в массив с объектами целые числа?
Код AS3:

private var _field:Vector.<Vector.<SomeObject>>;
 
private function createField():void
{
        const cols:int = 10;
        const rows:int = 10;
 
        _field = new Vector.<Vector.<SomeObject>>(cols, true);
 
        for (var i:int = 0; i < cols; i++)
        {
                _field[i] = new Vector.<SomeObject>(rows, true);
 
                for (var j:int = 0; j < ROWS; j++)
                {
                        if (Math.random() > .5)
                        {
                                _field[i][j] = new SomeObject();
                        }
                }
        }
}
 
private function check():void
{
        for (var i:int = 0; i < _field.length; i++)
        {       
                for (var j:int = 0; j < _field[i].length; j++)
                {
                        if (field[i][j])
                        {
                                trace("not empty");
                        }
                        else
                        {
                                trace("empty");
                        }
                }
        }
}



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

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