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

Nyb 08.03.2017 20:38

Не могу воспроизвести обект на дисплей
 
Я полний Нуб, начал читать книжку Колина Мука, решил сразу начать писать програми в класах, но когда решил написать свой первий код столкнулся с проблемой(указана в теме).Не игнорьте, могу помочь нарисовать 2д пиксель арт для вашего личного проекта.


Код AS3:

package{
        import flash.display.MovieClip;
        import flash.events.Event;
        public class Bird extends MovieClip{
                public var bird:Bird;
                public function Bird(){
                        bird = new Bird();
                        addChild(bird);
                        bird.addEventListener(Event.ENTER_FRAME, Enter);
                }
                public Enter(e:Event):void{
                        bird.y++;
                }
        }
}


Жень Шень 08.03.2017 20:59

Сразу бросилось в глаза - пропущено function в обработчике события


undefined 08.03.2017 21:12

где-то я этот акцент уже слышал :)

ZackMercury 08.03.2017 21:12

Что это? Экземпляр Bird в классе Bird?)
Ві явно не с того места читать книжку начали.

Wolsh 08.03.2017 23:58

Код AS3:

public function Bird(){ // это называется Конструктор. Он создает новый экземпляр класса Bird
bird = new Bird(); // так вызывается конструктор класса Bird

То есть, внутри конструктора вы вызываете этот конструктор. Который вызывает конструктор, вызывающий конструктор.

Добавлено через 26 минут
Классы нужны для того, чтобы выделить каждый объект программы в отдельную сущность. Это вот — Птица. Написав ее класс, можно будет создавать много однотипных экземпляров этой самой Птицы, которые будут вести себя одинаково. Создавать где? В других классах, в их экземплярах. И есть один класс, типа самый главный, называется Класс Документа, или Документ-класс, обычно его именуют Main. Когда вы запускаете свой ролик в флэш-плеере, первым делом создается и размещается на сцене экземпляр этого Документ-класса. То есть с него все начинается. Поэтому сначала надо написать этот класс Мейн и указать его в редакторе как Документ-класс (там есть соответствующая форма).
И вот в этом Мейне вы уже начинаете что-то лепить из других классов. Например, создаете экземпляр Птицы, добавляете его в отображение и начинаете двигать.
Если эта Птица сама по себе ничего не делает, не расчитывает и ничем не управляет, а представляет из себя просто муви-клип с анимацией махания крыльями, то по-сути писать то ничего и не надо в ее классе, достаточно указать класс для ролика в библиотеке. Вам стоило начать с этого — просто написать класс Мейн, по-сути тот же код, что Вы писали в кадре, с небольшими особенностями оформления его как Класса. А потом уже думать, какой бы ОСМЫСЛЕННЫЙ класс написать еще. То есть такой, чтобы было о чем писать))))) Чтобы он что-то делал, а не просто "был", добавлялся на сцену и там красовался.

Добавлено через 45 минут
В каком случае был бы смысл писать класс Bird?
Если бы у птицы были параметры. Например, можно было бы создавать птиц разного цвета. Или создавать разных птиц, указывая их название в параметре конструктора. То есть, использование класса выглядело бы так (код в Мейне):
Код AS3:

var eagle:Bird = new Bird("Eagle"); // орел
this.addChild(eagle);
var owl:Bird = new Bird("Owl"); // сова
this.addChild(owl);

Вот тогда в классе Птица, в конструкторе, было бы что-то похожее по смыслу на то, что написали Вы: нужно было бы найти ролик соответствующей птицы и добавить его в отображение данного экземпляра Птицы:
Код AS3:

public function Bird(type:String) {
 if(type == "Eagle") this.addChild(new Eagle()); // берем из библиотеки ролик класса Eagle
 if(type == "Owl") this.addChild(new Owl()); // берем из библиотеки ролик класса Owl
}

