Padarykite savo arkadinius žaidimus dar malonesnius ir įdomesnius pridėdami atsitiktinių judančių objektų.
Atsitiktinai judantys objektai žaidimuose gali sukelti jaudulį ir nenuspėjamumą. Tai daro juos patrauklesnius ir sudėtingesnius žaidėjams. Python Arcade biblioteka yra paprastas ir efektyvus būdas įtraukti atsitiktinius judančius objektus į žaidimus.
Sukurkite paprastą žaidimą
Prieš pradėdami įsitikinkite, kad turite pip įdiegtas jūsų įrenginyje. Naudokite šią komandą norėdami įdiegti arkada biblioteka:
pip diegimo pasažas
Po to sukurkite langą naudodami arkada. Langas klasę ir nustatykite fono spalvą į baltą.
Šiame straipsnyje naudojamas kodas pateikiamas čia GitHub saugykla ir jūs galite nemokamai naudotis pagal MIT licenciją.
Nustatykite grotuvo padėtį į ekrano vidurį horizontaliai ir pridėkite nedidelį atstumą nuo viršaus. Galite valdyti žaidėjo judėjimą naudodami rodyklių klavišus.
Štai mūsų pagrindinio žaidimo kodas:
importuoti arkada
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15klasėMano žaidimas(arkada. Langas):
def__init__(savaime, plotis, aukštis):
super().__init__(plotis, aukštis)
arcade.set_background_color (arcade.color. BALTAS)self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10defon_draw(savarankiškai):
arcade.start_render()
arcade.draw_circle_filled (self.player_x, self.player_y, PLAYER_RADIUS, arcade.color. MĖLYNA)defatnaujinti(savaime, delta_laikas):
praeitidefyra_key_press(savaime, raktas, modifikatoriai):
jeigu raktas == arcade.key. KAIRĖ:
self.player_x -= 5
elifas raktas == arcade.key. DEŠINĖJE:
self.player_x += 5
jeigu __vardas__ == "__pagrindinis__":
žaidimas = MyGame (SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()
Kelių objektų pridėjimas
Norėdami prie žaidimo pridėti atsitiktinai judančių objektų, sukurkite objektų pozicijų saugojimo sąrašą ir atnaujinkite jas kiekvieną kadrą. Taip pat galite naudoti spritai kaip objektai.
Žaidimo kode pridėkite sąrašą pavadinimu objektų atsitiktinai judančių objektų padėtims išsaugoti. Po to sugeneruokite objektų skaičių (NUM_OBJECTS) su atsitiktinėmis x ir y koordinatėmis ekrano ribose. Objektai nupiešti kaip raudoni apskritimai naudojant arcade.draw_circle_filled funkcija.
importuoti arkada
importuoti atsitiktinisSCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
PLAYER_RADIUS = 15
OBJECT_RADIUS = 10
NUM_OBJECTS = 10klasėMano žaidimas(arkada. Langas):
def__init__(savaime, plotis, aukštis):
super().__init__(plotis, aukštis)
arcade.set_background_color (arcade.color. BALTAS)self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10self.objects = []
dėl _ in diapazonas (NUM_OBJECTS):
x = atsitiktinis.randint(0, SCREEN_WIDTH)
y = random.randint(0, SCREEN_HEIGHT)
self.objects.append((x, y))defon_draw(savarankiškai):
arcade.start_render()
arcade.draw_circle_filled (self.player_x, self.player_y, PLAYER_RADIUS, arcade.color. MĖLYNA)dėl obj in self.objektai:
x, y = obj
arcade.draw_circle_filled (x, y, OBJECT_RADIUS, arcade.color. RAUDONA)defatnaujinti(savaime, delta_laikas):
praeitidefyra_key_press(savaime, raktas, modifikatoriai):
jeigu raktas == arcade.key. KAIRĖ:
self.player_x -= 5
elifas raktas == arcade.key. DEŠINĖJE:
self.player_x += 5
jeigu __vardas__ == "__pagrindinis__":
žaidimas = MyGame (SCREEN_WIDTH, SCREEN_HEIGHT)
arcade.run()
Žemiau yra išvestis:
Atsitiktinių judesių algoritmo įgyvendinimas
Norėdami, kad objektai judėtų atsitiktinai, atnaujinkite jų padėtis atnaujinti metodas, naudojant atsitiktinio judėjimo algoritmą.
Pakartokite kiekvieną objektą ir generuokite atsitiktines reikšmes dx ir dy, reiškiantis x ir y koordinačių pokytį. Tada atnaujinkite objekto padėtį pridėdami šias reikšmes. Štai pakeistas kodas:
defatnaujinti(savaime, delta_laikas):
dėl i in diapazonas (NUM_OBJECTS):
x, y = savaime.objektai[i]
dx = random.randint(-5, 5)
dy = atsitiktinis.randint(-5, 5)
x += dx
y += dy
self.objects [i] = (x, y)
Žemiau yra išvestis:
Objektai, judantys žaidėjo link
Norėdami pridėti daugiau sąveikos, priverskite objektus judėti link grotuvo. Tai galite pasiekti apskaičiuodami krypties vektorių tarp objekto ir grotuvo ir atitinkamai pakoreguodami objekto padėtį.
Tam apskaičiuokite x ir y koordinačių skirtumus tarp objekto ir grotuvo. Normalizuodami šias reikšmes, gausite krypties vektorių. Tada padauginkite šį vektorių iš greičio koeficiento (šiuo atveju 3) ir pridėkite jį prie objekto padėties. Štai atnaujintas atnaujinti metodas:
defatnaujinti(savaime, delta_laikas):
dėl i in diapazonas (NUM_OBJECTS):
x, y = savaime.objektai[i]
dx = self.player_x - x
dy = self.player_y – y
atstumas = math.sqrt (dx ** 2 + dy** 2)
dx /= atstumas
dy /= atstumas
x += dx * 3
y += dy * 3
self.objects [i] = (x, y)
Žemiau yra išvestis:
Objektai pradeda judėti, kai žaidėjas patenka į aplinką
Norėdami pridėti daugiau dinamikos, pakeiskite kodą taip, kad objektai pradėtų judėti tik tada, kai žaidėjas patenka į aplinkinę zoną. Pridėkite žaidėjo judėjimo kodas ir apibrėžkite spindulį, kuriame objektai tampa aktyvūs.
defatnaujinti(savaime, delta_laikas):
dėl i in diapazonas (NUM_OBJECTS):
x, y = savaime.objektai[i]
dx = self.player_x - x
dy = self.player_y – y
atstumas = math.sqrt (dx ** 2 + dy** 2)
jeigu atstumas < 100: # Sureguliuokite spindulį pagal poreikį
dx /= atstumas
dy /= atstumas
x += dx * 3
y += dy * 3
self.objects [i] = (x, y)
Susidūrimų aptikimas ir sąveika
Dabar pridėkite žaidėjo ir objektų susidūrimo aptikimą ir apibrėžkite elgesį įvykus susidūrimui. Modifikuoti atnaujinti susidūrimų valdymo būdas:
defatnaujinti(savaime, delta_laikas):
dėl i in diapazonas (NUM_OBJECTS):
x, y = savaime.objektai[i]
dx = self.player_x - x
dy = self.player_y – y
atstumas = math.sqrt (dx ** 2 + dy** 2)
jeigu atstumas < PLAYER_RADIUS + OBJECT_RADIUS:
# jei įvyko susidūrimas, tvarkykite jį čia
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
elifas atstumas < 100:
dx /= atstumas
dy /= atstumas
x += dx * 3
y += dy * 3
self.objects [i] = (x, y)
Atsitiktinumo balansavimas
Norint sukurti subalansuotą žaidimo patirtį, svarbu tiksliai sureguliuoti atsitiktinį objektų judėjimą ir atsiradimą. Štai keli pavyzdžiai, kaip galite koreguoti kodą, kad žaidimo balansas būtų geresnis:
Maksimalaus greičio ribojimas
Kad objektai nejudėtų per greitai, galite įvesti maksimalaus greičio apribojimą. Modifikuoti atnaujinti greičio apribojimų įtraukimo būdas:
defatnaujinti(savaime, delta_laikas):
dėl i in diapazonas (NUM_OBJECTS):
x, y = savaime.objektai[i]
dx = self.player_x - x
dy = self.player_y – y
atstumas = math.sqrt (dx ** 2 + dy** 2)jeigu atstumas < PLAYER_RADIUS + OBJECT_RADIUS:
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
elifas atstumas < 100:
dx /= atstumas
dy /= atstumasgreitis = 3# Sureguliuokite greičio vertę pagal poreikį
dx = min (maks. (dx * greitis, -MAX_SPEED), MAX_SPEED)
dy = min (maks. (dy * greitis, -MAX_SPEED), MAX_SPEED)
x += dx
y += dy
self.objects [i] = (x, y)
Neršto greičio valdymas
Taip pat galite valdyti naujų objektų atsiradimo greitį žaidime. Koreguokite kodą, kad įtrauktumėte delsą tarp naujų objektų atsiradimo:
importuoti laikas
klasėMano žaidimas(arkada. Langas):
def__init__(savaime, plotis, aukštis):
super().__init__(plotis, aukštis)
arcade.set_background_color (arcade.color. BALTAS)self.player_x = SCREEN_WIDTH // 2
self.player_y = PLAYER_RADIUS + 10self.objects = []
self.last_spawn_time = laikas.laikas()defatnaujinti(savaime, delta_laikas):
# čia valdykite neršto greitį
jeigu time.time() – self.last_spawn_time > SPAWN_DELAY:
jeigu len (self.objects) < MAX_OBJECTS:
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
self.last_spawn_time = laikas.laikas()dėl i in diapazonas (len (self.objektai)):
x, y = savaime.objektai[i]
dx = self.player_x - x
dy = self.player_y – y
atstumas = math.sqrt (dx ** 2 + dy** 2)jeigu atstumas < PLAYER_RADIUS + OBJECT_RADIUS:
self.objects.pop (i)
self.objects.append((random.randint(0, SCREEN_WIDTH), random.randint(0, SCREEN_HEIGHT)))
elifas atstumas < 100:
dx /= atstumas
dy /= atstumas
x += dx * 3
y += dy * 3
self.objects [i] = (x, y)
Sureguliuokite SPAWN_DELAY ir MAX_OBJECTS vertybes, kad rastumėte tinkamą žaidimo pusiausvyrą. Ilgesnis delsimas arba mažesnis maksimalus objektų skaičius sumažins žaidimą. Tuo tarpu trumpesnis delsimas arba didesnis maksimumas padidins sunkumus.
Padarykite žaidimus linksmesnius naudodami judančius objektus
Atsitiktinai judančių objektų pridėjimas prie žaidimų gali žymiai pagerinti bendrą patirtį. Jie suteikia nenuspėjamumo ir iššūkių, todėl žaidimas tampa patrauklesnis ir dinamiškesnis. Žaidėjai turės prisitaikyti ir greitai reaguoti, kad išvengtų susidūrimų ar nesugautų daiktų, o tai suteiks jaudulio ir pasiekimų jausmą.