Cara membuat game 2D dengan Python dan perpustakaan arcade

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.


gambar


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:


gambar


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 # Set constants for the screen size SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 # Open the window. Set the window title and dimensions (width and height) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") # Set the background color to white. # For a list of named colors see: # http://arcade.academy/arcade.color.html # Colors can also be specified in (red, green, blue) format and # (red, green, blue, alpha) format. arcade.set_background_color( arcade.color.WHITE) # Start the render process. This must be done before any drawing commands. arcade.start_render() # Draw the face x = 300 y = 300 radius = 200 arcade.draw_circle_filled( x, y, radius, arcade.color.YELLOW) # Draw the right eye x = 370 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the left eye x = 230 y = 350 radius = 20 arcade.draw_circle_filled( x, y, radius, arcade.color.BLACK) # Draw the smile x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline( x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) # Finish drawing and display the result arcade.finish_render() # Keep the window open until the user hits the 'close' button arcade.run() 

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. """ # Draw the triangle on top of the trunk. # We need three x, y points for the triangle. arcade.draw_triangle_filled( x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) # Draw the trunk arcade.draw_lrtb_rectangle_filled( x + 30, x + 50, y - 100, y - 140 , arcade.color.DARK_BROWN) 

Untuk contoh lengkap, lihat menggambar dengan fungsi .


gambar


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) : # Set up your game here pass def on_draw(self) : """ Render the screen. """ arcade.start_render() # Your drawing code goes here def update(self, delta_time) : """ All the logic to move, and the game logic goes here. """ pass def main( ) : game = MyGame( SCREEN_WIDTH, SCREEN_HEIGHT) game.setup( ) arcade.run() if __name__ = = "__main__": main() 

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.
gambar


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. """ # Create the sprite lists self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # Score self.score = 0 # Set up the player # Character image from kenney.nl self. player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 # Starting position self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # Create the coins for i in range( COIN_COUNT): # Create the coin instance # Coin image from kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # Position the coin coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # Add the coin to the lists self.coin_list.append(coin) 

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): # Generate a list of all coin sprites that collided with the player. coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # Loop through each colliding sprite, remove it, and add to the score. for coin in coins_hit_list: coin.kill() self.score += 1 

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


gambar


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 .


Platformers


gambar


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!

Source: https://habr.com/ru/post/id477544/


All Articles