Halo, Habr! Saya hadir untuk Anda terjemahan artikel Cara membuat game 2D dengan Python dan perpustakaan Arcade oleh Paul Vincent Craven
Cara membuat game 2D dengan Python dan perpustakaan arcade
Pelajari cara memulai dengan Arcade, pustaka Python yang mudah digunakan untuk membuat gim video 2D.

Phython adalah bahasa yang bagus untuk orang yang belajar pemrograman, dan sangat ideal bagi mereka yang ingin "melakukan sesuatu" dan tidak menghabiskan banyak waktu pada kode boilerplate. Arcade adalah pustaka Python untuk membuat video game 2D, yang mudah digunakan dan sangat efektif saat Anda mendapatkan pengalaman. Pada artikel ini, saya akan menjelaskan cara mulai menggunakan Python dan Arcade untuk memprogram video game.
Saya memulai pengembangan di Arcade setelah mengajar siswa menggunakan perpustakaan PyGame . Saya mengajar secara pribadi menggunakan PyGame selama hampir 10 tahun, dan saya mengembangkan ProgramArcadeGames .com untuk mengajar online. PyGame memang hebat, tetapi pada akhirnya saya merasa seperti membuang-buang waktu untuk menutupi bug yang tidak pernah diperbaiki .
Saya khawatir mengajarkan hal-hal seperti loop acara , yang tidak lagi seperti cara kita kode. Saya memiliki seluruh bagian di mana saya menjelaskan mengapa koordinat Y terbalik. Karena PyGame jarang diperbarui, dan didasarkan pada perpustakaan SDL 1 lama, dan bukan pada sesuatu yang lebih modern, seperti OpenGL , saya tidak punya banyak harapan untuk masa depan.
Saya ingin membuat perpustakaan yang lebih mudah digunakan, lebih kuat, dan menggunakan beberapa fitur Python 3 baru, seperti dekorator dan ketik petunjuk. Ini adalah arcade. Dan inilah cara memulainya.
Instalasi
Arcade, seperti banyak paket lain, tersedia melalui PyPi , yang berarti Anda dapat menginstal Arcade menggunakan perintah pip (atau perintah pipenv). Jika Anda sudah menginstal Python, Anda mungkin bisa membuka command prompt di Windows dan mengetik:
pip install arcade
Atau pada tipe MacOS dan Linux:
pip3 install arcade
Untuk instruksi instalasi yang lebih terperinci, Anda dapat merujuk ke dokumentasi instalasi Arcade .
Gambar sederhana
Anda dapat membuka jendela dan membuat gambar sederhana hanya dengan beberapa baris kode. Mari kita buat contoh yang menarik smiley, seperti yang ditunjukkan pada gambar di bawah ini:

Algoritme di bawah ini menunjukkan bagaimana Anda dapat menggunakan perintah gambar Arcade untuk melakukan ini. Perhatikan bahwa Anda tidak perlu tahu cara menggunakan kelas atau bahkan mendefinisikan fungsi. Pemrograman dengan umpan balik visual cepat sangat bagus untuk mereka yang ingin memulai belajar pemrograman.
import arcade
Penggunaan fungsi
Tentu saja, menulis kode dalam konteks global bukanlah bentuk yang baik. Untungnya, meningkatkan program Anda dengan fitur-fitur itu mudah. Di sini kita dapat melihat contoh menggambar pinus di tempat tertentu (x, y) menggunakan fungsi:
def draw_pine_tree(x, y) : """ This function draws a pine tree at the specified location. """
Untuk contoh lengkap, lihat menggambar dengan fungsi .

Seorang programmer yang lebih berpengalaman akan mengetahui bahwa program grafik modern mengunggah informasi grafik ke kartu video, dan kemudian meminta kartu video untuk menggambarnya nanti sebagai sebuah paket. Arcade juga mendukung ini. Menggambar 10.000 persegi panjang secara individual membutuhkan sekitar 0,800 detik. Menggambar mereka sebagai paket membutuhkan waktu kurang dari 0,001 detik.
kelas jendela
Program yang lebih besar biasanya mewarisi dari kelas Window atau menggunakan dekorator . Ini memungkinkan programmer untuk menulis kode untuk menangani menggambar, memperbarui, dan memproses input pengguna. Templat untuk meluncurkan program jendela ditunjukkan di bawah ini.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame( arcade.Window): """ Main application class. """ def __init__(self, width, height) : super( ) .__init__(width, height) arcade.set_background_color( arcade.color.AMAZON) def setup( self) :
Kelas Window memiliki beberapa metode yang dapat ditimpa oleh program Anda untuk menyediakan fungsionalitas program. Berikut adalah beberapa yang paling umum digunakan:
on_draw: semua kode untuk menggambar layar ada di sini.
Perbarui: semua kode untuk memindahkan item Anda dan menjalankan logika game ada di sini. Ini disebut sekitar 60 kali per detik.
on_key_press: menangani acara ketika tombol ditekan, misalnya, memberikan kecepatan pemain.
on_key_release: proses ketika kunci dilepaskan, di sini Anda dapat menghentikan gerakan pemain.
on_mouse_motion: Dipanggil setiap kali mouse bergerak.
on_mouse_press: dipanggil ketika tombol mouse diklik.
set_viewport: fungsi ini digunakan dalam permainan gulir ketika dunia Anda jauh lebih besar dari apa yang dapat Anda lihat di satu layar. Panggilan set_viewport memungkinkan programmer untuk mengatur bagian dunia mana yang saat ini terlihat.
Sprite
Sprite adalah cara mudah untuk membuat objek raster dua dimensi di Arcade. Arcade memiliki metode yang membuat menggambar, memindahkan, dan menghidupkan sprite lebih mudah. Anda juga dapat dengan mudah menggunakan sprite untuk mendeteksi tabrakan antar objek.
Pembuatan sprite
Membuat instance dari kelas Sprite Arcade dari grafik itu mudah. Programmer hanya perlu nama file gambar sehingga sprite didasarkan, dan, opsional, angka, untuk skala gambar naik atau turun. Sebagai contoh:
SPRITE_SCALING_COIN = 0,2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
Kode ini akan membuat sprite menggunakan gambar yang disimpan dalam coin_01.png. Gambar akan dikurangi hingga 20% dari tinggi dan lebar aslinya.

