<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Задания для 10-8. ФМЛ №239. 2024/2025</title>
    <description>Задания для 10-8. ФМЛ №239. 2024/2025</description>
    <link>http://polarnick.com/239/2024/index.html</link>
    <atom:link href="http://polarnick.com/blogs/239/2024/feed_ru.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sun, 12 Jul 2026 17:53:14 +0000</pubDate>
    <lastBuildDate>Sun, 12 Jul 2026 17:53:14 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
    
      <item>
        <title>Всякое разное - полезные навыки</title>
        <description>&lt;p&gt;Запишу несколько как мне кажется важных тем о которых интересно поговорить:&lt;/p&gt;

&lt;h1 id=&quot;технические-темы&quot;&gt;Технические темы&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Детектор прямой преобразованием Хафа&lt;/li&gt;
  &lt;li&gt;Детектор границ Канни&lt;/li&gt;
  &lt;li&gt;RANSAC&lt;/li&gt;
  &lt;li&gt;Прокладка шва в задаче склейки панорамы&lt;/li&gt;
  &lt;li&gt;Маскировка шва в задаче панорамы через разложение на частоты&lt;/li&gt;
  &lt;li&gt;Как интерполировать температуру по метеовышкам - троеликая триангуляция Делоне&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;про-поступления&quot;&gt;Про поступления&lt;/h1&gt;

&lt;p&gt;1) Лучшие места в Петербурге как будто бы - &lt;strong&gt;СПбГУ МКН&lt;/strong&gt; и &lt;strong&gt;ИТМО КТ&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;2) Даже если вы уверены что хотите идти дальше в физику - напишите ЕГЭ по информатике и в целом сделайте пожалуйста все что можете для гипотетического сценария в будущем “вдруг я передумаю и позже захочу перейти в другой ВУЗ на программирование”. &lt;strong&gt;Такое ЧАСТО случается.&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;как-стать-крутым-специалистом&quot;&gt;Как стать крутым специалистом?&lt;/h1&gt;

&lt;p&gt;Как стать крутым специалистом, получать удовольствие от работы, в т.ч. благодаря тому что вас будут ценить?&lt;/p&gt;

&lt;p&gt;1) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Делать то что нравится.&lt;/code&gt; Это очевидно, а сложный вопрос - как найти &lt;strong&gt;что&lt;/strong&gt; вам нравится. Лучшее что я до сих пор нашел - пробовать всякое разное, быть почти по-детски любопытным и вписываться во все движухи, особенно во время университета - во всякие хакатоны, соревнования, тусовки, сообщества, митапы.&lt;/p&gt;

&lt;p&gt;2) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Быть увлеченным.&lt;/code&gt; Делать не просто минимум который от вас просят (хотя это тоже нормально, если вы хотите работать ремесленником от звонка до звонка чтобы получить зарплату, а основная жизнь для вас - не включает работу), а быть увлеченным и делать то что от вас просят хорошо, делать больше (если это кому-то нужно и нет чего-то другого более приоритетного), предлагать идеи что еще можно сделать и т.п..&lt;/p&gt;

&lt;p&gt;3) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Не придумывать новое не изучив старое.&lt;/code&gt; Если у вас появилась грандиозная идея &lt;strong&gt;“как надо”&lt;/strong&gt; что-то делать - сначала спросите, а &lt;strong&gt;“как раньше”&lt;/strong&gt; это делали и почему именно так? Может быть не догадались до вашей идеи, а может быть были причины не делать так как вы придумали из-за какой-то специфики о которой вы не знаете. Кроме того если люди у лифта стоят и ждут - не очень красиво подходить нажимать на кнопку вызова лифта, сначала стоит посмотреть - может она уже светится т.к. другие люди тоже не дураки и уже догадались ее нажать.&lt;/p&gt;

&lt;p&gt;4) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Учитывать риски.&lt;/code&gt; Хотите заменить что-то старое чем-то новым? Оно будет работать в десять раз быстрее? Критично подумайте - &lt;strong&gt;а чем новое решение хуже?&lt;/strong&gt; Может быть в каких-то случаях новый метод медленнее? А вдруг этих случаев - большинство? А вдруг новый метод гораздо сложнее и поэтому его будет сложнее развивать в будущем? А важна ли вообще скорость в этой задаче? А вдруг исправив один баг - вы добавите другой?&lt;/p&gt;

&lt;p&gt;5) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Делать единообразно.&lt;/code&gt; Хотите что-то сделать но не знаете как правильно? Найдите похожую уже сделанную работу и сделайте по аналогии. Например в программировании не так важен &lt;strong&gt;codestyle&lt;/strong&gt;, как важно писать единообразный код - т.е. меняя или дописывая где-то код - писать его похоже на окружающий уже существующий код. Ваши изменения должны быть как хамелеон - быть максимально похожи на код вокруг - иногда даже вопреки формально фиксированному &lt;strong&gt;codestyle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;6) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Делать вовремя и отвечать за свои обязательства.&lt;/code&gt; Сказали что сделаете что-то к пятнице - сделайте это к пятнице. Если вдруг вы ошиблись с оценкой - как только это стало ясно придите к человеку которому было дано обещание и предупредите его, чтобы он смог скорректировать планы которые от этого зависят. Еще немного и научились почти всегда угадывать сроки и не продалбывать их? Хоп, вы уже внезапно стали почти &lt;em&gt;senior-помидор-девелопер-полубожеством&lt;/em&gt;. Не надо искать оправдательные причины почему вы что-то не смогли сделать, примите что вы совершили ошибку (хотя бы у себя в голове), извинитесь и подумайте как стать лучше.&lt;/p&gt;

&lt;p&gt;7) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Думать о том как выглядит ситуация с чужой стороны.&lt;/code&gt; Если у вас есть коллеги, начальник или подчиненные - они не просто так что-то от вас просят - будь-то что-то сделать/что-то подсказать и т.п.. Важно понимать зачем им это. В частности как только вы прокачали эмпатию и чувствуете чужие потребности - предыдущий пункт про сроки становится очевидным. Вас спросили про сроки чтобы планировать остальные задачи/знать когда можно будет начать что-то что зависит от результата вашей работы. &lt;strong&gt;Поэтому&lt;/strong&gt; очевидно надо предупредить если работа затянулась - чтобы можно было скорректировать планы.&lt;/p&gt;

&lt;p&gt;8) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Не пытаться победить в споре, а искать истину вместе с собеседником.&lt;/code&gt; Да, это проигрышная позиция если ваша цель победить и самоутвердиться. Но что дает победа в споре? Краткосрочный дофомин, небольшое удовольствие и радость для эго. А если вы в споре научились искать относительно объективную истину - то в споре не будет конфликта (если собеседник хотя бы примерно тоже пытается найти истину), и вы найдете лучшее решение/сделаете оптимальный выбор (например того как подступиться к задаче, или как расставить приоритеты в работе, или какой подход/идея сработает лучше).&lt;/p&gt;

&lt;p&gt;9) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Если есть вопрос - сначала попрбовать найти ответ самому/загуглить.&lt;/code&gt; Если есть вопрос и кто-то из коллег отзывчиво и хорошо помогает - поборите соблазн по любому поводу спрашивать его о помощи и совете, иначе вы будете все менее самостоятельны и не будете развиваться. Научитесь сначала потратить хоть какое-то время чтобы либо загуглить, либо поискать примеры такой же похожей задачи в коде - чтобы подсмотреть решение там и сделать по аналогии.&lt;/p&gt;

&lt;p&gt;10) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Самому идти и спросить помощи или сообщить о проблеме.&lt;/code&gt; Если что-то пошло не так (точно не уложитесь в сроки или поняли что закоммитили баг и вот-вот все сервера упадут), или у вас что-то не получается - идите к коллегам и &lt;strong&gt;поговорите&lt;/strong&gt; об этом. Если что-то пошло не так - проблему получится тем безболезненнее решить чем раньше о ней станет известно. Если вы застряли и например не знаете как что-то сделать - это тоже проблема, ведь вы уперлись в стену и тратите свое время впустую (а значит и время команды/компании).&lt;/p&gt;

&lt;p&gt;11) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Не бояться писать/говорить с незнакомыми людьми.&lt;/code&gt; Не знаете стоит ли поступать в этот ВУЗ/идти работать в эту компанию? Найдите тех кто там сейчас учится/работает или был там раньше. Например в группах в vkontakte или где-то еще. И вежливо напишите с просьбой подсказать и ответить на несколько вопросов. Если человек откажется или проигнорирует не беда, но чаще всего вам ответят. Лучше всего написать нескольким людям - так вы получите несколько мнений.&lt;/p&gt;

&lt;p&gt;12) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Не бояться написать в компанию мечты даже если нет вакансий.&lt;/code&gt; Многие компании готовы вас нанять если вы хоть сколько-то компетентны в области которой эти компании работают. И в т.ч. готовы нанять стажера если у него горят глаза и видно что большой потенциал. &lt;strong&gt;Даже если нигде нет ни единой вакансии.&lt;/strong&gt; Просто вежливо напишите любому сотруднику этой компании, расскажите о себе и спросите есть ли стажировки/вакансии. То же работает с поступлением в аспирантуру к какому-нибудь профессору.&lt;/p&gt;

&lt;p&gt;13) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Если вас не взяли на работу - спросите что подтянуть.&lt;/code&gt; Вам отказали после собеседования? &lt;strong&gt;Попросите дать обратную связь - т.е. почему, чего вам не хватило.&lt;/strong&gt; Можете даже в конце собеседования попробовать спросить дать вам обратную связь вживую, если собеседующий вас человек не против. Например может оказаться что просто нашли более опытного человека и имеет смысл написать вновь через полгода. Может быть вам надо подучить язык программирования/какую-то библиотеку/подтянуть какую-то область.&lt;/p&gt;

&lt;p&gt;14) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Систематизируйте информацию.&lt;/code&gt; Вы что-то обещали сделать такого-то числа или через месяц? Поставьте себе напоминание (гугл календарь, календарь в телефоне, отложенная отправка письма себе, отложенное сообщение в телеграмме себе). Пытаетесь что-то выбрать (условный ноутбук)? Составьте табличку (excel или google docs) и выпишите туда все хорошие варианты со всеми важными характеристиками и плюсами/минусами. Забываете что-то сделать? Заводите себе где-то &lt;strong&gt;TODO&lt;/strong&gt; лист дел - специальные приложения или просто Saved Messages в телеграмме.&lt;/p&gt;

&lt;p&gt;15) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Записывайте идеи.&lt;/code&gt; Если например вы занимаетесь каким-то творчеством, например придумываете алгоритмы - &lt;strong&gt;ЗАПИСЫВАЙТЕ КАЖДУЮ ИДЕЮ&lt;/strong&gt; в большой список. Иначе большую их часть &lt;strong&gt;ВЫ ЗАБУДЕТЕ&lt;/strong&gt;. То же работает с классными идеями хобби/вариантами отпуска - чем угодно.&lt;/p&gt;

&lt;p&gt;16) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Рефлексируйте и пытайтесь понять себя.&lt;/code&gt; Ошиблись и что-то пошло не так? Кто-то на вас обиделся/сказал что вы его подвели? Долго не могли найти ошибку в коде? &lt;strong&gt;ПРОВЕДИТЕ АНАЛИЗ&lt;/strong&gt; и подумайте - что вы сделали не правильно, что можно было сделать лучше чтобы результат был получен лучше/быстрее. Подумайте &lt;strong&gt;НЕ СОВЕРШАЛИ ЛИ ВЫ ТАКУЮ ОШИБКУ РАНЬШЕ.&lt;/strong&gt; Если совершали - возможно вы наступаете на одни и те же грабли и это серьезный повод еще больше удилить внимание тому чтобы что-то менять в своей жизни/в подходе к этого рода задачам/ситуациям. Иначе говоря вы - нейронка которая принимает море решений, и хотя бы в самых важных аспектах жизни (не только профессиональных) - очень важно развиваться и прокачивать свою систему принятия решения - в т.ч. на базе ошибок.&lt;/p&gt;

</description>
        <pubDate>Sat, 17 May 2025 21:03:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/05/17/interesting-topics.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/05/17/interesting-topics.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Конференция] Результаты</title>
        <description>&lt;p&gt;Пришлите мне свою финальную презентацию как можно быстрее:&lt;/p&gt;

&lt;p&gt;1) в &lt;strong&gt;pdf&lt;/strong&gt;-формате (обычно это делается через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Файл&lt;/code&gt;-&amp;gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Сохранить как&lt;/code&gt;-&amp;gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Выбрать .pdf расширение&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;2) назовите ее в форме &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;номер_название_проекта.pdf&lt;/code&gt;, например: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;01_Key_Save.pdf&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;02_The_Venerable_Lodge.pdf&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;03_Factor_io.pdf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Так же пожалуйста откройте по ссылке с таймштампом видео на youtube с записью демонстрации вашего проекта. Если вы хотите чтобы оттуда что-то было убрано - сообщите мне, позже я сделаю это видео публичным на своем канале (сейчас оно открывается только по ссылке).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://disk.yandex.ru/d/VGXiVaCx7gviJw&quot;&gt;Папка со всеми презентациями.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://239.ru/conf-informatics&quot;&gt;Официальные результаты конференции.&lt;/a&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Номер&lt;/th&gt;
      &lt;th&gt;Автор&lt;/th&gt;
      &lt;th&gt;Описание&lt;/th&gt;
      &lt;th&gt;Диплом (степень)&lt;/th&gt;
      &lt;th&gt;Оценка&lt;/th&gt;
      &lt;th&gt;Демонстрация проекта (скриншот+видео)&lt;/th&gt;
      &lt;th&gt;Презентация (pdf-слайды)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;01&lt;/td&gt;
      &lt;td&gt;Бай. Али.&lt;/td&gt;
      &lt;td&gt;KeySave - хранение паролей (синхронизация в яндекс.диске, криптография)&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=2037&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/01.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;02&lt;/td&gt;
      &lt;td&gt;Дем. Анд.&lt;/td&gt;
      &lt;td&gt;The Venerable Lodge - пошаговая игра - управление заговором&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=1025&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/02.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/-jHaklBektTLvA&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;03&lt;/td&gt;
      &lt;td&gt;Дор. Але.&lt;/td&gt;
      &lt;td&gt;Factor.io - клон Factorio - строить мини-заводики, соединять их конвейерами&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=568&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/03.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/WM8f9EY6XNyb0g&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;04&lt;/td&gt;
      &lt;td&gt;Жук. Соф.&lt;/td&gt;
      &lt;td&gt;Space Duo - прохождение уровней с ловушками двумя игроками&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=1765&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/04.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/TQ9XHYu0XEBhog&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;05&lt;/td&gt;
      &lt;td&gt;Кам. Мар.&lt;/td&gt;
      &lt;td&gt;типовая 27&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;06&lt;/td&gt;
      &lt;td&gt;Каю. Там.&lt;/td&gt;
      &lt;td&gt;Web-мессенджер “Теремок” - веб. мессенджер (React, создание групп)&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=4068&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/06.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/_YIqAtBF9MFoKw&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;07&lt;/td&gt;
      &lt;td&gt;Кол. Пав.&lt;/td&gt;
      &lt;td&gt;ChessCraft - головоломка с созданием шахматных фигур для прохождения уровней против бота&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3937&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/07.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/WNGTbVskDT9ByA&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;08&lt;/td&gt;
      &lt;td&gt;Лит. Ива.&lt;/td&gt;
      &lt;td&gt;типовая 2&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;09&lt;/td&gt;
      &lt;td&gt;Лоп. Дми.&lt;/td&gt;
      &lt;td&gt;типовая 1&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;Льв. Али.&lt;/td&gt;
      &lt;td&gt;Super Mush Bros - аркада вид сбоку, похоже на Марио&lt;/td&gt;
      &lt;td&gt;2 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=2988&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/10.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;Ман. Вал.&lt;/td&gt;
      &lt;td&gt;типовая 36&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;12&lt;/td&gt;
      &lt;td&gt;Мат. Ива.&lt;/td&gt;
      &lt;td&gt;Мусорный шутор - волны врагов, разное оружие, бонусы, много крутых анимаций&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=252&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/12.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/k7oS3iBI2d4daQ&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;13&lt;/td&gt;
      &lt;td&gt;Моч. Нат.&lt;/td&gt;
      &lt;td&gt;Bunny Walk - псевдо-трехмерная графика, бежать за зайца по линиям (аля Subway Surf), есть босс&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3683&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/13.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/EY8A7hbp0rlSFQ&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;14&lt;/td&gt;
      &lt;td&gt;Наз. Мат.&lt;/td&gt;
      &lt;td&gt;типовая 8&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;15&lt;/td&gt;
      &lt;td&gt;Нем. Арс.&lt;/td&gt;
      &lt;td&gt;типовая 24&lt;/td&gt;
      &lt;td&gt;N/A - типовой&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;16&lt;/td&gt;
      &lt;td&gt;Нов. Але.&lt;/td&gt;
      &lt;td&gt;func(math) - математические головоломки - получить число используя данные формулы и числа (польская нотация)&lt;/td&gt;
      &lt;td&gt;2 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=2687&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/16.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/rimsAjrDRKCLuw&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;17&lt;/td&gt;
      &lt;td&gt;Овс. Лео.&lt;/td&gt;
      &lt;td&gt;Покер с ботом&lt;/td&gt;
      &lt;td&gt;2 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=2361&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/17.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;18&lt;/td&gt;
      &lt;td&gt;Пар. Ден.&lt;/td&gt;
      &lt;td&gt;PALD (Picture Analyzator of Lego Details) - распознавание блока лего (CV, RANSAC, DepthAnything)&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=1657&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/18.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;N/A&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;19&lt;/td&gt;
      &lt;td&gt;Пес. Ива.&lt;/td&gt;
      &lt;td&gt;Бильярд с физикой&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5-&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3578&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/19.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/d/TiQGXDIzffuG4Q&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;Пет. Мат.&lt;/td&gt;
      &lt;td&gt;Soccer Stars - пошаговый футбол с физикой полета мяча и удара мышкой аля-бильярд&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3522&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/20.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/CDmxuQ11GCafMA&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;21&lt;/td&gt;
      &lt;td&gt;Руд. Кир.&lt;/td&gt;
      &lt;td&gt;Room Zero - нужно убить всех врагов, система скрытности и зоны видимости врагов&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;4+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3445&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/21.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/FKbGHnaAxf7yMw&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;22&lt;/td&gt;
      &lt;td&gt;Руд. Али.&lt;/td&gt;
      &lt;td&gt;Space ray - головоломка с лазером и зеркалами-призмами-телепортами&lt;/td&gt;
      &lt;td&gt;2 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=2075&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/22.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/hEEX8_3Y-XuTIw&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;24&lt;/td&gt;
      &lt;td&gt;Сую. Дал.&lt;/td&gt;
      &lt;td&gt;DoomDuDum - трёхмерный шутер на простой версии 360-трассировки лучей, гранаты рикошетят от стен, стены разрушаемые&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=160&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/24.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/0tcdRL52T0cvhw&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;25&lt;/td&gt;
      &lt;td&gt;Тих. Иль.&lt;/td&gt;
      &lt;td&gt;Tom the robber - скрытно обворовать дом не попавшись в зону видимости охраны&lt;/td&gt;
      &lt;td&gt;2 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=1491&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/25.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/pmRdp8WzM6zdfQ&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;26&lt;/td&gt;
      &lt;td&gt;Шка. Арт.&lt;/td&gt;
      &lt;td&gt;A Dance of Fire and Ice - ритм-игра, нужно шагать в такт (похожа на A Dance of Fire and Ice)&lt;/td&gt;
      &lt;td&gt;1 степень&lt;/td&gt;
      &lt;td&gt;5+&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=0&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/26.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/2uaUHE1amIGTLA&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;27&lt;/td&gt;
      &lt;td&gt;Яку. Мар.&lt;/td&gt;
      &lt;td&gt;Cooking Diary - нужно выполнять заказы на готовку бегая от плиты к миксеру и другим предметам&lt;/td&gt;
      &lt;td&gt;3 степень&lt;/td&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://youtu.be/bbKXnsysUXw?t=3114&quot;&gt;&lt;img src=&quot;/static/2025/05/projects/27.jpg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://disk.yandex.ru/i/PIEZhiScaeQyIQ&quot;&gt;pdf-презентация&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        <pubDate>Sun, 27 Apr 2025 21:11:38 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/04/27/projects_results.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/04/27/projects_results.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Конференция] Регистрация</title>
        <description>&lt;p&gt;При регистрации (или после нее) вам будет нужно составить описание проекта и отправить видео, вот как они должны выглядеть:&lt;/p&gt;

