Учините своје аркадне игре још пријатнијим и узбудљивијим додавањем насумичних покретних објеката.

Насумични покретни објекти могу донети узбуђење и непредвидљивост у игрице. То их чини привлачнијим и изазовнијим за играче. Питхон-ова библиотека Арцаде пружа једноставан и ефикасан начин за укључивање насумичних покретних објеката у ваше игре.

Направите једноставну игру

Пре него што почнете, уверите се да имате пип инсталиран на вашем уређају. Користите ову команду да бисте инсталирали арцаде библиотека:

пип инсталл арцаде

Након тога, креирајте прозор користећи арцаде. Прозор класе и подесите боју позадине на белу.

Код коришћен у овом чланку доступан је у овом ГитХуб спремиште и бесплатан је за коришћење под МИТ лиценцом.

Поставите позицију играча на средину екрана хоризонтално и додајте малу удаљеност од врха. Можете да контролишете кретање играча помоћу тастера са стрелицама.

Ево кода за нашу основну игру:

увоз арцаде

СЦРЕЕН_ВИДТХ = 800
СЦРЕЕН_ХЕИГХТ = 600
ПЛАИЕР_РАДИУС = 15

класаМиГаме(аркада. прозор):


деф__у томе__(само, ширина, висина):
супер().__инит__(ширина, висина)
арцаде.сет_бацкгроунд_цолор (арцаде.цолор. БЕО)

селф.плаиер_к = СЦРЕЕН_ВИДТХ // 2
селф.плаиер_и = ПЛАИЕР_РАДИУС + 10

дефон_драв(сам):
арцаде.старт_рендер()
арцаде.драв_цирцле_филлед (селф.плаиер_к, селф.плаиер_и, ПЛАИЕР_РАДИУС, арцаде.цолор. ПЛАВИ)

дефажурирање(селф, делта_тиме):
проћи

дефон_кеи_пресс(селф, кључ, модификатори):
ако кључ == арцаде.кеи. ЛИЈЕВО:
селф.плаиер_к -= 5
елиф кључ == арцаде.кеи. ЈЕЛ ТАКО:
селф.плаиер_к += 5

ако __наме__ == "__главни__":
игра = Моја игра (СЦРЕЕН_ВИДТХ, СЦРЕЕН_ХЕИГХТ)
арцаде.рун()

Додавање више објеката

Да бисте својој игри додали насумично покретне објекте, направите листу за чување позиција објеката и ажурирајте их у сваком кадру. Такође можете користити духови као објекти.

У коду игре додајте листу под називом објеката за чување положаја насумичних покретних објеката. Након тога, генеришите број објеката (НУМ_ОБЈЕЦТС) са насумичним к и и координатама унутар граница екрана. Објекти су нацртани као црвени кругови помоћу арцаде.драв_цирцле_филлед функција.

увоз арцаде
увоз насумично

СЦРЕЕН_ВИДТХ = 800
СЦРЕЕН_ХЕИГХТ = 600
ПЛАИЕР_РАДИУС = 15
ОБЈЕЦТ_РАДИУС = 10
НУМ_ОБЈЕЦТС = 10

класаМиГаме(аркада. прозор):
деф__у томе__(само, ширина, висина):
супер().__инит__(ширина, висина)
арцаде.сет_бацкгроунд_цолор (арцаде.цолор. БЕО)

селф.плаиер_к = СЦРЕЕН_ВИДТХ // 2
селф.плаиер_и = ПЛАИЕР_РАДИУС + 10

селф.објецтс = []
за _ ин опсег (НУМ_ОБЈЕЦТС):
к = рандом.рандинт(0, СЦРЕЕН_ВИДТХ)
и = рандом.рандинт(0, СЦРЕЕН_ХЕИГХТ)
селф.објецтс.аппенд((к, и))

дефон_драв(сам):
арцаде.старт_рендер()
арцаде.драв_цирцле_филлед (селф.плаиер_к, селф.плаиер_и, ПЛАИЕР_РАДИУС, арцаде.цолор. ПЛАВИ)

