Двач.hk не отвечает.
Вы видите копию треда, сохраненную 12 сентября в 09:57.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ПУГАЕМ.webm2,9 Мб, webm,
800x800, 2:15
НЕОЖИДАННЫЙ Pygame тред №1 800023 В конец треда | Веб
Изучаем лучший движок современности! А заодно и программирование на Питоне, фреймворк SDL, и заодно оптимизацию этого добра, чтобы всё летало в 30 FPS на RTX 5095 Ti! Спрашиваем вопросы! Делимся своими шедеврами! Помогаем новичкам!
Минер.png28 Кб, 553x633
2 800026
Начну тред своим шедевральным поделием!
3 800027
И сразу вопросы к олдам. Допустим, я хочу эту >>800026 фигню в изометрической проекции. Это достигается какой-то трансформацией или изометрическими тайлами и соответствующей математикой?
4 800041
Не ну это слишком толсто.
Изом.png76 Кб, 1642x1192
6 800059
>>800027

Нашел волшебную формулу: x - y, x + y, разбирая сорцы игр DaFluffyPotato.
7 800156
Научился отрисовывать курсор по координатам мыши. Тормозит, зараза, так как софтварный.
image.png689 Кб, 470x1024
8 800157
О, так всё намного проще было:

pygame.mouse.set_cursor(hotspot, cursor_surface)
9 800158
>>800157
Так он еще и хардварный! Странно что ВолосатаяКартоха парится с софтварным.
1651483328942.png98 Кб, 785x410
10 800191
>>800023 (OP)

> Pygame


А что насчёт python Kivy? Как он в сравнении с ОП-фреймворком?
11 800316
Научился ходить и двигать карту.
12 800320
>>800316
И авто-камеру.
13 800321
Авто-камера.mp41,1 Мб, mp4,
820x580, 0:06
14 800328
1651568144246.png289 Кб, 500x366
15 800346
>>800253
... и получаешь репорт за политоту.
Редактор.png150 Кб, 2350x1257
16 800412
Решил грузить карты в формате Tiled напрямую, так как ничего сверх того, что он умеет, мне пока не нужно.

Пока через либу PyTMX: https://github.com/bitcraft/PyTMX
Потом, может, свой лисапед сочиню.
Спрайты.mp42,5 Мб, mp4,
820x580, 0:08
17 800730
Потихоньку учимся выводить спрайты и бороться со странными координатами, которые им назначает Tiled. Например, почему совершенно квадратный спрайт отцентрованный в ячейке 1,1 имеет координаты (8.5, 9.5) - неизвестно, и как это выводить из размера тайла - очень большая загадка.
Столкновения.mp43,8 Мб, mp4,
820x580, 0:11
18 800900
Определяем столкновения. Но как реагировать на них - понятия не имею.

Вопрос к олдам. Как 2Д вектор скорости модифицировать, зная ректы игрока и стенки?
19 800964
>>800900

>Вопрос к олдам. Как 2Д вектор скорости модифицировать


В думе можно было разгоняться за счет стен т.к. они выталкивали игрока если в них упереться.
20 800967
>>800964

Я думаю запилить классическое скольжение вдоль стенки.
21 800968
Правда не знаю как.
22 800970
>>800023 (OP)
Зачем нужен pygame, если тебе больше 14 лет?
Можно же пользоваться нативным SDL/SMFL или библиотеками вроде raylib. Pygame хорош для обучения детей.
23 800982
>>800979
В современном C++ такого не должно быть, если грамотно использовать смарт пойнтеры. И компиляция на современных процессорах - доли секунды.
2022-05-08 15-44-57 (online-video-cutter.com).mp428 Кб, mp4,
282x262, 0:01
24 800986
>>800023 (OP)
Чё за хуйня со спрайтами? Кароч нарисовал чувачка с двигающимися ручками/ножками, когда двигаю влево/вправо местами спрайты идут по пизде и превращаются в пиксельное месиво, но сука при записи нихуя такого нет. Что это блять?
25 800998
>>800986

Возможно, блитишь поверх того, что в предыдущих кадрах наблитил? Во всяком случае, когда я столкнулся с чем-то подобным, дело было в этом. Фиксится обновлением поверхности каждый кадр: surface.fill('black')
2022-05-08 18-11-52 (online-video-cutter.com).mp458 Кб, mp4,
380x208, 0:01
26 801006
>>800998

>surface.fill('black')


Такое есть в коде.
Без него оно - ну, вот это вот...
27 801007
>>800998
Я думаю что может быть проблема в говновидяхе либо с методом вращения спрайтов. Хз.
28 801009
>>801006

Код давай тогда. Потестю на своей видяхе.
2022-05-08 19-10-23 (online-video-cutter.com).mp4669 Кб, mp4,
1920x1080, 0:04
29 801020
>>801009
Та ни.
30 801042
>>801009
Как привязать цикл анимации к pygame.time.Clock() если вообще возможно? Вроде читал что-то такое...
31 801050
>>801042

Наверное как-то так:

time = pygame.time.get_ticks() / 1000
anim_frame = int(time * anim_fps % anim_frames)

Это внутри вайл лупа.

Но я пока анимацию не изучал, может есть что-то готовое.
videoplayback (1).mp41,2 Мб, mp4,
640x360, 0:26
32 801068
>>801050
Кароч как я понял проблема была в перемещении спрайта, я типа прибавлял к поз.х += 4 на каждом фрейме анимации, что заставляло пугаме перерисовывать спрайт каждое перемещение. Правильно перемещать спрайт нужно функцией пугаме move_ip(*вектор) которая смещает прямоугольник по вектору (который изменяешь в корневом цикле, в зависимости от клавиши) спрайта и вместе с ним уже отрисованный спрайт!
Спидран.mp4389 Кб, mp4,
820x580, 0:32
33 801072
Пилим обработку столкновений. Пока со встроенными спидран-функциями. Но хотелось бы, конечно, без них.
34 801141
В общем, напилил и отладил обработку столкновений и доволен. На 99% ничего сложного, принимаем игрока за точку, прямоглы коллайдеров ожиряем на размеры игрока, ищем пересечение луча и прямоугольника, возвращаем нормаль, отговариваем скорость этой нормалью и радуемся. Потом решаем гемор с пенетрацией в углах и спотыканием на стыках, что решается сортировкой коллизий по расстоянию до них и несколькими проверками на пересечение для разных скоростей (обычной, горизонтальной, вертикальной).
Оптимизон.mp4436 Кб, mp4,
820x580, 0:14
35 801170
Оптимизон завез.
36 801221
>>801170
В чем оптимизон?
37 801222
>>801221
Отсекаем ректы и не тратим время на определение столкновений с ними.

Без оптимизона:
hit_rects = move(player, velocity, collisions=all_rects)

С оптимизоном:
scanrect = player.rect.inflate(20, 20)
rects = [all_rects for i in scanrect.collidelistall(all_rects)]
hit_rects = move(player, velocity, collisions=rects)


Ограничение: плюссайз сканректа не может быть меньше скорости, иначе теряется свойство CCD и приобретаются спидраннерские фичи
.
38 801224
>>801222
Разве на отсечение ненужных ректов не тратится примерно то же время, что и на столкновения?
39 801226
>>801224
Неа. Это оптимизированная операция, исполняемая сишной либой.

Чтоб ты понимал:
5к ректов, без оптимизона, векторы: ~30 фпс
5к ректов, без оптимизона, тупли: ~60 фпс

5к ректов, с оптимизоном, векторы: ~600 фпс
5к ректов, с оптимизоном, тупли: ~600 фпс
Столкновения 2.mp43,8 Мб, mp4,
820x580, 0:11
40 801325
Запилил всё это в проект! К несчастью моему, спидраны всё равно повылазили в углах, но результату я всё равно мега рад!
41 801328
>>801325
Ого, выглядит мило. Это будет игра или просто тестишь движок?
42 801330
>>801328

Я впечатлился опенсорсными работами этого гения: https://dafluffypotato.itch.io/shifting-edge
Офигел, что на Питоне можно писать функционирующие и динамичные игры, решил попробовать.

Разобрал одну до винтиков, параллельно всё делаю по-своему, как мне нравится. Не все идёт гладко, но есть и успехи. Например, удалось запилить подгрузку карт из Tiled: >>800412 (уже и спрайты работают) и свою систему обработки столкновений выше.

