ПрограммированиеФорумОбщее

ActionScript 3.0. События мышки для Sprite. Есть проблема. (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
8:34, 10 фев 2012

шота меня мучают сомнения, что это поможет. да и мувиклипы тормозны. вон в соседней теме делал демпку. 2000 клипов жутко тормозят, а 2000 спрайтов дают 10 фпс.

#31
10:38, 10 фев 2012

ИПавлов

> 2000 клипов жутко тормозят, а 2000 спрайтов дают 10 фпс.

Рендерить нужно через копипикселз из битмапдаты. Тогда тормозить не будет.

#32
11:06, 10 фев 2012

Antilegent
очень смешно.

#33
11:22, 10 фев 2012

ИПавлов

> очень смешно.

Смех без причины... Ну ты понял.

#34
11:39, 10 фев 2012

ну что тут сказать. видимо вы думаете, что можете меня чему-то научить во флэшэ. ну...
http://www.gamedev.ru/code/forum/?id=156947&page=9
сделайте, чтобы не тормозило.

#35
12:02, 10 фев 2012

Всем доброго дня!

Вот решил вчера реализовать перемещение по карте. Пока сделал это так, чтобы он всегда карту прокручивал вправо автоматически. Для этого вызывается функция:

public function Time(_timeTask:TimeTask):void
{
  mapScrollRect.x+=5;
  scrollRect=mapScrollRect;
}

Дело в том, что я всю карту (а она у меня предоставляет класс RenderMap и наследуется от класса Sprite) засовываю в прямоугольник прокрутки (scrollRect). То есть типа не будет обрабатываться то, что вне прямоугольника. И при перемещение по карте изменяю значение прокрутки и обновляю. Саму же функцию я вызываю по событию Event.ENTER_FRAME для одного из главных MovieClip (почти самый верхний). При срабатывании я обновляю менеджер времени:

// Вошли в кадр
private function OnEnterFrame(_event:Event):void
{
  if (mapManager != null && mapManager.GetRenderOnName(mapName) != null) 
  {
    mapManager.GetRenderOnName(mapName).Update();
  }
      
  if(timeManager) timeManager.Update();
}

А сам менеджер времени устроен так, что у него есть список задач времени и он при вызове функции Update() просматривает все задачи и определяет какая выполнила условия и вызывает её функцию. А сами задачи ориентированы на время, задаются следующие параметры:

public var timeName:String=null;          // Имя задачи времени
public var timeLast:uint=0;              // Последнее время
public var timeNeedCount:uint=0;          // Нужное количество срабатываний
public var timeCurrentCount:uint=0;          // Текущее количество срабатываний
public var timePeriod:uint=0;            // Время срабатывания
public var timeFunction:Function=null;        // Функция срабатывания

Ну и сам менеджер:

+ Показать

Собственно потом я добавляю задачу:

Game.timeManager.Add(new TimeTask("Move",0,20,Time));

Так то всё работает, но бывает иногда видны подёргивания при перемещении. Как можно это устранить?

#36
12:09, 10 фев 2012

s3dworld
а вы то сами как думаете, что нужно сделать, чтобы не подрагивало?

#37
12:11, 10 фев 2012

ИПавлов
> а вы то сами как думаете, что нужно сделать, чтобы не подрагивало?
Чёрт его знает. Я уже разные интервалы и разное количество смещения перепробовал.

#38
12:36, 10 фев 2012
      var newTimeTasks:Vector.<TimeTask>=new Vector.<TimeTask>();
      
      for(var i:uint=0;i<timeTasks.length;i++)
      {
        var timeTask:TimeTask=timeTasks[i];
        if(timeTask.timeName!=_name) newTimeTasks.push(timeTask);
      }
      
      timeTasks=newTimeTasks;

Facepalm.jpg. Как давно ты занялся программированием?

ИПавлов

> сделайте, чтобы не тормозило.

Я делал. И не только я. Попробуй погуглить по словам "copyPixels флеш тест производительности". Флеш может рендерить десятки тысяч спрайтов (в классическом понимании этого слова).

Впрочем, копипикселз - не единственный вариант создания быстрого рендера. Можно сделать попиксельный рендер. Я как-то раз пробовал - получилось тоже неплохо. Правда, такой движок лучше на ХаКсе писать - там и быстрая память, и инлайны.

#39
12:41, 10 фев 2012

Antilegent
> Как давно ты занялся программированием?
Ну да самому смешно. Но я так и не понял как из вектора удалить нужный элемент.

#40
13:14, 10 фев 2012

s3dworld

Я дам тебе несколько бесплатных советов.

1. Массивы и векторы - не единственные структуры данных. В данном случае тебе, скорее всего, нужен обычный Object. Он позволяет находить значения по строковому ключу.

2. Удаление со сдвигом - это то-ли splice, то-ли split. Не помню точно.

3. Значение свойства length во время цикла не изменяется. Его нужно занести в локальную переменную.

4. Не нужно так часто создавать объекты. Флешу от этого очень больно.

5. Класс Date в играх не используют. Точнее, используют, но для других целей. Лучше сделать счётчик кадров. Если всё-же важно, чтобы игровое время шло с той же скоростью, что и реальное, можно использовать getTimer.

#41
13:20, 10 фев 2012

Antilegent
ну раз так, то в той теме тебе будут очень рады, особенно писатели движков на цпу. о то не надо мне тут чесать

команда .splice() если что.
ну думаю автор сам когда-нибудь дойдёт до оптимизации.

#42
13:25, 10 фев 2012

Antilegent
Спасибо! Сейчас буду переделывать.

Хотел бы спросить на счёт MovieClip, Sprite и Bitmap. Слышал что MovieClip очень тормозные. Есть ли смысл грузить Bitmap'ы и вручную их выводить с правильной последовательности для иллюзии анимации? Будет ли это быстрее работать?

А то есть идея в SWF хранить Bitmap'ы, подгружать и вытаскивать их от туда и выводить уже самому.

На счёт uint и int. Значит int быстрее uint. И что, это сильно критично? Большинство Flash функций Number возвращают. Уж не думаю что он был бы быстрее, так как он хранит любой тип числа.

#43
13:27, 10 фев 2012

s3dworld
я таже отвечать не хочу. читай моё сообщение вчерашнее. вот нихрена не понятно что ты делал. если это уже вчерашний вопрос и уже решённый.

#44
13:35, 10 фев 2012

ИПавлов
Да, я вчера вытаскивал из SWF рисунки. Но делал это для того чтобы найти вхождение мышки. А видимо надо было чисто их и оставить, а SWF потом выгрузить?

Беда вот в чём была. У некого объекта было 801 кадр. И когда я хотел чисто экспериментально создать из них вектор рисунков, у меня рушилась программа с сообщением что не верные BitmapData данные.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.