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

 
Расширенный поиск
  Главная Форум Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 4 5 ... 8
1  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 21 Апрель 2018 в 18:50
О вреде глобальных переменных: ты переопределяешь Task в tasks/task_*.lua
Если писать local Task = {}, то всё ок. Правда непонятно почему Task.new() во втором случае вообще вызывался, так как Task к этому моменту уже должен был перезаписаться.
2  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 20 Апрель 2018 в 21:18
Мне кажется, так правильнее. Ведь во всех книжках есть аналогия со "стаканом", в который помещают значения. "Перевернутый" стек - как раз очень похож на стакан =)
Тогда пусть стакан снизу заполняется

Блин, вот такого читинга я и боялся, ага. Как думаете, как обезопасить игру от таких решений? Тупо сделать поле меньше - не хочется =(
В TIS-100 на каждое задание четыре теста, из них один рандомный (каждый раз разный)

А теперь решение 320 / 153:
ПоказатьСпойлер
ПоказатьСПОЙЛЕР
Ну или как-то так

Но это будет быстрее чем мой честный 613.
Не знаю, какой смысл ты вкладываешь в понятие "честный". Для меня это решение, печатающее правильный ответ для любых корректных входных данных.
3  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 20 Апрель 2018 в 03:05
Илья, ты зачем стек перевернул?)


UPD
Самый быстрый, который возможно сделать - 615.
Это если без читов.

Хотя я кажется понял, как это сделать. Эх, было бы поле 16х16...

UPD 2
Что, если я скажу тебе, что это можно честно пройти за 320 циклов?
(Блин, чем я занимаюсь в два часа ночи...)
4  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 16 Апрель 2018 в 00:13
Лучше я 11.0 скачаю
5  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 16 Апрель 2018 в 00:00
Хз почему, но если в setColor не передавать четвертый параметр (альфа), то все ок.

6  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 15 Апрель 2018 в 23:09
Löve 0.10.2: на полсекунды появляется интерфейс потом чёрный экран. Что-то ты там сломал.
7  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 15 Апрель 2018 в 21:34
Renamed APIs
All renamed APIs in 11.0 are deprecated rather than removed, until the next major release.

Renamed love.window.getPixelScale to love.window.getDPIScale.
...
8  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 15 Апрель 2018 в 19:57
Как бы ты хотел удалять символы? Как тебе будет удобно?
На самом деле ничего лучше удаления текущего символа через delete я тоже не придумал.
Сделай еще love.keyboard.setKeyRepeat(true) в love.load()
9  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 15 Апрель 2018 в 18:30
У меня 80

Выглядит круто, аж TIS-100 захотелось пройти. Но как, блин, удалять символы из клеточек?
10  Проекты и Релизы / Проекты в разработке / Re: Fungeoid [игра для программистов, головоломка] : 13 Апрель 2018 в 14:01
Для игры подойдет интерфейс как в SpaceChem, где с хоткеями набор "программы" занимает секунды. Ну, после того как ты час (два, три...) придумывал решение.
Точнее там есть два способа ввода – первые 5-10 уровней, пока не выучишь хоткеи, перетаскиваешь элементы мышкой и тебе норм. Хотя с самого начала использовать WASD на смену направления интуитивно очевидно.
11  Проекты и Релизы / Проекты в разработке / Just another match-3 : 23 Февраль 2018 в 03:33
[attachment=4]

Я тут для развлечения разрабатывал клон известной в узких кругах игры Bejeweled Twist. Много часов было потрачено в ней еще на кнопочном сименс С75. Главная фишка игры, отличающая её от большинства подобных, в том что при совершении хода нужно не поменять местами два соседних элемента, а повернуть квадрат из четырёх. С тех пор мне, кстати, не попадались match3, использующие ту же идею (не то чтобы я их специально искал, но всё же).

Со стороны игровой процесс выглядит не очень сложно для реализации: яжпрограммист, я могу проверить что три соседних элемента одинакового цвета!
Но как выяснилось, сделать хороший match3 не так просто. Все эти каскады падающих кристаллов генерировали просто потоки трудновоспроизводимых багов...
...пока я не взял в руки пулемёт автомат.
Это просто прекрасно - достаточно один раз описать все состояния (и не лезть грязными руками в fsm_set_state(...)), и все события происходят в нужном порядке. По крайней мере, все ошибки будут в описании, а не в реализации. Но в общем, этот пост не о победе матлогики над кривыми руками.

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

