RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1   Вниз
  Печать  
Полезные функции GML для Flash
0 Пользователей и 1 Гость смотрят эту тему.
Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

20 Апреля 2009 в 17:47
В этом архиве будут публиковаться некоторые полезные функции из Game Maker, написанные на языке Action Script для использования в Adobe Flash.
Для использование функций в своих проектах просто поместить код функции в самый первый кадр основного клипа, обращаться к ним можно будет из любого места.

Данные скрипты написаны на языке Action Script 2. Версии для Action Script 3 смотрите ниже.

Функция point_distance(x1, y1, x2, y2)
Описание: расчёт расстояния от точки до точки.
Автор: RaidhoTH
_global.point_distance = function(x1, y1, x2, y2) {
return (Math.sqrt(Math.pow(x1-x2, 2)+Math.pow(y1-y2, 2)));
};

Функция point_direction(x1, y1, x2, y2)
Описание: нахождение угла между двумя точками.
Автор: RaidhoTH
_global.point_direction = function(x1, y1, x2, y2) {
return Math.atan2(y2-y1, x2-x1)/Math.PI*180;
};

Функция choose(x1, x2, x3...x16)
Описание: выбор случайного аргумента любого типа.
Автор: DS
_global.choose = function() {
return arguments[Math.round(random(arguments.length))]
};

Функция lengthdir_x(length, direction)
Описание: нахождение вектора указанной длины и направления по оси Х.
Автор: RaidhoTH
_global.lengthdir_x = function(len:Number, dir:Number) {
return Math.cos(dir*Math.PI/180)*len;
};

Функция lengthdir_y(length, direction)
Описание: нахождение вектора указанной длины и направления по оси Y.
Автор: RaidhoTH
_global.lengthdir_y = function(len:Number, dir:Number) {
return -Math.sin(dir*Math.PI/180)*len;
};

Функция median(x1 ,x2, x3...x16)
Описание: нахождение среднего арифмитического.
Автор: andNsX
_global.median = function()
    {
        var ret:Number = 0;
        for (var i = 0; i<arguments.length; i++)
        {
            ret += arguments[i];
        }
        return ret/arguments.length;
};

Если вы располагаете полезной функцией, дублирующей возможности Game Maker, и не прочь поделиться ею с сообществом, то пожалуйста создайте сообщение в данной теме и вскоре она будет перенесена в архив с сохранением вашего авторства.
Последнее редактирование: 21 Апреля 2009 в 16:45 от Silen

Don't tell why, tell why not.
 
andNsX
Ветеран форума
*****

Репутация: 111
Offline Offline

Награды:
Легенда сайта
Сообщений: 1 345

Ответ № 1 20 Апреля 2009 в 17:59
Вот сделал, нахождение среднего арифмитического, в Math. не нашёл)

AS 2.0
_global.median = function()
{
var ret:Number = 0;
for (var i = 0; i<arguments.length; i++)
{
ret += arguments[i];
}
return ret/arguments.length;
}
AS 3.0
function median(... args)
{
var ret:Number = 0;
for (var i = 0; i<args.length; i++)
{
ret += args[i];
}
return ret/args.length;
}
Последнее редактирование: 20 Апреля 2009 в 18:18 от andNsX
Mikozoid
Младший администратор
Завсегдатай
******

Репутация: 196
Offline Offline

Награды:
Легенда сайта
Сообщений: 996