В планах на будущее: прыжки, анимации, звуки, проджектайлы, частицы, тряска камеры. Потом, может, простой ИИ врагов.
43 801335
>>801325

Фух, нашел баг. Подлое -1e-15 вкралось там, где ожидалось ≥ 0. Расчехлил эпсилоны, и теперь всё идеально.
2022-05-13 19-46-47 (online-video-cutter.com).mp4470 Кб, mp4,
1440x900, 0:10
44 801606
бамп мёртвому треду
45 801614
>>801606

Как спрайты вращаешь?
Анимация.mp42,9 Мб, mp4,
820x580, 0:15
46 801707
Потихоньку научился в анимацию:
Музыка.mp4808 Кб, mp4,
820x580, 0:20
47 801893
Играем музло на фоне.
2022-05-15 14-07-26 (online-video-cutter.com).mp41,6 Мб, mp4,
1440x900, 0:27
48 801921
>>801614
Т Р И Г О Н О М Е Т Р И Я
Р
И
Г
О
Н
О
М
Е
Т
Р
И
Я

Мозг взрывается. Сейчас дошёл до того, что ищу вектор до точки, получаю угол между ним и вектором спрайта, поворачиваю спрайт на этот угол, двигаю спрайт по вектору до точки. С телом интереснее - смещаю центр по окружности вокруг центра головы, нахожу вектор между телом и головой, поворачиваю на угол вектора, перемещаю к голове.
2022-05-15 15-09-24 (online-video-cutter.com).mp41,3 Мб, mp4,
1440x900, 0:24
49 801928
Накатываем гравитацию на обе части тела и пиздярики.
2022-05-16 09-28-24 (online-video-cutter.com).mp4578 Кб, mp4,
1440x900, 0:30
50 802073
51 802074
>>802073

Эт че, инверсная кинематика???
videoplayback (1).mp41,2 Мб, mp4,
640x360, 0:26
52 802076
>>802074
Я даже слов таких не знал. Скелетная анимация думал.
Таскаем.mp4398 Кб, mp4,
1280x720, 0:18
53 802725
>>801921

Я зделол.

Кстати, чем короче вектор мыши, тем сильнее направление квантуется на восемь сторон, отчего возникает дребезг.

От дребезгов помогает старый советский лерп:
sprite_dir = normalize(lerp(mouse_dir, sprite_dir, delta_time))

Жалко, что нет функции, которая вращает спрайт вокруг пивота и возвращает спрайт и новый рект. Приходится вычисислять новый рект отдельно.
54 802737
>>802725
x = rcos(fi)
y = r
sin(fi)

Например "найти точку на окружности имея радиус и угол"?ну и центр окружности = пивот
55 802738
>>802737
Это о чем? И чем rcos и rsin от cos и sin отличаются?
56 802739
>>802738
r это радиус
там пропущен *
ты смещаешь центр ректа расположенный от пивота на расстоянии r на угол fi, где тут вычисление нового ректа?
57 802740
>>802739
А икс и игрек тут что?
58 802741
>>802740
то что изменяется при смещении, видимо
59 802747
>>802741
Короче, я всё понял, что ничего не понял.

Я сделяль через так:

rot_sprite = rotate(sprite, -degrees(angle))
rot_rect = rot_sprite.get_rect(center=pos - rotate(pivot, angle))
screen.blit(rot_sprite, rot_rect)
60 802748
>>802747
ну, конечная формула сложнее чем просто:
self.rect.centerx = pivot_x + r cos(-fi)
self.rect.centery = pivot_y + r
sin(-fi)

там всякие Пи и циферки в разные места надо сувать.
61 802749
>>802748
ебучая макака опять трёт звёздочки
62 802750
>>802749
А. Ну, в принципе, то же самое.
63 802752
>>802750
Ну, в любой момент можно менять радиус (r + i), рект остаётся, и то и другое - ситуативно, я полагаю.
64 802753
>>802752
сам r инициируется со спрайтом через:
self.r = math.sqrt((self.rect.width 2) + (self.rect.height 2)) // 2
что тоже полезно, если разные исходные размеры.
65 802754
>>802753
сука ^2
66 802758
>>802752
В моем варианте для этого двигается пивот.
2022-05-22 15-46-22 (video-converter.com).webm4,1 Мб, webm,
1920x1080, 0:10
67 802864
image.png2,2 Мб, 1224x1632
68 802867
>>802864
Спс. В тему треда, в принципе. Но задачу "поумнеть" можно вычеркнуть. Нам умнеть дальше уже некуда. Поумнено до упора уже.
image.png249 Кб, 720x404
69 802868
>>802867
там Pygame начиная с 13 главы, результат вебмрил, +ёбаная гора ссылок, +весь код разжован, штош пойду картографировать Марс
70 802873
>>802868
Здорово. Я тоже скоро за партиклы возьмусь. Где-то после... этой секунды.
71 802897
Но сначала вопрос к олдам. Причем не по пайгейму, а скорее по архитектуре игровой.

Как простыню "for event in events" с обработкой миллиардов кнопок выделить из гейм лупа в отдельный класс, и желательно сделать так, чтобы инпут могли получать обрабатывать произвольные классы?
72 802898
Нравится система в Анриле, где есть понятия Axis и Action

Action происходит однократно, типа "игрок нажал кнопку прыжка".
Axis происходит каждый тик, типа "игрок двигается вертикально" и значение этой оси. Для кнопок это обычно 1.0/-1.0, а для геймпад стиков плавает между этими границами.

И можно назначать на них произвольные кнопки, даже больше одной.
1.png7 Кб, 397x251
73 802907
>>802897
events ИМХО годится только для KEYDOWN/KEYUP, типа открыть инвентарь, меню выхода и всё такое.

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


Заводишь метод класса и суёшь его в update().
Там в книге всё это есть.
image.png805 Кб, 700x467
74 802916
>>802907

Я пока решил запилить велосипед, а именно зоонаблюдателя:

>from input import handle_input, subscribe


>quit_requested = False



>def handle_quit():


> nonlocal quit_requested


> quit_requested = True



>subscribe(name='Quit', callback=handle_quit)


>while True:


> handle_input()


> if quit_requested: break



Внутри input.handle_input пока что происходит взлом жопы луп по эвентам и вызов коллбэков всех падпищеков.
Контролируем.mp44,8 Мб, mp4,
820x580, 0:33
75 803011
УХАХА! Лисапед готов! В мире нет ничего, что не решалось бы сотней строк отборного говнокода на Питоне!

Теперь у меня свои Аксисы и Акшоны, круче чем в Анрилах этих ваших. Основная сложность в том, что в Пугейме это всё раскидано по разным сущностям, и собрать их в единый интерфейс довольно сложно.

Значит, теперь можно подписываться и обрабатывать инпут где угодно. И на сладкое: можно прямо из игры динамически переназначать кнопки, это из коробки работает с этой системой.

Забиндил управление на мышь, клаву и геймпад. Всё работает. Даже кнопка следования камеры появилась.
76 803234
>>803011

Довёл до ума! Теперь эта штука переконфигурируется на лету через простой дедовский дикт или джейсон какими угодно действиями и коллбэками. Строго заданы только имена кнопок, и то можно переименовать. Без проблем могёт в many-to-one, one-to-many и даже many-to-many настройки, хот свап джойстика, инвертирование и масштабирование осей, и наверняка еще что-то грандиозное, что даже я сам еще не знаю.

Уечникам это покажется знакомым, думаю. Художественный фильм "Вдохновились".
77 803235
И заодно узнал две вещи о Пугайме, хорошую и плохую:

1) Для илиты, не добавляя в индекс документации, чтоб быдло не спалило, запилили pygame._sdl2.controller, который в тыщу разов лучше pygame.joystick. Сделан с мыслью о современных геймпадах, а не о джойпадах NES и палках от Atari 2600. Имеет адекватный интерфейс. Есть эвенты на все актуальные кнопки, включая тачпад дуалсенсовский. И последнее, но не менее важное: кнопки ди-пада, которых нет в joystick, где это называется hat и предлагается использовать голые оси без смс и регистрации нажатий и отпусканий. А вот под триггеры всё равно нет кнопок, только оси. Хаха, я здесь живу.жпг
https://www.pygame.org/docs/ref/sdl2_controller.html

