Направете вашите аркадни игри още по-приятни и вълнуващи, като добавите произволни движещи се обекти.

Случайно движещи се обекти могат да внесат вълнение и непредсказуемост в игрите. Това ги прави по-ангажиращи и предизвикателни за играчите. Библиотеката Arcade на Python предоставя лесен и ефективен начин за включване на произволни движещи се обекти във вашите игри.

Създайте проста игра

Преди да започнете, уверете се, че имате pip, инсталиран на вашето устройство. Използвайте тази команда, за да инсталирате аркада библиотека:

pip инсталирайте аркада

След това създайте прозорец с помощта на аркада. прозорец клас и задайте цвета на фона на бяло.

Кодът, използван в тази статия, е достъпен в това GitHub хранилище и е безплатен за използване под лиценза на MIT.

Задайте позицията на играча в средата на екрана хоризонтално и добавете малко разстояние от върха. Можете да контролирате движението на играча с помощта на клавишите със стрелки.

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

импортиране аркада

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15

instagram viewer

класMyGame(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
arcade.set_background_color (arcade.color. БЯЛО)

self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10

дефon_draw(себе си):
arcade.start_render()
arcade.draw_circle_filled (self.player_x, self.player_y, PLAYER_RADIUS, arcade.color. СИН)

дефактуализация(самостоятелно, делта_време):
пас

дефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. НАЛЯВО:
self.player_x -= 5
елиф ключ == arcade.key. ДЯСНО:
self.player_x += 5

ако __име__ == "__основен__":
игра = MyGame (SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()

Добавяне на множество обекти

За да добавите произволни движещи се обекти към вашата игра, създайте списък за съхраняване на позициите на обекта и ги актуализирайте всеки кадър. Можете също да използвате спрайтове като обекти.

В кода на вашата игра добавете списък, наречен обекти за съхраняване на позициите на произволно движещи се обекти. След това генерирайте броя на обектите (NUM_OBJECTS) с произволни координати x и y в рамките на границите на екрана. Обектите са нарисувани като червени кръгове с помощта на arcade.draw_circle_filled функция.

импортиране аркада
импортиране случаен

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
ОБЕКТ_РАДИУС = 10
NUM_OBJECTS = 10

класMyGame(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
arcade.set_background_color (arcade.color. БЯЛО)

self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10

self.objects = []
за _ в диапазон (NUM_OBJECTS):
x = random.randint(0, SCREEN_WIDTH)
y = random.randint(0, SCREEN_HEIGHT)
self.objects.append((x, y))

дефon_draw(себе си):
arcade.start_render()
arcade.draw_circle_filled (self.player_x, self.player_y, PLAYER_RADIUS, arcade.color. СИН)

за обект в себе си.обекти:
x, y = obj
arcade.draw_circle_filled (x, y, OBJECT_RADIUS, arcade.color. ЧЕРВЕН)

дефактуализация(самостоятелно, делта_време):
пас

дефon_key_press(самостоятелно, ключ, модификатори):
ако ключ == arcade.key. НАЛЯВО:
self.player_x -= 5
елиф ключ == arcade.key. ДЯСНО:
self.player_x += 5

ако __име__ == "__основен__":
игра = MyGame (SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()

По-долу е резултатът:

Внедряване на алгоритъм за произволно движение

За да накарате обектите да се движат произволно, актуализирайте техните позиции в актуализация метод, използващ алгоритъм за произволно движение.

Преминете през всеки обект и генерирайте произволни стойности за dx и dy, представляваща промяната в координатите x и y. След това актуализирайте позицията на обекта, като добавите тези стойности. Ето модифицирания код:

дефактуализация(самостоятелно, делта_време):
за аз в диапазон (NUM_OBJECTS):
x, y = self.objects[i]
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
x += dx
y += dy
self.objects[i] = (x, y)

По-долу е резултатът:

Обекти, движещи се към играча

За да добавите повече взаимодействие, накарайте обектите да се движат към играча. Можете да постигнете това, като изчислите вектора на посоката между обекта и играча и съответно коригирате позицията на обекта.

За целта изчислете разликите в координатите x и y между обекта и играча. Като нормализирате тези стойности, получавате вектор на посоката. След това умножете този вектор по коефициент на скорост (3 в този случай) и го добавете към позицията на обекта. Ето го актуализираното актуализация метод:

дефактуализация(самостоятелно, делта_време):
за аз в диапазон (NUM_OBJECTS):
x, y = self.objects[i]
dx = self.player_x - x
dy = self.player_y - y
разстояние = math.sqrt (dx ** 2 + dy ** 2)
dx /= разстояние
dy /= разстояние
x += dx * 3
y += dy * 3
self.objects[i] = (x, y)

По-долу е резултатът:

Обектите започват да се движат, когато играчът влезе в околността

За да добавите допълнителна динамика, променете кода, така че обектите да започнат да се движат само когато играчът навлезе в заобикалящата ги област. Добавете код за движението на играча и дефинирайте радиус, в рамките на който обектите стават активни.

дефактуализация(самостоятелно, делта_време):
за аз в диапазон (NUM_OBJECTS):
x, y = self.objects[i]
dx = self.player_x - x
dy = self.player_y - y
разстояние = math.sqrt (dx ** 2 + dy ** 2)

ако разстояние < 100: # Регулирайте радиуса според нуждите
dx /= разстояние
dy /= разстояние
x += dx * 3
y += dy * 3
self.objects[i] = (x, y)

Откриване на сблъсък и взаимодействие

Сега добавете откриване на сблъсък между играча и обектите и дефинирайте поведение при възникване на сблъсък. Променете актуализация метод за справяне със сблъсъци:

дефактуализация(самостоятелно, делта_време):
за аз в диапазон (NUM_OBJECTS):
x, y = self.objects[i]
dx = self.player_x - x
dy = self.player_y - y
разстояние = math.sqrt (dx ** 2 + dy ** 2)

ако разстояние < PLAYER_RADIUS + OBJECT_RADIUS:
# ако възникне сблъсък, обработете го тук
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))

елиф разстояние < 100:
dx /= разстояние
dy /= разстояние
x += dx * 3
y += dy * 3
self.objects[i] = (x, y)

Балансиране на случайността

За да създадете балансирано геймплей изживяване, е важно да настроите фино произволното движение и хвърляне на хайвера на обекти. Ето няколко примера как можете да коригирате кода, за да постигнете по-добър баланс в играта си:

Ограничаване на максималната скорост

За да предотвратите твърде бързото движение на обектите, можете да въведете ограничение на максималната скорост. Променете актуализация метод за включване на ограничения на скоростта:

дефактуализация(самостоятелно, делта_време):
за аз в диапазон (NUM_OBJECTS):
x, y = self.objects[i]
dx = self.player_x - x
dy = self.player_y - y
разстояние = math.sqrt (dx ** 2 + dy ** 2)

ако разстояние < PLAYER_RADIUS + OBJECT_RADIUS:
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
елиф разстояние < 100:
dx /= разстояние
dy /= разстояние

скорост = 3# Регулирайте стойността на скоростта според нуждите
dx = min (max (dx * скорост, -MAX_SPEED), MAX_SPEED)
dy = min (max (dy * скорост, -MAX_SPEED), MAX_SPEED)

x += dx
y += dy
self.objects[i] = (x, y)

Контролиране на скоростта на размножаване

Можете също да контролирате скоростта, с която се появяват нови обекти в играта. Коригирайте кода, за да включите забавяне между раждането на нови обекти:

импортиране време

класMyGame(аркадна. прозорец):
деф__в него__(аз, ширина, височина):
super().__init__(ширина, височина)
arcade.set_background_color (arcade.color. БЯЛО)

self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10

self.objects = []
self.last_spawn_time = time.time()

дефактуализация(самостоятелно, делта_време):
# контролирайте скоростта на хвърляне на хайвера тук
ако time.time() - self.last_spawn_time > SPAWN_DELAY:
ако len (self.objects) < MAX_OBJECTS:
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
self.last_spawn_time = time.time()

за аз в диапазон (len (self.objects)):
x, y = self.objects[i]
dx = self.player_x - x
dy = self.player_y - y
разстояние = math.sqrt (dx ** 2 + dy ** 2)

ако разстояние < PLAYER_RADIUS + OBJECT_RADIUS:
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
елиф разстояние < 100:
dx /= разстояние
dy /= разстояние

x += dx * 3
y += dy * 3
self.objects[i] = (x, y)

Регулирайте SPAWN_DELAY и MAX_OBJECTS стойности, за да намерите правилния баланс за вашата игра. По-дълго забавяне или по-малък максимален брой обекти ще направят играта по-малко претъпкана. Докато по-краткото забавяне или по-големият максимум ще увеличат трудността.

Направете игрите по-забавни с помощта на движещи се обекти

Добавянето на произволни движещи се обекти към игрите може значително да подобри цялостното изживяване. Те въвеждат непредвидимост и предизвикателство, правейки играта по-ангажираща и динамична. Играчите ще трябва да се адаптират и реагират бързо, за да избегнат сблъсъци или да хванат предмети, и това ще осигури усещане за вълнение и постижение.