Равзана ва расмкашӣ
Ин барои чӣ лозим аст
arcade — китобхонаи муосир барои бозиҳои 2D дар Python. Он тавассути видеокорт (OpenGL) мекашад, бинобар ин бо ҳазорҳо спрайт осон кор мекунад, барои платформерҳо бошад дар он ҳама чизи лозимӣ фавран ҳаст: физика, камера, харитаҳои сатҳ. Дар arcade платформерҳо, бозиҳои аркадӣ, муаммоҳо ва бозиҳои таълимӣ сохтан қулай аст.
Мисли курси pygame, шумо бозиҳои тайёрро ислоҳ мекунед: дар ҳар масъала — барномаи коркунанда, ки дар он қисми хурде вайрон шудааст. Дар ин мавзӯъ мефаҳмем, ки бозӣ дар arcade чӣ тавр сохта шудааст, тирҳои координатаҳо ба куҷо нигаронида шудаанд (дар ин ҷо фарқи муҳим аз pygame ҳаст) ва чӣ тавр шаклҳо кашидан мумкин аст.
Қадами 1. Бозӣ — синфи равзана аст
Дар pygame шумо худатон даври бозии while-ро менависед. Дар arcade даврро муҳаррик мегардонад, шумо бошед бозиро бо синфи ворисии arcade.Window тасвир мекунед ва методҳое менависед, ки муҳаррик худаш даъват мекунад:
import arcade
class Game(arcade.Window):
def __init__(self):
super().__init__(800, 600, "Бозии ман") # равзанаи 800 × 600
self.background_color = arcade.color.SKY_BLUE
def on_update(self, delta_time): # мантиқ: ~60 маротиба дар сония
pass
def on_draw(self): # кашидани кадр
self.clear()
arcade.draw_circle_filled(400, 300, 50, arcade.color.YELLOW)
Game()
arcade.run()
Равзанаи осмонранг бо доираи зард дар марказ кушода мешавад.
| Метод | Кай даъват мешавад |
|---|---|
__init__ |
як маротиба ҳангоми сохтани равзана: андозаҳо, сарлавҳа, ҳолати аввала |
on_draw() |
ҳар кадр, барои кашидани тасвир |
on_update(delta_time) |
ҳар кадр, барои нав кардани ҳолати бозӣ |
on_key_press(symbol, modifiers) |
ҳангоми пахши тугма |
on_mouse_press(x, y, button, modifiers) |
ҳангоми зеркунии муш |
arcade.run() даврро оғоз мекунад ва то пӯшидани равзана барнамегардад. Ин усулро коркардкунандаҳои ҳодисаҳо меноманд: шумо намепурсед «чӣ шуд?», балки муҳаррик худаш методи лозимиро даъват мекунад.
Қадами 2. on_draw ва clear
Ҳар кадр аз сифр кашида мешавад. Бинобар ин on_draw қариб ҳамеша бо self.clear() сар мешавад — он кадри гузаштаро пок мекунад ва равзанаро бо ранги background_color пур мекунад. Бе он дар экран изҳои кадрҳои гузашта мемонанд: тӯби ҳаракаткунанда ба «мор» аз нусхаҳои худ табдил меёбад.
delta_time дар on_update — аз кадри гузашта чанд сония гузашт (одатан тақрибан 1/60 ≈ 0.0167). Агар суръатро ба delta_time зарб кунед, бозӣ дар ҳар компютер якхела тез меравад:
speed = 120 # пиксел дар сония
delta_time = 1 / 60
print(round(speed * delta_time, 2))
Натиҷа:
2.0
Қадами 3. Координатаҳо: y ба боло
Фарқи асосӣ аз pygame: нуқтаи (0, 0) — кунҷи чапи поёни равзана, x ба рост меафзояд, y ба боло меафзояд — мисли графики математика. Барои он ки объект боло барояд, y-и онро зиёд мекунанд.
| pygame | arcade | |
|---|---|---|
| (0, 0) дар куҷост | кунҷи чапи боло | кунҷи чапи поён |
| y ба куҷо меафзояд | ба поён | ба боло |
| «объектро боло бардоштан» | y -= … |
y += … |
Аксар вақт маълумот «аз боло ба поён» навишта шудааст: сатрҳои матн, сатрҳои харитаи сатҳ, рақамҳои қаторҳо дар ҷадвал. Он гоҳ онҳоро чаппа кардан лозим меояд. Масалан, пикселе, ки дар координатаҳои pygame дар баландии y_top аз канори боло меистад, дар arcade дар баландии H - y_top аз канори поён мешавад:
H = 600
for y_top in (0, 100, 600):
print(y_top, "->", H - y_top)
Натиҷа:
0 -> 600
100 -> 500
600 -> 0
Болои равзана дар arcade — ин y = H, поён — y = 0.
Қадами 4. Катакҳо ва марказҳои онҳо
Дар бозиҳо дар майдони катакӣ координатаро тавассути рақами катак ҳисоб кардан қулай аст. Агар катакҳои бари size пай дар пай аз канор раванд, катаки рақами col x-ро аз col * size то (col + 1) * size ишғол мекунад, маркази он бошад — дар миён:
size = 64
for col in range(3):
left = col * size
print(col, left, left + size, left + size // 2)
Натиҷа:
0 0 64 32
1 64 128 96
2 128 192 160
Марказ барои он лозим аст, ки дар arcade бисёр чизҳо (спрайтҳо, доираҳо) аз рӯи марказ гузошта мешаванд. Барои он ки майдон дар мобайни равзана истад, ба координатаҳо фосила — нисфи ҷои холиро илова мекунанд: агар бари равзана 800, майдон 300 бошад, аз чап (800 - 300) / 2 = 250 пиксел мемонад.
Қадами 5. Росткунҷаҳои LRBT
Росткунҷаро дар arcade аксар вақт бо чор сарҳад — LRBT медиҳанд: Left, Right, Bottom, Top (чап, рост, поён, боло).
arcade.draw_lrbt_rectangle_filled(100, 300, 50, 150, arcade.color.RED)
Ин росткунҷаи сурх бо бари 300 - 100 = 200 ва баландии 150 - 50 = 100 аст. Чорчӯба — draw_lrbt_rectangle_outline(…, color, ғафсӣ).
Бар ва баландиро аз сарҳадҳо бо тарҳ ҳисоб мекунанд, сарҳадҳоро аз марказ ва андозаҳо — чунин:
cx, cy, w, h = 200, 100, 80, 40
left, right = cx - w / 2, cx + w / 2
bottom, top = cy - h / 2, cy + h / 2
print(left, right, bottom, top)
Натиҷа:
160.0 240.0 80.0 120.0
Қадами 6. Шаклҳои дигар ва матн
arcade.draw_circle_filled(x, y, radius, color) # доира бо маркази (x, y)
arcade.draw_circle_outline(x, y, radius, color, 2) # ҳалқа бо ғафсии 2
arcade.draw_line(x1, y1, x2, y2, color, 3) # хат бо ғафсии 3
arcade.draw_text("Ҳисоб: 10", x, y, arcade.color.WHITE, 14) # матни андозаи 14
Рангҳо — доимиҳои тайёри arcade.color.RED, arcade.color.GOLD, arcade.color.SKY_BLUE ва садҳои дигар, ё кортежи (r, g, b). Доимӣ — ҳамон маҷмӯи ададҳои RGBA аст:
import arcade
print(tuple(arcade.color.RED), tuple(arcade.color.WHITE)[:3])
Натиҷа:
(255, 0, 0, 255) (255, 255, 255)
Ҳар расми навбатӣ болои расми пешина меафтад: замина, баъд объектҳои калон, баъд хурдҳо ва матн.
Қадами 7. Функсияҳои фоиданок
Дар модули arcade.math функсияҳои хурде ҳастанд, ки дар бозиҳо доимо лозиманд:
import arcade
print(arcade.math.clamp(150, 0, 100)) # бо порчаи [0, 100] маҳдуд кардан
print(arcade.math.clamp(-5, 0, 100))
print(arcade.math.clamp(42, 0, 100))
print(arcade.math.lerp(0, 10, 0.25)) # нуқта дар чоряки роҳ аз 0 то 10
Натиҷа:
100
0
42
2.5
clamp(value, low, high)— қиматро ба порча «часпонидан»: аз сарҳади поён хурдтар бошад —lowбармегардад, аз болоӣ калонтар —high, вагарна худи қимат. Ҳамин тавр саломатӣ, суръат, мавқеи камераро маҳдуд мекунанд.lerp(a, b, t)— нуқта байниaваb: ҳангомиt = 0—a, ҳангомиt = 1—b. Ҳамин тавр ҳаракати ҳамвор ва пур кардани наворҳоро месозанд.
Наворҳо (саломатӣ, боргирӣ, таҷриба) — унсури маъмули интерфейс. Бари қисми пуркардашуда ба қимат мутаносиб аст. Дар ададҳои бутун аввал зарб мекунанд, баъд тақсим — вагарна қисми касрӣ барвақт гум мешавад:
width, hp, max_hp = 200, 30, 100
print(width * hp // max_hp, width * (hp // max_hp))
Натиҷа:
60 0
Дар дохил чӣ тавр кор мекунад
arcade пикселҳоро худаш намекашад, балки ба видеокорт тавассути OpenGL фармонҳо мефиристад. Видеокорт ҳазорҳо шаклро мувозӣ мекашад, бинобар ин arcade дар саҳнаҳои калон аз pygame тезтар аст. Нархи ин — кашидан танҳо дар дохили равзана, вақте ки муҳаррик омода аст (дар on_draw), мумкин аст. Бинобар ин санҷишҳо дар масъалаҳо на расмкаширо, балки функсияҳои ҳисоби шуморо даъват мекунанд: маркази катак дар куҷост, навор чӣ қадар бар дорад.
Масъалаҳо чӣ тавр санҷида мешаванд
Коди бозӣ зери if __name__ == "__main__": оғоз мешавад. «Дар компютери худ иҷро кардан» равзанаи бозиро мекушояд. Ҳангоми «Фиристодан» санҷиш барномаро бе равзана import мекунад ва функсияҳои шуморо бо маълумоти гуногун даъват мекунад. Бинобар ин функсияро ислоҳ кардан лозим аст, на синфи равзанаро.
Хатоҳои маъмул
1. Гумон мекунанд, ки y ба поён меафзояд. Одат аз pygame: объектро бо кам кардани y «боло мебардоранд», вале он поён мефарояд. Дар arcade боло — плюс.
2. Чаппа кардани сатрҳо фаромӯш шуд. Сатри 0-и харита — болоӣ, y = 0 бошад — поёни равзана. Бе чаппа кардан сатҳ чаппа кашида мешавад.
3. Тартиби LRBT омехта шуд. draw_lrbt_rectangle_filled(left, bottom, right, top, …) — нодуруст: адади дуюм — сарҳади рост. Тартиб: чап, рост, поён, боло.
4. Тақсим пеш аз зарб. width * (hp // max_hp) қариб ҳамеша 0 медиҳад. width * hp // max_hp нависед.
5. self.clear() фаромӯш шуд. Дар экран изҳои кадрҳои гузашта ҷамъ мешаванд.
Варақаи ёддошт
| Чӣ | Код |
|---|---|
| бозӣ | class Game(arcade.Window):, super().__init__(w, h, "сарлавҳа") |
| замина | self.background_color = arcade.color.SKY_BLUE |
| кашидани кадр | def on_draw(self): self.clear(); ... |
| мантиқи кадр | def on_update(self, delta_time): ... |
| оғоз | Game(), arcade.run() |
| координатаҳо | (0, 0) — кунҷи чапи поён, y ба боло |
| росткунҷа | arcade.draw_lrbt_rectangle_filled(left, right, bottom, top, color) |
| чорчӯба | arcade.draw_lrbt_rectangle_outline(l, r, b, t, color, ғафсӣ) |
| доира | arcade.draw_circle_filled(x, y, r, color) |
| хат | arcade.draw_line(x1, y1, x2, y2, color, ғафсӣ) |
| матн | arcade.draw_text("…", x, y, color, андоза) |
| маҳдуд кардани қимат | arcade.math.clamp(v, low, high) |
| нуқта дар байн | arcade.math.lerp(a, b, t) |