Daftar sprite
Sprite biasanya disusun dalam daftar. Daftar ini memudahkan pengelolaan sprite. Sprite dalam daftar akan menggunakan OpenGL untuk mengumpul sprite menggambar sebagai grup. Kode di bawah ini mengatur gim dengan pemain dan banyak koin yang dikumpulkan oleh pemain. Kami menggunakan dua daftar, satu untuk pemain dan satu untuk koin.
def setup(self): """ Set up the game and initialize the variables. """
Kita dapat dengan mudah menggambar semua koin dalam daftar koin:
def on_draw(self): """ Draw everything """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
Deteksi tabrakan sprite
Deteksi tabrakan sprite
Fungsi check_for_collision_with_list memungkinkan kita untuk melihat apakah sebuah sprite memenuhi sprite lain dalam daftar. Kita dapat menggunakan ini untuk melihat semua koin yang terhubung dengan sprite pemain. Menggunakan loop sederhana, kita bisa menyingkirkan koin dari game dan meningkatkan skor kita.
def update(self, delta_time):
Untuk contoh lengkap, lihat collect_coins.py .
Fisika permainan
Banyak permainan memasukkan beberapa jenis fisika. Yang paling sederhana adalah program top-down yang mencegah pemain menembus tembok. Platformer menambah kompleksitas pada platform gravitasi dan bergerak. Beberapa game menggunakan mesin fisika 2D lengkap dengan massa, gesekan, pegas, dan lainnya.
Game top down

Untuk permainan top-down sederhana, program arcade membutuhkan daftar dinding yang tidak dapat dilewati pemain (atau apa pun). Saya biasanya menyebutnya wall_list. Kemudian mesin fisika dibuat dalam kode instalasi kelas Window menggunakan:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
Player_sprite menerima vektor gerak dengan dua atribut: change_x dan change_y. Contoh sederhana dari ini adalah memindahkan pemain menggunakan keyboard. Misalnya, ini bisa di anak kustom dari kelas Window:
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers) : """Called whenever a key is pressed. """ if key = = arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key = = arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key = = arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key = = arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers) : """Called when the user releases a key. """ if key = = arcade.key.UP or key = = arcade.key.DOWN: self.player_sprite.change_y = 0 elif key = = arcade.key.LEFT or key = = arcade.key.RIGHT: selfplayer_sprite.change_x = 0
Meskipun kode ini mengatur kecepatan pemain, itu tidak menggerakkan pemain. Dalam metode memperbarui kelas Window, saat memanggil Physics_engine.update (), pemain akan bergerak, tetapi tidak melalui dinding.
def update(self, delta_time): """ Movement and game logic """ self.physics_engine.update()
Untuk contoh lengkap, lihat sprite_move_walls.py .

Beralih ke platformer dengan tampilan samping cukup sederhana. Programmer hanya perlu mengganti mesin fisika ke PhysicsEnginePlatformer dan menambahkan konstanta gravitasi.
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant= GRAVITY)
Anda dapat menggunakan program seperti Ubin untuk meletakkan ubin / blok yang membentuk level Anda.
Sebagai contoh, lihat sprite_tiled_map.py .
Untuk fisika 2D lengkap, Anda dapat mengintegrasikan perpustakaan PyMunk.
Belajar dari sebuah contoh
Salah satu cara terbaik untuk belajar adalah contoh. Arcade Library memiliki daftar panjang contoh program yang dapat digunakan orang untuk membuat game. Masing-masing contoh ini menunjukkan konsep permainan yang telah diminta siswa dalam pelajaran saya atau di Internet selama bertahun-tahun.
Menjalankan salah satu dari demo ini mudah setelah menginstal Arcade. Setiap contoh memiliki komentar di awal program dengan perintah yang dapat Anda masukkan pada baris perintah untuk menjalankan contoh, misalnya:
python -m arcade.examples.sprite_moving_platforms
Informasi singkat
Arcade memungkinkan Anda memulai pemrograman grafik dan game dengan kode yang mudah dipahami. Banyak programmer baru yang membuat gim hebat tak lama setelah start. Cobalah!