Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 14.10.2008, 13:07
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 1  
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
По умолчанию Создание кнопок програмно

Появилась задача сгенерировать список кадров ролика с возможностью переходить к выбранному. Список создаётся на основе многомерного массива в котором указан номер кадра, название и другие данные относящиеся к содержимому кадра. Т.к. до этого подобным не занимался то решил разобраться на простом примере из сборника рецептов ActionScript 3.0, но пример хоть ошибок не выдаёт кнопку тоже не показывает. Если кто в этом разбирается скажите в чём ошибка и как она исправляется.

Код вписан в верхний слой первого кадра:
Код:
import flash.display.*; 
import flash.events.*; 

function SimpleButtonDemo() { 
// Создаем простую кнопку и задаем ее местоположение 
var button2:SimpleButton = new SimpleButton(); 
button2.x = 100; 
button2.y = 100; 
// Создаем разные состояния кнопки. 
// Используя вспомогательный метод, 
// создаем круги разных цветов 
button2.upState = createCircle(0x00FF00, 90); 
button2.overState = createCircle( 0xFFFFFF, 16 ); 
button2.downState = createCircle( 0xCCCCCC, 15 ); 
button2.hitTestState = button2.upState; 
// Добавляем слушатель события click, чтобы знать, 
// когда пользователь щелкает кнопку мыши 
button2.addEventListener( MouseEvent.CLICK, handleClick ); 
// Наконец, добавляем кнопку з список отображения 
addChild(button2); 
} 
// Вспомогательная функция для создания круга 
// заданного цвета и радиуса 
function createCircle( color:uint, radius:Number ):Shape {
var circle:Shape = new Shape(); 
circle.graphics.lineStyle( 1, 0x000000 ); 
circle.graphics.beginFill( color ); 
circle.graphics.drawCircle( 0, 0, radius ); 
circle.graphics.endFill(); 
return circle; 
} 
// Обработчик события, вызываемый при нажатии кнопки 
function handleClick( event:MouseEvent ):void { 
trace( "Мышь щелкнула по кнопке" ); 
}
P.S. Если для решения основной задачи есть более простые решения нежели создание ряда из пары сотен кнопок, то подскажите

Старый 14.10.2008, 15:17
Xpb7 вне форума Посмотреть профиль Отправить личное сообщение для Xpb7 Найти все сообщения от Xpb7
  № 2  
Xpb7

Регистрация: Jul 2008
Адрес: Рига
Сообщений: 176
Это всего лишь отрезок кода, пример реализации описанного в книге, а не полный рабочий код вашего документа.
Там даже класс не описан!
Он не может не выдавать ошибок, т.к. если его вставить в [anyname].as, и указать anyname как Docuemnt class (надеюсь вы понимаете о чем я), вы удидвитесь количеству ошибок.
Учите флэш с самого начала, а не с рецептов.

Старый 14.10.2008, 15:32
Firexel вне форума Посмотреть профиль Отправить личное сообщение для Firexel Найти все сообщения от Firexel
  № 3  
Firexel

Регистрация: Jan 2008
Сообщений: 28
Судя по коду ваша функция SimpleButtonDemo() - это конструктор класса SimpleButtonDemo, который наследует MovieClip или Sprite.

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

Примерно так:

Код:
package main {
	import flash.display.*; 
	import flash.events.*; 
	
	public class SimpleButtonDemo extends Sprite{
		// весь ваш код сюда
	}
}

Старый 14.10.2008, 17:16
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 4  
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Это ж код в первом кадре
его надо дописать
Код:
SimpleButtonDemo();
И кнопка появится

Старый 14.10.2008, 17:25
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 5  
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
Цитата:
Сообщение от Alex Lexcuk Посмотреть сообщение
Это ж код в первом кадре
его надо дописать
Код:
SimpleButtonDemo();
И кнопка появится
Alex Lexcuk, просто волшебник

