Как сделать скриншот в rust
Наверное, мало кто на хабре не в курсе, что такое Rust — новый язык программирования от Mozilla. Уже сейчас он привлекает много интереса, а недавно наконец вышла первая стабильная версия Rust 1.0, что знаменует собой стабилизацию языковых возможностей. Мне всегда импонировали системные ЯП, а уж идея системного языка, предлагающего безопасность превосходящую языки высокого уровня, заинтересовала еще больше. Захотелось новый язык попробовать в деле и, заодно, интересно провести время, программируя что-нибудь увлекательное. Пока думал, что бы такого на расте написать, вспомнился недавний цикл статей про компьютерную графику, который я лишь бегло просмотрел. А очень интересно было бы попробовать все-таки написать все эти красивости самостоятельно. Вот так и родилась идея этого хобби-проекта, а также данной статьи.
Поскольку в оригинальной статье тщательно разжевываются все нюансы, касающиеся программирования непосредственно графической составляющей, то я в своем цикле статей буду сосредотачиваться главным образом на том, что касается непосредственно Rust'а. Постараюсь описать те грабли, на которые довелось наткнуться, а также как решал возникающие проблемы. Расскажу о личных впечатлениях от знакомства с языком. И, конечно, упомяну список ресурсов, которыми пользовался при разработке. Итак, кому интересно, добро пожаловать под кат.
Предупреждение: статья написана с позиции новичка и описывает тупые ошибки новичка. Если вы профи раста, возможно, посмотрев на мои потуги, вы захотите меня больно огреть чем-нибудь тяжелым. В таком случае рекомендую воздержаться от ее чтения.
Here is the Rust, which i hope to get at the end. (игра слов, Rust по-английски «ржавчина»)
Как сделать скриншот в rust
Wanting to take full screen Rust shots without the ugly HUD?
Stop messing around in your settings and follow these easy steps.
1,364 | уникальных посетителей |
3 | добавили в избранное |
In game, SHIFT+TAB to bring up the Steam Overlay.
Head to Settings at the bottom.
Tab over to In-Game.
Find your key (default is F12), or change it up.
Now head back into the game.
Find the position you want to take your picture by getting framed up.
The rule of thirds is nice, but anything will practically do. It's Rust, after all.
Press F4 and your screenshot key together to get some great looking screenshots!
Can't see the logic , it takes 1 second to untick 3 options The point of this guide is to NOT do that and save time or you could just press OPTIONS and UNTICK shit like SHOW HUD | SHOW CHAT | SHOW BRANDING |.useless guide I tried rebinding and it appeared that there's a gap between the HUD dissapearing and the Steam screenshot. looking around is super cool though have you tried rebinding screenshot to f4 and holding alt to move your charecters head it looks so good ye, f9 doesn't take steam screenshots, it just saves the picture in the game folder
Andy, this is for Steam screenshots. You could always rebind the Steam Overlay to whatever you like. I think rebinding to F4 would do the trick as well!
Как сделать скриншот в rust
Как сделать скриншот?
Скриншот — это точное изображение того, что вы видите на экране монитора в данный момент.
Для того чтобы сделать скриншот, необходимо:
Открыть в браузере ту страницу, изображение которой необходимо получить;
Нажать на клавиатуре клавишу PrintScreen (PrtSc) — данная кнопка расположена чаще всего в правом верхнем углу клавиатуры, в одном ряду с функциональными кнопками F1-F12;
Открыть один из графических редакторов, например стандартную программу Paint;
Выбрать пункт меню «Правка» — «Вставить» или же нажать сочетание клавиш Ctrl+V, после чего изображение появится в графическом редакторе;
Дополнить изображение необходимыми элементами — подписями, линиями и пр.;
Сохранить полученное изображение: «Файл» — «Сохранить как».
Открыть в браузере ту страницу, изображение которой необходимо получить;
Нажать на клавиатуре клавишу PrintScreen (PrtSc) — данная кнопка расположена чаще всего в правом верхнем углу клавиатуры, в одном ряду с функциональными кнопками F1-F12;
Открыть один из графических редакторов, например стандартную программу Paint.
Для этого перейдите «Пуск» — «Все программы» — «Стандартные» — Paint ;
Нажать «Вставить» или же нажать сочетание клавиш Ctrl+V, после чего изображение появится в графическом редакторе;
Дополнить изображение необходимыми элементами — подписями, линиями и пр.;
Сохранить полученное изображение: нажать значок «Файл», выбрать «Сохранить как».
Для того чтобы размер файла был оптимален для передачи по электронной почте, сохраняйте полученные изображения в формате *.jpg.
Программа
Перейти «Программы/Системные программы» (Applications/Utilities);
Запустить программу «Снимок экрана» (Grab.app);
Перейти «Снимок» — «Окно»;
Обвести необходимую область на экране, используя появившийся курсор;
Полученное изображение будет автоматически сохранено на «Рабочем столе».
Сочетание клавиш
Одновременно нажмите клавиши Command + Shift + 3, изображение всего экрана будет автоматически сохранено в виде файла на «Рабочем столе». Вы также можете использовать сочетание Command + Shift + 4 для сохранения вручную выделенной области экрана.
Зажать одновременно верхнюю и нижнюю кнопки устройства и удерживать;
Дождаться щелчка и «вспыхивания» экрана. Изображение экрана будет автоматически сохранено в стандартной папке «Фотопленка», наряду с фотографиями с основной камеры.
Пишем линию
Вобщем после решения всех вышеописанных проблем, итогом моей работы стало то, что вы можете увидеть в срезе репозитория. Ох, это чувство восторга, когда я наконец увидел на экране черное окно с маленькой белой точкой в центре…
Дальше пошло проще, потому-что серьезного взаимодействия с библиотекой Rust-SDL2 уже не требовалось. Ее неочевидный и недокументированный, местами даже недоделанный API был постоянным источником трудностей. Всякая арифметика и управляющие конструкции в Rust не слишком отличаются от других ЯП. Поэтому линия была написана всего за несколько часов (в отличии от нескольких дней на предыдущих этапах). И то большая часть работы была из-за того, что я решил не реализовывать готовый алгоритм, а написать свой, используя уравнение прямой y=kx+b, как основу, а все остальные формулы выведя самостоятельно. Вот такая функция у меня получилась в итоге:
Знаю, она у меня страшненькая, длинная, неэффективная. Но зато своя — родная. :) Я почти сразу пришел к тому, чтобы писать целочисленную версию, не используя вещественную арифметику. В Rust нет неявных преобразований типов, а явные получаются очень многословными. Поэтому от идеи написать сначала вещественную версию я отказался. Много кода, а ее потом все равно в итоге переписывать, чтобы она не тормозила.
Знатокам математики просьба не пинать. Все делалось just for fun.
В ходе написания этой портянки мне понадобилось логгирование, поскольку проверенной временем IDE для Rust пока нет. Есть несколько свежих, но я не хотел залипать на их бета(альфа?)-тесте. Если кто-то пользовался и увидел, что оно стабильно и хорошо работает, отпишитесь, пожалуйста, в комментариях. Пользоваться отладчиком из консоли мне не в радость. Да и вообще логгирование штука полезная. Стараюсь приучать себя использовать логи вместо отладчика, потому-что это помогает писать логи, по которым потом реально разобраться, в чем возникла проблема у конечного пользователя (по крайней мере, если он сумеет запустить в режиме логгирования debug).
Итак, логгирование. Для логгирования в поставке Rust есть библиотека log. Но это просто абстрактное API, а конкретную его реализацию надо выбрать самому. Я использовал env_logger, который предлагается в документации к log. Пишем следующее в cargo.toml:
Пользоваться этим набором очень просто:
Надо только не забыть, что контейнер (crate) env_logger настраивается посредством переменных окружения. Я использую следующую команду перед запуском проекта:
Это задает модулю rust_project уровень логгирования debug. Все остальные модули остаются с уровнем по умолчанию, поэтому лог при запуске программы не засоряется всяким отладочным мусором от cargo или sdl. Итог работы на этом этапе можно увидеть в срезе репозитория. При запуске наша программа выводит вот такую вот красоту:
Как сделать скриншот в rust
В этой теме описаны все бинды, которые вы можете забиндить на сервере, чтобы быстрее взаимодействовать с игроками, телепортироваться одной кнопкой домой, ремувать и так далее.
Бинд - это назначение определенной команды для выбранной клавиши. При нажатии на эту клавишу будет осуществляться действие. Используются для быстрого выполнения определенных команд на серверах, что значительно упрощает некоторые рутинные действия.
Как биндить в игре Rust?
Заходите на сервер, нажимаете клавишу F1, чтобы открыть консоль и вписываете ваш бинд, взятый из списка ниже.
Это мы описали бинды, которые на сервере используются чаще всего. Если есть еще, о которых мы забыли, пишите здесь - добавим. Ниже список дополнительных биндов, которые тоже можно забиндить для себя:
bind T inventory.toggle - Открыть инвентарь
bind T chat.open - Открыть чат
bind T jump - Прыжок
bind T +slot1 - Быстрый слот (от 1 до 6)
bind T +invprev - Предыдущий слот
bind T +invnext - Следующий слот
bind T kill - Убить себя
bind T respawn - Возродиться
bind T clearbinds - Очистить все бинды
bind T forward - Идти вперед
bind T backward - Идти назад
bind T left - Идти влево
bind T right - Идти вправо
bind T use - Использовать
bind T reload - Перезарядиться ( У вас есть кнопка R в расте)
bind T voice - Голосовой чат
bind T sprint - Бежать
bind T duck - Присесть
bind T attack - Стрелять или добывать, бить (У вас это ПКМ)
Пишем код
- конструктор, производящий необходимую инициализацию
- функция вывода точки (вместо имеющегося сейчас вывода текстуры)
- функция ожидания ввода Esc с клавиатуры
Стоит отметить, что до этого мой процесс разработки неплохо характеризовался словами «Stack Overflow Driven Development». Я просто дергал разные куски кода из разных мест и компоновал их вместе даже не зная синтаксиса языка. Это типичный для меня способ изучения нового языка или технологии — просто начать писать код. К различным ресурсам же я обращаюсь как к справочнику, чтобы понять, как сделать конкретный нужный мне кусочек. Нужен цикл, прочитать статью про циклы в языке. Нужно IoC, нагуглить хороший ответ на Stackoverflow. Ну вы поняли. Большинство языков и технологий довольно похожи, поэтому проблем при подобном подходе не возникает. Можно начать сразу программировать, даже еще толком не зная язык. С Rust такой номер не прошел. Язык довольно своеобразен и уже на попытке понять, как сделать класс или объект, произошел затык. В книге раста не было статей с названием Classes/Objects/Constructors и т. п. Стало понятно, что сначала придется немного подучить матчасть. Поэтому, чтобы составить общее впечатление о синтаксисе языка, были пройдены уроки Guessing Game и Dining Philosophers из официальной документации Rust'а. Она на английском, стоит отметить существование перевода на русский. Правда тогда я еще этого не знал, читал на языке оригинала.
В общем после этого, работа пошла. Хотя еще пришлось повоевать с системой владения и заимствования Rust. Официальная документация отмечает, что этот этап проходит каждый новичок, но ободряет нас тем, что по мере практики код можно будет писать легко и непринужденно, привыкнув к ограничениям, накладываемым компилятором. Во вступлении говорится, что сложность обучения — цена, которую приходится платить за безопасность без накладных расходов. Конкретно проблема была в том, что в методе new(), создающем структуру, поля вновь созданной структуры необходимо проинициализировать несколькими объектами из SDL, чтобы потом использовать их в методах структуры. Если я пытался проинициализировать поле ссылкой, компилятор ругался, что не может сделать изменяемое заимствование ( error: cannot borrow data mutably in a `&` reference ). Вот в таком коде:
Кстати, на Хабре сломана подсветка синтаксиса Rust, из-за чего код выше не расцвечивается, хотя и должен. Проблема в этом кусочке: <'_> . Если его убрать, то все расцвечивается нормально. Но убирать его здесь как раз таки нельзя. Это обозначение времени жизни (lifetime) — вполне себе правильный синтаксис для Rust. Не знаю, куда это написать, поэтому написал здесь. Надеюсь, починят.
Просто name: mut type в структурах писать нельзя. Тогда я попробовал сделать переменную неизменяемой (immutable), но от этого сломался другой код:
Компилятор жаловался, что не может заимствовать неизменяемое поле renderer как изменяемое ( error: cannot borrow immutable field `self.renderer` as mutable ). Ларчик открывался просто. Оказывается в Rust все поля в структуре рассматриваются как изменяемые или неизменяемые в зависимости от того, была ли передана сама структура в метод как изменяемая или неизменяемая. Таким образом правильный код таков:
Как видите, здесь я изменил сигнатуру метода point.
В других участках кода все упоминания lifetime можно убрать.
Думаю, кому-то мои мытарства могут показаться экспериментами обезьяны с гранатой. Но я вас предупреждал.
Подготовка
Описывать установку компилятора, я не буду, там все достаточно очевидно. Установочный пакет с официального сайта установился на моей Ubuntu 14.04 парой команд. Следует лишь отметить, что есть репозиторий для Ubuntu, используя который также теоретически можно установить Rust. Однако у меня с этим репозиторием не задалось. Почему-то Rust устанавливался, но без Cargo. Synaptic даже не показывал Cargo в списке доступных пакетов. Rust без Cargo — это довольно бессмысленная штуковина, так что указанный PPA я не использовал.
Итак, как и всегда, знакомство с новым языком мы начинаем с Hello World. Создадим файл main.rs:
Результат запуска этого в консоли очевиден:
Код можно писать с использованием Gedit. Расцветка синтаксиса Rust для этого редактора может быть найдена по следующей ссылке. Сразу она не заработала, но в трекере был багрепорт, который объяснял причину проблемы. Простенький pull request решил проблему, поэтому сейчас у вас должна расцветка заработать без лишних плясок с бубном.
Обычно новый проект создается с использованием команды cargo new rust_project --bin , но я тогда еще об этом не знал, поэтому создал всю структуру вручную, благо она не сложная:
Этот проект запускается на исполнение командой cargo run .
Для вывода изображения я решил не переписывать TGAImage, который предоставляется автором оригинальной статьи. Мне захотелось выводить результат при помощи SDL. Фактически нам от этой библиотеки понадобится только создание окна и вывод точки с заданным цветом по заданным координатам. Все остальные графические примитивы мы рисуем самостоятельно, так что при желании бэкенд вывода изображения можно изменить очень просто, всего-лишь реализовав 2 функции: set(x, y, color); и new(xsize, ysize) . Почему именно SDL? В перспективе хотелось бы уметь изменять точку обзора с клавиатуры. Может быть даже игрушку простенькую написать… TGA такого сделать не позволит.
Первая же ссылка в Google привела меня на сайт проекта Rust-SDL2 — привязки к SDL2 для Rust. Чтобы задействовать эту библиотеку добавляем в конец cargo.toml следующее объявление зависимости:
Это добавляет в проект т. н. контейнер (crate) sdl2. Для компиляции библиотека использует заголовочные файлы SDL, поэтому надо не забыть их установить. В Ubuntu 14.04 это делает команда:
После этого команда cargo build успешно соберет нам проект со всеми необходимыми зависимостями.
If you press F9, you can get super resolution screenshots without hud and then scale them down for cool desktop wallpapers.
Эксперименты с SDL
Всю функциональность, связанную со взаимодействием с SDL (или же другой графической библиотекой в перспективе), я решил вынести в отдельный класс — canvas.rs. Поначалу просто для проверки работы библиотеки я скопировал туда содержимое теста из репозитория Rust-SDL2, собираясь на основе его впоследствии написать готовый класс.
Тут у меня были первые грабли. Оказалось, что любое объявление extern crate package_name в библиотеке должно быть также продублировано в main.rs приложения. Потребовалось время, чтобы разобраться в этом, но после всех мучений, у меня наконец получился проект, который вы можете увидеть в снапшоте на github.
В итоге в файле canvas.rs был такой код:
Этот код выводит вот такое вот замечательное окошко:
If you press F9, you can get super resolution screenshots without hud and then scale them down for cool desktop wallpapers.
Yanno. I didn’t know this. I always just used it to fuck with people to think I was flying. Just checked the folder and o had 18gb worth of screenshots.
Same here this is hilarious
Wait what? Can you explain
Lmao. Got banned on a 5x for doing that. They unbanned me after i explained in the discord tho
me and my friends would go “YOOOOO OMNIPOTENT username” and laugh out asses of
is there just a way to crackout my graphics past the max?
Results typically found in C:\Program Files (x86)\Steam\steamapps\common\Rust\Screenshots
Also it will freeze your game for a few seconds, since screenshots can be 30-50+ mb each.
A couple more examples:
Or take some cool screenshots of your teammates, with a nice crisp resolution.
Читайте также: