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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 11.06.2013, 09:16
Vladimir991 вне форума Посмотреть профиль Отправить личное сообщение для Vladimir991 Найти все сообщения от Vladimir991
  № 1  
Ответить с цитированием
Vladimir991

Регистрация: Mar 2012
Сообщений: 28
По умолчанию Взаимодействие кнопки и файла swf

Здравствуйте! Подскажите как реализовать взаимодействие кнопки и игры в формате swf? Создал кнопку, в первом кадре слоя as пишу код:
Код AS3:
btn.buttonMode = true;
btn.addEventListener(MouseEvent.CLICK, btnClicked);
 
function btnClicked(e:MouseEvent):void
{
 var swfRequest:URLRequest = new URLRequest("saper.swf");
 var swfLoader:Loader = new Loader();
 swfLoader.load(swfRequest);
 
 addChild(swfLoader);
 swfLoader.x = stage.stageWidth - 550;
 swfLoader.y = 0;
}
Пишет ошибку: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main()
Направьте на путь пожалуйста.
Вложения
Тип файла: rar Новая папка (4).rar (53.7 Кб, 24 просмотров)

Старый 11.06.2013, 09:55
Vladimir991 вне форума Посмотреть профиль Отправить личное сообщение для Vladimir991 Найти все сообщения от Vladimir991
  № 2  
Ответить с цитированием
Vladimir991

Регистрация: Mar 2012
Сообщений: 28
Причем самое интересное в том, что вставляю любой другой файл swf и код работает как нужно.

Старый 11.06.2013, 10:21
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 3  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Скорее всего в этом файле saper.swf в конструкторе класса Main идет обращение к stage. А ее еще нет на стадии инициализации. Отсюда и ссылка на объект null.
Надо в том файле добавить в конструктор такой код:
Код AS3:
// эти 2 строки в конструктор
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
 
// ну и создать обработчик события
private function init(e:Event = null):void {
     removeEventListener(Event.ADDED_TO_STAGE, init);
     // а тут уже можно смело обращаться к stage
}

Старый 11.06.2013, 10:45
Vladimir991 вне форума Посмотреть профиль Отправить личное сообщение для Vladimir991 Найти все сообщения от Vladimir991
  № 4  
Ответить с цитированием
Vladimir991

Регистрация: Mar 2012
Сообщений: 28
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Скорее всего в этом файле saper.swf в конструкторе класса Main идет обращение к stage. А ее еще нет на стадии инициализации. Отсюда и ссылка на объект null.
Надо в том файле добавить в конструктор такой код:
Код AS3:
// эти 2 строки в конструктор
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
 
// ну и создать обработчик события
private function init(e:Event = null):void {
     removeEventListener(Event.ADDED_TO_STAGE, init);
     // а тут уже можно смело обращаться к stage
}
Вы не могли бы мне помочь. Вот класс main:
Вложения
Тип файла: rar Main.rar (1.5 Кб, 22 просмотров)

Старый 11.06.2013, 10:48
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 5  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
По-моему вот этот код вызывает ошибку
addChild(swfLoader);
swfLoader.x = stage.stageWidth - 550;
swfLoader.y = 0;
Нужно добавить слушатель события на окончание загрузки Event.COMPLETE , а потом в приемнике писать этот код.

Старый 11.06.2013, 10:52
Vladimir991 вне форума Посмотреть профиль Отправить личное сообщение для Vladimir991 Найти все сообщения от Vladimir991
  № 6  
Ответить с цитированием
Vladimir991

Регистрация: Mar 2012
Сообщений: 28
Помогите пожалуйста решить эту проблему. Отблагодарю перечислением на вебмани. Вопрос жизни и смерти.