&lt;p&gt;Пример описания:&lt;/p&gt;

&lt;p&gt;2D игра на java. Похоже на арканоид. Игрок двигает платформу чтобы отбивать мячик который рикошетит и летает по полю.
При врезании в кирпичи мячик их ломает. Нужно уничтожить все кирпичи. В игре есть бонусы, рейд-боссы, отсылки на Борхеса и глубокий философский подтекст, можно кидать гранаты, менять скины персонажа, есть музыка и авторская озвучка.&lt;/p&gt;

&lt;p&gt;Как должно выглядеть видео:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;около одной-двух минут&lt;/li&gt;
  &lt;li&gt;название должно быть вида &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Фамилия Имя &amp;lt;НазваниеПроекта&amp;gt;&lt;/code&gt;, например &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Полярный Николай Арканоид3000.mp4&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;должно показывать в первую очередь основной процесс вашей игры&lt;/li&gt;
  &lt;li&gt;не обязательно исчерпывающе показывать все уровни, лучше хорошо показать самое ключевое&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;До урока пятницы&lt;/strong&gt; вам нужно:&lt;/p&gt;

&lt;p&gt;1) Если у вас не типовая геометрия - зарегистрироваться как &lt;strong&gt;докладчик&lt;/strong&gt; по &lt;a href=&quot;https://239.ru/conf-informatics&quot;&gt;ссылке&lt;/a&gt; (в &lt;strong&gt;описании проекта&lt;/strong&gt; сделайте максимально понятно как выглядит игра, что в ней надо делать игроку, и что является самой сложной его частью - например это может быть наличие компьютерного игрока-бота, или режим сетевой игры, или рассчет физики) - и &lt;strong&gt;сохраните себе описание проекта&lt;/strong&gt;, т.к. его еще надо будет скинуть мне&lt;/p&gt;

&lt;p&gt;2) Написать мне в телеграм что вы зарегистрировались + скинуть мне &lt;strong&gt;название&lt;/strong&gt; вашего проекта указанного при регистрации + скинуть мне &lt;strong&gt;описание проекта&lt;/strong&gt; указанное при регистрации&lt;/p&gt;

&lt;p&gt;3) Если вы это не сделаете до конца урока пятницы - &lt;strong&gt;получите случайное количество колов&lt;/strong&gt; (от одного до шести)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Так же&lt;/strong&gt; вам нужно:&lt;/p&gt;

&lt;p&gt;4) Отправить короткое описание проекта и видео (указание об этом и email на который нужно отправить эти материалы увидите после регистрации), что в них должно быть - описано в начале этой статьи&lt;/p&gt;

&lt;p&gt;5) Прислать мне первую версию презентации (&lt;a href=&quot;https://polarnick.com/blogs/239/2023/school239_108_2023_2024/2024/03/17/projects_docs.html&quot;&gt;см. тут&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;6) Сделайте &lt;strong&gt;тестовый прогон&lt;/strong&gt; в ZOOM чтобы убедиться что вы укладываетесь в тайминги, темп рассказа спокойный, речь приятная, и что &lt;strong&gt;звук игры слышен в записи демо&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Если у вас типовой проект&lt;/strong&gt; то в дополнение вам еще нужно:&lt;/p&gt;

&lt;p&gt;7) Прислать мне черновую версию отчета (&lt;a href=&quot;https://polarnick.com/blogs/239/2023/school239_108_2023_2024/2024/03/17/projects_docs.html&quot;&gt;см. тут&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;8) Со следующей недели &lt;strong&gt;начинаем сдачу типовых проектов&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 02 Apr 2025 21:10:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/04/02/projects_registration.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/04/02/projects_registration.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Java] Проигрывание звуков (.wav)</title>
        <description>&lt;p&gt;1) Создайте пустой проект (или откройте ваш)&lt;/p&gt;

&lt;p&gt;2) Найдите какой-нибудь &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wav&lt;/code&gt; аудиофайл:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;например вбив в гугл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mp3 for games&lt;/code&gt; и найдя сайт вроде &lt;a href=&quot;https://www.zapsplat.com/sound-effect-category/game-sounds/&quot;&gt;https://www.zapsplat.com/sound-effect-category/game-sounds/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;когда для подобного сайта вас просят залогиниться - можно сэкономить время найдя сайт на котором выкладывают логины, например вбив в гугл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;free logins for sites&lt;/code&gt; -&amp;gt; &lt;a href=&quot;https://login2.me/&quot;&gt;https://login2.me/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;скачав &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mp3&lt;/code&gt; надо его преобразовать в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wav&lt;/code&gt; - вбиваем в гугл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mp3 to wav converter&lt;/code&gt;, находим сайт&lt;/li&gt;
  &lt;li&gt;преобразовали &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mp3&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wav&lt;/code&gt; (к сожалению mp3 - проприетарный формат, его можно проиграть через javafx, а с этим есть сложности, особенно из-под Swing GUI)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3) Вбейте в гугл &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;java play wav file&lt;/code&gt; и найдите например &lt;a href=&quot;https://stackoverflow.com/questions/2416935/how-to-play-wav-files-with-java&quot;&gt;это&lt;/a&gt; - создайте класс &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MakeSound&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.io.File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.io.IOException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.AudioFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.AudioInputStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.AudioSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.DataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.LineUnavailableException&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.sound.sampled.SourceDataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MakeSound&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;BUFFER_SIZE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;128000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;File&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;soundFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AudioInputStream&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;audioStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AudioFormat&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;audioFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SourceDataLine&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/**
     * @param filename the name of the file that is going to be played
     */&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;playSound&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strFilename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;soundFile&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;File&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strFilename&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;audioStream&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AudioSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getAudioInputStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;soundFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;audioFormat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;audioStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;DataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Info&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;info&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;DataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;Info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;SourceDataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;audioFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;SourceDataLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;AudioSystem&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;audioFormat&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;LineUnavailableException&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nBytesRead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;abData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;BUFFER_SIZE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;];&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nBytesRead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;nBytesRead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;audioStream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;abData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;IOException&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;printStackTrace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;nBytesRead&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;nd&quot;&gt;@SuppressWarnings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;unused&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nBytesWritten&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;abData&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nBytesRead&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;drain&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sourceLine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;4) Из &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Main&lt;/code&gt; класса проиграйте звук:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Main&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Start...&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MakeSound&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;playSound&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bip.wav&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;main() finished!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;5) Обратите внимание что вызов проигрывания музыки - блокирующий, пока файл не проиграется до конца - код не пойдет выполняться дальше.
Другая сторона этой проблемы - невозможно проиграть два аудиофайла одновременно, но решение есть!&lt;/p&gt;

&lt;p&gt;6) Нужно выполнить этот код из другого потока, тогда основная программа продолжит исполнение команд дальше - а аудиофайл проиграется из метода &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;playSound(...)&lt;/code&gt; выполняемого параллельно - в параллельном вычислительном потоке:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Main&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;){&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Start...&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MakeSound&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;playSound&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bip.wav&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;audio file finished!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;main() finished!&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Заметьте что теперь &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main() finished!&lt;/code&gt; печатается в консоль сразу после начала проигрывания музыки (не дожидаясь ее окончания), а это значит что основная программа продолжает выполняться независимо от проигрывания звука, ведь этим занимается специально созданный независимый поток.&lt;/p&gt;
</description>
        <pubDate>Mon, 10 Mar 2025 21:01:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/10/projects-wav.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/10/projects-wav.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Конференция] Положение о проекте, критерии, документация</title>
        <description>&lt;h1 id=&quot;документы&quot;&gt;Документы:&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;/static/2023/03/kriterii_for_project.pdf&quot;&gt;Критерии оценивания проекта&lt;/a&gt; (здесь в т.ч. рассказано про отчет)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;/static/2023/03/check_list_for_project.pdf&quot;&gt;Чек-лист оценивания проекта&lt;/a&gt; (кроме этого - еще раз проверьте что вы правильно прочитали условие задачи!)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;/static/2023/03/school_project.pdf&quot;&gt;Положение о проекте&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Обязательно обратите внимание на критерии и чек лист! Особенно на секцию “Реализация программы” и “Оформление презентации” в чек-листе оценивания проекта.&lt;/p&gt;