[attachment=1]
[attachment=2]

P.S. Отпишитесь, кому удалось собрать ряд из 8.
[attachment=3]
[attachment=5]
12  Портал / Примеры для GameMaker (GML) / Re: Маленькие хитрости GML : 20 Февраль 2018 в 16:34
бамп треду

Померил скорость доступа к переменным: глобальным, переменным экземпляра, локальным и переменным других экземпляров (активных и деактивированных).

var N = 10000000;
var t;

globalvar v_global;
v_global = 0;
v_instance = 0;
var v_local = 0;

var active = instance_create(0, 0, o_dummy);
active.v_other = 0;

var inactive = instance_create(0, 0, o_dummy);
instance_deactivate_object( inactive );
inactive.v_other = 0;

t[0] = get_timer();

repeat N {
    v_global++;
}

t[1] = get_timer();

repeat N {
    v_instance++;
}

t[2] = get_timer();

repeat N {
    v_local++;
}

t[3] = get_timer();

repeat N {
    active.v_other++;
}

t[4] = get_timer();

repeat N {
    inactive.v_other++;
}

t[5] = get_timer();

show_message(
    "Global: " + string( ( t[1] - t[0] ) / 1000 ) + "#" +
    "Instance: " + string( ( t[2] - t[1] ) / 1000 ) + "#" +
    "Local: " + string( ( t[3] - t[2] ) / 1000 ) + "#" +
    "Active: " + string( ( t[4] - t[3] ) / 1000 ) + "#" +
    "Inactive: " + string( ( t[5] - t[4] ) / 1000 )
);
game_end();

Как и ожидалось, локальные самые быстрые, а из других объектов самые медленные. Но в целом разница между ними небольшая.
13  Разработка / Вопросы и ответы по GameMaker / Re: Ответы@Gmakers.xyz — все вопросы сюда : 14 Январь 2018 в 02:38
И surface_get_texture() даже не нужен.
14  Проекты и Релизы / Готовые проекты / Re: Master Mind : 21 Ноябрь 2017 в 19:31
Кстати, формат data.win у GMS2 такой же, как и у GMS1, только добавилась секция EMBI (что бы это ни значило).
Неплохой стимул для допиливания декомпилятора, осталось разжиться где-нибудь студией 2.0
15  Проекты и Релизы / Готовые проекты / Re: Master Mind : 21 Ноябрь 2017 в 04:14
Мне тупо выпали все пары подряд ¯\_(ツ)_/¯

16  Разработка / Вопросы и ответы по GameMaker / Re: Ответы@Gmakers.xyz — все вопросы сюда : 28 Сентябрь 2017 в 02:44
как сделать так что бы он появлялся в месте попадания, например в стену?
Очевидно, создавать его в месте попадания в стену.

2 - Что бы выстрел был из дула оружия (сейчас он немного ниже)
Это буквально предыдущий пункт FAQ II.2.17.

3 - Разброс пуль по сторонам (просто если оставить тот код, что был в примере, спрайт начинает дергаться из-за постоянно меняющегося direction)
Сейчас пули вылетают в направлении direction, разброс это отклонение от линии прицеливания, следовательно... посылать пули в направлении direction ± random(accuracy). Кстати, тоже есть в FAQ.
17  Проекты и Релизы / Проекты в разработке / Re: Westland[WIP] Hellroom Jam #8 : 05 Сентябрь 2017 в 21:16
Добавлены наказания за нечестную\неправильную игру

Если запрещенная стратегия является оптимальной (самой удобной и продуктивной), то наказания никак не помогут. В таком случае игроки выбирают стратегию, ближайшую к запрещенной (и, возможно, при этом проклинают разработчика страшными словами).
Если за кемперство убивают через минуту стояния на одном месте, то игроки будут стоять на месте 59 секунд, что было замечено еще в древние времена на серверах CS1.6 и Quake. Если в файтинге запрещен спам "читерного" комбо 10 раз подряд, они будут делать его 9 раз подряд.

Этой проблемы можно относительно легко избежать, изменив среду так, чтобы нежелательная стратегия перестала быть оптимальной. Поставить стену перед кемперской позицией, добавить combo-breaker и т.д. Тогда кемперить никто не будет, так как выгоднее бегать по карте (больше фрагов, опыта или чего еще).