Не самый лучший пример использования классов, но хотя бы демонстрирующий, зачем они нужны.
У вас будет два экземпляра класса Bird, выглядящие по-разному, но абсолютно одинаковые для программы.

Этот прием называется Композиция (или агрегация) — когда экземпляр одного класса добавляет в себя экземпляр другого.
Противоположный композиции прием называется Наследование — это если бы классы Орел и Сова наследовали (расширяли, extends) класс Птица. Для роликов, нарисованных в графическом редакторе Adobe Flash, такое невозможно — они могут расширять только МувиКлип, поэтому два ролика с разными изображениями птиц не могут расширять один класс Птица. Тогда есть смысл использовать Композицию.

ZackMercury 09.03.2017 00:54

Может, дойдёт так
Код AS3:

package com.zackmercury.example
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
 
        /**
        * ...
        * @author ZackMercury
        */

        public class Bird extends Sprite
        {
                private static const GRAVITY:Number = 9.80665;//постоянная ускорения свободного падения на поверхности Земли
 
                private var name:String = "Unnamed"; //имя птицы
                private var mass:Number = 1; //масса птицы(kg)
                private var velocity:Point = new Point(0, 0); //вектор скорости, стандартный компонент любой игры с даже простейшей физикой
                private var netForce:Point = new Point(0, 0); //равнодействующая сил, из физики = сумме всех сил, воздействующих на предмет, пропорциональна ускорению [F] = Newtons(kg * m / (s^2))
                private var sprite:Bitmap; //здесь будет храниться картинка птицы, в будущем она может передаваться в конструктор.
                private var isAffectedByGravity = true;
 
                public function Bird()
                {
                        this.addEventListener(Event.ADDED_TO_STAGE, init); //дождёмся добавления на сцену
                }
 
                private function init(e:Event):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);//и удалим слушатель добавления на сцену
                        //здесь наша птица создана
 
                        //устанавливаем равнодействующую в вектор гравитации(значит, больше ничего не будет воздействовать на птицу в текущей версии)
                        if(isAffectedByGravity) netForce.y -= GRAVITY * mass;
                        addChild(sprite);
                        addEventListener(Event.ENTER_FRAME, update);
                }
 
                private function update():void
                {
                        //прибавляем к координатам птицы вектор скорости
                        x += velocity.x;
                        y += velocity.y;
 
                        //прибавляем к вектору скорости вектор ускорения(равнодействующую сил, делённую на массу, согласно второму закону Ньютона)
                        velocity.x += netForce.x / mass;
                        velocity.y += netForce.y / mass;
                }
 
        }
 
}

И, хоть приведённый выше код может использоваться в игре, его нужно дописать так, чтобы сколько бы птиц мы не создавали, мы могли бы управлять отдельно каждой снаружи класса(в том самом Document Class(Main)), чтобы сделать их независимыми друг от друга.
Для этого в конструктор передаются аргументы.
https://pp.userapi.com/c637425/v6374...VIxBUreo0U.jpg
Что это даёт? А вот, что:
Код AS3:

package com.zackmercury.example
{
        import flash.display.Sprite;
        import flash.events.Event;
        /**
        * ...
        * @author ZackMercury
        */

        public class Main extends Sprite
        {
 
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        var jackTheBird:Bird = new Bird("Jack", 1, 0, 0, true);
                        var melanieTheBird:Bird = new Bird("Melanie", 5, 2, 2, true);
                        addChild(jackTheBird);
                        addChild(melanieTheBird);
                }
        }
}

Физическая реализация недоделана, ибо она считает кадры как секунды, но это вы и сами сможете исправить, если начнёте наконец читать книгу, а не листать. А, и ещё неплохо бы конвертировать систему координат в нужную, ибо пиксели тут считаются за метры, а это не то, что нам нужно, а также во флеше ось Y инвертирована в отличии от общепринятой декартовой системы. В остальном код птицы будет выглядеть примерно так.
Но опять же, это пока вы не дочитаете до наследования. Затем код придётся переписывать.


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

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