&lt;p&gt;Если вы делаете &lt;strong&gt;типовой проект&lt;/strong&gt; - обязательно так же обратите внимание на секцию “Оформление отчета” в чек листе!&lt;/p&gt;

&lt;p&gt;Критерии и чек листы - то как будут оцениваться &lt;strong&gt;типовые проекты&lt;/strong&gt;. Творческие проекты оцениваются жюри на конференции и формально все эти критерии не требуются, но многие из них (в первую очередь про перезентацию) - это хороший ориентир “как сделать хорошо”.&lt;/p&gt;

&lt;h1 id=&quot;ключевые-моменты&quot;&gt;Ключевые моменты&lt;/h1&gt;

&lt;p&gt;К защите творческого проекта требования слабее чем к типовому проекту (геометрии), в частности не требуется “документация”, достаточно предоставить:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Презентацию (рекомендую использовать &lt;a href=&quot;http://slides.google.com/&quot;&gt;Google презентации&lt;/a&gt;, &lt;strong&gt;обязательно pdf-формат&lt;/strong&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Дополнительный плюс если исходники опубликованы на &lt;strong&gt;github&lt;/strong&gt; (&lt;a href=&quot;/blogs/239/2024/school239_108_2024_2025/2024/10/13/github.html&quot;&gt;инструкция&lt;/a&gt;)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Еще дополнительный плюс если на &lt;strong&gt;gtibhu&lt;/strong&gt; опубликован запускаемый &lt;strong&gt;jar-файл&lt;/strong&gt; (&lt;a href=&quot;/blogs/239/2018/school239_105_2018_2019/2019/04/15/jar-packaging.html&quot;&gt;инструкция&lt;/a&gt;)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В организационном плане:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Вам надо будет презентовать проект примерно за &lt;strong&gt;пять минут&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Все будет проходить в &lt;strong&gt;апреле&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Сначала с помощью презентации рассказываете &lt;strong&gt;что за проект&lt;/strong&gt; вы хотели сделать&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Затем рассказываете как реализовали интересные детали, какие были сложности, что получилось в итоге&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Запускаете и &lt;strong&gt;демонстрируете результат проекта&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Отвечаете на вопросы комиссии&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Качество кода в случае творческого проекта на оценку не влияет&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

</description>
        <pubDate>Wed, 05 Mar 2025 22:02:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/conference-docs.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/conference-docs.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Презентация] Где рисовать иллюстрации для презентации</title>
        <description>&lt;h1 id=&quot;в-какой-программе-рисовать-иллюстрации&quot;&gt;В какой программе рисовать иллюстрации?&lt;/h1&gt;

&lt;p&gt;1) Если вы привыкли и много рисовали в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Photoshop&lt;/code&gt; или другой программе, то возможно это лучший вариант - т.к. за счет опыта вы этот инструмент используете быстро и эффективно&lt;/p&gt;

&lt;p&gt;2) Если нужна какая-то специализированная иллюстрация вроде UML-диаграммы - то можно поискать онлайн редактор по запросу вроде &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UML diagram editor&lt;/code&gt; и сделав там нужную иллюстрацию - вытащить ее ввиде картинки&lt;/p&gt;

&lt;p&gt;3) В целом в будущем если вам надо много рисовать (например для презентаций или лекций) - мне удобно и нравится использовать планшет (я использую &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XP Pen Deco 01 v2&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Microsoft Whiteboard&lt;/code&gt; как программу рисования)&lt;/p&gt;

&lt;p&gt;4) В остальных случаях я использую &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Paint.net&lt;/code&gt; т.к. это простая и приятная программа в которой есть поддержка слоев и есть фигуры вроде прямых/стрелочек/прямоугольников и т.п.&lt;/p&gt;

&lt;h1 id=&quot;paintnet&quot;&gt;Paint.net&lt;/h1&gt;

&lt;p&gt;Скачать &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Paint.net&lt;/code&gt; можно &lt;a href=&quot;https://www.getpaint.net/download.html&quot;&gt;здесь&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ниже есть общие идеи о самых удобных на мой взгляд инструментах:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Использование слоев&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Выделение прямоугольником и волшебной палочкой&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Рисование кисточкой и рисование геометрии (прямоугольники/овалы)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Рисование прямых, горизонтальных/вертикальных прямых и стрелочек&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Как откатить назад случайное изменение&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Как сохранить результат&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;использование-слоев&quot;&gt;Использование слоев&lt;/h1&gt;

&lt;p&gt;В &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Paint.net&lt;/code&gt; есть поддержка слоев, это очень удобный инструмент позволяющий разбить вашу картинку на логические слои, например на:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Фоновая картинка (например просто заливка одним цветом)&lt;/li&gt;
  &lt;li&gt;Система координат (оси, подписи X и Y)&lt;/li&gt;
  &lt;li&gt;График одной функции&lt;/li&gt;
  &lt;li&gt;График другой функции&lt;/li&gt;
  &lt;li&gt;Текстовые комментарии с указанием мест интереса (например точки пересечения графиков)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Почему это удобно? Представьте что вы почти все нарисовали, но поняли что график одной из функций надо сдвинуть чуть левее. Если все объекты находятся в одном слое - выделить и сдвинуть график функции не затронув остальные объекты невозможно. Но благодаря тому что график функции находится в отдельном своем слое - то вам достаточно выбрать этот слой, выделить весь график и сдвинуть только его, не затрагивая другие слои.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_01_layers.png&quot; alt=&quot;Paint.net окно управления слоями&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1) Сняв/нажав эту галку вы выключите/включите отображение слоя (может быть удобно временно визуально спрятать слой)&lt;/p&gt;

&lt;p&gt;2) Этой кнопкой можно добавить новый слой для нового логического объекта&lt;/p&gt;

&lt;p&gt;3) Этой кнопкой слой можно удалить целиком если стало ясно что этот слой с данными оказался не нужен&lt;/p&gt;

&lt;p&gt;4) Этой кнопкой слой можно скопировать если хочется например сделать копию графика но немного сместить его вниз/вбок&lt;/p&gt;

&lt;p&gt;5) Эта кнопка вклеивает слой намертво в слой ниже (т.е. объединяет их в один слой)&lt;/p&gt;

&lt;p&gt;6) Слои рисуются один поверх другого, поэтому между ними важен порядок - эта кнопка позволяет поднять слой выше на поверхность&lt;/p&gt;

&lt;p&gt;7) Эта кнопка опускает слой ниже (глубже)&lt;/p&gt;

&lt;h1 id=&quot;инструменты-выделение&quot;&gt;Инструменты: выделение&lt;/h1&gt;

&lt;p&gt;Представим что мы нашли классную картинку с машинкой и хотим использовать ее в игре, но в этой картинке фон оказался не прозрачным а каким-то серым:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_02_car_with_bg.png&quot; alt=&quot;Машинка на непрозрачном фоне&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Обратите внимание на выделенные красным прямоугольником четыре инструмента слева:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Выделение прямоугольником&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Выделение произвольной формой (так называемое лассо, нужно просто очертить контур мышкой)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Выделение овалом&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Выделение волшебной палочкой&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Давайте выделим все пиксели фона и удалим их чтобы добиться прозрачного фона. Для этого нам пригодиться волшебная палочка, выбрав ее и кликнув на фон мы выделим все пиксели похожие по цвету и смежные с пикселем клика:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_03_car_with_bg_2.png&quot; alt=&quot;Выделение фона волшебной палочкой&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Обратите внимание что выделилась так же часть пикселей самой машины (рядом с фарой сверху слева и на багажнике снизу).&lt;/p&gt;

&lt;p&gt;Это можно поправить ослабив чувствительность волшебной палочки - просто сдвиньте Tolerance волшебной палочки к меньшему значению (см. на скрине сверху):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_04_car_with_bg_3.png&quot; alt=&quot;Выделение фона волшебной палочкой с правильным Tolerance&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Теперь когда выделены только пиксели фона - нажмите кнопку &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Delete&lt;/code&gt; и теперь фон прозрачный и осталось только сохранить в формате &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;png&lt;/code&gt; (но не &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jpeg&lt;/code&gt; т.к. в нем не сохраняется прозрачность):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_05_car_with_bg_4.png&quot; alt=&quot;Машинка на прозрачном фоне&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;инструменты-рисование&quot;&gt;Инструменты: рисование&lt;/h1&gt;

&lt;p&gt;Базовые инструменты рисования:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_06_drawings.png&quot; alt=&quot;Paint.net базовые инструменты рисования&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1) Кнопка заливки позволяет по клику заполнить все пиксели в выделенной зоне одним выбранным цветом. Например если вы хотите залить весь фон одним цветом - выделите его (прямоугольником или волшебной палочкой) и кликните этим инструментом заливки (предварительно выбрав нужный цвет).&lt;/p&gt;

&lt;p&gt;2) Кисточка позволяет рисовать (с произвольной толщиной - выбор толщины вверху - &lt;strong&gt;Brush size&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;3) Карандаш не очень удобен, но он позволяет нарисовать тонкий контур&lt;/p&gt;

&lt;p&gt;4) Иногда удобно добавить текст - например чтобы подписать оси на графике или что-то еще&lt;/p&gt;

