Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming

Праграмуем руйнуюць піксельных ландшафт: як падарваць ўсё

by
Difficulty:IntermediateLength:LongLanguages:

Belarusian (беларуская мова) translation by Alex Grigorovich (you can also view the original English article)

У гэтым уроку мы будзем ствараць піксельных ландшафт ў стылі гульняў Cortex Command і Worms. Вы навучыцеся ствараць вырывалася свет, калі вы ў яго страляеце і як стварыць пыльны асадак на зямлі, ствараючы новы ландшафт.

Заўвага. Хоць гэты ўрок напісаны ў на Processing і скампіляваны з дапамогай Java, вы атрымаеце магчымасць выкарыстоўваць тыя ж метады і канцэпцыі ў любы асяроддзі распрацоўкі гульняў.


Папярэдні вынік

Вы можаце згуляць у дэма версію гульні. Выкарыстоўвайце Клавішы WASD для перамяшчэння, левая кнопка мышы для стральбы разрыўнымі кулямі, правая для роскіду пискселей.


Крок 1: Ландшафт

У нашай пясочніцы ландшафт будзе асноўнай механікай нашай гульні. Падобныя алгарытмы часта складаюцца з аднаго малюнка для тэкстуры ландшафту, і іншага - чорна-белага ў якасці маскі для вызначэння, якія пікселі з'яўляюцца суцэльнымі. У гэтай дэма версіі ландшафт і яго тэкстура - гэта адзін малюнак, а пікселі - суцэльныя, у залежнасці ад іх празрыстасці. адыход маскі быў бы больш правільным, калі б вы хацелі вызначыць ўласцівасці кожнага пікселя, напрыклад, наколькі хутка ён будзе разбураны або наколькі ён паўплывае на астатнія пікселі.

Для рэндэрынгу ландшафту пясочніца спачатку малюе статычныя пікселі, а затым дынамічныя пікселі і ўсё астатняе па-над.

У ландшафце таксама ёсць метады якія вызначаюць, ці з'яўляецца нерухомы піксель ў месцазнаходжанні суцэльным або няма, і метады для выдалення і дадання пікселяў. Верагодна, найбольш эфектыўным спосабам захоўвання малюнка з'яўляецца аднамерны масіў.  Атрымаць 1D-індэкс з 2D-каардынатаў даволі проста:

Для таго каб дынамічныя пікселі адскоквалі, нам трэба будзе даведацца нармальны ўзровень паверхні ў дадзенай кропцы. Прайдзіце па квадрату вакол патрэбнай кропкі, знайдзіце ўсе суцэльныя пікселі паблізу і усреднено іх становішча. Правядзіце вектар з дадзенай пазіцыі ў патрэбную кропку, звярніце яе і нармалізуецца.  Гэта ваша норма!

Чорныя лініі ўяўляюць норму па ландшафту ў розных кропках.

Вось як гэта выглядае ў выглядзе кода:


Крок 2: Дынамічны піксель і фізіка

«Terrain» сама па сабе захоўвае ўсе нерухомыя статычныя пікселі.  Дынамічныя пікселі - гэта тыя пікселі, якія ў цяперашні час знаходзяцца ў руху, і захоўваюцца асобна ад статычных пікселяў.  Па меры таго, як ландшафт выбухае і рассейваецца, пікселі перамыкаюцца паміж статычнымі і дынамічнымі станамі, калі яны выцясняюцца і сутыкаюцца. Кожны піксель вызначаецца побач уласцівасцяў:

  • Становішча і хуткасць (патрабуецца для працы фізікі).
  • Не толькі бягучае месцазнаходжанне, але і папярэдняе месцазнаходжанне пікселя. (Мы можам вызначыць розніцу паміж двума кропкамі для выяўлення калізій.)
  • Іншыя ўласцівасці ўключаюць колер пікселя, цяжар і рухомасць.

Каб піксель мог рухацца, яго становішча павінна быць накіравана з хуткасцю.  Інтэграцыя Эйлера, хоць і недакладная для складаных сімуляцый, досыць простая для таго, каб мы маглі эфектыўна перамяшчаць нашы часціцы:

elapsedTime - гэта час, якое прайшло з моманту апошняга абнаўлення. Дакладнасць любога мадэлявання можа быць цалкам парушаная, калі elapsedTime занадта зменлівы або занадта вялікі. Гэта не так складана як разабрацца з дынамічнымі пікселямі, але тут будуць выкарыстоўвацца іншыя схемы выяўлення сутыкненняў.

Мы будзем выкарыстоўваць часовыя пазнакі фіксаванага памеру, возьмем час і падзелім яго на кавалкі пэўнага памеру. Кожны фрагмент ўяўляе сабой поўнае «абнаўленне» для фізікі, прычым усе тыя, што засталіся дадзеныя перадаюцца ў наступны кадр.


Крок 3: Выяўленне сутыкненняў

Выяўленне сутыкненняў для нашых лятучых пікселяў так жа проста, як намаляваць некалькі ліній.

Лінейны алгарытм Бресенхама быў распрацаваны ў 1962 годзе джэнтльменам па імені Джэк Э. Бресенхам. Па гэты дзень ён выкарыстоўваецца для эфектыўнага малявання псеўданімаў ліній. Алгарытм строга прытрымліваецца правілаў цэлых лікаў і выкарыстоўвае ў асноўным складанне і адніманне для таго, каб эфектыўна выкарыстоўваць сюжэтныя лініі. Сёння мы будзем выкарыстоўваць яго для іншай мэты: выяўленне сутыкнення.

Я выкарыстоўваю код, запазычаны з артыкула на gamedev.net. Хоць большасць рэалізацый лінейнага алгарытму Брешенема переупорядочивает парадак малявання, гэты канкрэтны прыклад дазваляе нам заўсёды праходзіць ад пачатку і да канца. Парадак важны для выяўлення сутыкненняў, інакш мы будзем рабіць гэта на няправільным канцы шляху пікселя.

Нахіл з'яўляецца неад'емнай часткай лінейнага алгарытму Брешенема. Алгарытм працуе шляхам падзелу нахілу на яго «ўздым» і «запуск» кампанентаў.  Калі, напрыклад, нахіл лініі роўны 1/2, мы можам пабудаваць лінію, змясціўшы дзве кропкі гарызантальна, падняўшыся ўверх (і направа), а затым яшчэ два разы.

Алгарытм, які я паказваю тут, ўлічвае ўсе сцэнары, ці маюць лініі станоўчы і адмоўны нахіл ці ён вертыкальны.  Аўтар падрабязна тлумачыць, як усё гэта працуе на gamedev.net.


Крок 4: Апрацоўка сутыкненняў

Дынамічны піксель можа зрабіць адну з двух рэчаў падчас сутыкнення.

  • Калі ён рухаецца досыць павольна, дынамічны піксель выдаляецца, а статычны дадаецца да рэльефу, з якім ён сутыкаецца. Гэта будзе нашым самым простым рашэннем. У лінейным алгарытме Брешенема лепш за ўсё адсочваць папярэднюю кропку тую, якая цячэ кропку. Калі выяўлена сутыкненне, «бягучая кропка» будзе першым суцэльным пікселем, на які трапляе прамень вэктару, а «папярэдняя кропка» - гэта пустое прастору непасрэдна перад ім. Папярэдняя кропка - гэта менавіта тое месца, дзе нам трэба замацаваць піксель.
  • Калі ён рухаецца занадта хутка, ён адскоквае ад паверхні.  Вось дзе патрэбна наша норма паверхні! Адлюструйце пачатковую хуткасць мяча па норме, каб піксель адскочыў.
  • Кут з абодвух бакоў нармалі адзін і той жа.


Крок 5: Кулі і выбухі!

Кулі дзейнічаюць дакладна гэтак жа, як дынамічныя пікселі. Рух інтэгравана такім жа чынам, і выяўленне сутыкнення выкарыстоўвае той жа алгарытм Наша адзінае адрозненне складаецца ў апрацоўцы сутыкненняў.

Пасля выяўлення сутыкнення кулі выбухаюць, выдаляючы ўсе статычныя пікселі ў радыусе, а затым змяшчаюць дынамічныя пікселі на сваё месца з указаннем іх хуткасцяў. Я выкарыстоўваю функцыю для сканавання квадратнай вобласці вакол радыуса выбуху, каб высветліць, якія пікселі выціснуць. У наступстве адлегласць пікселя ад цэнтра выкарыстоўваецца для ўстанаўлення хуткасці.


Крок 6: Гулец

Гулец не з'яўляецца асноўнай часткай руйнуюць механікі, але ён звязаны з выяўленнем сутыкнення, якое будзе мець стаўленне да праблем у будучыні. Я растлумачу, як сутыкненне выяўляецца і апрацоўваецца ў дэма версіі для гульца.

  1. Для кожнага краю, прайдзіце цыкл ад аднаго кута ў наступны, правяраючы кожны піксель
  2. Калі піксель цэльны, пачніце ад цэнтра гульца і праверце ўсе пікселі да таго часу, пакуль вы не натыкнецеся на суцэльны піксель.
  3. Перамесціце гульца ад першага суцэльнага пікселя, з якім вы сутыкнецеся.

Крок 7: Аптымізацыя

Тысячы пікселяў апрацоўваюцца адразу, што прыводзіць да даволі вялікай нагрузцы на фізічны рухавічок. Каб зрабіць усё хутка, я б рэкамендаваў выкарыстоўваць мову, які досыць продуктивет. Дэма скампілявана на Java.

Вы можаце рабіць усё, каб аптымізаваць ўзровень алгарытму.  Напрыклад, колькасць часціц ад выбухаў можа быць зменшана шляхам памяншэння дазволу знішчэння. Звычайна мы знаходзім кожны піксель і ператвараем яго ў дынамічны 1x1. Замест гэтага скануе кожныя 2x2 пікселя або 3x3 і запусціце дынамічны піксель такога памеру. У дэма мы выкарыстоўваем 2x2 пікселя.

Калі вы выкарыстоўваеце Java, то вялікай праблемай можа стаць куча смецця. JVM будзе перыядычна знаходзіць аб'екты ў памяці, якія больш не выкарыстоўваюцца, напрыклад, дынамічныя пікселі, якія адкідаюцца ў абмен на статычныя пікселі, і спрабуюць пазбавіцца ад іх, каб вызваліць месца для большай колькасці аб'ектаў. Аднак выдаленне аб'ектаў, іх вялікай колькасці патрабуе часу, і кожны раз, калі JVM выконвае ачыстку, наша гульня будзе ненадоўга завісаць.

Адно з магчымых рашэнняў - выкарыстоўваць кэш-памяць. Замест таго, каб ствараць або знішчаць ўвесь час аб'екты, вы можаце проста захоўваць непатрэбныя аб'екты (напрыклад, дынамічныя пікселі) што выкарыстоўваць іх пазней.

Пры неабходнасці выкарыстоўвайце прымітывы.  Напрыклад, выкарыстанне аб'ектаў для абазначэння пазіцый і хуткасцяў стварае больш цяжкасцяў у плане смецця.  Будзе лепш, калі вы зможаце захаваць усё, як прымітывы, у аднамерных масівах.


Крок 8: Зрабі гэта самастойна

Ёсць шмат розных накірункаў, якія вы можаце выкарыстоўваць у гульнявой механіцы. Розныя магчымасці могуць быць дададзеныя і настроены ў адпаведнасці з любым тыпам гульні, як вы захочаце.

Напрыклад, узаемадзеянне паміж дынамічнымі і статычнымі пікселямі могуць апрацоўвацца па-рознаму. Маска гэтага ўзаемадзеяння пад рэльефам можа выкарыстоўвацца для вызначэння ўласцівасці ліпкасць, пругкасці і сілы кожнага статычнага пікселя або верагоднасці таго, што ён будзе знішчаны ў момант выбуху.

Існуе таксама мноства розных рэчаў, з дапамогай якіх вы можаце зрабіць зброю. Для снарада могуць быць зададзены налады «глыбіні пранікнення", каб дазволіць ёй перамяшчацца пэўнае колькасці пікселяў да моманту сутыкнення. Традыцыйная механіка снарада таксама можа ўключаць у сябе розныя налады, такія як розная хуткасць стрэльбы, або, як драбавіка, магчымасць стрэліць адразу некалькімі кулямі. Вы можаце нават стварыць кулі, адскокваюць ад металічных паверхняў / пікселяў.


Выснова

Разбурэнне 2D-ландшафту не з'яўляецца унікальным.  Напрыклад, класікі жанру Worms and Tanks выдаляюць часткі ландшафту пры выбухах.  Каманда Cortex выкарыстоўвае падобныя скачуць часціцы, як і мы выкарыстоўвалі тут. Магчыма ёсць яшчэ і іншыя гульні, але я пра іх не чуў. Я з нецярпеннем чакаю таго, што іншыя распрацоўнікі будуць выкарыстоўваць гэтую механіку.

Калі ласка, паглядзіце на яго зыходны код, калі нешта здаецца двухсэнсоўным або незразумелым. Калі ласка, паглядзіце на яго зыходны код, калі нешта здаецца двухсэнсоўным або незразумелым.  Я дадаў каментары да зыходнага кода, каб зрабіць яго максімальна ясным. Дзякуй за ўдзел!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.