Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MVC, ООП, AS3 учусь на примере 2D движка (http://www.flasher.ru/forum/showthread.php?t=208872)

Gerbert 14.09.2014 14:38

Цитата:

почему? шар наследует спрайт, чтобы использовать его свойства и методы, в моем случае graphics юзаю. Поконкретней что именно не так.
К сожалению, эта строчка говорит о том, что Вы вообще не в одном ООП языке не разбираетесь.
Объяснить Вам, значит пересказать несколько глав книги.
Покажите мне, где Вы в Shar обращаетесь к graphics унаследованного Sprite?

Babylon 14.09.2014 14:45

ntro123123, совет простой. Читайте форум.Многократно написано и про MVC и ООП на классах. Сэкономите много времени себе и другим. Обсирать г/k неполиткорректно.

ntro123123 14.09.2014 14:57

Цитата:

Покажите мне, где Вы в Shar обращаетесь к graphics унаследованного Sprite?
в конструкторе, я просто думал (и сейчас думаю), что graphics является методом Sprite'a, и его юзать можно только унаследовав класс Sprite, или достаточно было сделать import спрайта?

Ладно, в любом случае спасибо и так читаю потихоньку.

Gerbert 14.09.2014 16:00

Вы неправильно думаете! В шаре Вы создаете объект с типом Sprite и присваиваете свойству _obj.
У этого объекта есть свойство graphics, _object.graphics, к которому Вы и обращаетесь. Но вот только
Ваше незнание какого-то языка вообще не дает уловить суть.
Я не говорю, что Вы не знаете другие языки, возможно в других языках Вы даже что-то делали и это работает...
Но вот саму работу языка Вы не понимаете. Что такое объект и его свойство, это самый-самый примитив.
Вы обязательно это поймете, это просто, но для это нужно читать. И лучше всего, отложить написание кода
на время, чтобы полностью посвятить себя чтению.

Добавлено через 49 минут
Вы упоминали, что мячей может быть больше одного, по этому вот код, как сделал бы я

Код AS3:

package
{
        public class Ball extends Sprite
        {
                public function Ball(radius = 10, color:uint = 0x000000)
                {
                        super.graphics.beginFill(color);
                        super.graphics.drawCcleir(0, 0, radius);
                        super.graphics.endFill();
                }
        }
}

Код AS3:

package
{
        public class BallValue
        {
                public var x:Number;
                public var y:Number;
                public var m:Number;
                public var e:Number;
                public var r:Number;
                public var c:Number;
                public var v:Number;
                public var a:Number;
                public var d:Number;
 
                public var ball:DisplayObject;
 
                public function BallValue()
                {
                        //...
                }
        }
}

Код AS3:

package
{
        public class Movement
        {
                private _allBallValue:Array = [];
 
                public function Movement()
                {
                        // ...
                }
 
                public function setBallValue(ballValue:BallValue):void
                {
                        _allBallValue.push( ballValue );
                }
 
                public function move(x:Number, y:Number)
                {
                        var length:int = _allBallValue.length;
 
                        for(var i:int = 0; i < length; i++)
                        {
                                item = _allBallValue[i];
                                ball = item.ball;
 
                                ball.x += item.e + x;
                                ball.y += item.a + y;
                        }
                }
        }
}

Код AS3:

var ballValue:BallValue = new BallValue();
        ballValue.x = array[0]
        ballValue.x = array[0]
        ballValue.y = array[0]
        ballValue.m = array[0]
        ballValue.e = array[0]
        ballValue.r = array[0]
        ballValue.c = array[0]
        ballValue.v = array[0]
        ballValue.a = array[0]
        ballValue.d = array[0]
 
ballValue.ball = new Ball(ballValue.r, ballValue.c);
 
var movement:Movement = new Movement();
movement.setBallValue( ballValue );

Добавлено через 9 минут
Вот на этом простом примере, можно понять, что я имел ввиду, когда говорил, что модель у Вас выполняет больше дозволенного в ООП.
У меня есть класс мяч, этот класс ТОЛЬКО мяч. Есть класс данные, он ТОЛЬКО данные. Есть класс,
который занимается ТОЛЬКО движением, да и то не движением, а по сути ТОЛЬКО соединяет данные из разных мест.
У него обязанность, ТОЛЬКО соединять данные. Он НЕ ЗАГРУЖАЕТ, НЕ СОЗДАЁТ, НЕ РАССЧИТЫВАЕТ.
Так же разбив все на отдельные классы, в любой момент можно с легкостью что-то поменять, заменить мяч на картинку и т.д.

Добавлено через 14 минут
И тут по сути ещё одного класса не хватает...

Добавлено через 35 минут
Код AS3:

public function createObj(e:Event = null):void
{
        var arr:Array=new Array();
        arr=loadData.data.split(';');
        currentShar=new Shar({ // создали экземпляр шара по параметрам из файла (класс objects/Shar.as)
                        X:arr[0],
                        Y:arr[1],
                        M:arr[2],
                        E:arr[3],
                        R:arr[4],
                        C:arr[5]
                });
        dispatchEvent(new Event('sharCreated'));
}

Метод выше, он вообще монстрообразный. Во первых, в хандлерах писать код, считается плохим тоном.
Во вторых, если Вам понадобится добавить новое свойство, то придется изменять код, а это тоже неправильно.
Сделайте в текстовом файле строку ключ:значение и потом распарсивайте эту строку в обжект типа
Код AS3:

object[prop] = value;


КорДум 15.09.2014 10:30

Цитата:

Во
первых, в хандлерах писать код, считается
плохим тоном.
Что? Зачем вообще нужны они, если в них не писать код? Просто, чтобы были?

Gerbert 15.09.2014 12:42

Цитата:

Что? Зачем вообще нужны они, если в них не писать код? Просто, чтобы были?
Код содержащий логику...

КорДум 15.09.2014 12:48

Цитата:

Сообщение от Gerbert (Сообщение 1171981)
Код содержащий логику...

Где Вы это прочли? Вы, возможно, перепутали с кодом в конструкторе. Тут да, конструктор интерпретатором не кэшируется и каждый раз заново интерпретируется.

Gerbert 15.09.2014 12:59

Я не помню где об этом читал и почему нельзя писать, но точно уверен, что читал об этом неоднократно
и если бы это были сомнительные статьи без объяснений, то я бы не запомнил... Хотя я и не помню..
Как в следующий раз увижу, то покажу Вам.

А объясните, что значит "интерпретирует заново"? Это если я создам сто экземпляров класса, то после компиляции
ссылки будут идти на методы класса ( как если бы они были статические ), а конструкторов создастся столько же
сколько и инстенсов?

КорДум 15.09.2014 16:13

Интерпретатор снова берет байткод конструктора и снова его переводит в понятные ему команды. Каждый раз, в отличие от методов, которые "кэшируются" при первом обращении.

Babylon 15.09.2014 16:36

Я бы добавил, что передавать параметры через конструктор тоже не очень правильно, хотя и красиво:)


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

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