Game Maker - создание игр | HellRoom Games
Ноябрь 18, 2025, 10:40:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: 1 ... 13 14 [15] 16   Вниз
  Печать  
Автор Тема: Полезные скрипты  (Прочитано 380714 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dmi7ry
Гл. Администратор
*

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

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #210 : Декабрь 12, 2017, 19:43:14 »

Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии.
Давайте возьмём поверхность 0 градусов. На неё под углом 135 градусов падает луч. Под каким углом он должен отразиться?
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
MusNik
KeeVee Games
GM Pro user
*

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

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #211 : Декабрь 12, 2017, 20:10:44 »

Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии.
Эээ, разве ось "симметрии" не равна оси "отражения" + 90 градусов?
Записан

DmitryDS
Потому что я такой-сякой
GM Pro user
*

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

Награды:
За лояльность! [+150 репутации]1000 сообщений!За постоянность! [100 дней на форуме]
API: GameMaker Studio Master
Сообщений: 1061



WWW
« Ответ #212 : Декабрь 12, 2017, 20:13:28 »

Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии.
Эээ, разве ось "симметрии" не равна оси "отражения" + 90 градусов?

Да это уже в чате обсудили, если кто не заметил.
(И, замечу, что это верно только в половине случаев, с осью симметрии).
Записан

Я никогда никого не пытаюсь оскорбить или обидеть, хотя порой веду себя вызывающе. Не обижайтесь, я не со зла
Dmi7ry
Гл. Администратор
*

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

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #213 : Декабрь 12, 2017, 20:54:39 »

Выяснили, что результат всё-таки один и тот же. Просто мой способ не требует переворота луча, падающего на поверхность, на 180 градусов.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
Slug2002
Активный участник
*****

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

Пол: Мужской
Награды:
2 место в HellRoom Jam XЗа постоянность! [10 дней на форуме]
API: GameMaker Studio Pro
Деятельность: GML, Network, Ultimate 3D, Java Script
Сообщений: 272


слава векторам


« Ответ #214 : Декабрь 29, 2017, 19:49:09 »

Простой скролл в RTS без использования объекта курсора.
Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные.
Create:
Код:
ss=16//Скорость скролла
ds=16//Отвечает за расстояние скролла.

Step:
Код:
if view_xview[0]>0 if mouse_x<view_xview[0]+ds or keyboard_check(vk_left)
{
view_xview[0]-=ss
}

if view_yview[0]>0 if mouse_y<view_yview[0]+ds or keyboard_check(vk_up)
{
view_yview[0]-=ss
}

if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-ds or keyboard_check(vk_right)
{
view_xview[0]+=ss
}

if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-ds or keyboard_check(vk_down)
{
view_yview[0]+=ss
}
« Последнее редактирование: Декабрь 29, 2017, 23:15:39 от Slug2002 » Записан

На джеме побеждает не десяток однообразных уровней, а один, но сделанный на совесть.
Fur
Fur
Абы-какой
GM Pro user
*

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

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [500 дней на форуме]Третье место на HellRoom Jam #9 [Flucoldache]За лояльность! [+300 репутации]Настоящий игродел!Боже мой, посмотрите на эту медальку! Первое место на HellRoom Jam #6
API: Game Maker 8.0 Lite
Деятельность: Бурная.
Сообщений: 3673


Лисяток тебе.


« Ответ #215 : Декабрь 29, 2017, 20:04:50 »

Простой скролл в RTS без использования объекта курсора.
Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные.
Create:
Код:
ss=16//Скорость скролла
ds=16//Отвечает за расстояние скролла.

Step:
Код:
if view_xview[0]>0 if mouse_x<view_xview[0]+16 or keyboard_check(vk_left) {view_xview[0]-=16}
if view_yview[0]>0 if mouse_y<view_yview[0]+16 or keyboard_check(vk_up) {view_yview[0]-=16}
if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-16 or keyboard_check(vk_right) {view_xview[0]+=16}
if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-16 or keyboard_check(vk_down) {view_yview[0]+=16

- Отсутствие какого-либо форматирования (пока-пока, читаемость кода).
- Волшебные числа в коде. (самое смешное -- ты даже догадался создать переменные, но мыслительного процесса, по всей видимости, не хватило на то, чтобы использовать их в коде, лолц.)
- Это настолько элементарная задача, что с таким же успехом можно сюда впихнуть код движения на стрелачки. Очень полезно, верно?
Записан

В одной отдельно взятой фразе не должно быть больше миллиона муравьёв, пусть даже она — научного труда о муравьях.

Hyperflex
AndrewVideoGames
Главный Модератор
*

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

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #216 : Декабрь 29, 2017, 23:14:21 »

Простой скролл в RTS без использования объекта курсора.
Это лучше всего впихнуть в какой нибудь главный объект отвечающий за переменные.
Create:
Код:
ss=16//Скорость скролла
ds=16//Отвечает за расстояние скролла.

Step:
Код:
if view_xview[0]>0 if mouse_x<view_xview[0]+16 or keyboard_check(vk_left) {view_xview[0]-=16}
if view_yview[0]>0 if mouse_y<view_yview[0]+16 or keyboard_check(vk_up) {view_yview[0]-=16}
if view_xview[0]<room_width-view_wview[0] if mouse_x>view_xview[0]+view_wview[0]-16 or keyboard_check(vk_right) {view_xview[0]+=16}
if view_yview[0]<room_height-view_hview[0] if mouse_y>view_yview[0]+view_hview[0]-16 or keyboard_check(vk_down) {view_yview[0]+=16
Да, с ss/ds конечно факапнулся, раз объявил, то вместо 16 вставь переменные, чтобы понятно было.
Записан
Neo
*LisenokArtist
GM Pro user
*

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

Пол: Женский
Награды:
За медальки для форума!500 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+150 репутации]
API: GameMaker Studio Free
Сообщений: 971



« Ответ #217 : Февраль 19, 2018, 02:26:10 »

Набросал грубый скрипт, что позволит получить угол грани у объекта.
Код:
///collision_get_angle(x, y, angle, lenght, object, prec, notme)
var xx, yy, angle, lenght, steps, obj, prec, notme;
    xx     = argument0;                        // X позиция коллизии
    yy     = argument1;                        // Y позиция коллизии
    steps  = 18;                               // Шагов (360 / 20);
    angle  = round(argument2 / steps) * steps; // Округляем значение угла
    lenght = argument3;                        // Длина сенсоров
    obj    = argument4;                        // Искомый объект
    prec   = argument5;                        // Точная маска
    notme  = argument6;                        // Исключить вызывающий экземпляр


var step = 360 div steps; // Текущий шаг, выраженный в значении угла
var x1, y1, x2, y2; // Коодинатые точки вершин сенсоров
    x1 = xx - dcos(angle) * lenght;
    y1 = yy - dsin(angle) * lenght;
    x2 = xx - dcos(angle) * lenght;
    y2 = yy + dsin(angle) * lenght;
var angle1, angle2; // Собственные значения угла для каждого сенсора
    angle1 = 0;
    angle2 = 0;

// Первый сенсор полуокружности
while (angle1 < 180){
    var c1;
    x1 = xx - dcos(-angle + angle1) * lenght;
    y1 = yy - dsin(-angle + angle1) * lenght;
    c1 = collision_point(floor(x1), floor(y1), obj, prec, notme);
    if c1 == noone angle1 += steps else break;}
// Второй сенсор полуокружности
while (angle2 < 180){
    var c2;
    x2 = xx - dcos(angle + angle2) * lenght;
    y2 = yy + dsin(angle + angle2) * lenght;
    c2 = collision_point(floor(x2), floor(y2), obj, prec, notme);
    if c2 == noone angle2 += steps else break;}

return floor(point_direction(x1,y1,x2,y2));
~В GM не нашел что-то, что позволяет работать с векторами. С фикстурой тоже не нашел ничего подходящего.
~~Мне кажется, что это можно доработать...

Как уже говорил, угол отражения вычисляется одной строкой:
Код:
var reflection = mirror + angle_difference(mirror, dir);

Это не то, что мне нужно. Ваш код создает угол, симметричный заданному, а мой - отраженный. Ось выступает в качестве поверхности отражения, а не симметрии.
Я сначала думал, что у меня тоже как-то не так работает. Проверил - совпало как у Dmi7ry, только аргументы местами не там.
Код:
///vector_reflect(vector_angle, planar_angle)
var a, b, c;
    a = argument0;
    b = argument1;

c = b - (angle_difference(a, b));

return(c);
Записан

Goo
ну типа
GM Pro user
*

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

Пол: Мужской
Награды:
3 место в HellRoom Jam XВторое место на HellRoom Jam #9 [Антибиотик]
API: GameMaker Studio 2
Деятельность: программист
Сообщений: 1345



« Ответ #218 : Февраль 19, 2018, 09:41:03 »

Особо не вникал в работу скрипта (и увы не проверял его на практике),
но что-то мне подсказывает что если

тут 2 минуса

Код:

    x1 = xx - dcos(-angle + angle1) * lenght;
    y1 = yy - dsin(-angle + angle1) * lenght;


то тут, должно быть 2 плюса

Код:

    x2 = xx - dcos(angle + angle2) * lenght;
    y2 = yy + dsin(angle + angle2) * lenght;


Если я не прав, поправь меня.
Записан

Neo
*LisenokArtist
GM Pro user
*

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

Пол: Женский
Награды:
За медальки для форума!500 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+150 репутации]
API: GameMaker Studio Free
Сообщений: 971



« Ответ #219 : Февраль 19, 2018, 13:57:57 »

Особо не вникал в работу скрипта (и увы не проверял его на практике),
но что-то мне подсказывает что если

тут 2 минуса

Код:

    x1 = xx - dcos(-angle + angle1) * lenght;
    y1 = yy - dsin(-angle + angle1) * lenght;


то тут, должно быть 2 плюса

Код:

    x2 = xx - dcos(angle + angle2) * lenght;
    y2 = yy + dsin(angle + angle2) * lenght;


Если я не прав, поправь меня.
Перепроверил. Вроде правильно.
Вершины сенсоров создаются за + 180 от указанного значения угла. Один из сенсоров перемещается на 180 градусов по часовой, второй против часовой до тех пор, пока не обнаружат столкновение. За место collision_ можно использовать тот же place_ при желании. Не знаю что лучше будет использовать.
Записан

Goo
ну типа
GM Pro user
*

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

Пол: Мужской
Награды:
3 место в HellRoom Jam XВторое место на HellRoom Jam #9 [Антибиотик]
API: GameMaker Studio 2
Деятельность: программист
Сообщений: 1345



« Ответ #220 : Февраль 19, 2018, 16:25:16 »

Да все верно, проверил.

Да и если приглядется

Код:

    x1 = xx - dcos(angle) * lenght;
    y1 = yy - dsin(angle) * lenght;
    x2 = xx - dcos(angle) * lenght;
    y2 = yy + dsin(angle) * lenght;


{-;-;-;+}

Код:

x1 = xx - dcos(-angle + angle1) * lenght;
y1 = yy - dsin(-angle + angle1) * lenght;

x2 = xx - dcos(angle + angle2) * lenght;
y2 = yy + dsin(angle + angle2) * lenght;


тоже {-;-;-;+}, я просто не сразу заметил, ну а там из-за симметрии функций... и т. д.
Записан

S_Kleer
GM Pro user
*

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

Награды:
За лояльность! [+500 репутации]3 место в Дичайшем джеме #82000 сообщений!За постоянность! [50 дней на форуме]Настоящий игродел!2 место на HellRoom Jam #5, Контраст...
API: GameMaker Studio 2
Сообщений: 2734


« Ответ #221 : Август 02, 2018, 20:15:26 »

Скрипт, который возвращает позицию и индекс вертикального, равностороннего по высоте и ширине гексагона. Подойдёт для игр с гексагональной картой.
Не уверен, что код самый правильный, но он работает. Проверял на гексагонах размером 64х64 и 32х32.

Объявляем макросы:
Код: (macro)
#macro HEX_W 32         // 32 ширина гексагона, можно использовать sprite_get_width
#macro HEX_PART (HEX_W / 4)          // Четверть высота гексагона, для проверок двух верхних углов
#macro HEX_H (HEX_W - HEX_PART)  // Высота гексагона (Полная ширина минус четверть)

#macro HEX_W_HALF (HEX_W / 2)     // Половина ширины гексагона (пригодится для смещений)

Сам скрипт:
Код: (mouse_hex)
/// @desc Возвращает индекс и позицию гексагона

// Представляем координаты курсора в виде индексов
var mx = mouse_x div HEX_W;
var my = mouse_y div HEX_H;

// Смещение
var off_x = 0;

// Если каждая вторая строка чётная, то смещаем координаты на половину ширины гексагона
if my mod 2 = 1
{
    off_x = HEX_W_HALF;
    mx = (mouse_x + off_x) div HEX_W;
}

// Обновляем координаты текущего гексагона
mx = mx * HEX_W - off_x;
my = my * HEX_H;

// Если курсор в левом верхнем углу, то смещаем координаты гексагона влево вверх
if point_in_triangle(mouse_x, mouse_y, mx, my, mx + HEX_W_HALF, my, mx, my + HEX_PART)
{
    mx = mx - HEX_W_HALF
    my = my - HEX_H
}

// Если курсор в правом верхнем углу, то смещаем координаты гексагона вправо вверх
if point_in_triangle(mouse_x, mouse_y, mx + HEX_W_HALF, my, mx + HEX_W, my, mx + HEX_W - 1, my + HEX_PART)
{
    mx = mx + HEX_W_HALF;
    my = my - HEX_H;
}

// Возвращаем индекс и позицию гексагона
return [mx div HEX_W, my div HEX_H, mx, my];

Пример использования:
Код:
var result = mouse_hex();

// Индексы гексагона
hex_i = result[0];
hex_j = result[1];

// Координаты гексагона
hex_x = result[2];
hex_y = result[3];

// При нажатии лкм, ставим на карту лес
if mouse_check_button_pressed(mb_left)
{
    map[hex_i, hex_j] = 5; // Допустим 5 - это лес
}

// Рисуем гексагональный курсор точно на клетке
draw_sprite(s_cursor, 0, hex_x, hex_y);

Код заточен под GMS2, но его несложно переделать под другие версии.
« Последнее редактирование: Август 02, 2018, 20:21:02 от S_Kleer » Записан

Коты - Мирители
Goo
ну типа
GM Pro user
*

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

Пол: Мужской
Награды:
3 место в HellRoom Jam XВторое место на HellRoom Jam #9 [Антибиотик]
API: GameMaker Studio 2
Деятельность: программист
Сообщений: 1345



« Ответ #222 : Сентябрь 30, 2018, 21:03:20 »

срипт "складываюший" два списка

0 - аргумент основной лист,
1 - лист добавляемый в конец первого,
2 - если == false, изменяем 1-й лист, добавляя 2-й в конец
     если == true, создаем новый лист, являющийся их суммой, не меняя содержимое исходных   

Код:

/// ds_list_plus_list(main_list, sourse_list, change[boolean])
// return ds_list

var l = argument0;
var s = argument1;
var c = argument2;

if !ds_exists(l, ds_type_list) show_error("data structure is not exists", 1);
if !ds_exists(s, ds_type_list) show_error("data structure is not exists", 1);
var z = undefined;

if c
{ z = ds_list_create();
  ds_list_copy(z, l);
}

for (var i = 0; i < ds_list_size(s); i++)
{ var v = s[| i];
  if is_undefined(v) continue;
  
  if !c ds_list_add(l, v);
  else ds_list_add(z, v);
}

if c return z;
return l;


Добавлено: Сентябрь 30, 2018, 21:16:08
пожалуй можно и так

Код:

/// ds_list_plus_list(main_list, sourse_list, change[boolean])
// return ds_list

var l = argument0;
var s = argument1;
var c = argument2;

if !ds_exists(l, ds_type_list) show_error("data structure is not exists", 1);
if !ds_exists(s, ds_type_list) show_error("data structure is not exists", 1);
var z = l;

if c
{ z = ds_list_create();
  ds_list_copy(z, l);
}

for (var i = 0; i < ds_list_size(s); i++)
{ var v = s[| i];
  if is_undefined(v) continue;
  ds_list_add(z, v);
}
return z;


Добавлено: Ноябрь 23, 2018, 17:32:20
скрипт сравнивающий строки... возвращает массив.
0-й индекс - степень сравнения.
1-й количество схожих символов

если строки не равны возвращает
0 - не равны
0 - схожих символов

если строки равны частично возвращает
1 - частично равны
n - схожих символов

если строки равны целиком
2 - целиком равны
длина сравниваемых строк - схожих символов

Код:

#macro NOT_EQUALLY 0
#macro NEARLY_EQUAL 1
#macro EQUALLY 2
#macro COMPARISON_VALUE 0
#macro INDEX 1


Код:

/// string_compare(str, str1)
// return: array

var str_0 = argument0;
var str_1 = argument1;

var cmp_val = NOT_EQUALLY;
var arr_for_ret = array_create(2);
var str_len_0 = string_length(str_0);
var str_len_1 = string_length(str_1);
var str_len = min(str_len_0, str_len_1);
var i;

for (i = 1; i < str_len + 1; i++;)
{     var char_0 = string_char_at(str_0, i);
      var char_1 = string_char_at(str_1, i);
      if char_0 != char_1 break;
      cmp_val = NEARLY_EQUAL;
}

if cmp_val && (i - 1 == str_len)
{     if str_len_0 == str_len_1
      {
            cmp_val = EQUALLY;
      }
}

arr_for_ret[COMPARISON_VALUE] = cmp_val;
arr_for_ret[INDEX] = i - 1;
return arr_for_ret;

« Последнее редактирование: Ноябрь 23, 2018, 20:31:05 от Goo » Записан

SilentPhil
Norland
GM Pro user
*

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

Пол: Мужской
Награды:
Первое место на HellRoom Jam #7 [Hell in Your Fridge]500 сообщений!За постоянность! [50 дней на форуме]За лояльность! [+150 репутации]Настоящий игродел!Второе место на HellRoom Jam #6 [По следам Артакса]...
API: GameMaker Studio 2
Деятельность: GML, Pixel Art
Сообщений: 1363



WWW
« Ответ #223 : Ноябрь 23, 2018, 19:14:43 »

Для сравнения строк хорошо использовать алгоритм расстояние Ливенштейна. Даже реализовал его на гм8 в прошлом веке.
Записан

         
Да, на них можно кликать.
Neo
*LisenokArtist
GM Pro user
*

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

Пол: Женский
Награды:
За медальки для форума!500 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+150 репутации]
API: GameMaker Studio Free
Сообщений: 971



