Membuat game-shooting-dengan-pygame

Preview:

DESCRIPTION

Membuat imitasi game 1980 dengan PyGame

Citation preview

Membuat Game Shooting dengan PyGame

Pemberdayaan Open Source SoftwareSabtu, 20 September 2014Gedung Ilmu Komputer, FPMIPA, UPI

Pendahuluan

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Dalam pelatihan ini akan dipelajari teknik dasar dalam mengembangkan game● Alat yang dibutuhkan antara lain Python, Text Editor, PyGame, GIMP● Anda cukup memahami algoritma dan pemrograman sebagai pijakan untuk

mulai mengembangkan game● Kita akan membuat sebuah game versi sederhana dari game yang berjudul

1980● Sebuah pesawat player akan menembaki UFO yang berdatangan● Waktu yang diberikan untuk bermain sekitar 60 detik● Raih skor setinggi mungkin dalam waktu sempit tersebut

Instalasi PyGame

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● sudo apt-get install python-pygame

● pip install pygame

● Instalasi melalui source code PyGame

Aset Game

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Aset game yang digunakan didapat dari SpriteLib dan FreeSFX● Aset untuk pelatihan silahkan copy dari pemateri

Mulai Coding

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Siapkan Teks Editor favorit kamu :D● Buatlah struktur folder dan file seperti ini

● Copy file aset yang sudah disediakan ke masing – masing folder● Kode game yang akan kita buat berada di main.py

Import Module yang Dibutuhkan

Membuat Game Shooting dengan PyGame. POSS UPI 2014

from pygame import *from pygame.sprite import *from random import *from os import *

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Membuat Class Bullet

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

class Bullet(sprite.Sprite): def __init__(self, source): Sprite.__init__(self) try: self.image = image.load('assets/sprite/bullet.png').convert() except: raise UserWarning, "could not load or play soundfiles in 'data' folder :-(" self.rect = self.image.get_rect() self.speed = 6.625 self.source = source self.target = None print "bullet source: ", source print "bullet created at position: ", self.rect.center

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Membuat Class Bullet

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def update(self): self.rect.centery -= self.speed if self.rect.centery <= 0-self.rect.height: sprite.Sprite.kill(self) print "bullet removed.." for enemy in enemies: print enemy.hitted temp_hitted = enemy.hitted if sprite.collide_rect(self, enemy): temp_hitted = temp_hitted + 1 print "bullet collide with enemy from bullet" enemy.hitted = temp_hitted sprite.Sprite.kill(self) else: print "no collision bullet"

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Penjelasan Class Bullet

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Sebuah sprite harus mewarisi class Sprite milik PyGame● Image.load().convert() adalah sebuah proses pembacaan aset gambar untuk

digunakan di game● Image.get_rect() adalah mengambil posisi tengah dari sprite secara otomatis● Sebuah sprite minimal mempunyai method __init__ dan update()● Bullet mempunyai atribut speed, source, dan , target● Di dalam update(), jika Bullet sudah melewati area game maka Bullet dihapus● Di dalam update(), terdapat proses pemeriksaan setiap unit Enemy apakah

terkena oleh Bullet atau tidak. Jika terkena oleh Bullet maka akan ditandai dengan hitted. Bullet yang bertabrakan dengan Enemy tersebut akan dihapus

Membuat Class Player

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class Player(sprite.Sprite): def __init__(self, screen): Sprite.__init__(self) try: self.image = image.load('assets/sprite/player.gif').convert() self.shoot_sfx = pygame.mixer.Sound('assets/sfx/shoot.ogg') self.fail_sfx = pygame.mixer.Sound('assets/sfx/fail.ogg') except: raise UserWarning, "could not load or play soundfiles in 'data' folder :-(" self.rect = self.image.get_rect() self.speed = 5.52 self.shoot_delay = 10 self.shoot_timer = 0 self.bullet_group = sprite.Group() self.screen = screen print "player created at position: ", self.rect.center - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Membuat Class Player

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def get_user_control(self): key_pressed = key.get_pressed() if key_pressed[K_UP]: print "UP" self.rect.centery -= self.speed elif key_pressed[K_DOWN]: print "DOWN" self.rect.centery += self.speed elif key_pressed[K_LEFT]: print "LEFT" self.rect.centerx -= self.speed elif key_pressed[K_RIGHT]: print "RIGHT" self.rect.centerx += self.speed if key_pressed[K_SPACE]: if self.shoot_timer == self.shoot_delay: temp_bullet = Bullet("player") temp_bullet.rect.center = (self.rect.center) self.bullet_group.add(temp_bullet) self.shoot_sfx.play() self.shoot_timer = 0 else: self.shoot_timer += 1 def update(self): self.get_user_control() self.bullet_group.update() self.bullet_group.draw(self.screen)

Penjelasan Class Player

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Sebuah sprite harus mewarisi class Sprite milik PyGame● Image.load().convert() adalah sebuah proses pembacaan aset gambar untuk

digunakan di game● Pygame.mixer.Sound() digunakan untuk membaca aset audio dan

mengintegrasikannya dengan game● Image.get_rect() adalah mengambil posisi tengah dari sprite secara otomatis● Sebuah sprite minimal mempunyai method __init__ dan update(), tapi Player

memiliki method lain yang bernama get_user_control()● Method get_user_control() digunakan untuk mendeteksi tombol keyboard