2) Минималистичная либа, которую уже больше 20 лет пилят по принципу "лучше делать одну вещь хорошо, чем всё подряд плохо" местами может быть сырой и недописанной, фейля в простейших вещах. Например, крашится, если _sdl2 контроллер выключить или вытащить из юсб порта. Фиксится НЕиспользованием pygame.event.get() без аргументов. И pygame.event.clear() в конце цикла (на всякий пожарный). Это опенсорс, сынок, кушой.
Voronoj.png29 Кб, 902x931
78 803293
Я С Н О
С
Н
О
79 803297
>>803293
Чо пилишь?
80 803309
>>803297
Ну, песочек, хотелось бы. А-ля Oxygen Not Included, по крайней мере в голове образ чего-то такого. Докатился до уровня где понадобилось перемещение персонажа к точке выполнения задания и тут А* с Графами кааак налетели, Графы - вообще особый путь поехать кукухой, а у меня ни опыта, ни знаний, в итоге Вороного таки осилил, теперь буду улучшать алгоритм создания, всякие там сохранения мира, перемещения камеры, и потом уже по Графам взад-вперёд ездить до посинения.
Мимолётом ещё узнал, что блит всего экрана каждый цикл - ваще не вариант, и буду по-ходу ещё вникать в отдельные прорисовки того что подвигалось.
81 803310
>>803309

>блит всего экрана каждый цикл - ваще не вариант, и буду по-ходу ещё вникать в отдельные прорисовки того что подвигалось



Так ведь с перемещением камеры у тебя всё подвигалось, не?
82 803311
>>803310
Да, но не каждый цикл. Интерфейс тоже не подвигался. Кароч буду разбираться.
Камера.mp41,2 Мб, mp4,
1920x1080, 0:18
83 803325
Продолжаем продолжать. Итак, камеры.

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

Оказывается, если не скейлить ОБСом видосики с пиксель артом, то они весят даже меньше, чем даунскейл.
Частицы.mp4229 Кб, mp4,
1920x1080, 0:10
84 803333
Запилил частицу. Элементарно: спрайт с несколькими фреймами, совершающий self.kill()надзор в конце анимации. В минимуме содержит только позицию (и скролл в моем случае). Но, думаю, без вектора скорости смысла в партиклах мало.

Запускать и апдейтить частицы будет, наверное, эмиттер. Погнали.
Эмиттер.mp42 Мб, mp4,
1920x1080, 0:15
85 803334
>>803333

Запилил эмиттер.
2022-05-26 14-53-23 (online-video-cutter.com) (1).mp417,1 Мб, mp4,
1280x720, 0:38
86 803354
87 803377
>>803354

Хера майнкрафт.
Направленный эмиттер.mp4244 Кб, mp4,
1920x1080, 0:09
88 803457
>>803334

Направленные эмиттеры + гравитация.
Эффект шагов.mp41,5 Мб, mp4,
1920x1080, 0:18
89 803499
Ну, вроде работает мой партикловый спецэффект шагов. Осталось запилить к нему звуки шагов.
90 803506
Проблема:
Всё это время я рендерил маленькую картинку и растягивал её в конце в N раз. Я подсмотрел это в сорцах ВолосатойКартохи. Так и не понял, почему он так сделал. Однако это весьма удобно, потому что всё рулится глобальным масштабом в настройках, можно задать какой хочется. Всё бы ничего, но движение спрайтов и камеры с шагом N пикселей заставляет вытекать глаза: когда камера замедляется, приближаясь к игроку, она начинает двигаться ступенчато. То же самое с медленно двигающимся игроком, его спрайт сильно дребезжит.

Решение:
Переделать логику масштабирования. Теперь я масштабирую тайлы и спрайты при подгрузке ассетов, а рендерю всегда большую картинку. Графоний улучшился в триллионы раз. Камера стала плавной, дрожание героя исчезло. Ну и всё по-прежнему рулится глобальным масштабом в настройках, и всё ещё можно задать какой хочется.

До и после:
2022-05-28 12-53-19 (online-video-cutter.com).mp47,8 Мб, mp4,
1440x900, 0:26
92 803688
93 803774
Всем зип файл, кто-нибудь пытался на пайгейме работать с 3д графикой? Как ощущения?
image.png689 Кб, 470x1024
94 803776
>>803774

В Пугайме нет 3д графики. Придется подключать Пуопенжиэль и работать уже с ним, а Пугаем будет как прослойка для окна и т. п.
95 803987
И получится ренпи... Где чтение ивентов с пигейма, а графика через openGl.
16157413582320.jpg187 Кб, 1280x720
96 804113
Оп выложи код-то, любопытно как всё сделано на питоне.
97 804133
>>804113

У меня всё слишком сыро. Лучше сюда ходи: https://dafluffypotato.itch.io/
98 804134
Переделал сортировку спрайтов с Y-Sort на псевдо-3D сортировку.
Прыжки.mp42,6 Мб, mp4,
1920x1080, 0:17
99 804137
Псевдопрыжки без запрыгивания и перепрыгивания.

Удивительно, насколько возможность прыгать всё усложняет.
100 804146
>>804137
То то на сони любят даже в ааа прыжки убрать.
2022-06-01 13-31-41 (online-video-cutter.com).mp4961 Кб, mp4,
640x480, 1:03
101 804156
ух бля, песок сыпится
Пол.mp41,7 Мб, mp4,
1920x1080, 0:13
102 804162
Определяем тип пола. Кто угадает зачем?
103 804163
>>804156

Прикольная механика для какого-нибудь фарминга. Это с той книжки?
2022-06-01 15-30-02 (online-video-cutter.com).mp4942 Кб, mp4,
640x480, 0:32
104 804175
>>804163
Это свои потуги.
Теперь буду каждому материалу своё поведение присваивать.
Ну и как ты там скейлишь на выводе думать. Потому что ФПС прямо пропорционален площади мира делёной на размер квадратов.
8b0c6659c87ea996122166da9e8f5ffd.jpg86 Кб, 500x383
105 804178
>>804175
И ещё надо как-то сузить цикл по квадратам которые надо отрисовывать, но в то же время как-то успевать их отрисовывать когда они близко от экрана/расположены на экране и вроде действия внутри квадратов должны происходить, но не отрисовываться до тех пор пока они не находятся в пределах около экрана, и уже два цикла получается - на действия и на отрисовку, и хз в какой жопе в итоге будет ФПС. Кароч ноды это пиздос.
106 804181
>>804175

>Ну и как ты там скейлишь на выводе думать. Потому что ФПС прямо пропорционален площади мира делёной на размер квадратов.



Скейлю спрайты при загрузке. Чтобы обойтись без pygame.transform.scale в геймлупе.

settings.py:

> GLOBAL_SCALE = 3


> UNIT_SIZE = TILE_SIZE * GLOBAL_SCALE

107 804184
>>804181
А, ну это не то, у меня скейл при инициализации класса спрайта сейчас, и мне скорее в лупе надо его делать, типа увеличенной проекции сурфасе мира на экран что-то. Сейчас у меня субсурфасе от сурфасе мира блитится на экран, поэтому я могу изменяя положение субсурфасе на сурфасе мира иммитировать перемещение камеры, значит мне надо скейлить субсурфасе перед тем как блитить на экран, в то время как
оригинальную площадь мира(в пикселях), оставив колличество квадратов, можно будет сократить. Я просто не разобрался ещё как именно её скейлить, вернее скейлю но фпс падает, что мне не нужно. Там код такой:
screen.blit(subsurface, (0,0), (и вот тут типа скейл, называется AREA, но этот скейл отрисовывает за экран в итоге тупо))
Как-то с этими циферками надо играться.
108 804185
>>804184
или даже эта DiArea тупо разположение на экране меняет, а не скейлит, и где-то в кваргах валяется заветное ключевое слово.
videoplayback (11).mp461 Кб, mp4,
450x360, 0:02
109 804192
>>804185
Кароч subsurface создаётся меньшего размера, потом через pygame.transform.scale создаётся другая растянутая из subsurface и новая блитится на экран, все координаты мыши и границы за которые нельзя уезжать - у меня, разумеется пошли по пизде, но фпс вроде отрастает. Настало время переписывать весь код.
110 804334
Попробовал загрузить большую карту...
111 804364
>>804162

>Определяем тип пола. Кто угадает зачем?


Чтобы изменять скорость движения?

>>804334
В чём проблема? КВС мало?