&lt;p&gt;5) Удобно рисовать разные геометрические примитивы - прямоугольники, овалы&lt;/p&gt;

&lt;h1 id=&quot;инструменты-как-рисовать-прямые-и-стрелки&quot;&gt;Инструменты: как рисовать прямые и стрелки&lt;/h1&gt;

&lt;p&gt;Чтобы нарисовать стрелку нужно выбрать инструмент рисования геометрических примитивов и дальше настроить:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_07_line_arrow.png&quot; alt=&quot;Paint.net рисуем стрелку&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1) Выбираем инструмент рисования прямых и кривых&lt;/p&gt;

&lt;p&gt;2) Указываем толщину нашей прямой&lt;/p&gt;

&lt;p&gt;3) Указываем форму начала, середины и конца нашей прямой - благодаря этому мы можем превратить ее в стрелку или даже двустороннюю стрелку&lt;/p&gt;

&lt;p&gt;Обратите внимание что иногда вам может быть нужно нарисовать строго горизонтальную или вертикальную прямую - в таком случае пока вы зажали мышку чтобы указать начало и конец прямой - зажмите &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SHIFT&lt;/code&gt;, тогда прямая будет “приклеиваться” в горизонтали/вертикали (и другим направлениям с шагом в 15 градусов).&lt;/p&gt;

&lt;h1 id=&quot;как-откатить-назад&quot;&gt;Как откатить назад&lt;/h1&gt;

&lt;p&gt;Если вы случайно нарисовали что-то не то:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Z&lt;/code&gt; отменит последнее действие (можно нажимать несколько раз)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Y&lt;/code&gt; обратно выполнит только что отмененное последнее действие (т.е. по сути движение по изменениям вперед в будущее, т.е. удобно когда вы случайно отменили действие через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Z&lt;/code&gt; и теперь передумали)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;как-сохранить-результат&quot;&gt;Как сохранить результат&lt;/h1&gt;

&lt;p&gt;Не забывайте сохранять результат:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_08_save.png&quot; alt=&quot;Paint.net Save as&quot; /&gt;&lt;/p&gt;

&lt;p&gt;1) Используйте либо &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.pdn&lt;/code&gt; формат если вы может быть захотите продолжить работу над картинкой позже - это формат который поддерживается только в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Paint.net&lt;/code&gt; и в таком случае в файле будет сохранено разделение картинки на слои, так что позже можно будет продолжить работу со слоями независимо&lt;/p&gt;

&lt;p&gt;2) Либо если вы уже хотите сохранить результат для вставки в презентацию или игру - сохраните в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.png&lt;/code&gt; (если есть текст или прозрачность) либо в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.jpg&lt;/code&gt; (потеряется прозрачность и вокруг текста могут появиться шумы, зато размер файла гораздо меньше)&lt;/p&gt;

&lt;p&gt;Поэтому если у вас больше одного слоя и вы сохраняете в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.png&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.jpg&lt;/code&gt; - то появится предупреждение что картинка будет &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Flatten&lt;/code&gt;, т.е. расплющена - т.е. все слои будут объединены в один:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/paint_net_09_flatten_warning.png&quot; alt=&quot;Paint.net Save as&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Mar 2025 21:05:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presentation-images.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presentation-images.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Презентация] Примеры как часто стоит улучшить слайд</title>
        <description>&lt;p&gt;Основная идея:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Слушают ваш рассказ (текст и слова доносятся голосом)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Слайды помогают легче/правильнее понять ваш рассказ благодаря визуальному сопровождению&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Отсюда вывод - текста на слайдах почти не должно быть, т.к. слушатели и так слышат текст.&lt;/p&gt;

&lt;p&gt;Максимум что можно себе позволить на слайдах кроме картинок и иллюстраций - тезисный текст разбитый на пункты.&lt;/p&gt;

&lt;p&gt;При этом все что можно объяснить и донести до зрителя через визуал - лучше показывать без текста (например геометрические иллюстрации - отличная идея).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_07.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_02.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_06.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_08.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_04.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_01.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_09.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/presentation_improvement_03.png&quot; alt=&quot;Пример как можно улучшить слайд&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Mar 2025 21:04:40 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presenations-examples.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presenations-examples.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Презентация] Как сделать хорошую презентацию</title>
        <description>&lt;h1 id=&quot;что-должно-быть-в-презентации&quot;&gt;Что должно быть в презентации?&lt;/h1&gt;

&lt;p&gt;Если вы делаете типовой проект - то делаете презентацию по &lt;a href=&quot;/static/2023/03/check_list_for_project.pdf&quot;&gt;чек-листу оценивания проекта&lt;/a&gt; (секция &lt;strong&gt;Оформление презентации&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Если вы делаете творческий проект - тоже самое, делаете презентацию по этому чек-листу, но вам еще важнее чем в типовых проектах сделать так, чтобы любой человек с улицы понял что у вас за проект - т.е. вы должны &lt;strong&gt;понятно&lt;/strong&gt; рассказать о чем он. Презентация - визуальный способ сопроводить ваш рассказ и сделать его гораздо понятнее благодаря картинкам/иллюстрациям/скриншотам. От вас не требуется выполнения полного перечня слайдов (как того требуют от типовых проектов) - но это хороший ориентир и подсказка “как сделать хорошо”.&lt;/p&gt;

&lt;h1 id=&quot;1-формулы-должны-быть-красивыми&quot;&gt;1) Формулы должны быть красивыми&lt;/h1&gt;

&lt;p&gt;Все математические формулы должны быть красивыми. Я для этого использую &lt;strong&gt;&lt;a href=&quot;https://latex.codecogs.com/eqneditor/editor.php&quot;&gt;удобный сайт&lt;/a&gt;&lt;/strong&gt; на базе языка разметки latex (он в т.ч. используется для написания научных статей и многих других задач верстки документов, и хотя в целом он очень неприятен - для формул он подходит хорошо). Затем эту картинку с формулой можно вставить в слайды как обычную картинку. Пример:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/04/latex_formulas.png&quot; alt=&quot;Пример красивой latex-формулы&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;2-не-должно-быть-много-текста&quot;&gt;2) Не должно быть много текста&lt;/h1&gt;

&lt;p&gt;Не должно быть слайдов где очень много текста. Пример ужасного слайда:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/03/slides_01_bad_slide_too_much_text.jpg&quot; alt=&quot;Плохой слайд где очень много текста&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Когда такой слайд показывается публике - любой слушатель &lt;strong&gt;испугается&lt;/strong&gt;, у любого глаза начнут разбегаться, слушатель начнет пытаться судорожно понять куда же смотреть, забудет слушать рассказчика, потеряет нить презентации и захочет лишь сбежать или выставить вам мало баллов.&lt;/p&gt;

&lt;h1 id=&quot;3-визуальное-сопровождение-рассказа&quot;&gt;3) Визуальное сопровождение рассказа&lt;/h1&gt;

&lt;p&gt;Слайд должен &lt;strong&gt;визуально иллюстрировать и сопровождать&lt;/strong&gt; ту небольшую часть рассказа которая сейчас произносится.&lt;/p&gt;

&lt;p&gt;Например вы начали рассказывать про врагов в вашей игре - пчел, которых главный персонаж (медведь) очень боится - в этот момент покажите слайд где показано как выглядят эти пчелы, тогда ваш рассказ сразу будет легко воспринимать + слушатели лучше поймут что у вас в игре происходит:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/03/slides_04_good_slide.jpg&quot; alt=&quot;Хороший слайд показывающий врагов - пчел&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Если у вас есть какой-то алгоритм - например алгоритм по которому делает коды компьютерный-противник (т.е. искусственный бот) - обязательно изложите этот калгоритм так чтобы понял человек со стороны, который о вашем проекте ничего не знает. Сопроводите этот рассказ иллюстрациями - например скриншотами нескольких разных ситуаций в которых бот ходит так или сяк. Чтобы слушатели лучше поняли и прочувствовали о чем идет речь.&lt;/p&gt;

&lt;h1 id=&quot;4-каждый-слайд-должен-быть-с-картинкой&quot;&gt;4) Каждый слайд должен быть с картинкой&lt;/h1&gt;

&lt;p&gt;Звучит как странное правило, но это хороший ориентир. Даже в конце презентации на слайде “Спасибо за внимание, вопросы?” - стоит добавить картинку, например:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;скриншот с игрой&lt;/li&gt;
  &lt;li&gt;вашу фотографию&lt;/li&gt;
  &lt;li&gt;что-нибудь красивое - например Единорога:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/03/slides_05_finishing_slide.jpg&quot; alt=&quot;Пример финишного слайда с картинкой&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;5-разбивка-тяжелых-слайдов-на-этапы&quot;&gt;5) Разбивка тяжелых слайдов на этапы&lt;/h1&gt;

&lt;p&gt;В идеале тяжелых слайдов с большим объемом информации быть не должно. Но если это кажется неизбежным, то можно подавать такую информацию хотя бы поэтапно.&lt;/p&gt;

&lt;p&gt;Например представьте что хочется рассказать математическую модель про хранение персонажа ввиде прямоугольника (ширина и высота) + координаты персонажа (\(x\), \(y\)) + скорость. Расскажите это поэтапно в несколько слайдов! Каждый следующий слайд - пусть просто &lt;strong&gt;визуально добавляет&lt;/strong&gt; то что вы начали в этот момент рассказывать:&lt;/p&gt;

&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot;&gt;
    &lt;source src=&quot;/static/2023/03/slides_02_video.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

&lt;p&gt;Т.е. вы пролистываете эти 4 слайда один за другим &lt;strong&gt;по мере того как рассказываете&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1) Математической моделью персонажа игрока является прямоугольник некоторой ширины и высоты&lt;/p&gt;