Объясняю на пальцах: средний видишь?
[attachment=1]
Вот исходная ситуация в виде графика. По оси Х различные стратегии ("честные" справа), по оси Y – их продуктивность (точнее наоборот – штраф, чем меньше, тем лучше). Видно, что одна из стратегий лучше остальных, но по какой-то причине она нам не подходит.

[attachment=2]
Здесь добавлено наказание за нечестную игру. Это означает, что был добавлен штраф к нескольким стратегиям вблизи нежелательной. При этом минимум переместился, но очевидно что он продолжает стремиться к "кемперству", так как принципы игры не изменились.

[attachment=3]
А вот если правильно изменить оценку, то минимум естественным образом сдвигается в "честные" стратегии.
18  Разработка / Вопросы и ответы по GameMaker / Re: Ответы@Gmakers.xyz — все вопросы сюда : 25 Июнь 2017 в 18:36
Во-первых, вместо стены ифов лучше сделать массив смещений.
Ну и если image_speed не 1, то image_index может равняться хоть 3.14159265, и иф, соответственно, не сработает.


xcor[0, 0] = 0;
xcor[0, 1] = -1;
// ...
xcor[0, 19] = 1;


xcor[1, 0] = 4;
// ...
xcor[1, 15] = 4;


// ycor[...] = ...

 
var i_off;
switch( sprite_index ) {
    case( luna_stay ): i_off = 0; break;
    case( luna_stay_a ): i_off = 1; break;
    // ...
}
if( global.hat == 0 ) {
    var ii = floor( image_index );
    draw_sprite( sprite, 0, player.x + xcor[i_off, ii], player.y + ycor[i_off, ii] );
}

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

P.S. У тебя в строчках 21-22 одинаковые условия.
19  Портал / Песочница (статьи) / Re: Декомпилятор для GameMaker:Studio : 20 Июнь 2017 в 23:04
Подборка интересных фактов:
  • Аксессоры – это на самом деле функции, и их можно даже вызвать напрямую.
    a = list[| i ];<=>   ds_list_find_value( list, i );
    list[| i ] = a;<=>   ds_list_set( list, i, a );
    a = map[? key ];<=>   ds_map_find_value( map, key );
    map[? key ] = a;<=>   ds_map_set( map, key, a );
    a = arr[@ i ];<=>   array_get( arr, i );
    arr[@ i ] = a;<=>   array_set( arr, i, a );
    a = grid[# i, j ];<=>   ds_grid_get( grid, i, j );
    grid[# i, j ] = a;<=>   ds_grid_set( grid, i, j, a );

    Это может упростить работу со вложенными массивами
    inner[5] = "Hello";
    arr[1] = inner;

    // show_message( arr[1][5] );   // ERROR
    show_message( array_get( arr[1], 5 ) );   // "Hello"

    Так же, как и функции, не проверяют тип аргумента. Хотя его вообще нельзя проверить, потому что id структуры это просто число, так еще и для каждого типа отдельная нумерация.
    var map = ds_map_create();
    map[? 13 ] = "map";

    var list = ds_list_create();
    list[| 13 ] = "list";

    show_message( map[? 13 ] );  // "map"
    show_message( list[| 13 ] ); // "list"
    show_message( map[| 13 ] );  // "list" !!!
    show_message( list[? 13 ] ); // "map"  !!!
  • Двумерные массивы можно использовать как одномерные с размером до 32000*32000 = 1024000000.
    i = 5;
    j = 2;
    a[i, j] = 42;
    // a[i, j] == a[i*32000 + j] == a[5*32000 + 2] == a[160002] == 42;
    for( var i = 0; i < 1000000; ++i ) {
        a[i] = i + 1;
    }
    show_message( a[65535] ); // 65536
20  Портал / Песочница (статьи) / Re: Декомпилятор для GameMaker:Studio : 19 Июнь 2017 в 12:51
Do, конечно. Это я, видимо, с Lua его перепутал.
В любом случае, сейчас перепроверил - он тоже нормально восстанавливается.
Страниц: 1 2 3 4 5 ... 8
RSGMC (gmakers.ru) © 2007—2018
Счётчик–@Mail.ru