Есть одна старая методика для 2D тайловых карт, которые рисуют бит блиттингом. Объединяй тайлы в чанки (группы), рисуй каждый чанк на отдельной текстуре, затем рисуй на экране чанки. Итого, если карта не обновляется, ты делаешь значительно меньше дроуколлов. Если карту нужно иногда обновлять, т.е. менять тайлы - после изменения тайла заново рисуешь текстуру чанка, в который входит этот тайл. Всё просто и скорость при этом большая. Если у тебя есть слои, их придётся рисовать в отдельные текстуры. Учитывая вид твоей графики, не забудь включить прозрачность у текстур чанков, иначе уголки будут перекрывать соседние чанки.

Если же у тебя не бит блиттинг, а 3D API, то теоретически можно комбинировать вершины в один массив и с разными материалами, но таким в чисто 2D движке позорно заниматься.

мимо проходил
112 804366
>>804334
Вообще, я не знаю, как там оно под капотом устроено: используется ли встроенный рендерер SDL (с бит блиттингом)? Если так, то другого выбора как рендерить чанки в текстуру вроде и нет, SDL вроде не имеет встроенного механизма батчинга.

Просто тут недавно кто-то возмущался, зачем рендерить чанки в текстуру, в чём смысл. А на SDL другого пути нет, только если на OpenGL переезжать, но там ты теряешь контроль за пикселями, т.е. это уже не пиксель-перфект 2D получается...
113 804368
>>804364

>Чтобы изменять скорость движения?



Пока что просто чтобы разный звук шагов проигрывать.
Чанкинг.mp41,5 Мб, mp4,
1920x1080, 0:04
114 804371
>>804366
>>804364

Да, там блитинг. Чанкинг в процессе:

Зарылся с вычислениями ректов немного. У меня тайлы в мировых изометрических координатах, плюс прокрутка камеры. Сложно подобрать нужную процедуру для вычисления ректа.
115 804377
Завёз оптимизон. Оказалось, что производительность при большом количестве дроуколлов в основном убивал альфа-канал.
Дешевле всего оказалось просто слить все 2500 тайлов в один гигачанк размером с карту.

Без чанков без цветомаски 90 фпс
Без чанков с цветомаской 250 фпс
Гигачанк без цветомаски 400 фпс
Гигачанк с цветомаской 410 фпс
116 804388
>>804377

>альфа-канал


Да... Там вроде умножения постоянно производятся вместо прямого копирования пикселей. Или как минимум проверка каждого пикселя на наличие альфы < 1.0.

>цветомаски


А разве не достаточно отметить "прозрачный" цвет?
https://wiki.libsdl.org/SDL_SetColorKey

>2500 тайлов


Это не так уж много, 50x50.

Теперь попробуй сгенерировать/загрузить карту ещё больше)
image.png106 Кб, 1922x1112
117 804389
>>804388

Да, я имел в виду прозрачный цвет.

>попробуй сгенерировать/загрузить карту ещё больше



В моем случае ничего не меняется. Чем больше чанки - тем выше производительность.

А вот с памятью проблема, вплоть до:

> pygame.error: Out of memory



Это на 500х500 (250 000 тайлов) и одном гигачанке. Но на 4 чанках работает, кушая 10 гигов оперативы.

Хотя, 50х50 в моем случае более чем помещается в экран с запасом, так что смысла в большей карте пока нет.
Чанки.jpg211 Кб, 2212x1658
118 804390
Хоть я и зря потратил половину дня, тумкая над функцией чанкинга, вот вам мойНАШ алгоритм, вдруг вам полезней окажется:

https://pastebin.com/raw/66b4b1Kj

Делит сетку произвольного размера чанками произвольного размера. Если кратности нет, в конце будут чанки-обрезки. Порядок слева направо сверху вниз.
8b0c6659c87ea996122166da9e8f5ffd.jpg86 Кб, 500x383
119 804397
>>804390
я хз про все эти ваши чанки, но когда пилил свою матрицу, пришёл к списку list = [0,1,2,3,4,...,n] из которого высчитываю координаты на сетке через y = n//grid_width x = n%grid_width ебля с определением клетки внизу через клетка = list[(self.x)+(self.y*grid_width)] included, наверное какой-то тупль можно кидать как чанк в этот лист.
120 804419
>>804397

У тебя всё плохо. У меня-то статичная земля: склеил всё в один жипег и показывай. А тебе еще и обновлять надо динамически, чтобы песочек подбличивать в кучу.

Попробуй при каждом добавлении песочка регенерировать всю кучу и склеивать их в один большой сюрфейс.
Это скорее всего будет статтерить при добавлении песка. Но при бездействии и скролле будет видна максимальная теоретическая польза от чанкинга. И уже думать как оптимизировать кусок чанка в месте подсыпания.
image.png73x86
121 804425
Вопрос к олдам. Как умножить только видимую часть спрайта с цветомаской?

Сейчас использую такое:

> image.fill(color, rect=None, special_flags=pygame.BLEND_RGBA_MULT)



Тут цветомаска тоже умножается, и перестаёт быть цветомаской. Пробовал все флаги.
122 804445
>>804425

Короче, решил через цикл по всем пикселям оригинала и восстановлением пикселей цветомаски на тинтованном изображении. Странно, что нет такой банальной функции.
123 804513
>>804419
Где ты прочитал, что у меня весь лист блитится на поверхность мира каждый цикл?
image.png16 Кб, 348x149
124 804529
>>804513

А как у тебя? А то вроде скроллишь всю бодягу, и фпс не меняется?
2022-06-03 19-45-30 (online-video-cutter.com).mp44,3 Мб, mp4,
640x480, 0:30
125 804550
>>804529
У меня мир из тех же чанков, только они объекты класса Node, наследник класса pygame.Surface, у каждого объекта свой контейнер спрайтов, который объект сам на себя блитит, и потом блитит себя на картинку мира, сейчас сделал начальную отрисовку всего мира и потом отрисовку изменений только во время нахождения на экране и пилю цикл изменения объектов и помещения в сет изменённых чтобы при пересечении сета экрана и сета изменённых происходила отрисовка. Пока что только под себя умеем перекидывать, после изменения функция возвращает в сет объектов в очереди на изменение None объект.
126 804552
>>804550
Наверное стоит написать FX8350
127 804553
>>804552
ну и OBS кушает проц ващет
128 804555
>>804550

Понял. Какой размер чанка-ноды? Меня чанки поменьше как-то не впечатлили по сравнению с одним гигачанком.
129 804557
>>804555
В пикселях 10х10, при инициализации каждому объекту роллится свой цвет, чтобы потом филл накидывать, в тестовом режиме. Всего их 12288 пока что. На экране 48 срезов листа по 64 объекта брошенных в сет.
130 804559
>>804557

Так один квадратик это одна нода что ли?
8b0c6659c87ea996122166da9e8f5ffd.jpg86 Кб, 500x383
131 804561
>>804559
Получается так.
132 804566
>>804561

А что содержит контейнер спрайтов ноды?
Ты уже финальную картинку мира скроллишь, я так понимаю?
133 804573
>>804566
Изначально ничего не содержит, по клику кидаю в контейнер спрайт, спрайт проваливается в контейнер нижней ноды, если нижняя занята - случайная слева или справа от нижней.

>Ты уже финальную картинку мира скроллишь, я так понимаю?


>>804550

>сейчас сделал начальную отрисовку всего мира


Перед запуском while. Потому что изначально сет изменённых пуст и прорисовывать нечего хоть с пересечением экрана, хоть без.
134 804576
>>804573

А, вот чего у тебя фепесы подросли. Сами сюрфейсы без альфы? Просто image.convert()? А то Пугейм никак не препятствует выстрелам себе в ногу. (И это хорошо!)
135 804595
>>804334
Вспомнился Song of Conquest который 2D спрайтовый и нещадно тормозит при скролинге карты на 1060, в то время как такие же спрайтовые герои 3 сносно идут на пека до 1го пентиума...
В чём магия оптимизации?
136 804602
>>804595

>Song of Conquest



Не играл, но судя по скринам, это полностью 3д игра с реалтаймовыми тенями, пбр графикой, пост-процессом, налогом на юнити и т. д. Пффф! Щенки.