&lt;p&gt;2) У персонажа хранятся две переменные - координаты угла прямоугольника (&lt;em&gt;хорошо было бы их и на рисунке справа добавить&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;4) Чтобы описать движение персонажа - есть две переменные хранящие проекцию вектора скорости на обе оси (&lt;em&gt;хорошо было бы этот вектор и его проекции тоже на рисунке нарисовать - это отлично бы сопроводило рассказ визуальной интуитивной подсказкой&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;5) Для того чтобы движение персонажа было плавным - важно двигать персонажа каждый раз на вектор скорости домноженный на прошедшее с предыдущего кадра время&lt;/p&gt;

&lt;h1 id=&quot;как-сделать-такие-слайды&quot;&gt;Как сделать такие слайды?&lt;/h1&gt;

&lt;p&gt;1) Сделать полный слайд со всеми этапами (пусть есть &lt;strong&gt;5 этапов&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;2) Сделать его копии (через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+C&lt;/code&gt; + &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+V&lt;/code&gt; в секции слева) так чтобы этот слайд повторился &lt;strong&gt;5 раз&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3) В каждой копии удалить лишнее этапы:&lt;/p&gt;

&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot;&gt;
    &lt;source src=&quot;/static/2023/03/slides_03_video.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

&lt;p&gt;Если же хочется сделать такие картинки, то я использую для этой задачи &lt;a href=&quot;https://www.getpaint.net/download.html&quot;&gt;Paint.NET&lt;/a&gt; - он простой и удобный и в нем есть &lt;strong&gt;слои&lt;/strong&gt;, они позволяют рисовать поверх, а затем “прятать” то что было нарисовано сверху. Это позволяет мне нарисовать слой за слоем все иллюстрации, а затем сохранить все поэтапные версии иллюстрации и положить их на слайды.&lt;/p&gt;

&lt;h1 id=&quot;примеры-презентаций&quot;&gt;Примеры презентаций&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/static/2021/04/projects/presentations/Point-and-Click%20detective.pdf&quot;&gt;Пример презентации_про_расследование&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/static/2021/04/projects/presentations/ted_presentation.pdf&quot;&gt;Пример_презентации_про_медведя&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/static/2021/04/projects/presentations/geom_presentation.pdf&quot;&gt;Пример_презентации_типового_проекта&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 05 Mar 2025 21:03:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presentations.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2025/03/05/presentations.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Проект] Как фиксировать камеру на игроке если игровой мир - большой?</title>
        <description>&lt;p&gt;Представим что у вас в игре есть некий мир (например некая карта замка и его окрестностей).
Игровой персонаж - Единорог - исследует и взаимодействует с этим миром, делая его лучше:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/11/unicorn_in_large_world.jpg&quot; alt=&quot;Иллюстрация игры с большим миром&quot; /&gt;&lt;/p&gt;

&lt;p&gt;При этом мир слишком большой и если мы его будем показывать на экране целиком, то игрок не сможет разглядеть маленькие объекты вокруг главного игрового персонажа.&lt;/p&gt;

&lt;p&gt;Поэтому на иллюстрации:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Зеленым&lt;/strong&gt; - обведена система координат мира игры&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Красным&lt;/strong&gt; - обведена система координат того что показывается на экране (размера \(w\) на \(h\)) - т.е. небольшой окрестности вокруг игрока, которая отображается на весь игровой экран:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/11/world_vs_screen_coordinates.png&quot; alt=&quot;Вводим систему координат мира и экрана&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Давайте заметим что теперь мы все объекты, все их координаты и всю физику что с ними связана - можем спокойно выполнять в этой глобальной системе координат мира (в метрах), не беспокоясь о том, что видно на экране, а что нет.&lt;/p&gt;

&lt;p&gt;Теперь осталось лишь в момент когда код выполняет отрисовку мира на экране научиться делать переход из системы координат мира в систему координат экрана.&lt;/p&gt;

&lt;p&gt;Т.е. нам осталось придумать функцию \(f(x_{world}, y_{world}) = ... = (x_{screen}, y_{screen})\), такую что:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Игрок обязательно должен быть в центре экрана, т.е. \(f(x_0, y_0) = (w/2, h/2)\)&lt;/li&gt;
  &lt;li&gt;Масштаб может быть произвольным (возможно он меняется - в зависимости от скорости движения персонажа, или от колесика мышки), поэтому давайте введем некий коэффициент \(s\) (от слова &lt;strong&gt;scale = масштаб&lt;/strong&gt;), он будет говорить сколько пикселей в одном метре&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Давайте тогда придумаем как пересчитать координаты для произвольной печеньки из координат мира в пиксельныекоординаты экран:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Упражнение&lt;/code&gt; Попробуйте сами вывести формулу которая удовлетворяет двум вышеописанным свойствам&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2023/11/world_vs_screen_coordinates_cookie.png&quot; alt=&quot;Как рассчитать координаты в экране для каждого объекта&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Итак, мы хотим чтобы в метре было \(s\) пикселей и чтобы функция переводила координаты игрока в центр экрана, т.е. \(f(x_0, y_0) = (w/2, h/2)\).&lt;/p&gt;

&lt;p&gt;Давайте выведем общий вид формулы:&lt;/p&gt;

&lt;p&gt;1) Во-первых, переведем изначальные метровые координаты в пиксели (т.е. \(s \cdot x, s \cdot y\))&lt;/p&gt;

&lt;p&gt;2) Во-вторых, учтем что мы хотим сместить координаты на некие \((x_{shift}, y_{shift})\) так чтобы игрок оказался в центре экрана, т.е.:&lt;/p&gt;

\[f(x_0, y_0) = (w/2, h/2) \implies (s \cdot x_0 + x_{shift}, s \cdot y_0 + y_{shift}) = (w/2, h/2) \implies (x_{shift}, y_{shift}) = (w/2 - s \cdot x_0, h/2 - s \cdot y_0)\]

&lt;p&gt;Т.о. формула для пересчета метровых координат мира в пиксельные координаты экрана вокруг игрока:&lt;/p&gt;

\[f(x_{world}, y_{world}) = (s \cdot x_{world} + w/2 - s \cdot x_0, s \cdot y_{world} + h/2 - s \cdot y_0) = (x_{screen}, y_{screen})\]

&lt;p&gt;Где:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;\(x_0, y_0\) - координаты игрока в мировых координатах&lt;/li&gt;
  &lt;li&gt;\(s\) - произвольно выбранный масштаб - сколько пикселей в метре&lt;/li&gt;
  &lt;li&gt;\(w, h\) - размеры экрана в пикселях&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;как-это-выразить-в-коде&quot;&gt;Как это выразить в коде?&lt;/h2&gt;

&lt;p&gt;Сделайте методы &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int toScreenX(int worldX)&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int toScreenY(int worldY)&lt;/code&gt; в классе откуда будет доступ до:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;размера окна (\(w, h\))&lt;/li&gt;
  &lt;li&gt;координат игрока в мировых координатах (\(x_0, y_0\))&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Реализуйте в этих методах формулы которые переводят соответственно из системы координат мира в систему координат экрана с учетом того какого размера окно и где находится игрок.&lt;/p&gt;

&lt;p&gt;Теперь в месте где вызывается отрисовка предмета (например печеньки) - выполняйте отрисовку картинки с учетом данных преобразований  (вызвав эти методы &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;toScreenX&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;toScreenY&lt;/code&gt;).&lt;/p&gt;
</description>
        <pubDate>Wed, 13 Nov 2024 21:02:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2024/11/13/how-to-render-large-world.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2024/11/13/how-to-render-large-world.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
    
      <item>
        <title>[Java] Добавляем кнопки</title>
        <description>&lt;p&gt;Что если нам надо добавить кнопки в нашу программу? Например в &lt;strong&gt;Paint&lt;/strong&gt; мы можем хотеть добавить кнопки выбора режима рисования - овалы по кликам или росчерк по движению мыши, или добавить кнопку очистки экрана (чтобы начать рисовать заново).&lt;/p&gt;

&lt;p&gt;В играх тоже часто хочется сделать подобное - например добавить кнопку &lt;em&gt;перезапустить уровень&lt;/em&gt; или просто сделать возможным кликнуть на персонажа (тоже своего рода кнопка)  - скажем чтобы начать диалог с ним. Или кнопкой может быть одна из фраз в диалоге которую может выбрать наш персонаж.&lt;/p&gt;

&lt;p&gt;Что требуется от кнопки?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Когда по кнопке нажали - должен быть выполнен какой-то произвольный код. По сути это код обрабатывающий событие “кнопка была нажата”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Кнопка должна уметь себя рисовать. Проще всего рисовать просто кнопку-картинку.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Дополнительно у кнопки может быть вторая версия - картинка “нажатой кнопки”, когда он как бы прожата вглубину (т.е. пока кнопка мыши нажата но еще не отпущена).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Дополнительно у кнопки может быть третья версия - картинка “увеличенной кнопки”, когда мышка нависает над кнопкой (но еще не нажата, кнопка как бы в предвосхищении и просит мышку кликнуть - благодаря этому пользователю очевидно что это кнопка которую можно нажать).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Пример как это может выглядеть:&lt;/p&gt;

&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot;&gt;
    &lt;source src=&quot;/static/2022/11/buttonsDemo.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

&lt;h2 id=&quot;1-создаем-базовое-окно-для-экспериментов&quot;&gt;1) Создаем базовое окно для экспериментов&lt;/h2&gt;