(<

Ответ № 2 20 Апреля 2009 в 18:09
public function choose(... args) {
return args[Math.floor(Math.random() * args.length)];
}
Мне кажется, что choose делать лучше без циклов. Версия для As3, наверное и для других функций As3 вариант стоит сделать, синтаксис там разный немного. Вот, если нужно, еще четыре штуки.
public function lengthdir_x(len: Number, dir: Number):Number {
return -Math.cos((dir - 180) * Math.PI / 180) * len;
}

public function lengthdir_y(len: Number, dir: Number):Number {
return -Math.sin((dir - 180) * Math.PI / 180) * len;
}

public function point_direction(x1: Number, y1: Number, x2: Number, y2: Number):Number {
return Math.atan2(y2 - y1, x2 - x1) * (180 / Math.PI);
}

public function point_distance(x1: Number, y1: Number, x2: Number, y2:Number):Number {
return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
Последнее редактирование: 20 Апреля 2009 в 18:55 от Mikozoid

Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

Ответ № 3 20 Апреля 2009 в 18:54
Здорово ) Для АС3 тогда отдельно надо будет сделать.

Don't tell why, tell why not.
Raidho
Завсегдатай
****

Репутация: 58
Offline Offline

Сообщений: 856


Ответ № 4 20 Апреля 2009 в 19:33
Прекалькулированные значения синуса и косинуса:
var prec:Number=0;
var doubledPI=Math.PI*2;
var halfedPI=Math.PI/2;
var pre_geom:Array = new Array();

function init_pre_geom(prc:Number){
prec=prc*Math.PI/180;
//prec=prc;
for (var d:Number=0; d<_doot.doubledPI; d += prec){
pre_geom.push(Math.sin(d));
}
pre_geom.push(1);
}
function pre_sin(angle:Number){
if(angle<0) angle = -angle;
if(angle > _root.doubledPI) angle = angle % _root.doubledPI;
return _root.pre_geom[Math.round(angle/_root.prec)];
}
function pre_cos(angle:Number){
return pre_sin(angle+_root.halfedPI);
}
В чем меньше выставлено значение prec при инициализации, тем с большей точностью будет прерассчет.
Это значение надо выставлять в градусах. Так удобней =)
Последнее редактирование: 20 Апреля 2009 в 20:25 от RaidhoTH
Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

Ответ № 5 20 Апреля 2009 в 19:44
Если вы располагаете полезной функцией, дублирующей возможности Game Maker...

Don't tell why, tell why not.
Raidho
Завсегдатай
****

Репутация: 58
Offline Offline

Сообщений: 856


Ответ № 6 20 Апреля 2009 в 19:46
Оу... эээ...
Ну я думаю что тогда следует перенести ответ в другую тему, потому как эти функции ,для флеш, просто МегаСуперПупер полезные, как минимум.
Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

Ответ № 7 20 Апреля 2009 в 20:15
А зачем они нужны, если не секрет? ;D
Лучше бы выложил обещанный mp_potensial_step, от него пользы для пользователей явно больше будет )

Don't tell why, tell why not.
Raidho
Завсегдатай
****

Репутация: 58
Offline Offline

Сообщений: 856


Ответ № 8 20 Апреля 2009 в 20:23
Нужны они для того, чтобы ускорить процесс рассчета синусов и косинусов. В той самой функции potential_step, их нужно рассчитывать отнюдь немало. Думаю, заменив рассчет косинуса через Math.SIN на его выдергивание из большого массива прерассчетных данных, можно сэкономить немало процессорносного времени.
Например, без этих самых прерассчетов, дум бы сильно тормозил даже на мощных машинах того времени. //см. технические данные
Также, у меня в флэш-игре, в момент когда нужно одновременно рассчитать около 20 (посчитал) синусо-косинусов, игра слегка подвисает.
Последнее редактирование: 20 Апреля 2009 в 20:44 от RaidhoTH
Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

Ответ № 9 20 Апреля 2009 в 21:31
Теперь понял зачем )

Don't tell why, tell why not.
DS
Активный участник
**

Репутация: 16
Offline Offline

Сообщений: 161

Ответ № 10 21 Апреля 2009 в 04:11
Silen,
вариант choose без цикла


_global.choose = function()
{return arguments[Math.round(random(arguments.length))]}

кстати в ГМ хреновый choose, пробовал внем больше 15 агрументов загнать не работает(прсто числом агрументов шанс можно регулировать например choose(1,1,1,1,1,5,3)).


UPD:
Ух ты! Оказывается Микозоид меня уже опередил )
Мне вот стало интересно, _global. функции не сжирают ли  память? Ну например создал я 100 частиц (мувиулипов) и у каждого в конструкторе обьекта уже будет вписано штук 20 функций, которые он не использует.
Будет ли выигрыш в производительности, если держать все функции в _root-е(например _root.point_direction())?
 
Последнее редактирование: 21 Апреля 2009 в 11:31 от DS
Raidho
Завсегдатай
****

Репутация: 58
Offline Offline

Сообщений: 856


Ответ № 11 21 Апреля 2009 в 16:46
Не будет. Но держать все функции в руте как бы более профессионально чтоли.
Silen
Старожил
******

Репутация: 277
Offline Offline

Награды:
Легенда сайта
Сообщений: 2 478


Indie Game Developer

Ответ № 12 21 Апреля 2009 в 16:52
Нужно будет потестировать. Хотя столь малые объёмы оперативки не фатальны.

Don't tell why, tell why not.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2017
Счётчик–@Mail.ru