23
Membuat Game Shooting dengan PyGame Pemberdayaan Open Source Software Sabtu, 20 September 2014 Gedung Ilmu Komputer, FPMIPA, UPI

Membuat game-shooting-dengan-pygame

Embed Size (px)

DESCRIPTION

Membuat imitasi game 1980 dengan PyGame

Citation preview

Page 1: Membuat game-shooting-dengan-pygame

Membuat Game Shooting dengan PyGame

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

Page 2: Membuat game-shooting-dengan-pygame

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

Page 3: Membuat game-shooting-dengan-pygame

Instalasi PyGame

Membuat Game Shooting dengan PyGame. POSS UPI 2014

● sudo apt-get install python-pygame

● pip install pygame

● Instalasi melalui source code PyGame

Page 4: Membuat game-shooting-dengan-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

Page 5: Membuat game-shooting-dengan-pygame

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

Page 6: Membuat game-shooting-dengan-pygame

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 *

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

Page 7: Membuat game-shooting-dengan-pygame

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

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

Page 8: Membuat game-shooting-dengan-pygame

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"

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

Page 9: Membuat game-shooting-dengan-pygame

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

Page 10: Membuat game-shooting-dengan-pygame

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

Page 11: Membuat game-shooting-dengan-pygame

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)

Page 12: Membuat game-shooting-dengan-pygame

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

Page 13: Membuat game-shooting-dengan-pygame

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

Page 14: Membuat game-shooting-dengan-pygame

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()

Page 15: Membuat game-shooting-dengan-pygame

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

Page 16: Membuat game-shooting-dengan-pygame

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

Page 17: Membuat game-shooting-dengan-pygame

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

Page 18: Membuat game-shooting-dengan-pygame

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

Page 19: Membuat game-shooting-dengan-pygame

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))

Page 20: Membuat game-shooting-dengan-pygame

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

Page 21: Membuat game-shooting-dengan-pygame

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

Page 22: Membuat game-shooting-dengan-pygame

Ada pertanyaan :D ?

Membuat Game Shooting dengan PyGame. POSS UPI 2014

Page 23: Membuat game-shooting-dengan-pygame

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