#flash #actionscript-3
#flash #actionscript-3
Вопрос:
Я создал некоторый код в Actionscript 3, следуя различным руководствам, который представляет собой простой медиаплеер, связанный с XML-файлом для получения исходной информации. Я обнаружил, что мне нужно использовать классы actionscript для кода, и задался вопросом, есть ли у них способ преобразовать его в классы или кто-нибудь знает руководство по actionscript 3 для создания медиаплеера на основе классов? Мой код приведен ниже:
import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
var loader:URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE,xmlloaded);
var xml:XML = new XML();
var amountofvid:Number=0;
var currentvideo:Number=0;
btn_prev.addEventListener (MouseEvent.CLICK, prevvid);
btn_next.addEventListener (MouseEvent.CLICK, nextvid);
loader.load(new URLRequest('videos.xml'));
function xmlloaded (e:Event) {
xml=XML(e.target.data);
amountofvid=xml.video.length ()-1;
changevid();
}
function nextvid (e:Event) {
currentvideo ;
changevid();
}
function prevvid (e:Event) {
currentvideo--;
changevid();
}
function changevid():void {
var cv:Number=Math.abs(currentvideo);
if (cv>amountofvid) {
currentvideo=cv=0;
}
if (currentvideo<0) {
currentvideo=cv=amountofvid;
}
vid.source = xml.video.@src[cv];
title.text = xml.video.@title[cv];
}
Есть идеи?
Обновление, спасибо за помощь, ребята, оба помогли нагрузкам, хотелось бы, чтобы я мог подобрать вам обоим решаемые ответы.
Ответ №1:
Отойти от временной шкалы и принять некоторую базовую структуру ООП — это лучшее, что вы можете сделать как начинающий разработчик flash, программист или прилежный студент. Это может быть сложная тема, но чем раньше вы начнете разбираться в ней, тем лучше. Поиск в Google все объяснит.
В любом случае — у вас есть большая часть того, что вам нужно для записи этой процедуры в класс. Ознакомьтесь с комментариями для краткого объяснения:
// package encloses the class and identifies its scope
package you.com.app
{
//imports
import flash.display.MovieClip;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
import flash.text.TextField;
/**
* ... declare your class, whatever it may extend and any interfaces
*/
public class MediaPlayer extends Sprite
{
// variables now include an access modifier to define their scope (private, here)
private var xml :XML;
private var amountofvid :Number=0;
private var currentvideo :Number=0;
private var loader :URLLoader;
private var vid :MovieClip; //or video component or whatever
private var title :TextField;
private var btn_prev :SimpleButton;
private var btn_next :SimpleButton;
private var currentvideo :int;
/**
* constructor - must match class name. returns statement omitted
*/
public function MediaPlayer()
{
// call superclass
super();
//initialize procedure
init();
}
private function init():void
{
//build display list
assembleDisplayObjects();
//grab data
retreiveData();
}
private function retreiveData():void
{
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE, xmlloaded);
loader.load(new URLRequest('videos.xml'));
}
private function xmlloaded (e:Event):void
{
xml = new XML();
xml=XML(e.target.data);
amountofvid=xml.video.length ()-1;
changevid();
addEventHandlers(); //when data has loaded, activate clickables
}
private function assembleDisplayObjects():void
{
// create or instantiate display objects, and into the display list
// adjust x,y values as needed
vid = new MovieClip();
this.addChild(vid);
title = new TextField();
this.addChild(title);
btn_next = new SimpleButton();
this.addChild(btn_next);
btn_prev = new SimpleButton();
this.addChild(btn_prev);
}
private function addEventHandlers():void
{
//centralized event listener control
btn_prev.addEventListener (MouseEvent.CLICK, prevvid);
btn_next.addEventListener (MouseEvent.CLICK, nextvid);
}
private function nextvid (e:Event):void
{
currentvideo ;
changevid();
}
private function prevvid (e:Event):void
{
currentvideo--;
changevid();
}
private function changevid():void
{
var cv:Number=Math.abs(currentvideo);
if (cv>amountofvid) {
currentvideo=cv=0;
}
if (currentvideo<0) {
currentvideo=cv=amountofvid;
}
vid.source = xml.video.@src[cv];
title.text = xml.video.@title[cv];
}
}
}
Я не тестировал это, и, вероятно, это не безошибочно, но это базовая структура пакета / класса, и она должна заставить вас работать.
Я бы настоятельно рекомендовал книгу Шупе / Россерса «Learning Actionscript 3.0» в качестве отличного введения в тему и книгу Мука «Essential Actionscript 3.0» в качестве исчерпывающего справочника. И Google. Много Google.
Надеюсь, это поможет.
Комментарии:
1. Привет, Bosworth99, спасибо, что перезвонил мне, я в Великобритании, поэтому спал, когда ты ответил 🙂 У меня возникли некоторые ошибки при запуске кода, и я немного погуглил, чтобы разобраться с этим, но не могу понять, как исправить проблемы. Не удалось загрузить файлы с markhaynes.me/flash не могли бы вы для меня посмотреть, что происходит не так?
2. На самом деле все заработало, я не прав 🙂 Просто по какой-то причине застрял в названии видео, которое появляется ido, а не в названии видео : S
3. Другое обновление по какой-то причине из всего алфавита в нем будут отображаться только буквы adgilno.
4. Рад, что вы разобрались с этим! Приветствую
Ответ №2:
вот быстрое преобразование вашего кода в класс.
package {
import flash.net.URLLoader;
import flash.events.Event;
import flash.net.URLRequest;
public class mediaPlayer extends Sprite {
private var loader:URLLoader;
private var xml:XML;
private var amountofvid:Number=0;
private var currentvideo:Number=0;
public function mediaPlayer() {
loader = new URLLoader();
loader.addEventListener(Event.COMPLETE,xmlloaded);
btn_prev.addEventListener (MouseEvent.CLICK, prevvid);
btn_next.addEventListener (MouseEvent.CLICK, nextvid);
loader.load(new URLRequest('videos.xml'));
}
private function xmlloaded (e:Event) {
xml = new XML();
xml=XML(e.target.data);
amountofvid=xml.video.length()-1;
changevid();
}
public function nextvid (e:Event) {
currentvideo ;
changevid();
}
public function prevvid (e:Event) {
currentvideo--;
changevid();
}
private function changevid():void {
var cv:Number=Math.abs(currentvideo);
if (cv>amountofvid) {
currentvideo=cv=0;
}
if (currentvideo<0) {
currentvideo=cv=amountofvid;
}
vid.source = xml.video.@src[cv];
title.text = xml.video.@title[cv];
}
}
}
Я предполагал, что он будет связан со спрайтом, поэтому я расширил его как таковой. Если вы хотите связать класс с чем-то другим, вам потребуется изменить эту строку :
public class mediaPlayer extends Sprite {
Я сохранил оба метода nextvid и prevvid общедоступными (что означает, что вы можете получить к ним доступ с другого уровня, например, родительского), а другие ваши методы и переменные закрытыми (доступными только с этого уровня). Возможно, вы захотите изменить это в соответствии с вашими потребностями.
В качестве начального руководства о том, как работают классы, я бы предложил это на GoToAndLearn.com http://gotoandlearn.com/play.php?id=43
m.
Комментарии:
1. Привет, спасибо за твою помощь, приятель, в конце концов добрался, просто возникла проблема с названием, по какой-то причине название заголовка для каждого видео отображается как ido?