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

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

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

Регистрация: May 2016
Сообщений: 5
Cool Сохранение отсортированного массива

Привет всем!
Пытаюсь сделать игрушку. Короче, есть массив с артефактами:
Код AS1/AS2:
private var artefacts:Array = [
	{артефакт №1 и его свойства}
	{артефакт №2 и его свойства}
	{артефакт №3 и его свойства}
	{артефакт №4 и его свойства}
]
Если игрок зашел в игру первый раз, то у нас должны перемешаться элементы массива. Если нет, то мы должны загрузить перемешанный массив. Для этого я пытался сделать второй массив который должен сохранять новую последовательность артефактов. А там где стоит комментарий, сделать обратную процедуру с загрузкой. Но как бы я не старался, сыпались ошибки.. (вроде Ошибка типа Coercion: невозможно преобразовать Object@477d509 в flash.display.DisplayObject.)
Код AS3:
private var so:SharedObject = SharedObject.getLocal('save');	
function saveRandomArt() {
	so.data.art_obj = artefacts;
	so.flush();
}
 
 
var art_list_sorted:Array = [];
for (var id in artefacts) {
	art_list_sorted.push(artefacts[id]);
	artefacts[id].id = id;
}
for (var a in artefacts) {
	var id = artefacts[a].id;
	var obj = artefacts[id];
}
function shuffle(artefacts) {
	for (var i=0; i<artefacts.length; i++) {
		var index = int(Math.random()*artefacts.length);
		artefacts.push(artefacts[index]);
		artefacts.splice(index, 1);
	}
}		
if (so.data.art_obj) {
	//(здесь надо загрузить артефакты)
	//artefacts = so.data.art_obj; (не работает, ниже где вызывается artefacts[0] выдает ошибку
}else {
	shuffle(artefacts);
	saveRandomArt();
}
Умоляю, помогите

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

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Не знаю, что у тебя именно не работает, но у меня, перемешивание, сохранение и загрузка массива по принципу "Если игрок зашел в игру первый раз, то у нас должны перемешаться элементы массива. Если нет, то мы должны загрузить перемешанный массив." работает и без второго массива.

Что делает второй цикл? Для меня он показался вообще бессмысленным.
Код AS3:
var art_list_sorted:Array = [];
for (var id in artefacts) {
	art_list_sorted.push(artefacts[id]);
	artefacts[id].id = id;
}
for (var a in artefacts) {
	var id = artefacts[a].id;
	var obj = artefacts[id];
}
Если компилятор выдает ошибку типа Coercion: невозможно преобразовать Object@477d509 в flash.display.DisplayObject., возможно ты пытаешься сделать как-то так:

Код AS3:
addChild(artefacts[0]);
Если сделать трейс типа artefacts[0] то он выдаст тебе:

Код AS3:
trace(typeof (artefacts[0]), " Type of element"); //object
а object на сцену добавлять нельзя.

Чтобы добавить твой артефакт на сцену с параметрами из массива артефактов, нужно сделать примерно следующее:

Код AS3:
for(var i:int = 0;i < artefacts.length;i++)
{
     artefact = new Artefact(); // класс который унаследован от Sprite, MovieClip и т д...
     artefact.id = artefacts[i].id;
     artefact.color = artefacts[i].color;
     artefact.artName = artefacts[i].name;
     addChild(artefact);
 }
Вот мой код:
Код AS3:
 
package {
import flash.display.Sprite;
import flash.net.SharedObject;
 
public class Main extends Sprite{
 
    private var so:SharedObject = SharedObject.getLocal('save');
    private var artefacts:Array = [{name:"art1", color:"red",id:0},{name:"art2", color:"green",id:1},{name:"art3", color:"white",id:2},{name:"art4", color:"yellow",id:3},{name:"art5", color:"black",id:4}];
 
    public function Main() {
 
        trace(JSON.stringify(so.data.art_obj), " First start or not")
 
        if (so.data.art_obj) {
            //(здесь надо загрузить артефакты)
            artefacts = so.data.art_obj;
            trace(artefacts[0], " First element")
        }else {
            shuffle(artefacts);
            saveRandomArt();
        }
 
    }
 
    private function saveRandomArt():void {
        so.data.art_obj = artefacts;
        so.flush();
    }
 
    private function shuffle(artefacts):void {
        trace(JSON.stringify(artefacts))
        for (var i:int = 0; i<artefacts.length; i++) {
            var index:int = int(Math.random()*artefacts.length);
            artefacts.push(artefacts[index]);
            artefacts.splice(index, 1);
        }
        trace(JSON.stringify(artefacts))
    }
 
}
}
И еще, лично мое мнение, всегда указывай типы переменных и типы данных возвращаемых фунциями.
__________________
Не стыдно спросить, стыдно не знать !

Старый 03.05.2016, 22:27
vadim2007 вне форума Посмотреть профиль Отправить личное сообщение для vadim2007 Найти все сообщения от vadim2007
  № 3  
Ответить с цитированием
vadim2007