« Ответ #224 : Июль 12, 2019, 12:49:44 »

Лучше названия не придумал. Скрипт возвращает значение 1 если находится между минимум и максимум и 0 если на границах. С плавающей точкой, разумеется.
Код:
///rise_fall(value, min, max);
var min_, max_, val_;
min_ = argument1;
max_ = argument2;
val_ = clamp(argument0, min_, max_);

var s, m, l;
s = max_ - min_;
m = s div 2;
v = val_ - min_;
l = 1 - (abs((m - v) * 2) / s);

return l;

Следующий скрипт рисует линию с прозрачностью на границах. Работает в паре с скриптом выше.
Код:
///draw_line_alpha_rise_fall(x1, y1, x2, y2);
var x1, y1, x2, y2;
x1 = argument0;
y1 = argument1;
x2 = argument2;
y2 = argument3;

var lx, ly, sx, sy, ii;
ii = 2;
lx = (x2 - x1);
ly = (y2 - y1);
sx = lx / ii;
sy = ly / ii;

draw_primitive_begin(pr_linestrip);

for (var i = 0; i <= ii; i ++){
    var xx, yy, alpha;
    xx      = x1 + sx * i;
    yy      = y1 + sy * i;
    alpha   = rise_fall(i, 0, ii);
   
    draw_set_alpha(alpha);
    draw_vertex(xx, yy);}

draw_primitive_end();
draw_set_alpha(1);

return true;
Можно было проще, ну так получилось...

Добавлено: Август 14, 2019, 21:52:20
Простой скрипт смешивает каналы двух цветов. Канал смешиваемого цвета необходимо получить функцией color_get_red/green/blue соответственно.
Код:
///merge_channel(channel a, channel b, amount)
//amount- насколько тот или иной цвет должен быть смешан. Значения от 0 до 1.0
var a, b;
a = argument0 * argument2;
b = argument1 * (1 - argument2);
return a + b;
« Последнее редактирование: Август 14, 2019, 21:52:20 от Neo » Записан

Страниц: 1 ... 13 14 [15] 16   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.085 секунд. Запросов: 37.