за обј ин селф.објецтс:
к, и = обј
арцаде.драв_цирцле_филлед (к, и, ОБЈЕЦТ_РАДИУС, арцаде.цолор. ЦРВЕНА)

дефажурирање(селф, делта_тиме):
проћи

дефон_кеи_пресс(селф, кључ, модификатори):
ако кључ == арцаде.кеи. ЛИЈЕВО:
селф.плаиер_к -= 5
елиф кључ == арцаде.кеи. ЈЕЛ ТАКО:
селф.плаиер_к += 5

ако __наме__ == "__главни__":
игра = Моја игра (СЦРЕЕН_ВИДТХ, СЦРЕЕН_ХЕИГХТ)
арцаде.рун()

Испод је излаз:

Имплементација алгоритма случајног кретања

Да би се објекти кретали насумично, ажурирајте њихове позиције у ажурирање метод помоћу алгоритма случајног кретања.

Итерирајте кроз сваки објекат и генеришите насумичне вредности за дк и ди, представља промену координата к и и. Затим ажурирајте позицију објекта додавањем ових вредности. Ево измењеног кода:

дефажурирање(селф, делта_тиме):
за и ин опсег (НУМ_ОБЈЕЦТС):
к, и = селф.објецтс[и]
дк = рандом.рандинт(-5, 5)
ди = рандом.рандинт(-5, 5)
к += дк
и += ди
селф.објецтс[и] = (к, и)

Испод је излаз:

Предмети се крећу ка играчу

Да бисте додали више интеракције, учините да се објекти померају према играчу. То можете постићи тако што ћете израчунати вектор правца између објекта и играча и прилагодити положај објекта у складу са тим.

За ово израчунајте разлике у координатама к и и између објекта и играча. Нормализујући ове вредности, добијате вектор правца. Затим помножите овај вектор са фактором брзине (у овом случају 3) и додајте га позицији објекта. Ево ажурираног ажурирање метод:

дефажурирање(селф, делта_тиме):
за и ин опсег (НУМ_ОБЈЕЦТС):
к, и = селф.објецтс[и]
дк = селф.плаиер_к - к
ди = селф.плаиер_и - и
растојање = матх.скрт (дк ** 2 + ди ** 2)
дк /= растојање
ди /= растојање
к += дк * 3
и += ди * 3
селф.објецтс[и] = (к, и)

Испод је излаз:

Објекти почињу да се померају када играч уђе у окружење

Да бисте додали даљу динамику, измените код тако да објекти почну да се крећу тек када играч уђе у околину. Додајте код за кретање играча и дефинишу радијус унутар којег објекти постају активни.

дефажурирање(селф, делта_тиме):
за и ин опсег (НУМ_ОБЈЕЦТС):
к, и = селф.објецтс[и]
дк = селф.плаиер_к - к
ди = селф.плаиер_и - и
растојање = матх.скрт (дк ** 2 + ди ** 2)

ако растојање < 100: # Подесите радијус по потреби
дк /= растојање
ди /= растојање
к += дк * 3
и += ди * 3
селф.објецтс[и] = (к, и)

Детекција судара и интеракција

Сада додајте детекцију судара између играча и објеката и дефинишите понашање када дође до судара. Модифи тхе ажурирање метод за решавање колизија:

дефажурирање(селф, делта_тиме):
за и ин опсег (НУМ_ОБЈЕЦТС):
к, и = селф.објецтс[и]
дк = селф.плаиер_к - к
ди = селф.плаиер_и - и
растојање = матх.скрт (дк ** 2 + ди ** 2)

ако удаљеност < ПЛАИЕР_РАДИУС + ОБЈЕЦТ_РАДИУС:
# ако је дошло до судара, реши га овде
селф.објецтс.поп (и)
селф.објецтс.аппенд((рандом.рандинт(0, СЦРЕЕН_ВИДТХ), рандом.рандинт(0, СЦРЕЕН_ХЕИГХТ)))

елиф растојање < 100:
дк /= растојање
ди /= растојање
к += дк * 3
и += ди * 3
селф.објецтс[и] = (к, и)