Регистрация: May 2016
Сообщений: 5
Спасибо большое за ответ, если можно, чуть подробнее про то, как добавить артефакт на сцену. У меня есть внутри каждого элемента параметр icon, затем эту иконку я должен отобразить.
Код AS3:
artefact = new Artefact(); // класс который унаследован от Sprite, MovieClip и т д...
Вот эта строчка мне не понятна, у меня нет такого класса...

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

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от vadim2007 Посмотреть сообщение
Спасибо большое за ответ, если можно, чуть подробнее про то, как добавить артефакт на сцену. У меня есть внутри каждого элемента параметр icon, затем эту иконку я должен отобразить.
Код AS3:
artefact = new Artefact(); // класс который унаследован от Sprite, MovieClip и т д...
Вот эта строчка мне не понятна, у меня нет такого класса...
смысл в том, что для artefact нужно сделать класс, который является наследником DisplayObject или его потомком (Sprite, MovieClip), т.к. на сцену можно добавить только наследников выше перечисленных.

Старый 04.05.2016, 00:43
vadim2007 вне форума Посмотреть профиль Отправить личное сообщение для vadim2007 Найти все сообщения от vadim2007
  № 5  
Ответить с цитированием
vadim2007

Регистрация: May 2016
Сообщений: 5
а что должно быть в этом классе? я попробовал сделать пустой класс, унаследовал от спрайта, в глобале объявил свойства артефактов (иначе ругается). дальше, где я хочу добавить иконку, как раз выдает Ошибка типа Coercion
Код AS3:
addChild(artefact.icon);
а если просто оставить
Код AS3:
addChild(artefact);
то ошибок нет, но ничего и не происходит

Старый 04.05.2016, 01:25
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 6  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
сначала нужно создать свойство icon в этом классе, а уж потом выводить его. Ну а проще, на мой взгляд, после загрузки каждого "артефакт №* и его свойства" добавлять их в новый экземпляр класса artefact. Тогда для того, чтобы сразу вывести всё, будет достаточно "addChild(artefact);", а что-то одно addChild(artefact.*);. Вы просто не понимаете пока что для чего нужны классы, что такое наследование, композиция, интерфейсы и т.д. Разберитесь сначала с основами снова: типы данных(особенно приведение), классами(и их экземплярами), наследованием, дальше композиция - этого хватит для реализации вашей задумки на этом этапе.

прочитайте и поймите два слушателя, ОЧЕНЬ помогут писать предсказуемый код
Код AS3:
			this.addEventListener(Event.ADDED_TO_STAGE, init);
			this.addEventListener(Event.REMOVED_FROM_STAGE, removeInit);

Старый 04.05.2016, 02:23
mihael_p вне форума Посмотреть профиль Отправить личное сообщение для mihael_p Посетить домашнюю страницу mihael_p Найти все сообщения от mihael_p
  № 7  
Ответить с цитированием
mihael_p

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Что такое icon? Путь до картинки?
__________________
Не стыдно спросить, стыдно не знать !

Старый 04.05.2016, 15:54
vadim2007 вне форума Посмотреть профиль Отправить личное сообщение для vadim2007 Найти все сообщения от vadim2007
  № 8  
Ответить с цитированием
vadim2007

Регистрация: May 2016
Сообщений: 5
Цитата:
Сообщение от mihael_p Посмотреть сообщение
Что такое icon? Путь до картинки?
Код AS3:
[Embed(source = "buttons/book.png")]	private var art_book_cls:Class;
private var art_book:Bitmap = new art_book_cls;
private var artefacts:Array = [
	{bonus:"xdamage", nameArt:Language.artbook_text, icon:art_book}
]
не силен в теории, поэтому прикрепляю код. это называется ссылкой на путь к картинке? иконка вставляется без проблем, если не делать загрузку массива.

Добавлено через 2 минуты
Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
Вы просто не понимаете пока что для чего нужны классы, что такое наследование, композиция, интерфейсы и т.д. Разберитесь сначала с основами снова: типы данных(особенно приведение), классами(и их экземплярами), наследованием, дальше композиция - этого хватит для реализации вашей задумки на этом этапе.
благодарю, уже начал читать справочник adobe по этим темам

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

Регистрация: Jul 2011
Сообщений: 249
Отправить сообщение для mihael_p с помощью Skype™
Я бы вообще не советовал использовать это:
Код AS3:
[Embed(source = "buttons/book.png")]
Embed всегда останется в памяти, а оно вам надо?

Я бы сделал так:

Код AS3:
{bonus:"xdamage", nameArt:Language.artbook_text, icon:"buttons/book.png"}
а в классе Artefact загружал эту иконку с помощью класса Loader.
__________________
Не стыдно спросить, стыдно не знать !

Старый 12.05.2016, 16:15
vadim2007 вне форума Посмотреть профиль Отправить личное сообщение для vadim2007 Найти все сообщения от vadim2007
  № 10  
Ответить с цитированием
vadim2007

Регистрация: May 2016
Сообщений: 5
Так ничего и не получилось у меня ничего... Ошибок нет, но на экран артефакты не выводятся (прикрепил исходник). Пожалуйста, помогите кто может, уже несколько дней не сплю
Вложения
Тип файла: rar TestProject.rar (32.3 Кб, 21 просмотров)

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

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

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


 


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


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