То ли дело Пугайм, пердящий на 90 фпс, отрисовывая пару тысяч 2д спрайтов на чистом SDL. Вот это да, внушает уважение.
137 804604
>>804602
Ну как бы да, но выглядит это как пикселявые спрайты, особенно при приближении камеры. Предполагаю что там туман войны ещё какой-то ёба эффект который рендерится на всю карту сразу.
138 804611
>>804604

Реалтаймовые динамические тени на всю карту и 5 тыщ дроуколлов делают своё черное дело.
139 804633
>>804576
Сами сурфасе вообще без имаге, это же поверхность для отрисовки, на них self.fill(self.color) для того чтобы видеть как расположены сами ноды и как отрисовываются, было дело что пол экрана только заполнялось. Альфа там только для прозрачности, насколько я понимаю. Типа делаешь set_alpha и цвет альфы выпиливается при отрисовке. У меня так обводка на координатах возле курсора сделана, хотя я её не планировал, но она вылезла. У координат тоже своя сурфасе, которую надо филлить каждый цикл, чтобы циферки не сливались в гавно, но и летающий прямоугольник возле курсора - так себе смотрится, поэтому сетаешь альфу и pygame.SRCALPHA её глушишь. А спрайты загружаю с .convert_alpha(), на простом конверте альфа заполняет спрайтовые пустоты.
140 804636
>>804633

>convert_alpha



Во, вот эта хрень мне 50% перформанса убивала. Схитрил, загружая пнгшку и блитя её на сюрфейс розового цвета, которому ставил розовый цветом прозрачности при помощи set_colorkey. Но я все тайлы каждый кадр в гейм лупе рендерил.
2022-06-04 13-54-33 (online-video-cutter.com).mp4792 Кб, mp4,
640x480, 0:38
141 804707
Без OBS ~140-180 если чо. Баги со всех сторон когда двигаешь экран с зажатой мышью, хз пока как фиксить и надо ли, скорее это баг прорисовки, потому что сквозь ноду всё равно проваливается песочек, добавил по краям стенки и пол чтобы индекс не выходил за пределы листа.
2022-06-04 14-16-04 (online-video-cutter.com).mp41,7 Мб, mp4,
640x480, 0:39
142 804708
2022-06-04 22-07-57 (online-video-cutter.com).mp43,6 Мб, mp4,
640x480, 1:01
143 804822
Ух, бля!
144 804863
>>804708
>>804822
Магический песок, не иначе.
145 804922
>>804708

Исправил? В чем баг-то был?
146 804940
>>804822
А что ты делаешь? Клон The Powder Toy?
https://powdertoy.co.uk/
Кстати, песочница эта, оказывается, опенсурс:
https://github.com/The-Powder-Toy/The-Powder-Toy
Много лет назад игрался с ней, быстро надоело. А ведь некоторые целые компьютеры сооружали. Очень жаль что мир ограничен рамками экрана.

В общем, интересно, будешь ли ты делать электронику в своей песочнице, с полупроводниками и т.д.?
147 804951
>>804368
Аудиосопровождение постоянное на фоне? В таком случае звуки шагов будут неслышны.
148 805040
>>804922
Там скорее всего в контейнер падает больше одного спрайта, а активность ноды выключается после переноса одного, полуфикс - замена постоянного закидывания при нажатии на мышь на одно действие по клику - event.type и MOUSEBUTTONDOWN перед click[0], либо целыйфикс - прописывание условий на повторную проверку осталось ли что-то в контейнере, по сути мне будет достаточно полуфикса.
>>804940 -> >>803309
Не знал про сабж.

>будешь ли ты делать электронику в своей песочнице


До этого ещё далеко, я не очень опытный программист.
149 805045
>>805040
Ну, кстати можно тип контейнера сменить на переменную со значением между None и спрайтом, но там лежит много всякой фигни типа у None объекта нету имаге и ректа или ещё какая-нибудь срань в дальнейшем, так же у Пугейма есть своя группа одного спрайта, которая если получает спрайт выкидывает тот, который уже в ней есть, можно через неё, но там чтобы вызвать аргумент спрайта всё время надо обращаться к спрайту через group.sprites()[0].image например и в итоге строки по 200 символов, ну, и для того чтобы помещать несколько спрайтов разных сущностей надо будет пилить отдельный контейнер под каждую сущность. для песка, для персонажа, для проводов, etc.
150 805050
>>805045
Почитал, там обращение к спрайту в одиночной группе через:
group.sprite
Отдельные контейнеры скорее всего надо будет запилить.
151 805059
>>805040

>Не знал про сабж.


Поиграй. Там много интересных механик и физика сложная. Есть встроенная онлайн галерея пользовательских работ, которые можно в пару кликов скачать и попробовать. В ONI тоже есть физика газов и жидкостей, но в ONI оно как-то грубо выглядит. Может, из-за оптимизации, всё же размеры мира большие, или из-за крупного размера тайлов (в The Powder Toy буквально пиксели).

Но, как я понял, у тебя жанр совсем другой, ты хочешь симулятор колонии как в ONI? Тогда нужно фокусироваться на ботах, там отлаживать ИИ довольно сложно, наверное.
152 805063
>>805059

>Поиграй


Я скачал, потыкал в разные стороны, не разобрался. Сложно позволить себе поиграть во что-то, когда поставил цель писать и надо думать над кодом.

>в ONI оно как-то грубо выглядит. Может, из-за оптимизации


Там обнову завезли, обещали экономию памяти на всех этапах игры. Хочется глянуть, но не могу себе позволить, опять же.

>симулятор колонии как в ONI


Да. Но конечная картина игры в голове постоянно меняется в разные стороны.

>ИИ довольно сложно, наверное


По сути весь ИИ там заключается в поиске пути от точки нахождения до точки задания, алгоритм А*, из-за этого и начал ковырять все эти ноды. Эмуляция выполнения задания на месте - скорее просто: если а - то покрути ручками и потом б.
Загрузка и выгрузка.mp4880 Кб, mp4,
1920x1080, 0:10
153 805133
Запилил загрузку и выгрузку карт.
Материалы.mp41,8 Мб, mp4,
1920x1080, 0:11
154 805167
Сделал материалы: контейнеры с настройками частиц и звуков различных физических поверхностей: травы, земли, камня, листвы, досок и т. д.

Назначил материалы тайлам пола, чтобы использовать при обработке шагов.
Размеры.mp41,1 Мб, mp4,
1920x1080, 0:15
155 805848
Запилил физические размеры объектам, а также их отрисовку в виде псевдо-3д коробок.
156 805851
Вопрос к олдам. Какой есть годный алгоритм для пересечения курсора/луча и изометрических AABB? Какая-нибудь дистанция Сосницкого, учитывающая размеры коробок и их перекрытие друг друга.

В Пугайме есть пересечение точки с ректами, но это отстой для изометрии, если именно экранные ректы трогать.
image.png192x192
157 805867
>>805851
Если у тебя каждый объект находится точно в клетке карты, и размеры коробки равны размеру клетки и отличаются только высотой, то может можно все свести к алгоритму Digital differential analyzer?
Подсвечивание.mp4876 Кб, mp4,
1920x1080, 0:08
158 806150
Подсвечиваем объекты под мышью. Пока что на ректах.

>>805867

У меня произвольные AABB. Видимо, придется 3д рэй-бокс использовать.
159 806327
Небольшой оптимизоний подсветки. Отсекаем все объекты, кроме тех, что попадают в небольшое окно вокруг курсора.

Не знаю зачем. Но при 5000+ объектов это заметно.
160 806346
Заодно добавил оптимизон коллизий из >>801170 в игру.
161 806349
Новая веха в проекте!!! Интерактируем с объектами! Пока что просто убираем спрайты. Но уже такой-то геймплей на кончиках пальцев! Круче, чем в этих ваших дарксоулсах и зельдах. Ведь это уже почти полноценная функционирующая игра получается. Ура!

Месяц назад я и представить не мог, что удастся даже так далеко зайти, пользуясь практически голым Питоном+Пугаймом.

И господи, как же это приятно, когда просто добавляешь функцию на несколько строк, и всё просто и без задней мысли работает: объекты убираются, подсветка очищается, коллизии удаляются. Не надо с болью перепиливать половину кода. Бог-император архитектуры в треде!
16462547915450.mp42 Мб, mp4,
1280x720, 0:40
162 806365
>>806349
Красава!
163 806539
>>806349
На днях буквально тыкал в ренпи ядро, и там был список функций пигейма залоченных. Может разлочить пошаманить тоже с чем-нибудь. Выглядит прикольно.
164 806764
>>806539