panah (atas, bawah, kiri, kanan) dan spasi (untuk menembak)● Player memiliki atribut speed, shoot_delay, shoot_timer, bullet_group, dan

screen● Tombol keyboard yang ditekan dideteksi dengan menggunakan

key.get_pressed()● Saat menembakkan peluru, Player akan mendapat delay sesuai dengan

shoot_delay

Membuat Class Enemy

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - class Enemy (sprite.Sprite): def __init__(self, type=1): Sprite.__init__(self) try: self.bomb_sfx = pygame.mixer.Sound('assets/sfx/bomb.ogg') self.spring_sfx = pygame.mixer.Sound('assets/sfx/spring.ogg') self.wormhole_sfx = pygame.mixer.Sound('assets/sfx/wormhole.ogg') if type == 2: self.image = image.load('assets/sprite/enemy.png').convert() else: self.image = image.load('assets/sprite/ufo.png') except: raise UserWarning, "could not load or play soundfiles in 'data' folder :-(" self.hitted = 0 self.point = 0 self.rect = self.image.get_rect() self.speed = 2.25 self.rect.center = (randint(40, 600), randint(0, 10)) self.wormhole_sfx.play() print "enemy created at position: ", self.rect.center

Membuat Class Enemy

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

def update(self): self.rect.centery += self.speed if self.rect.centery >= 700 + self.rect.height: self.reset_position() if self.hitted > 5: self.reset_position() temp = self.point self.point = temp + 1 self.hitted = 0 def reset_position(self): self.rect.center = (randint(40, 600), randint(0, 50)) self.wormhole_sfx.play()

Penjelasan Class Enemy

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Method reset_position() digunakan untuk melakukan proses spawn Enemy secara random

● Player memiliki atribut speed, point, rect, hitted● Jika sudah melewati layar, maka Enemy akan melakukan proses spawn

secara random● Jika Enemy sudah kehabisan darah karena ditembaki Player (dimana darah

bernilai 5 poin) maka Enemy akan melakukan proses spawn● Setiap Enemy yang dikalahkan akan bernilai 1 poin

Membuat Variabel untuk Game

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

# bagian utama gameinit()

# menciptakan latar dari gamescreen = display.set_mode((640, 700))display.set_caption('World War Ufo')background_1 = image.load('assets/bg/ocean.gif').convert()background_2 = image.load('assets/bg/ocean.gif').convert()

# memuat semua asset yang diperlukan untuk gameclock = time.Clock()myFont = pygame.font.SysFont("Comic Sans MS", 30)try: music = pygame.mixer.music.load('assets/sfx/an-turr.ogg')except: raise UserWarning, "could not load or play soundfiles in 'data' folder :-("mixer.music.play(-1)

# menciptakan variabel global untuk gamekeepGoing = Truebg_1_y = -1440bg_2_y = 0score = 0time_buffer = 0.0

Membuat Variabel untuk Game

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

# menciptakan objek - objek yang akan tampil di gameplayer = Player(screen)player.rect.center = (320, 650)enemies = [] for i in range(0, 3): enemies.append(Enemy(1))

all_sprites = sprite.Group(player, enemies)

def getScore(enemies): score = 0 for enemy in enemies: score = score + enemy.point return score

Membuat Game Loop

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

# game loopwhile keepGoing: clock.tick(45) # menampilkan latar game yang berupa lautan screen.blit(background_1, (0, bg_1_y)) screen.blit(background_2, (0, bg_2_y))

# nampilin score score = "SCORE: %d" %( getScore(enemies) ) score_txt = myFont.render(score, 1, (255, 255, 0)) screen.blit(score_txt, (50, 10)) score = 0

Membuat Game Loop

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if time_buffer < 60: # menangkap respon yang diberikan oleh gamer evt = event.poll() if evt.type == QUIT: quit() break # menggambar semua sprite di game all_sprites.draw(screen) all_sprites.update() # mengupdate waktu permainan time_temp = (round(time_buffer)) time_remain_txt = myFont.render("TIME: %d" % time_buffer, True, (255, 128, 50)) screen.blit(time_remain_txt, (450, 10)) time_buffer += 0.021 print time_buffer elif time_buffer >= 60.0: # mengecek akhir permainan game_over_txt = myFont.render("GAME OVER", True, (255, 0, 0)) screen.blit(game_over_txt, (250, 300))

Membuat Game Loop

Membuat Game Shooting dengan PyGame. POSS UPI 2014

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

display.flip() # menggerakkan latar game (lautan yang seolah - olah bergerak) bg_1_y += 0.5 bg_2_y += 0.5 if bg_1_y >= 1440: bg_1_y = -1440 if bg_2_y >= 1440: bg_2_y = -1440

Jalankan Gamenya :D !

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Masuk ke dalam direktori game yang sedang kita bangun

● Jalankan game tersebut dengan python main.py

Ada pertanyaan :D ?

Membuat Game Shooting dengan PyGame. POSS UPI 2014

Kesimpulan

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● Mengenal dan mencicipi PyGame● Memahami cara membuat game loop● Memahami cara membuat teks di dalam game● Memahami cara mengintegrasikan audio ke dalam game● Memahami cara membuat sprite dalam berupa class● Memahami collision detection● Mengetahui teknik side scrolling● Mengetahui teknik spawn● Mengetahui cara untuk membuat kondisi agar game berjalan● Mengetahui cara untuk mengakhiri sebuah game