Membuat game-shooting-dengan-pygame
-
Upload
ridwan-fajar -
Category
Technology
-
view
365 -
download
9
description
Transcript of Membuat game-shooting-dengan-pygame
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