Осторожно! Так можно докопаться до скрытых [ВЫМАРАНО].
Материалы по объектам этого класса не должны быть доступны обычным пользователям.
Рэйбокс.mp42 Мб, mp4,
1920x1080, 0:24
165 806765
Напилил рэйбоксы.
166 806820
>>806765
А что насчёт ямок?
мимо копатель
image.png361 Кб, 500x389
167 806833
>>806820

Ямок?
168 806856
>>806833
Овраги там и канавы.
169 806870
>>806856

Есть примеры тайловых изометрических игр с ямами-оврагами?
170 806887
>>806870
лул
мимо-олд
симмулятор червепидора готов
171 806923
>>806887

>пики 1 и 2



Это ж наклейка на полу с принтом ямы. Обман на доллары. В принципе, такое без проблем сделать можно запилить на текущем коде.
image.png3 Мб, 1920x1080
172 806927
>>806923
Ну, вот тогда. Проект забросили в раннем доступе, вроде был какой-то конкурент получше.
выфафафывафывф.png134 Кб, 353x236
173 806929
>>806927
Ну, или не забросили.
174 806932
>>806927

Тут, как видишь, независимые плоские этажи и лестницы-телепорты между ними.

Лично мне на ум приходит Стронгхолд 1, там настоящий террейн с перепадами высот, но там какая-то йоба технология, а не тупо 2д массив с тайлами. Для меня это технологии 22 века.
175 806952
>>806923
Экран компьютера - это двухмерная наклейка с принтом из пикселей. Обман на далары.
Рэйбокс курсора.mp4830 Кб, mp4,
1920x1080, 0:12
176 807150
Напилил наконец-то рэйбокс курсора.
Интерактируем 2.mp4829 Кб, mp4,
1920x1080, 0:15
177 807310
>>807150

И присобачил к игре. Вот теперь совсем по-другому ощущается подсветка и интерактирование.
2022-06-14 18-18-14 (online-video-cutter.com).mp42,4 Мб, mp4,
640x480, 0:37
178 807311
179 807314
>>807311

Фигасе у тебя физониум! А что за зеленые квадратики? Дебаг?

Как делал гуй?
180 807315
Ну, лан. Без профилирования и с отрисовкой(каждый цикл) ректов только на экране, вместо ректов на всей карте. без ОБСа не могу записать
2022-06-14 18-32-26 (online-video-cutter.com).mp41,5 Мб, mp4,
640x480, 0:21
181 807316
>>807315
отклеилось
182 807319
>>807314
Зелёные - по которым можно пройти, они же путь.
GUI просто слой, который блитается на экран, на котором надписи, если мышь в пределах прямоугольников и кликает - делаем Тру-инструмент, если инструмент Тру, ну, ты понял.
183 807320
>>807319

Надо будет попробовать.
image.png2 Кб, 720x480
184 807322
>>807314
По поводу физики, кста, натыкался на Хабре на статью про Pymunk либу, вроде что-то делает, у меня движок не про это просто, мож кому пригодится.
0e2aeeb01d6494ec13b3f3cdee034276.gif657 Кб, 720x480
185 807323
>>807322
ля, копировал в пнг нах
2022-06-17 12-14-18 (online-video-cutter.com).mp43,5 Мб, mp4,
640x480, 1:02
186 807768
2022-06-17 15-17-39 (online-video-cutter.com).mp41,3 Мб, mp4,
640x480, 0:31
187 807858
188 808114
>>807858

Поиск пути запилил? Какой алгоритм?
189 808160
>>808114
А*
>>808118
Кто живое?
190 808443
>>808402
Типа реалтайм изменение пути? На поиск уходит, пока что 0,001-0,002, один персонаж может и норм по ФПС выйдет, но несколько в дальнейшем сожрут проц.
191 813347
Запилил зачатки интерфейса и виджет нажимающейся кнопки.

Пока что успешно открываем и закрываем главное меню, а также закрываем игру.

Научился обрабатывать событие масштабирования окна игроком и перерисовывать интерфейс на лету.
Смена языка.mp4358 Кб, mp4,
1920x1080, 0:09
192 813350
Меняем язык на лету.
Настройки.mp4546 Кб, mp4,
1920x1080, 0:15
193 814074
Научился менять язык еще более на лету. Запилил экран всевозможных настроек.
2022-07-05 22-47-18 (online-video-cutter.com).mp418 Мб, mp4,
640x480, 1:34
194 814248
процы соснули
195 814253
>>814248

КВС>=1 всё еще реалтайм!
196 814273
>>814253
Реалтайм из прошлого десятилетия, а.к.а мой проц.
На самом деле - пилю физику, с вектором силы и массой, и камень об камень - отскакивает вверх(когда-нибудь и искрить будет), камень об песок - выталкивает из под себя или выталкивает крайний/ие в нижнем ряду, песок - скользит по диагонали обо всё. Функция на два типа материалов(твёрдые и полутвёрдые) занимает 250+ строк. На очереди жидкости, у них ещё и деление объёма по-хорошему надо делать. Ожидаемая длина функции=1кк. Полупуки по теме жидкостей в гугле - вообще ни о чём.
197 814329
>>814248
Лучшебы спиздили у разрабов ноиты движ. По какой-нибудь самосбор оче зашло бы.
Главное меню.mp41,3 Мб, mp4,
1920x1080, 0:24
198 814343
Запилил главное меню с рудиментарными настройками в игру.

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

Пока что это самый большой файл в проекте (213 строк), но, думаю, сильно больше будет, ведь пока есть только пять виджетов: базовый, текст-строка, кнопка-вызывалка, кнопка-листалка и бесполезный виджет-двачер, выполняющий одну функцию: он синий.
ut-00007278.jpg102 Кб, 1200x1200
199 814347
>>814329
Хз, пиратка у меня, на том же процэ, вылетала тупа. Мож кряк такой, а мож и оптимизация говна.
200 814394
>>814273

>Полупуки по теме жидкостей в гугле - вообще ни о чём



https://ru.wikipedia.org/wiki/Уравнения_Навье_—_Стокса
15249298813250.webm210 Кб, webm,
1280x720, 0:02
201 814454
>>814394
Это четверть пука, максимум - треть.
пфваыфвуыфв.png13 Кб, 642x512
203 814484
>>814473
Ну, да, примерно такие мысли о написании.
Так же не знаю как запилить сообщающиеся сосуды(хотя скорее всего смогу, т.к. есть уже функции работающие по нижнему ряду и поиску всех заполненных нод ниже предложенной, и соответственно давление = сумма всех весов сверху, но там есть ещё заморочки с ситуациями пикрилл - где над/под нодой лежит нода не оказывающая давления, а за ней продолжается ряд давящих), и так же деление объёма на соседей.
Просто на предыдущей реализации физики векторов силы не было, а теперь они есть и вот уже почти начал писать, ленб только.
Инвентарь.mp41 Мб, mp4,
1920x1080, 0:16
204 815180
Запилил большой черный мешок.
205 815199
>>815198

Нет: >>801330

Надо, конечно, спрайты свои сделать, да лень.
Штабелирование.mp41,4 Мб, mp4,
1920x1080, 0:23
206 815213
Штабелируем. Теперь все вещи завернуты в стаки. Каждый стак умеет брать число предметов, уменьшать его на число свободного места в стаке и возвращать остаток или 0 (если всё влезло). Добавляя N предметов в инвентарь, мы сначала тратим N в цикле фор по всем существующим стакам, затем в цикле while (N > 0) создаем новые стаки и тратим N на них.
207 816153
>>814484
Эм, с питоном же датасаентисты работают в том числе занимающиеся физикой. Что-то не верится что либы до сих пор не запилили где есть расчёт физ.процессов разных.
208 816197
2022-07-10 10-00-52 (online-video-cutter.com).mp49,3 Мб, mp4,
640x480, 2:14
209 816199
Но я сам пишу.
16235898784030.png768 Кб, 2500x1840
210 816218
Бамп годному треду.
Я вот тоже решил прототип прототипа клиента к своей онлайн дрочильне на pygame накидать, бэкенды тоже на питоне с pymunk правда. Сложно пиздец, я веб дев и с вебом вообще лады, а тут вообще голова пухнет, особенно от попыток организовать норм архитектуру-структуру кода и тысяч физики и геометрии, которых я забыл к хуям после универа. Сложно но интересно сука, весь тред прочитал взахлёб
211 816645
212 816682
213 816765
>>816722