&lt;p&gt;Давайте начнем с того чтобы сделать базовое окно подобное тому что было сделано в прошлом задании про &lt;a href=&quot;/blogs/239/2022/school239_108_2022_2023/2022/11/08/paint.html&quot;&gt;Paint&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;1.1) Создаем класс &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MyFrame&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;javax.swing.*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.awt.*&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;java.awt.image.BufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyFrame&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;JFrame&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;MyFrame&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;setSize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;640&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;setDefaultCloseOperation&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EXIT_ON_CLOSE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;setVisible&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// делаем окно видимым только после того как оно полностью готово&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;paint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Graphics&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;BufferStrategy&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bufferStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Обращаемся к стратегии буферизации&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bufferStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Если она еще не создана&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;createBufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// то создаем ее&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;bufferStrategy&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getBufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// и опять обращаемся к уже наверняка созданной стратегии&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getDrawGraphics&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Достаем текущую графику (текущий буфер) - это наш холст для рисования (спрятанный от глаз пользователя)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;clearRect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getWidth&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;getHeight&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Очищаем наш холст (ведь там остался предыдущий кадр)&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;// Выполняем рисование:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;drawOval&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// рисуем тестовый овал чтобы убедиться что все работает&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;dispose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;                &lt;span class=&quot;c1&quot;&gt;// Освободить все временные ресурсы графики (после этого в нее уже нельзя рисовать)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;bufferStrategy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;      &lt;span class=&quot;c1&quot;&gt;// Сказать буферизирующей стратегии отрисовать новый буфер (т.е. поменять показываемый и обновляемый буферы местами)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;1.2) Создаем окно в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;-функции:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Main&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;InterruptedException&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;MyFrame&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;frame&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;MyFrame&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;frame&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;repaint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// давайте отрисовывать окно не чаще чем раз в 10 миллисекунд - т.е. не чаще чем 100 раз в секунду&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;Thread&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// для этого ждем 10 миллисекунд прежде чем вновь вызвать frame.repaint();&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// это полезно для того чтобы не грузить процессор компьютера слишком сильно&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;2-создаем-класс-button&quot;&gt;2) Создаем класс &lt;strong&gt;Button&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Нам нужен класс который представляет кнопку, будем считать что кнопка у нас всегда прямоугольная, тогда она состоит из:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;поля &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x, y&lt;/code&gt; - координаты верхнего левого угла (в пикселях)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;поля &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;width, height&lt;/code&gt; - ширина и высота (в пикселях)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;поле &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;image&lt;/code&gt; - картинка (которую нужно вписать в указанный прямоугольник)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paint(...)&lt;/code&gt; - кнопка должна уметь рисовать себя&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onMouseHit(...)&lt;/code&gt; - кнопка должна уметь проверять “попал ли клик мышки по мне” и если мышка попала - реагировать на это (как минимум провоцируя какое-то событие, но может быть еще прожимаясь вглубь под тяжестью нажатия)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.1) Создайте класс &lt;strong&gt;Button&lt;/strong&gt; с полями &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x, y, width, height&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;2.2) Создайте метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paint(...)&lt;/code&gt; который рисует кнопку в переданной извне графике &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Graphics g&lt;/code&gt; (т.е. через аргумент функции &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paint(...)&lt;/code&gt;). Пока что давайте просто нарисуем прямоугольник.&lt;/p&gt;

&lt;p&gt;2.3) Создайте метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onMouseHit(int mouseX, int mouseY)&lt;/code&gt; который проверяет правда ли что переданные через аргументы координаты клика мышки попали в кнопку. Если попали - то пусть этот метод выведет в консоль “Button hit!”.&lt;/p&gt;

&lt;h2 id=&quot;3-создаем-объект-этой-кнопки-в-окне&quot;&gt;3) Создаем объект этой кнопки в окне&lt;/h2&gt;

&lt;p&gt;Теперь нам надо создать экземпляр этой кнопки. Т.е. создать конкретный объект-кнопку в окне.&lt;/p&gt;

&lt;p&gt;3.1) Создайте поле в окне &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MyFrame&lt;/code&gt; которое будет хранить кнопку, т.е. объект только что созданного класса &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Button&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3.2) Инициализируйте это поле (создав объект через вызов конструктора - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;... = new Button(...);&lt;/code&gt;) в конструкторе окна по каким-нибудь координатам. Сделайте это до &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;setVisible(true)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3.3) В отрисовке окна (т.е. в методе &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;paint(...)&lt;/code&gt; в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MyFrame&lt;/code&gt;) добавьте отрисовку кнопки - вызвав ее метод отрисовки.&lt;/p&gt;

&lt;p&gt;3.4) Запустите программу - убедитесь что кнопка (прямоугольник) рисуется там где вы бы ожидали с учетом ее координат.&lt;/p&gt;

&lt;h2 id=&quot;4-добавляем-обработку-мышки&quot;&gt;4) Добавляем обработку мышки&lt;/h2&gt;

&lt;p&gt;Теперь надо добавить обработку нажатий мышки. Это делается так же как и раньше, но теперь мы не хотим сразу что-то делать при клике мышки - а хотим просто сообщить об этом кнопке.&lt;/p&gt;

&lt;p&gt;И кнопка в свою очередь проверит - а попало ли нажатие мышки в кнопку? Если да, то кнопка на это будет реагировать.&lt;/p&gt;

&lt;p&gt;4.1) &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MyFrame&lt;/code&gt; должен заявить себя как “слушатель мышки”, т.е. реализовать интерфейс: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;implements MouseListener&lt;/code&gt;. А значит и реализовать в себе 5 методов - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mouseClicked(...)&lt;/code&gt; и прочие.&lt;/p&gt;

&lt;p&gt;4.2) В методе который обрабатывает событие нажатия мышки оповестите об этом кнопку - т.е. вызовите ее метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onMouseHit(...)&lt;/code&gt;. Обратите внимание что этому методу надо сообщить где именно мышка нажала - передав два аргумента - координаты клика мышки.&lt;/p&gt;

&lt;p&gt;4.3) Окно должно добавить себя в список “почетных слушателей мышки” - в конструкторе добавьте строчку &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addMouseListener(this);&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;4.4) Запустите программу - убедитесь что при клике мышкой в консоли появлется “Button hit!” тогда и &lt;strong&gt;только тогда&lt;/strong&gt; когда мышка &lt;strong&gt;попала в кнопку&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;5-добавляем-картинку-для-кнопки&quot;&gt;5) Добавляем картинку для кнопки&lt;/h2&gt;

&lt;p&gt;5.1) Вбейте в гугл “gui button image” и найдите картинку которая вам по душе, или например скачайте эту:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2022/11/button.png&quot; alt=&quot;Красивая кнопка&quot; /&gt;&lt;/p&gt;

&lt;p&gt;5.2) Создайте папку &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data&lt;/code&gt; в проекте рядом с папкой &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;src&lt;/code&gt; как мы уже это делали &lt;a href=&quot;/blogs/239/2022/school239_108_2022_2023/2022/10/28/keyboard-and-images.html&quot;&gt;раньше&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;5.3) Создайте в классе кнопки поле хранящее картинку кнопки - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BufferedImage image;&lt;/code&gt; и инициализируйте это поле в конструкторе картинки, т.е. через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ImageIO.read(new File(&quot;data\\button.png&quot;))&lt;/code&gt; (тоже так же как &lt;a href=&quot;/blogs/239/2022/school239_108_2022_2023/2022/10/28/keyboard-and-images.html&quot;&gt;раньше&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;5.4) Поправьте рисование кнопки - теперь надо рисовать картинку, т.е. используя &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;g.drawImage(...)&lt;/code&gt; (напоминаю что последний аргумент этого метода &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;observer&lt;/code&gt; нас не интересует, можно вместо него передать отстутствующий объект - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;5.5) Запустите программу - убедитесь что кнопка рисуется во всей красе и клики по ней все еще работают.&lt;/p&gt;

&lt;h2 id=&quot;6-добавляем-более-интересную-реакцию-на-кнопку&quot;&gt;6) Добавляем более интересную реакцию на кнопку&lt;/h2&gt;

&lt;p&gt;Что если мы хотим чтобы нажатие на кнопку делало что-то интересное?&lt;/p&gt;

&lt;p&gt;Например перезапускало уровень или выбирало персонажа (тоже своего рода кнопка) чтобы начать диалог с ним. Или кнопкой может быть одна из фраз в диалоге которую может выбрать наш персонаж.&lt;/p&gt;

&lt;p&gt;Давайте для примера решим что у нас есть некий счетчик - поле в окне которое хранит число, изначально это число равно \(0\). И пусть каждое нажатие на кнопку увеличивает этот счетчик на \(1\) и выводит новое значение в консоль.&lt;/p&gt;

&lt;p&gt;6.1) Добавьте в окно поле &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int counter;&lt;/code&gt;, в конструкторе окна инициализируйте это поле нулем.&lt;/p&gt;

&lt;p&gt;6.2) Теперь кнопка должна уметь делать произвольное действие при нажатии на нее. По сути “действие” стало новым параметром кнопки, в дополнение к ее ширине и высоте!&lt;/p&gt;

&lt;p&gt;6.3) Создайте &lt;strong&gt;интерфейс&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButtonAction&lt;/code&gt; - это делается так же как создание нового &lt;strong&gt;класса&lt;/strong&gt;, но в момент когда вы вводите имя &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButtonAction&lt;/code&gt; - внизу выберите &lt;strong&gt;Interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;6.4) В этом интерфейсе мы укажем какие методы требуются от любого кто заявит что реализовывает этот интерфейст. От любого кто заявит что он “является ButtonAction”. В нашем случае мы требуем лишь одного - наличия метода &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;void onClick();&lt;/code&gt; - это метод который будет вызываться когда кнопка нажата.&lt;/p&gt;