Цитата:
Сообщение от Xpb7
Это всего лишь отрезок кода, пример реализации описанного в книге, а не полный рабочий код вашего документа.
Там даже класс не описан!
Он не может не выдавать ошибок, т.к. если его вставить в [anyname].as, и указать anyname как Docuemnt class (надеюсь вы понимаете о чем я), вы удидвитесь количеству ошибок.
Учите флэш с самого начала, а не с рецептов.
вобщем-то понимаю. но не знаю где это прописывается. Я конечно начал бы с начала, но покачто для меня доступные источники это сборник рецептов и flasher.ru

Firexel Спасибо, но примерно из такой конструкции я его и достал.

Старый 16.10.2008, 13:15
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 6  
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
Почитал про то как правильно писать на AS3.
Решил реализовать один пример кода по созданию кнопок программно и с надписями.
В папке main разместил файлы RectangleButton.as и SimpleButtonDemo.as, во fla файле прописал класс документа "main.RectangleButton".
Но при тестировании выводиться ошибки:
Цитата:
5000: В класс "main.RectangleButton" должен входить подкласс "flash.display.MovieClip", так как он связывается с символом такого же типа в библиотеке.
1180: Call to a possibly undefined method addFrameScript.
Впрочем последняя пропадает если исправить
Код:
package main {
на
Код:
package {
хотя мне кажется что это не совсем верное решение.
При поиске что за ошибка 5000 и как с ней бороться нашёл на форуме советы:
Цитата:
Сообщение от nuway Посмотреть сообщение
как и пишется в ошибке, открои класс com\editor\Хистри и там добавь

import flash.display.MovieClip;

public class History extends MovieClip
И тему Error 5000 Но первое не помогло, а насчёт второго я не понял.

Вот интересно как сделать чтобы всё работало.

RectangleButton.as
Код:
package main {
  import flash.display.*;
  import flash.text.*;
 // import flash.display.MovieClip;
  import flash.filters.DropShadowFilter;
  public class RectangleButton extends SimpleButton {
    // The text to appear on the button
    private var _text:String;
    // Save the width and height of the rectangle
    private var _width:Number;
    private var _height:Number;
    
    public function RectangleButton( text:String, width:Number, height:Number ) {
      // Save the values to use them to create the button states
      _text = text;
      _width = width;
      _height = height;
      
      // Create the button states based on width, height, and text value
      upState = createUpState();
      overState = createOverState();
      downState = createDownState();
	  hitTestState = upState;
    }
  
    // Create the display object for the button's up state
    private function createUpState():Sprite {
      var sprite:Sprite = new Sprite();
      
      var background:Shape = createdColoredRectangle( 0x33FF66 );
      var textField:TextField = createTextField( false );
          
      sprite.addChild( background );
      sprite.addChild( textField );
      return sprite;
    }
    
    // Create the display object for the button's up state
    private function createOverState():Sprite {
      var sprite:Sprite = new Sprite();
      
      var background:Shape = createdColoredRectangle( 0x70FF94 );
      var textField:TextField = createTextField( false );
            
      sprite.addChild( background );
      sprite.addChild( textField );
      return sprite;
    }
    
    // Create the display object for the button's down state
    private function createDownState():Sprite {
      var sprite:Sprite = new Sprite();
      
      var background:Shape = createdColoredRectangle( 0xCCCCCC );
      var textField:TextField = createTextField( true );
      
      sprite.addChild( background );
      sprite.addChild( textField );
      
      return sprite;
    }
    
    // Create a rounded rectangle with a specific fill color
    private function createdColoredRectangle( color:uint ):Shape {
      var rect:Shape = new Shape();
      rect.graphics.lineStyle( 1, 0x000000 );
      rect.graphics.beginFill( color );
      rect.graphics.drawRoundRect( 0, 0, _width, _height, 15 );
      rect.graphics.endFill();
      rect.filters = [ new DropShadowFilter( 2 ) ];
      return rect;
    }
    
    // Create the text field to display the text of the button
	 private function createTextField( downState:Boolean ):TextField {
      var textField:TextField = new TextField();
      textField.text = _text;
      textField.width = _width;
            
      // Center the text horizontally
      var format:TextFormat = new TextFormat();
      format.align = TextFormatAlign.CENTER;
      textField.setTextFormat( format );
      
      // Center the text vertically
      textField.y = ( _height - textField.textHeight ) / 2;
      textField.y -= 2;  // Subtract 2 pixels to adjust for offset
      
      // The down state places the text down and to the right
      // further than the other states
      if ( downState ) {
        textField.x += 1;
        textField.y += 1;
      }
      
      return textField;
    }
  }
}
SimpleButtonDemo.as
Код:
package main {
  import flash.display.*;
  public class SimpleButtonDemo extends Sprite {
    public function SimpleButtonDemo() {
      
      // Create three rectangular buttons with different text and 
      // different sizes, and place them at various locations within 
      // the movie
      
      var button1:RectangleButton = new RectangleButton( "Button 1", 60, 100 );
      button1.x = 20;
      button1.y = 20;
      
      var button2:RectangleButton = new RectangleButton( "Button 2", 80, 30 );
      button2.x = 90;
      button2.y = 20;
      
      var button3:RectangleButton = new RectangleButton( "Button 3", 100, 40 );
      button3.x = 100;
      button3.y = 60;
	  // Add the buttons to the display list so they appear on-screen
      addChild( button1 );
      addChild( button2 );
      addChild( button3 );
    }
  }
}

Старый 16.10.2008, 16:03
Xpb7 вне форума Посмотреть профиль Отправить личное сообщение для Xpb7 Найти все сообщения от Xpb7
  № 7  
Xpb7

Регистрация: Jul 2008
Адрес: Рига
Сообщений: 176
Уважаемый, вы не знаете азов. Отложите эти 100 рецептов и прочтите нормальную книгу по as3. Очень советую, Essential ActionScript 3.0 | O'Reilly Media. Тогда вам всё станет ясно, и не будут возникать такие глупые вопросы.
Document class, являясь графическим объектом по натуре обязан напрямую наследоваться (если мне не изменяет память) либо от MovieClip, либо от Sprite, либо от Shape. То есть у вас должен быть третий класс, характеризующий Document class, который создаст вашу кнопку как-нибудь так:

Код:
var r: RectangleButton = new RectangleButton();
addChild(r);

Старый 16.10.2008, 16:57
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 8  
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
Цитата:
Сообщение от Xpb7 Посмотреть сообщение
Document class, являясь графическим объектом по натуре обязан напрямую наследоваться (если мне не изменяет память) либо от MovieClip, либо от Sprite, либо от Shape. То есть у вас должен быть третий класс, характеризующий Document class, который создаст вашу кнопку как-нибудь так:
Код:
var r: RectangleButton = new RectangleButton();
addChild(r);
гм, но ведь в SimpleButtonDemo это же и происходит... и он как раз от Sprite
Вобщем если его прописать во fla файле то ошибки 5000 не возникает, но по прежнему что то про метод addFrameScript пишут.
Цитата:
1180: Call to a possibly undefined method addFrameScript.
Пойду поищу "Essential ActionScript 3.0 | O'Reilly Media" на русском.

Старый 16.10.2008, 17:03
Xpb7 вне форума Посмотреть профиль Отправить личное сообщение для Xpb7 Найти все сообщения от Xpb7
  № 9  
Xpb7

Регистрация: Jul 2008
Адрес: Рига
Сообщений: 176
Ещё раз:
Цитата:
Document class, являясь графическим объектом по натуре обязан напрямую наследоваться (если мне не изменяет память) либо от MovieClip, либо от Sprite, либо от Shape. То есть у вас должен быть третий класс, характеризующий Document class, который создаст вашу кнопку как-нибудь так:
Essential ActionScript 3.0 | O'Reilly Media на русском вряд ли найдете.

Старый 16.10.2008, 17:06
Орец вне форума Посмотреть профиль Отправить личное сообщение для Орец Найти все сообщения от Орец
  № 10  
Орец
[+4 29.10.08]
[+4 31.10.08]

Регистрация: Jan 2008
Сообщений: 38
гм, а на других языках мне книжка не поможет.

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 01:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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