Старый 11.06.2013, 19:36
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Переделал:
Код AS3:
package 
{
	// импортируем классы
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	// конец импорта классов 
	public class Main extends Sprite
	{
		// переменные класса 
		private const FIELD_W:uint = 9;
		private const FIELD_H:uint = 9;
		private const NUM_MINES:uint = 10;
		private var mineField:Array = new Array();
		private var game_container:Sprite = new Sprite();
		private var tile:tile_movieclip;
		private var timer:Timer = new Timer(1000);
		private var toolbar:toolbar_mc;
		private var gameOver:Boolean = false;
		private var firstClick:Boolean = true;
		// конец записи переменных класса
		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);
			// создаем минное поле 
			for (var i:uint = 0; i < FIELD_H; i++)
			{
				mineField[i] = new Array();
				for (var j:uint = 0; j < FIELD_W; j++)
				{
					mineField[i].push(0);
				}
			}
			// конец создания минного поля
			// создание плиток
			addChild(game_container);
			for (i = 0; i < FIELD_H; i++)
			{
				for (j = 0; j < FIELD_W; j++)
				{
					tile = new tile_movieclip();
					game_container.addChild(tile);
					tile.gotoAndStop(1);
					tile.nrow = i;
					tile.ncol = j;
					tile.buttonMode = true;
					tile.x = 140 + tile.width * j;
					tile.y = 65 + tile.height * i;
					tile.addEventListener(MouseEvent.CLICK, onTileClicked);
				}
			}
			// конец создания плиток
			// управление временем и конец игры
			toolbar = new toolbar_mc();
			addChild(toolbar);
			toolbar.y = stage.stageHeight - toolbar.height;
			timer.start();
			timer.addEventListener(TimerEvent.TIMER, onTick);
			// конец управления временем и окончания игры
		}
		private function tileValue(row,col:uint):int
		{
			if (mineField[row] == undefined || mineField[row][col] == undefined)
			{
				return -1;
			}
			else
			{
				return mineField[row][col];
			}
		}
		private function onTileClicked(e:MouseEvent):void
		{
			if (!gameOver)
			{
				var clicked_tile:tile_movieclip = e.currentTarget as tile_movieclip;
				var clickedRow:uint = clicked_tile.nrow;
				var clickedCol:uint = clicked_tile.ncol;
				if (firstClick)
				{
					firstClick = false;
					// минируем поле
					var placedMines:uint = 0;
					var randomRow,randomCol:uint;
					while (placedMines < NUM_MINES)
					{
						randomRow = Math.floor(Math.random() * FIELD_H);
						randomCol = Math.floor(Math.random() * FIELD_W);
						if (mineField[randomRow][randomCol] == 0)
						{
							if (randomRow != clickedRow || randomCol != clickedCol)
							{ 
								mineField[randomRow][randomCol] = 9; 
								placedMines++; 
							}
						}
					}
					// конец минирования поля
					// помещаем цифры
					for (var i = 0; i < FIELD_H; i++)
					{
						for (var j = 0; j < FIELD_W; j++)
						{
							if (mineField[i][j] == 9)
							{
								for (var ii:int = -1; ii <= 1; ii++)
								{
									for (var jj:int =- 1; jj <= 1; jj++)
									{
										if (ii != 0 || jj != 0)
										{
											if (tileValue(i+ii,j+jj) != 9 && tileValue(i+ii,j+jj) != -1)
											{
												mineField[i + ii][j + jj]++;
											}
										}
									}
								}
							}
						}
					}
					var debugString:String;
 
					for (i = 0; i < FIELD_H; i++)
					{
						debugString = "";
						for (j = 0; j < FIELD_W; j++)
						{
							debugString +=  mineField[i][j] + " ";
						}
						trace(debugString);
					}
					// конец помещения цифр
				}
				var clickedValue:uint = mineField[clickedRow][clickedCol];
				if (e.shiftKey)
				{
					clicked_tile.gotoAndStop(5 - clicked_tile.currentFrame);
				}
				else
				{
					if (clicked_tile.currentFrame == 1)
					{
						clicked_tile.removeEventListener(MouseEvent.CLICK, onTileClicked);
						clicked_tile.buttonMode = false;
						// пустая плитка 
						if (clickedValue == 0)
						{
							floodFill(clickedRow, clickedCol);
						}
						// конец пустой плитки 
						// плитка с цифрой 
						if (clickedValue > 0 && clickedValue < 9)
						{
							clicked_tile.gotoAndStop(2);
							clicked_tile.tile_text.text = clickedValue.toString();
						}
						// конец плитки с цифрой 
						// мина 
						if (clickedValue == 9)
						{
							clicked_tile.gotoAndStop(3);
							timer.removeEventListener(TimerEvent.TIMER, onTick);
							toolbar.message_text.text = "Вы подорвались на мине!";
							gameOver = true;
						}
						// конец мины ;
					}
				}
			}
		}
		private function onTick(e:TimerEvent):void
		{
			toolbar.message_text.text = "Время игры: " + e.target.currentCount + " сек.";
		}
		private function floodFill(row,col:uint):void
		{
			var emptyTile:tile_movieclip;
			emptyTile = game_container.getChildAt(row * FIELD_W + col) as
			tile_movieclip;
			if (emptyTile.currentFrame == 1)
			{
				emptyTile.removeEventListener(MouseEvent.CLICK, onTileClicked);
				emptyTile.buttonMode = false;
				emptyTile.gotoAndStop(2);
				if (mineField[row][col] > 0)
				{
					emptyTile.tile_text.text = mineField[row][col].toString();
				}
				else
				{
					emptyTile.tile_text.text = "";
				}
				if (mineField[row][col] == 0)
				{
					for (var ii:int = -1; ii <= 1; ii++)
					{
						for (var jj:int = -1; jj <= 1; jj++)
						{
							if (ii != 0 || jj != 0)
							{
								if (tileValue(row + ii, col + jj) != 9)
								{
									if (tileValue(row + ii, col + jj) != -1)
									{
										floodFill(row + ii, col + jj);
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
проблему и вызывала эта строка:
Код AS3:
toolbar.y = stage.stageHeight - toolbar.height;
в конструкторе здесь в stage обращаться нельзя

п.с. никаких вебмани не надо. Форум на то и создан, чтобы помогать просто так.

Старый 11.06.2013, 22:05
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 8  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
caseyrya
А чем декомпилировали saper.swf ?
Или после , декомпиляции переписали класс ?

Старый 11.06.2013, 22:22
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Я ничего не декомпилировал. ТС же выложил исходник.

Старый 11.06.2013, 22:27
belv вне форума Посмотреть профиль Отправить личное сообщение для belv Найти все сообщения от belv
  № 10  
Ответить с цитированием
belv
[+1 16.07.13]
[+4 16.07.13]

Регистрация: Oct 2005
Сообщений: 217
Я понял , просто прозевал его, вы 100 % правы .

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

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

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


 


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


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