А никак. Есть возможность написать свой велосипед с нуля.
Как ты его напишешь - такие возможности и будут, получается.
214 816782
>>816777

Питоновский PyPI и есть: https://pypi.org/search/?q=pygame
Еще на сайте есть проекты разной степени качества: https://www.pygame.org/tags/all
Вот, например, целая ГУИ либа: https://www.pygame.org/project/4381
215 816815
>>816645
Спасибо, пока только очевидные вещи встретил, но как то и интересно даже

>>816722
А там в юае надо разбираться, по мне так проще новый язык освоить чем с этими интерфейсами дрочиться ещё и при том что совсем не знаешь best practices. Ну энивей на пайгейме только прототип клиента конечно же, если вдруг получиться неплохо буду движок выбирать
216 817052
Запилил конфиги. Пока еще не определился, какой формат мне нравится больше.

Инишники аккуратны, но их надо парсить и валидировать. Встроена поддержка пользовательских настроек и значений по умолчанию.

Джейсон компактный и строгий, прямолинейно переводится в питоновские структуры. Специальных конфиг-функций нет. Впрочем, со словарями всё просто из коробки: "settings = defaults | overrides", а метод dict.get позволяет задать значение по умолчанию.
217 817060
>>817052
И сразу тихо спарсилась несуществующая кнопка 'Space JoyDown' (забыл разделитель |), а персонаж в игре не прыгает. Без валидации жопа.
218 818672
Оу, май!
219 818699
>>818672
Ебать крутяк
220 818723
>>818699
стил нат енаф, бат...
Застрял на понимании откуда брать вещ-во для переноса вверх если в ряду с тайлом(1) есть тайл(2) с давлением сверху больше чем у тайла(1) и над тайлом(1) есть пустой/с водой тайл(3), которое даст сообщ-ся сосуды, и возможно даст понимание облегчения всей физики жидкости. сложна блять
221 818725
типа если брать из тайла(1) - оно упадёт обратно, тупа
Области ввода.mp42 Мб, mp4,
1920x1080, 0:24
222 819997
Допилил инпут понятием области действия: везде / игра / интерфейс. Теперь коллбэки можно подписывать областью действия. Если система настроена обрабатывать только интерфейсные вызовы, весь инпут игры, такой как движение, прыжки, взаимодействие и т. д., будет проигнорирован.

Так можно запретить герою ходить и интерактировать с предметами, когда кликаем по кнопкам в главном меню. Или разрешить только ходить, смотря на карту. Или позволить делать что угодно и при этом шариться в окошке инвентаря одновременно.

Также поменял поведение эскейпа на контекстное действие (пока только закрытие текущего окна). Вместо того, чтобы всегда открывать главменю.
223 820283
Окей, а с чего начать с этим пигеймом? Как вообще с библиотеками работать?
224 820291
>>820283

>с чего начать


С документации. https://www.pygame.org/docs/
https://www.pygame.org/wiki/GettingStarted

>Как вообще с библиотеками работать?


Лол, ну как с любыми модулями питона, нет?

мимо щупал питон на уровне hello world
225 820312
>>820291

>Лол, ну как с любыми модулями питона, нет?


А как с любыми другими модулями питона работать?

Я просто в питоне не особо понимаю, но вижу большой интерес. Ладненько, завтра попробую что нибудь сделать.
За документацию спасибо!
226 820336
>>820283

Пайгейм это сторонний питоний модуль. Сторонние модули устанавливаются через командную строку программой pip:

> pip install pygame



После чего импортируются как стандартные модули в скрипте. Пугайм требует бойлерплейта небольшого - инициализации, создания окна, вайл лупа.

Попробуй этот тутор:
https://www.youtube.com/watch?v=QU1pPzEGrqw

>>820312

А, тебе в целом интродакшн в Питон нужен? Тогда сюда ходи:

https://www.coursera.org/learn/interactive-python-1
https://www.coursera.org/learn/interactive-python-2

Это курс, преподающий Питон через геймдев. Они используют Пайгейм-подобный фреймворк.
227 820351
>>820312
Не надо pygame, он слишком низкоуровневый. По сути позволяет только создавать окно, ловить события мыши и выводить картинки по заданным координатам. Попробуй Arcade, Pyxel, Ursina engine (обёртка над Panda 3D) - там есть игровые сущности.
00.png14 Кб, 642x512
228 820574
>>820351
Аркадий привлёк внимание.

>По сути позволяет только создавать окно


Там есть пиксельаррай и класс вектор с горой методов.
Можно сочетать, потому что у Аркадия в сравнении с Пугеймом честно написаны плюсы и минусы друг против друга. Главное чтобы х, у, и сходились.
229 821852
Обнаружил, что мой метод рисования рамочки вокруг игрового окна съедает 25% фпс. Переделал всё на апдейт частичного ректа по центру экрана после изначальной заливки цветом. Не то чтобы рамочка вообще была нужна, но как-то уюта добавляет, пусть будет.
Журнал.mp4360 Кб, mp4,
1920x1080, 0:06
230 822533
У любой конечной игры должна быть какая-то цель. И наверное эту цель хорошо бы знать. А для этого лучше всего подходит что? Правильно! Повествование через окружение и нарративный дизайн.

Но я сделал старый дедовский журнал. А именно простенькую систему заданий и виджет журнала. Пока окно не умеет реагировать на клики и обновляться, но основа для интереснейших квестов уже видна. Осталось понять, как бы получше запилить проверки и продвижение по заданиям, чтобы можно было их завершать и проваливать.
Выбор заданий.mp4462 Кб, mp4,
1920x1080, 0:07
231 822613
>>822533
Добавил таки базовый функционал в окно журнала. Внимание, спойлеры эндгейма!
232 822618
>>822613
Квесты - зарыться под землю, притворится деревом, вырастить из куста аниме девочку.
233 822685
>>822618
Вы приняты
Задания.mp41,6 Мб, mp4,
1920x1080, 0:25
234 822818
Выполняем задания!
235 823531
>>820336

>https://www.youtube.com/watch?v=QU1pPzEGrqw


Вот у чувака в самом начале всего 3 файла есть, он открывает main и у него открывается окно с Pygame, а у меня откроется и за долю секунды закроется сразу. Что я делаю не так?

У меня 1 в 1 как у него все, я списал. Все 3 файла в одной папке лежат.
236 823534
А вот такое просто окно запускается, а как у него - нету. Что за дела
изображение.png20 Кб, 1271x743
237 823537
>>823531
Отбой, получилось починить - я двоеточие забыл поставить в начале класса.
238 823538
Может подскажите какой нибудь текстовый редактор который отлавливает такие синтаксические ошибки? Или таких не бывает? Я сейчас ATOM юзаю.
239 823545
>>823538

Я использую PyCharm Community от JetBrains:
https://www.jetbrains.com/pycharm/download/
Офигенно удобная и быстрая IDE, самое то для игрового проекта с кучей файлов.

Но если хочешь что-то полегче, можешь попробовать редактор Visual Studio Code от Microsoft. Не путать с Visual Studio, неподъемной неповоротливой IDE.
https://code.visualstudio.com/

И то, и другое бесплатны и кроссплатформенны. Рекомендую заменить ATOM на VSCode в любом случае, даже если PyCharm будешь ставить.
240 823550
>>823537
>>823538
Ты чё совсем? Запускай код из командной строки, а не кликом по иконке. Так у тебя будет время прочитать ошибку в терминале.

Ну и в глобальное окружение пакеты не рекомендуется ставить - используй virtual environment.
241 823552
>>823550

>Ты чё совсем? Запускай код из командной строки, а не кликом по иконке. Так у тебя будет время прочитать ошибку в терминале.


Ну да, ради ошибки наверное стоит, но так то кликом быстрее и удобнее чем через терминал. У меня 1 монитор, и лишнее окно держать не очень хочется.

>Ну и в глобальное окружение пакеты не рекомендуется ставить - используй virtual environment.


Пакеты это ты про pygame ? Ну уже поздно, а так да, затупил, у меня есть виртуалка с линуксом.
242 823554
>>823552

>У меня 1 монитор, и лишнее окно держать не очень хочется.