&lt;p&gt;6.5) Теперь в кнопке мы можем добавить новое поле &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButtonAction action;&lt;/code&gt; которое будет хранить “как реагировать на нажатие”. По сути это объект который может делать ровно одну вещь - выполнить метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onClick()&lt;/code&gt;, и кнопка попросит его об этом в момент когда мышка кликнет по кнопке.&lt;/p&gt;

&lt;p&gt;6.6) Это поле надо чем-то инициализировать - добавьте новый аргумент в конструктор кнопки (наравне с &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x, y, width, height&lt;/code&gt;), пусть тот кто создает кнопку сам решает какой &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButtonAction&lt;/code&gt; привязан к этой кнопке. Т.е. по сути - какое действие нужно делать при нажатии на эту кнопку.&lt;/p&gt;

&lt;p&gt;6.7) Поправьте метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onMouseHit(...)&lt;/code&gt; - теперь нам надо не писать в консоль сообщение, а вызывать наше поле-реакцию, чтобы уже он сделал то что надо в ответ на нажатие, т.е. нам надо теперь вызывать &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;action.onClick();&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;6.8) Теперь там где кнопка создавалась (где вызывался ее конструктор через &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new Button(...)&lt;/code&gt; из конструктора окна) - нужно добавить еще один - пятый - аргумент - “действие при нажатии на кнопку”, добавьте запятую сразу после ширины и высоты кнопки и начните печатать &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;new ButtonAction&lt;/code&gt; - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IDEA&lt;/code&gt; предложит вам подсказкой - нажмите &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Enter&lt;/code&gt;, получится что-то навроде:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(...,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ButtonAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// это создание объекта реализующего интерфейс ButtonAction&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// а значит вам надо прямо тут указать какая реализация у его метода onClick()&lt;/span&gt;
        
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;6.9) Добавьте в этом методе &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onClick()&lt;/code&gt; что-то свое, например &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;System.out.println(&quot;My onClick()!!!&quot;);&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;6.10) Запустите программу, убедитесь что кнопка рисуется и если кликнуть в нее - появляется “My onClick()!!!”.&lt;/p&gt;

&lt;p&gt;6.11) Давайте вернемся к тому что кнопка должна увеличивать на \(1\) счетчик &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;int counter;&lt;/code&gt; который объявлен в окне и выводит его в консоль. Попробуйте это написать в методе &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;onClick()&lt;/code&gt; который только что создали.&lt;/p&gt;

&lt;p&gt;6.12) Запустите программу, убедитесь что кнопка рисуется и что нажатие на кнопку выводит возрастающие числа от \(1\) и дальше - т.е. значения увеличенного счетчика.&lt;/p&gt;

&lt;h2 id=&quot;7-добавим-еще-одну-кнопку&quot;&gt;7) Добавим еще одну кнопку&lt;/h2&gt;

&lt;p&gt;А теперь то ради чего мы мучались! Давайте добавим еще одну кнопку, которая будет увеличивать этот же счетчик &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;counter&lt;/code&gt; но на этот раз сразу на \(10\) (и тоже сразу выводить новое значение в консоль).&lt;/p&gt;

&lt;p&gt;7.1) Создайте в окне новое поле &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Button button2;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;7.2) Инициализируйте ее в конструкторе окна: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;button2 = new Button(...);&lt;/code&gt;, но с отличиями от первой кнопки - по другим координатам и счетчик теперь нужно увеличивать на \(10\).&lt;/p&gt;

&lt;p&gt;7.3) Запустите программу. Появилась ли новая кнопка? Нет? Но мы ведь забыли добавить ее в отрисовку окна - поправьте. Пример результата:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/2022/11/twoButtonsFrame.png&quot; alt=&quot;Две кнопки&quot; /&gt;&lt;/p&gt;

&lt;p&gt;7.4) Запустите программу. Появилась ли новая кнопка? Срабатывают ли нажатия на нее? Нет? Но мы ведь забыли добавить ее проверку “попала ли мышка” - поправьте, окно при событии “мышка нажала” должно оповещать обе кнопки об этом.&lt;/p&gt;

&lt;p&gt;7.5) Запустите программу, все должно работать.&lt;/p&gt;

&lt;p&gt;7.6) Заметьте что для будущих добавлений новых кнопок можно избавиться от шага 7.3) и 7.4) если хранить кнопки не отдельными полями - а списком &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ArrayList&amp;lt;Button&amp;gt; buttons;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;7.7) Тогда в конструкторе окна кнопки вместо создания и сохранения в поле - будут добавляться в этот список кнопок:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;buttons&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ArrayList&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;buttons&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;250&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ButtonAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nd&quot;&gt;@Override&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nc&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;out&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;println&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}));&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;buttons&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(...,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ButtonAction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;7.8) А отрисовка всех кнопок будет выглядеть так:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Button&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buttons&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;paint&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;7.9) А запуск проверки каждой кнопкой “не попала ли в меня мышка” - так:&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Button&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;button&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;buttons&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;onMouseHit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;getY&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;());&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;7.10) Убедитесь что обе кнопки все еще работают и реагируют на мышку как и раньше.&lt;/p&gt;

&lt;h2 id=&quot;8-делаем-красиво-увеличивание-кнопок&quot;&gt;8) Делаем красиво! Увеличивание кнопок!&lt;/h2&gt;

&lt;p&gt;Давайте теперь сделаем так чтобы кнопка становилась больше когда мышка над ней нависает.&lt;/p&gt;

&lt;p&gt;Чтобы увеличивать кнопку когда мышка сверху, нам достаточно в кнопке хранить флажок “мышка сейчас над нами или нет”, при каждом движении мышки - обновлять этот флажок проверяя “правда ли мышка над нами?” И при отрисовке учитывать этот флаг - если он выставлен в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; то нужно рисовать кнопку чуть больше чем обычно.&lt;/p&gt;

&lt;p&gt;8.1) Добавляем в кнопку флаг &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;boolean isMouseOver;&lt;/code&gt;, в конструкторе мышки выставляем этот флаг в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;false&lt;/code&gt; (в момент создания кнопки мышка не над нею).&lt;/p&gt;

&lt;p&gt;8.2) Добавляем в кнопку метод &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;void onMouseMove(int mouseX, int mouseY)&lt;/code&gt; - в нем проверяем, если координаты в которых теперь находится мышка - внутри кнопки - то выставляем флажок &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isMouseOver = true;&lt;/code&gt; - иначе выставляем &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isMouseOver = false;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;8.3) Подправляем логику отрисовки кнопки - если флаг &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;isMouseOver&lt;/code&gt; выставлен в &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; то надо рисовать кнопку чуть большего размера.&lt;/p&gt;

&lt;p&gt;8.4) Заявляем что наше окно &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;implements MouseMotionListener&lt;/code&gt; - чтобы следить за движениями мышки.&lt;/p&gt;

&lt;p&gt;8.5) Реализуем методы &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mouseDragged&lt;/code&gt; и &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mouseMoved&lt;/code&gt;, в обоих методах нам надо оповестить все кнопки о движении мышки:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;for (Button button : buttons) {
    button.onMouseMove(e.getX(), e.getY());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;8.6) Не забываем зарегистрировать окно как “слушателя движений мышки” - в конструкторе надо добавить &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;addMouseMotionListener(this);&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;8.7) Проверьте что программа все еще работает как надо, но что теперь кнопки еще и увеличиваются когда мышка над ними!&lt;/p&gt;

&lt;h2 id=&quot;9-делаем-красиво-уменьшение-кнопок&quot;&gt;9) Делаем красиво! Уменьшение кнопок!&lt;/h2&gt;

&lt;p&gt;Давайте теперь сделаем так чтобы кнопка становилась меньше когда мышка на кнопку нажимает.&lt;/p&gt;

&lt;p&gt;Т.е. вместо того чтобы просто оповестить кнопку о нажатии мышкой мы хотим:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;когда кнопка мышки нажимается (т.е. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mousePressed(MouseEvent e)&lt;/code&gt;) - сообщаем об этом кнопке чтобы она могла выставить свой флаг “меня нажали но еще не отпустили”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;когда кнопка мышки отпускается (т.е. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mouseReleased(MouseEvent e)&lt;/code&gt;) - сообщаем об этом кнопке чтобы она могла сбросить свой флаг “меня нажали но еще не отпустили”, ведь ее только что отпустили. Но при этом кнопка &lt;strong&gt;НЕ ВЫЗЫВАЕТ&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;action.onClick();&lt;/code&gt;, ведь обработка кнопки уже проихошла при опускании кнопки мыши.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;10-пример-результата&quot;&gt;10) Пример результата&lt;/h2&gt;

&lt;video autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot;&gt;
    &lt;source src=&quot;/static/2022/11/buttonsDemo.mp4&quot; type=&quot;video/mp4&quot; /&gt;
&lt;/video&gt;

</description>
        <pubDate>Wed, 13 Nov 2024 21:01:39 +0000</pubDate>
        <link>http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2024/11/13/buttons.html</link>
        <guid isPermaLink="true">http://polarnick.com/blogs/239/2024/school239_108_2024_2025/2024/11/13/buttons.html</guid>
        
        
        <category>blogs</category>
        
        <category>239</category>
        
        <category>2024</category>
        
        <category>school239_108_2024_2025</category>
        
      </item>
    
    
  </channel>
</rss>
