Jeffrey Cross
Jeffrey Cross

Цодебок: Сват (арраилиста) циљева

Последњи Цодебок је показао како да користите веб камеру да замените миша чаробним штапићем (врста). У примеру, померање штапа у кружни део екрана проузроковало је да се зраке које емитују претворе у случајну боју. Овај чланак се ослања на тај примјер и показује како створити софистицираније интеракције. Уместо једног, стационарног циља, ова скица представља одређени број летећих циљева. Додиривање мета (реч „шешир“) претвара га у другу реч (у овом случају, „зец“), као што је приказано овде:

Скица илуструје како креирати и управљати пописом интерактивних објеката. Без обзира да ли пишете игре, системе честица или чаробну емисију коју контролише Ардуино (ОК, тако да сам наговестио моју руку - ово је тема будућег поста), то су алати које ћете поново и поново користити као и ви ићи даље са обрадом.

Поставите скицу

Прво прво - хајде да нацртамо и покренемо скицу. Потребна су два фајла за овај пројекат: магиц_вордс.пде и Таргет.пде. Прво покрените Процессинг и залијепите сљедећи код за магиц_вордс.пде у главни прозор.

Можете означити прву линију, скроловати до краја и затим користити Цтрл-ц да бисте копирали код (тврди), или можете кликнути на овај линк (магиц_вордс.пде), притисните Цтрл + а да бисте изабрали цео текст, и онда користите Цтрл + ц да бисте је копирали (лакше). Када копирате код, вратите се на Обраду и налепите га у главни прозор. Затим, користите “Филе -> Саве” из траке менија (или само Цтрл + с) и сачувајте датотеку користећи име “магиц_вордс” (Обрада ће аутоматски додати “.пде”).

Ево Таргет.пде, други фајл који вам је потребан:

Копирајте код у бафер за лепљење користећи било који метод који желите (тј. Све то означите или директно повежите са датотеком). Овај пут ћете морати да направите нови таб, што је начин на који вам обрада омогућава управљање скицама са више датотека. (Ово је нешто као креирање нове картице у прозору прегледача).

Да бисте креирали картицу, кликните на стрелицу са десне стране у горњем десном углу прозора за обраду.Обрада ће вас питати за ново име датотеке - унесите „Таргет“. Када унесете име датотеке, појавит ће се нова картица на коју можете залијепити код. Следећи дијаграм ће вам дати кораке који су вам потребни:

Последња ствар коју треба да урадимо је да направимо леп фонт за циљ. (Фонтови су објашњени у поглављу 6 Почетак рада са обрадом). Зашто питаш? Из кутије, Обрада има само једноставну наредбу текст () који ће приказати текст, али не можете рећи колико простора заузимају на екрану (што ће бити важно, као што ћемо видети за минут). Осим тога, они су само стари Ариал фонт, тако да нису баш занимљиви.

Да бисте заобишли ово, можете да користите мени Алатке да бисте креирали нову датотеку фонта за вашу скицу. Након што увезете датотеку помоћу лоадФонт () команду, моћи ћете да се играте типографијом. (В00т!). У сваком случају, процес креирања фонта је једноставан. Прво, кликните на “Тоолс -> Цреате Фонт…” из менија који ће се појавити на следећем екрану:

Затим, све што треба да урадите је да изаберете фонт који желите (изабрао сам "Баскервилле-Болд"; ако желите да користите други фонт, мораћете да промените име датотеке фонта у магиц_вордс.пде). Обратите пажњу на то да се име фајла на дну оквира мења док одабирете различите опције - то је име датотеке које ћете морати да користите у скици; Обрада ће аутоматски додати ".влв" на крај.

Након што сте учитали двије датотеке и инсталирали фонт, покрените скицу. (Као и код већине пројеката у овој серији, требат ће вам и веб камера.) Користећи штапић (или било који други прикладан показивач) из посљедњег Цодебока, требали бисте моћи превући различите циљеве.

Следећа два одељка описују како скица функционише. Први дио описује код у Таргет.пде датотеци, која се користи за креирање циљног објекта, главног градивног блока скрипте. Други део описује како магиц_вордс.пде датотека користи и АрраиЛист за управљање вишеструким Таргет објектима.

Циљни објекат

Поглавље 9 у одељку Почетак рада са обрадом уводи објекте и објектно оријентисано програмирање (ООП). Да бисте прегледали укратко, објекат је грађевни блок који се користи за креирање софистициранијих програма. Објекти садрже два основна елемента: поља, које су варијабле које одређују тренутно стање објекта, и методе, које су само функције које чине објекат нечим. Кључни део моћи ООП-а је да вам помаже да размишљате о свом коду на физички начин охрабрујући вас да размишљате у смислу једноставнијих компоненти.

Да бисте користили објекте, прво креирате а класа (или неколико класа - можете користити много различитих објеката), што је као предложак који описује све што објекат може да уради. Када дефинишете класу, користите нев наредбу да стварате објекте које можете користити у својим скицама. Ова разлика може бити помало збуњујућа, тако да о томе размишљајте на овај начин. Ако сте печени колач, почели бисте са рецептом. Ово је као класа - имате опис, али сама торта. Да бисте добили торту - или предмет - морате слиједити рецепт прије него што имате што јести. Креирање нових објеката је посао обраде нев цомманд - прави нову променљиву објекта позивајући посебну методу која се зове конструктор. Конструктор иницијализира варијабле објекта и генерално је спреман за акцију; једина разлика између ње и било које друге методе је да има исто име као и сама класа.

ОК, довољно прегледа. Разговарајмо о коду. Као што је раније објашњено, циљна класа је грађевни блок. Његова поља укључују:

  • Тренутна позиција, представљена варијаблама Икс и и
  • Брзина и смер, представљени варијаблама дк и ди. Ово су само насумично изабране вредности.
  • Ширина и висина, као што су представљене варијаблама в и х
  • Величина фонта (више о томе у мало)
  • Застава која означава да ли штапић додирује циљ (флаг је програмски израз за било коју варијаблу која се користи за представљање одређеног статуса, на пример на или ван)
  • Тренутни текст циља (тј. „Шешир“ или „зец“)

Након обавезног Циљ () конструктор (једини задатак је да постави вредности бефофе и после текста за циљ), методе укључују:

  • степ (), због чега се циљ креће по позорници. Ово ради додавањем дк и ди до Икс и и Променљиве.
  • боја (), који привлачи мету на позорницу (Икс, и) позиција
  • детецтЦоллисион (), која одређује да ли је штап сударио са метом
  • сетБок (), који ажурира променљиве ширине и висине циља на основу тога да ли је додирнуо штапић
  • искључи(), која мења циљну реч. (тј., ако је тренутна реч "Шешир", онда искључи чини га "зецом", и обрнуто
  • на бини(), која враћа заставицу која означава да ли је циљ одлетио из видљиве површине екрана

Прве две методе су прилично једноставне, али преостале методе, које се користе за откривање колизија, заслужују мало више пажње. Ако ћете из почетног кода подсетити, откривање судара је име за све начине на које можете да утврдите да ли се две ствари секу на екрану. У првобитном примјеру штапа, имали смо кружну мету, тако да смо користили формулу једноставне удаљености да одредимо да ли су координате штапића унутар радијуса мете. У овом примеру користимо правоугаони циљ. Да би ствари биле мало компликованије, циљ мења величину када га желите додирнути, тако да нам требају неке методе подршке да би се уверили да су све променљиве у складу са тренутним стањем циља. Следећи дијаграм приказује различите делове који су у игри:

Са овим дијаграмом, прилично је лако написати код за детецтЦоллисион ():

// Одређује одређену к, и координату унутар оквира боолеан детецтЦоллисион (флоат цк, флоат ци) {боолеан ретВал = фалсе; иф ((цк> к) && (цк <(к + в)) && (ци> (и-х)) && (ци <и)) {ретВал = труе; } повратак ретВал; }

Коначно, на бини() одређује да ли је мета још увек у видљивој фази. Када се једном одлети, рециклира се стављајући га на неко ново место са новом брзином и правцем. Утјешно је напоменути да упркос додатним сложеностима, већина овог кода је скоро идентична са Примером 5-17: Границе правоугаоника у Почетку рада са Обрадом.

Арраилиста циљева

Сада када смо прошли кроз циљну класу, погледајмо како да је употребимо. Као што је поменуто на почетку, главни циљ овог примера је био да покаже како можете да управљате више објеката динамички. Док су стандардни низови (о којима се говори у поглављу 10 Почетак рада с обрадом) одлични за многе ствари, они нису јако динамични, јер након што сте одредили колико елемената имају, заглавили сте заувијек.

На пример, претпоставимо да желите да имате гомилу циљева, али уместо да их рециклирате као што смо овде урадили, једноставно сте их хтели избрисати. У стандардном низу не можете избрисати елементе. Ако сте почели са 5, увек имате 5, без обзира на све. Дакле, ако желите нешто "избрисати", морате имати неку врсту неспретног заобилазног рјешења. Или, на другој страни, претпоставимо да сте имали програм у којем сте обично имали прегршт ставки за управљање, али у неким приликама, можда имате много хиљада. Користећи стандардни низ, сваки пут ћете морати да направите простор за хиљаде, који троше меморију и могу да учине ваше скице споријим.

Обрада Низ листа је начин да се заобиђу ова ограничења. Уместо да буде једноставан тип података, као што је флоат или инт, АрраиЛист је класа грађевног блока за управљање другим објектима. Има методе за додавање нових ставки, брисање постојећег, проналажење броја ставки на листи и тако даље. Поред тога што је заиста користан алат, рад са АрраиЛист-ом ће вас упознати са техникама које ћете користити у другим, софистициранијим класама, као што су ХасхМапс (нешто што ћемо истражити у будућим порукама). Дакле, пребаците се на магиц_вордс.пде и погледајмо код.

Креирање АрраиЛист-а је прилично једноставно и ради се у овој линији; имајте на уму како не морамо да декларишемо величину:

АрраиЛист мете; // АрраиЛист је динамичан начин за управљање низовима

Када се једном прогласи, можемо почети са додавањем нових објеката у АрраиЛист, што радимо са додати() метода. Ево исечка кода у поставити() метод који додаје почетне циљеве:

таргет = нев АрраиЛист (); // Креирајте нову листу за (инт и = 0; и <Н; и ++) {таргет.адд (нови Таргет ("Хат", "Раббит")); }

Овај комад има неколико интересантних тачака. Прво, она демонстрира синтаксу за позивање методе, која је објецт_вариабле.цласс метход (листе аргумената). Друго, показује како можете користити објекат као аргумент за АрраиЛист. Запамтите како користимо нев наредба у листи аргумената - која ће креирати нову Таргет објектну варијаблу и прослиједити је на листу. Коначно, исјечак показује како све то можемо направити унутар петље. Можемо додати 10, 100 или 10.000 објеката - величина листе је потпуно динамична.

Овај следећи исјечак, који се појављује у нацртати () метода, показује како можемо користити добити() метод за повлачење ставке из АрраиЛист-а:

за (инт и = 0; и <таргет.сизе (); и ++) {Таргет т = (Таргет) таргет.гет (и); // Дохвати и'тх циљ из матрице т.паинт (); // Паинт ит // Провери колизије ако (т.детецтЦоллисион (вандКс, вандИ)) {иф (! Т.инТаргет) {т.тоггле (); т.инТаргет = труе; }} елсе {т.инТаргет = фалсе; } т.степ (); // Унапредите га на екран // Ако је тренутни циљ изашао из фазе, избришите га са листе и креирајте нови циљ ако (! Т.онСтаге ()) {таргет.ремове (и); таргет.адд (нови циљ ("шешир", "зец")); }}

Најважнија линија овде је Таргет т = (Таргет) таргет.гет (и);. Неколико ствари се дешава овде. Прва је да стварамо нову Таргет варијаблу која се зове т. Овај пут, међутим, не користимо нев команду. Зашто питаш? То је зато што објекат који покушавамо да приступимо већ постоји - он је креиран раније у поставити() метода. Све што радимо овде је да га преузмемо. Друго, имамо ову врсту чудне синтаксе (Циљ). То је начин на који ми говоримо Обраду који тип варијабле је да очекујемо да преузмемо. То се назива "лијевање" и захтијева мало више објашњења.

Ако се сетите, АрраиЛист је генерички алат - могли бисмо га користити са Таргет променљивом, Јиттербуг класом о којој смо говорили у поглављу 10 Почетак рада са обрадом, или било коју другу променљиву класе коју можемо креирати у будућности. Међутим, обрада (и Јава, основни језик на коме се заснива) не може да се бави генеричким објектом. То захтева да свакој варијабли дајемо тачан тип када га декларишемо. Додавање (Циљ) до предње стране добити() наредба је оно што ово ради - говоримо Обраду "Хеј, повлачимо" циљни "објект. ливење у другим програмским ресурсима.

Коначно, имамо таргет.гет (и) део линије. Ово само говори “повуци иФром тх ставке из циљева АрраиЛист.

Једном када дођемо до променљиве т, можемо позвати читање његових варијабли, позвати њене методе, и опћенито учинити да се наше понуде. У овом примеру прво позивамо боја () начин да нацртате мету на екрану. Затим проверавамо да ли га штапић додирује (као што ћете запамтити из последњег кода, положај штапића је представљен променљивим вандКс и вандИ). Ако дође до судара, прво проверите да ли је штапић већ унутар мете. (Другим речима, штап се можда сударио са објектом на ранијој итерацији поставити() и даље бити у оквиру за циљање.) Ако није (тј. први пут погоди оквир за циљање), онда пребацујемо текст и подешавамо инТаргет флаг. Ако је штап већ у мети, онда једноставно поставимо циљну заставицу на лажну, што спречава циљ од измењеног стања на свакој итерацији нацртати (). Следећа команда, т.степ (), једноставно повећава циљ Икс и и позиције. Коначно, последњи ако блок провјерава да ли циљ више није видљив на позорници. Ако није (тј. Лутао је изван видљиве површине екрана), онда је циљ уклоњен из АрраиЛист-а користећи уклони () метода; затим се нова мета додаје на неком новом мјесту.

Вхев! То је много апстрактних ствари, али вреди разумети зато што ћете ове технике користити поново и поново. Без обзира да ли користите АрраиЛист, ХасхМап или неку другу општу структуру података, разумевање ових основних корака - креирање новог објекта, складиштење у генеричкој структури података и његово враћање - од суштинског је значаја за израду софистициранијих програма.

У следећем Цодебок-у, направићемо паузу од веб камере и истражити како да добијемо софистициранији унос од корисника користећи стварно цоол библиотеку под именом цонтролП5. Ох, и фрактали. И ми ћемо то урадити.

Више: Погледајте све ступце Цодебока

Удео

Оставите Коментар