Баланцинг Рандомнесс

Да бисте створили уравнотежено искуство играња, важно је фино подесити насумично кретање и стварање објеката. Ево неколико примера како можете да прилагодите код да бисте постигли бољу равнотежу у игри:

Ограничавање максималне брзине

Да бисте спречили да се објекти крећу пребрзо, можете увести ограничење максималне брзине. Модифи тхе ажурирање метод за укључивање ограничења брзине:

дефажурирање(селф, делта_тиме):
за и ин опсег (НУМ_ОБЈЕЦТС):
к, и = селф.објецтс[и]
дк = селф.плаиер_к - к
ди = селф.плаиер_и - и
растојање = матх.скрт (дк ** 2 + ди ** 2)

ако удаљеност < ПЛАИЕР_РАДИУС + ОБЈЕЦТ_РАДИУС:
селф.објецтс.поп (и)
селф.објецтс.аппенд((рандом.рандинт(0, СЦРЕЕН_ВИДТХ), рандом.рандинт(0, СЦРЕЕН_ХЕИГХТ)))
елиф растојање < 100:
дк /= растојање
ди /= растојање

брзина = 3# Подесите вредност брзине по потреби
дк = мин (макс (дк * брзина, -МАКС_СПЕЕД), МАКС_СПЕЕД)
ди = мин (макс (ди * брзина, -МАКС_СПЕЕД), МАКС_СПЕЕД)

к += дк
и += ди
селф.објецтс[и] = (к, и)

Контролисање брзине појављивања

Такође можете да контролишете брзину којом се нови објекти појављују у игри. Подесите код тако да укључује кашњење између покретања нових објеката:

увоз време

класаМиГаме(аркада. прозор):
деф__у томе__(само, ширина, висина):
супер().__инит__(ширина, висина)
арцаде.сет_бацкгроунд_цолор (арцаде.цолор. БЕО)

селф.плаиер_к = СЦРЕЕН_ВИДТХ // 2
селф.плаиер_и = ПЛАИЕР_РАДИУС + 10

селф.објецтс = []
селф.ласт_спавн_тиме = тиме.тиме()

дефажурирање(селф, делта_тиме):
# овде контролишете брзину мријешћења
ако тиме.тиме() - селф.ласт_спавн_тиме > СПАВН_ДЕЛАИ:
ако лен (селф.објецтс) < МАКС_ОБЈЕЦТС:
селф.објецтс.аппенд((рандом.рандинт(0, СЦРЕЕН_ВИДТХ), рандом.рандинт(0, СЦРЕЕН_ХЕИГХТ)))
селф.ласт_спавн_тиме = тиме.тиме()

за и ин опсег (лен (селф.објекти)):
к, и = селф.објецтс[и]
дк = селф.плаиер_к - к
ди = селф.плаиер_и - и
растојање = матх.скрт (дк ** 2 + ди ** 2)

ако удаљеност < ПЛАИЕР_РАДИУС + ОБЈЕЦТ_РАДИУС:
селф.објецтс.поп (и)
селф.објецтс.аппенд((рандом.рандинт(0, СЦРЕЕН_ВИДТХ), рандом.рандинт(0, СЦРЕЕН_ХЕИГХТ)))
елиф растојање < 100:
дк /= растојање
ди /= растојање

к += дк * 3
и += ди * 3
селф.објецтс[и] = (к, и)

Подесите СПАВН_ДЕЛАИ и МАКС_ОБЈЕЦТС вредности да бисте пронашли прави баланс за своју игру. Дуже кашњење или мањи максимални број објеката учиниће игру мање гужвом. Док ће краће кашњење или већи максимум повећати потешкоћу.

Учините игре забавнијим помоћу покретних објеката

Додавање насумичних покретних објеката играма може значајно побољшати укупно искуство. Они уносе непредвидљивост и изазове, чинећи игру занимљивијом и динамичнијом. Играчи ће морати да се прилагоде и брзо реагују како би избегли сударе или ухватили предмете, а то ће пружити осећај узбуђења и постигнућа.