А лишнее окно проводника держать хочется? Как ты отлаживать код будешь без терминала? В VS Code он встроенный в основное окно, кстати.

>Ну уже поздно, а так да, затупил, у меня есть виртуалка с линуксом.


Я про https://docs.python.org/3/tutorial/venv.html
243 823656
>>823554
Знаешь, пожалуй ты прав, стоит сразу по нормальному учиться делать.
А если в винде, то что лучше использовать - повер шелл или простую цмд?
изображение.png3 Кб, 218x136
244 823659
>>823554
Слушай, я вот создал виртуальное окружение, установил туда Pygame. А куда кидать мои готовые файлики с игрой? Прямо в корень каталога этого окруждения или в новую папку для удобства?

И я правильно понял что алгоритм работы окружения такой: запускаю активирующий скрипт в командной строке, запускаю свою игру, потом запускаю деактивирующий скрипт. Правильно? Если я запущу сразу свою игру без запуска скрипта, то она запустится не в моем виртуальном окружении?
image.png7 Кб, 266x245
245 823806
>>823659

Использую подобную структуру:
Хранилище.mp4820 Кб, mp4,
1920x1080, 0:15
246 825005
Сделал хранилища и окно обмена, которое пока не работает, но уже умеет отображать содержимое инвантаря и хранилища бок о бок.
247 825010
Изучаю события.

Где-то ошибочно вычитал, что для пользователя зарезервировано всего 30 с чем-то видов событий. Не то чтобы сложно было уложиться в этот лимит, либо навелосипедить свои события поверх неё, использовав всего лишь один полиморфный тип для всех событий в игре, но оказалось, что пользовательских событий можно напилить 32685!

> >>>pygame.constants.NUMEVENTS - pygame.constants.USEREVENT


> 32685



Ну и остается только запиливать свои тивпы событий с минимальной обвязкой. Короче, события офигенны, не представляю, как бы я жил без событий, когда всё начинает референсить друг друга, а Питон не умеет в круговые импорты.
248 825033
>>823656

>А если в винде, то что лучше использовать - повер шелл или простую цмд?


Windows Terminal + Git for Windows
249 825038
>>825005
красота
Многострочный текст.png62 Кб, 1922x1112
250 825560
Добавил поддержку многострочного текста. При этом потерял поддержку выравнивание, но выравнивание многострочных текстов по центру и правому краю всё равно никому не нужно, даже исправлять не буду.
251 825596
Ладно, уговорили.
252 825606
>>825596
Ну вот другое дело, люблю когда делают качественно.
253 825631
>>825606

Качество тут запредельного уровня.
Обмен.mp41,3 Мб, mp4,
1920x1080, 0:20
254 827751
Обмен вещами работает.
Перетаскивание.mp41,2 Мб, mp4,
1920x1080, 0:23
255 827885
>>827751
И даже перетаскивание вещей с одной панели на другую. Можно и вещь на вещь перетаскивать, но сейчас это ничего не делает.
Обратная связь.mp4477 Кб, mp4,
1920x1080, 0:09
256 827894
>>827885

Добавил обратной связи. Обратной связи много не бывает. Еще бы курсор менять, но это целый отдельный квест.
257 827919
>>827894
Такими темпами годика за 3 что-то и выйдет законченное.
258 827964
>>827919

Почему так оптимистично?
Триггеры.mp41,9 Мб, mp4,
1920x1080, 0:10
259 828069
Новый тип объектов - триггеры. Умеют пересекаться с игроком и писать "привет" в консоль, но вы этого не видите, да вам оно и не надо.
Триггеры заданий.mp41 Мб, mp4,
1920x1080, 0:11
260 828087
>>828069

И без задней мысли триггерим задания в журнале.
Коллайдеры.mp4795 Кб, mp4,
1920x1080, 0:11
261 828161
Долго думал, как быть с пустотой, по которой всё это время можно было свободно ходить. Особо ничего не надумал, но через то же самое АПИ с триггерами оказалось легко запилить поддержку невидимых стен. Просто и эффективно.
262 828295
>>800023 (OP)
А в чём смысл? Питун это не язык для геймдева от слова совсем.
263 828302
>>828295

Питон на данный момент является лучшим языком для новых проектов. Исключительная выразительность языка и мощная система аннотации типов позволят Вам быстро писать элегантный и надежный код. Язык еще не столь распространён в геймдеве. Пока ваши конкуренты используют устаревшие технологии на базе Сишарп или Си++, вы сможете в разы поднять свою эффективность, задействовав pygame.Sprite - последнее достижение науки в области высокоуровневой отрисовки графики. Но это еще не все. В жизни любого проекта наступает момент, когда он превращается в продукт и к сопровождению проекта привлекаются дополнительные разработчики. На этом этапе распространённость и доступность движка начинает играть решающую роль. Благодаря активной популяризации Пугайм в среде профессиональных игроделов, а также поддержке этого фреймворка со стороны библиотеки для создания кроссплатформенных приложений - фонда Симпл ДиректМедиа Леер, Вы можете быть уверены, что в будущем Вам не придется переписывать свой проект на Юнити, как это произошло с проектами на печально известном движке Аур Машинери. Пугайм обеспечит вам гарантии успеха и стабильности Ваших начинаний. Выберите Пугайм сейчас и через несколько лет Вы сможете наслаждаться результатами своих трудов - успешным проектом, выполненным с учетом всех современных технологий и индустриальных стандартов. Пугайм - Ваш проводник к успеху в мире разработки игр. Выбирайте Пугайм.
Оповещение.mp41,5 Мб, mp4,
1920x1080, 0:25
264 828402
Добавил еще обратной связи. На этот раз оповещаем игрока об изменении состояния мира. Пока что работает при добавлении новых заданий и при их завершении.
265 828416
>>828295
Залётный ты? Пигейм это sdl, а sdl это С.
266 828460
>>828416
А анимацию и сценграф ты на чём пишешь?
Псевдовращение.mp4118 Кб, mp4,
1920x1080, 0:09
267 830297
Совершенствую графоний. Запилил псевдовращение анимаций.
268 833426
>>818723
В Noita эту хуйню не осилили.
269 834221
>>818723
Я бы решал задачу от гравитации. Каждый тайл имеет единичную гравитацию. Если он может двигаться вниз, он каждый кадр движется вниз на 1хG, где G - гравитация игрового мира. Если под тайлом есть другой тайл, то этот тайл не может двигаться вниз, тогда он сообщает тайлу снизу некоторый коэффициент, например треть своей суммарной массы (а масса у нас это 1хG, если кто не догадался), затем наш тайл проверяет, может ли он соскользнуть в сторону? выбирает рандомное направление и пытается соскользнуть, если не удалось, то вторую треть от сообщает тайлу в той стороне, куда хотел соскользнуть, и выбирает оставшееся направление, и если не удалось соскользнуть то последнюю треть своей массы он сообщает третьему тайлу. Если соскользнуть удалось, то он падает с 1/3 x G только в этом кадре, в следующем кадре он снова обладает полной массой в 1xG.

Теперь рассмотрим слой ниже. На тайл сверху давит несколько тайлов и каждый кадр сообщают ему коэффициент в скажем, 3.5, тайл домножает на G и теперь его полная масса 3.5xG, и он каждый кадр пытается упасть вниз с этой массой, если снизу неподвижный тайл, то он переданный ему коэффицент посылает обратно. Это у нас реакция опоры. Наш тайл получает этот возврат в стек, но будет суммировать его на следующем кадре. Далее он пытается соскользнуть по схеме выше. Если сбоку опора, то импульс соскальзывания тоже возвращается ему в стек. На следующем кадре каждый тайл смотрит, что у него в стеке и импульсы справа передаёт влево, и наоборот, а импульсы снизу передаёт наверх. Затем обрабатывает импульсы сверху. Снова.

Таким образом, если у нас сообщающиеся сосуды, то спрайты естественным образом распределят давление и выдавятся в незанятую полость. Только вот, насколько я слышал (а сам не пробовал) такой поатомный расчёт жидкостей заставит приуныть даже топовую пекарню.
Кручение.mp41,4 Мб, mp4,
1920x1080, 0:19
270 909111
Непролюбамп с последней страницы. (Планов оживлять тред пока нет.)
271 909139
>>909111
С годовщиной.
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 12 сентября в 09:57.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /gd/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски