Corona oyun motoru: toqquşma hadisələri nə vaxt və necə tətbiq olunur?

Yəqin ki, müəyyən oyun aspektləri altında fiziki xüsusiyyətləri və davranışları olan çox sayda mobil oyun oynamısınız. Məsələn, Doodle Jump-də platformalardan tullanın və ya Angry Birds-də ağac yığınlarını yırtın.

Bütün bu qarşılıqlı əlaqələrin arxasında nəyin olduğunu və doodler bir platformanın nə vaxt keçəcəyini və nə vaxt atılacağını bilirsinizmi? Qəzəbli bir quş vurduqda bu yığın ağac necə real şəkildə çökə bilər? Əslində o qədər də çətin deyil. Hamısı toqquşma hadisələrindən hansısa bir yardımla alırlar.

Oyunlarımın çoxu Corona Oyun Mühərriki ilə yaradıldığı üçün Corona Collision (Fizika) və Lua proqramlaşdırma dilindən bu mövzuda nümunələri təsvir etmək və kodlaşdırmaq üçün istifadə edirəm. Ancaq oxşar prinsiplər digər oyun motorlarına asanlıqla tətbiq edilə bilər, çünki bir çox fizika mühərrikləri çox oxşar işləyir. Corona ümumiyyətlə sənədlər ilə belə bir möhtəşəm bir iş görür ki, bu mətndəki sənədlərə bəzi istinadları görə bilərsiniz, çünki təkəri yenidən ixtira etmək üçün heç bir səbəb yox idi. :)

Beləliklə, dalış edək!

Tam baxış

Əvvəla, hər bir oyun motorunun fizika ilə məşğul olmaq üçün arxa planda fizika mühərrikindən istifadə etdiyini vurğulamaq lazımdır. Corona xüsusilə Box2D fizika mühərrikindən istifadə edərək fizika ilə məşğul olur. Bu sayədə fizika dünyasından sadəcə fiziki xüsusiyyətləri oyundakı obyektlərə həvalə etmək və uyğun metodlardan istifadə edərək qarşılıqlı əlaqəni idarə etməklə funksiyaları həyata keçirə bilərsiniz.

Toqquşma hadisələri bunlardan biridir. Fiziki cisimlər arasındakı toqquşmaların aşkarlanmasına və işlənməsinə imkan verir. Xarakterə düşən cisimləri toplayan, yaxşılarını tutan və pis olanları qaçıran sadə bir oyun düşünün. Xarakterin düşən bir cisimlə nə vaxt ünsiyyət qurduğunu müəyyən etmək üçün əvvəllər xarakterə və düşən obyektlərə təyin etdiyiniz toqquşma hadisəsini nəzərdən keçirin.

Bu test aşağıdakı kimi sadə ola bilər:

Toqquşma hadisələri fiziki qarşılıqlı təsir detektorları olduğundan, əvvəllər qarşılıqlı əlaqə qurmaq istədiyiniz obyektlərə fiziki cisimlər əlavə etdiyiniz güman edilir. Bu tərif sadədir, ancaq obyektlərinizin fiziki qarşılıqlı əlaqələrə uyğun olmasını istəyirsinizsə bir şərtdir.

Məsələn, deyə bilərsiniz:

Göründüyü kimi, burada bir neçə tərif var: cismin növü (dinamik cisimlər cazibə və ya reaksiya toqquşma qüvvələri kimi qüvvələrə görə simulyasiyada hərəkət edir və sürətin istifadəsini qəbul edir, statik cisimlər cazibə kimi qüvvələrə cavab vermir və sonsuz bir kütləyə sahib olduqları kimi hərəkət edəcəklər, kinematik cisimlər simulyasiya zamanı (daha çox coronalabs.com saytında) və fərqli fiziki qarşılıqlı təsirlərlə meydana gələn fiziki xassələrə görə sürətlərinə və s. Məsələn, bir top yerə çatsaydı, sürətinin çox hissəsi toqquşmadan sonra geri dönəcəyi üçün yüksək sürətlə sıçrayacaqdı (atlama = 0.8) Əgər xarakterimiz bir təpəyə dırmaşan bir adam olsaydı və istəmirik ki, dırmaşarkən geri oturub yıxılsın Əgər belədirsə, müəyyən bir ox ətrafında fırlanmasını dondura bilərik və s.

Bunu həyata keçirmək üçün bir çox təcrübə tələb olunduğu kimi görünə bilər, amma həqiqətən də belə deyil. Mühərrik sizin üçün ən çox iş gördüyü üçün bir çox sadə oyun asanlıqla fizikanın əsas anlayışı ilə yaradıla bilər.

Müəyyən bir şəkildə toqquşma

Daha əvvəl qeyd edildiyi kimi, toqquşma hadisələri fiziki cisimlər arasındakı toqquşmanı müəyyənləşdirməyə və idarə etməyə kömək edə bilər. Corona müxtəlif toqquşma növlərini təyin etmək üçün istifadə edilə bilər:

  • Qarşıdurma
  • Toqquşma
  • toqquşmadan sonra

Hər bir toqquşma hadisəsi üçün aşağıdakıları təyin edən bir sub-case də mövcuddur:

  • yerli toqquşma
  • qlobal toqquşma

Hansı birini seçdiyiniz nə edəcəyinizə bağlıdır.

Qlobal və ya yerli bir toqquşma ilə başlayaq. Yerli toqquşmalar birdən birə çox toqquşma ssenarilərində ən yaxşı şəkildə istifadə olunur, qlobal toqquşmalar isə çoxdan çox toqquşma ssenarilərində ən yaxşı şəkildə istifadə olunur - ətraflı məlumat üçün coronalabs.com-a baxın Beləliklə, xasiyyətimiz yaxşı düşən cisimləri ələ keçirsə və pislərini götürməsə, yerli bir toqquşma hadisəsinə mükəmməl uyğunlaşardı. Oyununuzda çox simvol varsa, qlobal iş saatı olaraq təyin olunan və oyundakı bütün fiziki obyektlər arasında toqquşma aşkar edən qlobal toqquşma hadisəsindən istifadə etməlisiniz.

Yerli toqquşma hadisələri, obyektin özünü təmsil edən və digərləri arasında toqquşmada iştirak edən digər corona ekran obyektləri ilə özünü və hadisə parametrlərini təsvir edir. Corona ekran obyektləri həqiqətən çox gözəl bir funksiyaya sahibdirlər: Lua masaları kimi davranırlar ki, adlar, identifikatorlar və ya kateqoriyalar kimi müxtəlif məlumatlar asanlıqla əlavə olunsun. Bu, toqquşmalarla qarşılaşdıqda xüsusilə faydalıdır. Hər bir yaxşı və pis obyektə bir identifikator əlavə edilə bilər (məsələn, "yaxşı", "pis"). Toqquşma hadisəsi daxilindəki bu identifikatorları müqayisə edərək, oyunçunun hansının yığıldığını tapmaq çox asandır. Yaxşı olarsa, oyunçuya xallar verə bilərsiniz. Olmasa, onun həyat nöqtələrini azalda bilərsən.

Bu ssenari nizamlı bir toqquşmadan istifadə edərək asanlıqla yaradıla bilər. Yəni, fiziki bir cisimlə əlaqəli olan cisimlər arasında fiziki təmasları görə bilərsiniz. Bu hadisə ilkin və kəsilmiş əlaqə anları üçün tədbirlər görə biləcəyiniz bir başlanğıc və son mərhələdən ibarətdir. Məsələn, Little Galaxy kimi bir kosmik oyun qurduğunuzu və fizikanın artikulyasiya texnologiyasından istifadə edərək planetinizin cazibə sahələrini təyin etdiyinizi düşünün. Toqquşma hadisəsinin ilk və son mərhələlərində bir peykin planetin cazibə sahəsinə nə zaman girdiyini və çıxdığını öyrənə bilərsiniz və sonra müəyyən hərəkətlər edə bilərsiniz. Gəlin xarakterimizə qayıdaq və əngəlləri görək və bunun hərəkətdə nə olduğunu görək.

Birincisi, fərqli ekran ölçüləri ilə məşğul olmaq üçün bəzi qlobal sabitləri yaradıram. Bu yanaşma tərtibatçıdan inkişaf etdiriciyə qədər dəyişə bilər. Bu config.lua-da müəyyən edilmiş məzmun ölçüsünə aiddir və mən şəxsən bu metodun istifadə üçün ən uyğun olduğunu aşkar etdim.

Bundan əlavə, düşən cisimlər üçün identifikator kimi istifadə edəcəyəm bir qlobal sayım yaradacağam:

Lazımi kitabxananı da həyata keçirəcəyəm, fizikanı işə salacağam və cazibə qüvvəsini söndürəcəyəm:

Sonrakı xarakterimizi yaradacağam. Məsələn, (düşən cisimlər kimi) sadə bir dairə ilə təmsil olunur:

Y anker xassəsi 1 xarakter üçün təyin edilmişdir. Bu, Y oxunun istinad nöqtəsinin ən aşağı nöqtəyə qoyulduğunu göstərir. Nəticədə ekranın ortasında yerləşdirildikdə alt dairə orada yerləşdirilir. Bu "Doodle Jump" sonrakı nümunəsində çox vacib olacaqdır.

Artıq qeyd edildiyi kimi, fiziki bir bədən fiziki qarşılıqlı əlaqədə iştirak edəcək bütün obyektlərə tapşırılmalıdır:

Bir xarakter olaraq sensoru təyin etdiyimi unutmayın. Bu o deməkdir ki, digər fiziki cisimlər xarakterlə fiziki qarşılıqlı əlaqə qura bilmir (təsir yoxdur, sürtünmə yoxdur və s.), Lakin yenə də toqquşmaları aşkarlaya biləcəyik. Bu prinsip, ekrandakı davranışlarına görə cisimlərin toqquşmasını və ətrafında uçmasını istəmədiyimiz zaman istifadə olunur, ancaq qarşılıqlı əlaqədə olduqda və qarşılıqlı əlaqənin əsasında bir şey etdikdə (məsələn, nöqtələri artırmaq və ya azaltmaqda) sadəcə tanıyırıq.

İndi düşən obyektlərin yaradılması üçün bir funksiya yaradırıq:

Bu funksiya hər 2 saniyədə bir obyekt yaradan və onu yuxarıdan aşağıya canlandıran bir timer ilə çağırılır. Gördüyünüz kimi, hər bir maneə əvvəlcədən müəyyənləşdirilmiş say ilə müəyyən edilir və vizual fərqləndirmə üçün hər yaxşı düşən obyekt yaşıl rəngə, pis düşən obyekt qırmızı rəngə malikdir.

İndi düşünə bilərsən ki, mən düşən əşyaları niyə sensorlar kimi istifadə edirəm? İnkişaf etmiş bir oyun ssenarisində, düşən cisimləri toplamaq / qarşısını almaq və təsadüfi olaraq düşən bir obyektin ekranın altındakı səyahətinə başladığı mövqeyi yaratmaq üçün xarakterinizi sola və sağa söykəmək üçün istifadə edə bilərsiniz. Oyunun gedişində obyektin əmələ gəlməsi üçün tələb olunan vaxt intervalını məhdudlaşdırarsanız, bəzi maneələrin bir-birinə çox yaxınlaşma ehtimalı var.

Sensor kimi qurulmasaydılar, keçidlər (cazibə deyil!) Cihazları ekranın altından yuxarıya doğru hərəkət etdirmək üçün istifadə edildiyindən çox qeyri-təbii şəkildə toqquşardılar və davranardılar. Bu, sərbəst hərəkət etməyə imkan verir, xüsusən düşmə sürəti fərqli olduqda və bu obyektlərlə toqquşmağı hələ də aşkar edə bilərsiniz, çünki hər ikisi də fiziki cisim olaraq təyin olunur.

İndi toqquşma hadisəmizi bir funksiya olaraq təyin etməyin vaxtı gəldi:

Bu hadisə təsir bağışlamaq üçün xarakterimizə bağlı və bağlı olmalıdır:

İndi dinləyicimiz, xarakterimizlə əlaqəli olan bütün fiziki qarşılıqlı əlaqələri "dinləyir". Düşən bir cisimlə əlaqə qurduqdan sonra istifadəçinin yaxşı və ya pis bir obyekti topladığını yoxlayır. Toplanan hər yaxşı obyekt üçün istifadəçi 10 bal alır. Digər tərəfdən, pis bir obyekti toplayırsa, xalları 10-a endirilir. Bu edildikdə, düşən cisim çıxarılır və xarakter bir toqquşmanın baş verdiyini əyani şəkildə göstərmək üçün müvafiq olaraq canlandırılır.

Nəticələri əvvəlcədən nəzərdən keçirək!

Fəaliyyət obyekt snap oyun

Gördüyünüz kimi, bütün bunları etmək asan idi, çünki arxa planda sizin üçün bütün mürəkkəb şeyləri idarə edən bir fizika mühərriki var. Tam kodu buradan yükləyə bilərsiniz.

İndi maraqlı davranışa nail olmaq üçün əvvəlcədən toqquşmaların necə asanlıqla tətbiq olunacağına baxaq. Bəlkə də bunun ən yaxşı nümunəsi, bir atlama xarakteri ilə bir doodle atlama kimi platforma oyununun yaradılmasıdır. İnanın ya da inanmıram, bu vacib oyun funksiyası əvvəlki "obyektin bağlanması" funksiyasından daha çətin yerinə yetirilmir. Birincisi, əvvəlcə istifadəçi interfeysinin elementlərini müəyyənləşdiririk və onlara fiziki bədən veririk.

Bu dəfə bu oyunçu və bir sıra sabit kodlu platformalar:

Yenə də qeyd edək ki, platformalara bir identifikator verilir və xarakter hələ dinamik olduğu müddətdə bu dəfə statik cisimlər kimi təyin olunur. Bunun səbəbi cazibə qüvvəsidir:

Belə ki, platformalar yıxılmır və yıxılmır, statik cisimlər kimi müəyyənləşdirilməlidir, yəni cazibə qüvvələrinə reaksiya vermirlər. Digər tərəfdən oyunçumuz hər atladığı zaman aşağı çəkilməlidir. Diqqət yetirin ki, xarakterimizin Y lövbər nöqtəsi yenidən ən aşağı nöqtəyə qoyuldu. Bu, xarakterin mövqeyinin (ayaqları) vuruşmaq istədiyi platformanın üstündə və ya altındakı olub olmadığını yoxlamaq üçün toqquşma əvvəli hadisələrdə istifadə olunur.

Ayaqları aşağı olduqda, əlaqəni bağlayın. Ayaqları qalxdıqda, havada bir az itələyin:

Əvvəlcədən toqquşma bir az yüksəkdir və hər əlaqə başına bir neçə dəfə tetiklenebilir. Xarakterimizə hər bir havada yalnız bir zərbə vermək üçün, onun xətti sürətini təyin edə bilərik və xarakterin düşdüyünü və platformaya yaxınlaşdığını müəyyən etmək üçün sürət işarəsini (Y istiqaməti) istifadə edə bilərik. Xarakterimizin ilkin sürəti 0 olduğundan, əvvəlində bir az itələməliyik və o işə başlaya bilər!

Fəaliyyətdə platforma atlama oyunu

Növbəti addım, təsadüfi platformalar yaratmaq üçün bir funksiya yaratmaq və simvol yuxarı qalxdıqda onları aşağı salmaq olar. Məsələ olmadığı üçün bunu başqa bir bloga buraxacağam. Sadəcə qeyd etmək istəyirəm ki, bu xüsusi mexanikaya müxtəlif yanaşmalarla nail olmaq mümkündür. Bunu nümunə naminə seçdim. Təcrübələrdən qorxma! Tam demo kodunu buradan yükləyə bilərsiniz.

Sonuncusu, lakin ən azı, toqquşmadan sonra baş verən bir hadisədir. Toqquşma qüvvəsi və sürtünmə barədə məlumat verən yeganə toqquşma hadisəsidir (daha çox məlumat üçün coronalabs.com saytına daxil olun). Bir oyun tərtibçisi olaraq bu sizin üçün nə deməkdir? Bu dəyərlərdən, məsələn, müəyyən hadisələrin gücünü və miqdarını təyin etmək üçün istifadə edə bilərsiniz.

Bir langırt oyunu oynadığınız zaman topun vurduğu raketin səsini hadisənin qüvvəsinə nisbətdə oynaya bilərsiniz. Buz xokkey oyunu qurursan və puck üzərində bir avar vurarkən buz parçaları ilə buz qırarsan, daha güclü zərbə ilə daha çox hissəcikləri xaric edə bilərsən.

Bu nümunədə, xarakterimizin dairəsinə vuran bir top yaradıram.

Top xarakterin altına şaquli yerləşdirilir. İndi bir az güc tətbiq edib xarakterə işarələyəcəyəm, lakin təsadüfi X və Y qüvvə dəyərləri ilə topun biraz fərqli idarə edildiyi və xarakteri vurduqdan sonra son nəticədə (davranış) fərqlərini görə biləcəyiniz üçün. başqa bir məqam.

Toqquşmadan sonrakı hadisəni aşağıdakı kimi təyin etmək olar:

Və son nəticə belə görünür:

Fəaliyyətdə toqquşmadan sonrakı oyun

Xarakter hitdən sonra kifayət qədər real hərəkət edir, elə deyilmi? Cisimlər və fizika dünyasının özü üçün yalnız bir neçə xüsusiyyət müəyyən etdik. Bu hadisənin arxasında duran bütün mexaniklərin sizin üçün fizika mühərriki tərəfindən idarə olunduğuna görədir. Tam kodu burada tapa bilərsiniz.

Nəticə

Gördüyünüz kimi, toqquşma manipulyasiyası çox əlverişlidir. Fizika mühərriki sizin üçün işlərin çoxunu arxa planda etdiyindən, bir çox əsas (lakin çox təsirli) şeylər yalnız fizikanın əsas anlayışı ilə və əlbətdə işlədiyiniz oyun mühərriki ilə həyata keçirilə bilər.

Toqquşma hadisələri müxtəlif fəaliyyətlərlə birləşdirilə bilər və olmalıdır, yalnız performans və təxəyyüllə məhdudlaşan sonsuz imkanlar verir.

__________ Tərəfdaşlığa müraciət edirik və yeni layihələrə açıqıq. Müzakirə etmək istədiyiniz bir fikriniz varsa, komandamızla bölüşün!