SlideShare uma empresa Scribd logo
Membuat Game Shooting dengan 
PyGame 
Pemberdayaan Open Source Software 
Sabtu, 20 September 2014 
Gedung Ilmu Komputer, FPMIPA, UPI
Pendahuluan 
● 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 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Instalasi PyGame 
● sudo apt-get install python-pygame 
● pip install pygame 
● Instalasi melalui source code PyGame 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Aset Game 
● Aset game yang digunakan didapat dari SpriteLib dan FreeSFX 
● Aset untuk pelatihan silahkan copy dari pemateri 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Mulai Coding 
● 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 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Import Module yang Dibutuhkan 
from pygame import * 
from pygame.sprite import * 
from random import * 
from os import * 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Bullet 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Bullet 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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" 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Penjelasan Class Bullet 
● 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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Player 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Player 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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) 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Penjelasan Class Player 
● 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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Enemy 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Class Enemy 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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() 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Penjelasan Class Enemy 
● 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 Game Shooting dengan PyGame. POSS UPI 2014
Membuat Variabel untuk Game 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
# bagian utama game 
init() 
# menciptakan latar dari game 
screen = 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 game 
clock = 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 game 
keepGoing = True 
bg_1_y = -1440 
bg_2_y = 0 
score = 0 
time_buffer = 0.0 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Membuat Variabel untuk Game 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
# menciptakan objek - objek yang akan tampil di game 
player = 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 Shooting dengan PyGame. POSS UPI 2014
Membuat Game Loop 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
# game loop 
while 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 Shooting dengan PyGame. POSS UPI 2014
Membuat Game Loop 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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 Shooting dengan PyGame. POSS UPI 2014
Membuat Game Loop 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
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 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Jalankan Gamenya :D ! 
● Masuk ke dalam direktori game yang sedang kita bangun 
● Jalankan game tersebut dengan python main.py 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Ada pertanyaan :D ? 
Membuat Game Shooting dengan PyGame. POSS UPI 2014
Kesimpulan 
● 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 
Membuat Game Shooting dengan PyGame. POSS UPI 2014

Mais conteúdo relacionado

Mais procurados

Beberapa distribusi peluang diskrit (1)
Beberapa distribusi peluang diskrit (1)Beberapa distribusi peluang diskrit (1)
Beberapa distribusi peluang diskrit (1)
Raden Maulana
 
STANDARD SCORE, SKEWNESS & KURTOSIS
STANDARD SCORE, SKEWNESS & KURTOSISSTANDARD SCORE, SKEWNESS & KURTOSIS
STANDARD SCORE, SKEWNESS & KURTOSIS
Ermawati Syahrudi
 
Anova 1way &amp; uji lanjut
Anova 1way &amp; uji lanjutAnova 1way &amp; uji lanjut
Anova 1way &amp; uji lanjut
Suci Agustina
 
Bahan kuliah statistika gbs
Bahan kuliah statistika gbsBahan kuliah statistika gbs
Bahan kuliah statistika gbs
Judianto Nugroho
 
PPT Sidang Skripsi R & D (109151415406)
PPT Sidang Skripsi R & D (109151415406)PPT Sidang Skripsi R & D (109151415406)
PPT Sidang Skripsi R & D (109151415406)
Nastiti Rahajeng
 
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSSContoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
Propaningtyas Windardini
 
Makalah kelompok 4 metode simpleks
Makalah kelompok 4 metode simpleksMakalah kelompok 4 metode simpleks
Makalah kelompok 4 metode simpleks
Nila Aulia
 
6 lanjutan perulangan
6 lanjutan perulangan6 lanjutan perulangan
6 lanjutan perulangan
Simon Patabang
 
Soal matstat ngagel+jawabannya
Soal matstat ngagel+jawabannyaSoal matstat ngagel+jawabannya
Soal matstat ngagel+jawabannya
Kana Outlier
 
Matematika Diskrit kombinatorial
Matematika Diskrit  kombinatorialMatematika Diskrit  kombinatorial
Matematika Diskrit kombinatorial
Siti Khotijah
 
Tabel normal z
Tabel normal zTabel normal z
Tabel normal z
harjunode
 
Contoh soal Metode Simpleks
Contoh soal Metode SimpleksContoh soal Metode Simpleks
Contoh soal Metode Simpleks
Reza Mahendra
 
PPT Regresi Berganda
PPT Regresi BergandaPPT Regresi Berganda
PPT Regresi Berganda
Lusi Kurnia
 
10.pendugaan interval
10.pendugaan interval10.pendugaan interval
10.pendugaan intervalhartantoahock
 
Peubah acak diskrit dan kontinu
Peubah acak diskrit dan kontinuPeubah acak diskrit dan kontinu
Peubah acak diskrit dan kontinu
Anderzend Awuy
 
13.analisa korelasi
13.analisa korelasi13.analisa korelasi
13.analisa korelasi
Hafiza .h
 
Aplikasi sistem persamaan diferensial_
Aplikasi sistem persamaan diferensial_Aplikasi sistem persamaan diferensial_
Aplikasi sistem persamaan diferensial_
SMPNegeri12
 
Distribusi Normal Matematika Peminatan Kelas XII Program MIPA
Distribusi Normal Matematika Peminatan Kelas XII Program MIPADistribusi Normal Matematika Peminatan Kelas XII Program MIPA
Distribusi Normal Matematika Peminatan Kelas XII Program MIPA
Muhammad Arif
 

Mais procurados (20)

Beberapa distribusi peluang diskrit (1)
Beberapa distribusi peluang diskrit (1)Beberapa distribusi peluang diskrit (1)
Beberapa distribusi peluang diskrit (1)
 
STANDARD SCORE, SKEWNESS & KURTOSIS
STANDARD SCORE, SKEWNESS & KURTOSISSTANDARD SCORE, SKEWNESS & KURTOSIS
STANDARD SCORE, SKEWNESS & KURTOSIS
 
Anova 1way &amp; uji lanjut
Anova 1way &amp; uji lanjutAnova 1way &amp; uji lanjut
Anova 1way &amp; uji lanjut
 
Bahan kuliah statistika gbs
Bahan kuliah statistika gbsBahan kuliah statistika gbs
Bahan kuliah statistika gbs
 
PPT Sidang Skripsi R & D (109151415406)
PPT Sidang Skripsi R & D (109151415406)PPT Sidang Skripsi R & D (109151415406)
PPT Sidang Skripsi R & D (109151415406)
 
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSSContoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
Contoh Soal, Hasil Olahan dan Interpretasi Hasil Olahan SPSS
 
Makalah kelompok 4 metode simpleks
Makalah kelompok 4 metode simpleksMakalah kelompok 4 metode simpleks
Makalah kelompok 4 metode simpleks
 
6 lanjutan perulangan
6 lanjutan perulangan6 lanjutan perulangan
6 lanjutan perulangan
 
Mean, median, modus
Mean, median, modusMean, median, modus
Mean, median, modus
 
Soal matstat ngagel+jawabannya
Soal matstat ngagel+jawabannyaSoal matstat ngagel+jawabannya
Soal matstat ngagel+jawabannya
 
Matematika Diskrit kombinatorial
Matematika Diskrit  kombinatorialMatematika Diskrit  kombinatorial
Matematika Diskrit kombinatorial
 
Minggu 9_Teknik Analisis Korelasi
Minggu 9_Teknik Analisis KorelasiMinggu 9_Teknik Analisis Korelasi
Minggu 9_Teknik Analisis Korelasi
 
Tabel normal z
Tabel normal zTabel normal z
Tabel normal z
 
Contoh soal Metode Simpleks
Contoh soal Metode SimpleksContoh soal Metode Simpleks
Contoh soal Metode Simpleks
 
PPT Regresi Berganda
PPT Regresi BergandaPPT Regresi Berganda
PPT Regresi Berganda
 
10.pendugaan interval
10.pendugaan interval10.pendugaan interval
10.pendugaan interval
 
Peubah acak diskrit dan kontinu
Peubah acak diskrit dan kontinuPeubah acak diskrit dan kontinu
Peubah acak diskrit dan kontinu
 
13.analisa korelasi
13.analisa korelasi13.analisa korelasi
13.analisa korelasi
 
Aplikasi sistem persamaan diferensial_
Aplikasi sistem persamaan diferensial_Aplikasi sistem persamaan diferensial_
Aplikasi sistem persamaan diferensial_
 
Distribusi Normal Matematika Peminatan Kelas XII Program MIPA
Distribusi Normal Matematika Peminatan Kelas XII Program MIPADistribusi Normal Matematika Peminatan Kelas XII Program MIPA
Distribusi Normal Matematika Peminatan Kelas XII Program MIPA
 

Mais de Ridwan Fadjar

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
Ridwan Fadjar
 
PyCon ID 2023 - Ridwan Fadjar Septian.pdf
PyCon ID 2023 - Ridwan Fadjar Septian.pdfPyCon ID 2023 - Ridwan Fadjar Septian.pdf
PyCon ID 2023 - Ridwan Fadjar Septian.pdf
Ridwan Fadjar
 
Cloud Infrastructure automation with Python-3.pdf
Cloud Infrastructure automation with Python-3.pdfCloud Infrastructure automation with Python-3.pdf
Cloud Infrastructure automation with Python-3.pdf
Ridwan Fadjar
 
GraphQL- Presentation
GraphQL- PresentationGraphQL- Presentation
GraphQL- Presentation
Ridwan Fadjar
 
Bugs and Where to Find Them (Study Case_ Backend).pdf
Bugs and Where to Find Them (Study Case_ Backend).pdfBugs and Where to Find Them (Study Case_ Backend).pdf
Bugs and Where to Find Them (Study Case_ Backend).pdf
Ridwan Fadjar
 
Introduction to Elixir and Phoenix.pdf
Introduction to Elixir and Phoenix.pdfIntroduction to Elixir and Phoenix.pdf
Introduction to Elixir and Phoenix.pdf
Ridwan Fadjar
 
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
Ridwan Fadjar
 
CS meetup 2020 - Introduction to DevOps
CS meetup 2020 - Introduction to DevOpsCS meetup 2020 - Introduction to DevOps
CS meetup 2020 - Introduction to DevOps
Ridwan Fadjar
 
Why Serverless?
Why Serverless?Why Serverless?
Why Serverless?
Ridwan Fadjar
 
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
Ridwan Fadjar
 
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
Ridwan Fadjar
 
A Study Review of Common Big Data Architecture for Small-Medium Enterprise
A Study Review of Common Big Data Architecture for Small-Medium EnterpriseA Study Review of Common Big Data Architecture for Small-Medium Enterprise
A Study Review of Common Big Data Architecture for Small-Medium Enterprise
Ridwan Fadjar
 
Mongodb intro-2-asbasdat-2018-v2
Mongodb intro-2-asbasdat-2018-v2Mongodb intro-2-asbasdat-2018-v2
Mongodb intro-2-asbasdat-2018-v2
Ridwan Fadjar
 
Mongodb intro-2-asbasdat-2018
Mongodb intro-2-asbasdat-2018Mongodb intro-2-asbasdat-2018
Mongodb intro-2-asbasdat-2018
Ridwan Fadjar
 
Mongodb intro-1-asbasdat-2018
Mongodb intro-1-asbasdat-2018Mongodb intro-1-asbasdat-2018
Mongodb intro-1-asbasdat-2018
Ridwan Fadjar
 
Resftul API Web Development with Django Rest Framework & Celery
Resftul API Web Development with Django Rest Framework & CeleryResftul API Web Development with Django Rest Framework & Celery
Resftul API Web Development with Django Rest Framework & Celery
Ridwan Fadjar
 
Memulai Data Processing dengan Spark dan Python
Memulai Data Processing dengan Spark dan PythonMemulai Data Processing dengan Spark dan Python
Memulai Data Processing dengan Spark dan Python
Ridwan Fadjar
 
Kisah Dua Sejoli: Arduino & Python
Kisah Dua Sejoli: Arduino & PythonKisah Dua Sejoli: Arduino & Python
Kisah Dua Sejoli: Arduino & Python
Ridwan Fadjar
 
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
Ridwan Fadjar
 
Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1
Ridwan Fadjar
 

Mais de Ridwan Fadjar (20)

My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
PyCon ID 2023 - Ridwan Fadjar Septian.pdf
PyCon ID 2023 - Ridwan Fadjar Septian.pdfPyCon ID 2023 - Ridwan Fadjar Septian.pdf
PyCon ID 2023 - Ridwan Fadjar Septian.pdf
 
Cloud Infrastructure automation with Python-3.pdf
Cloud Infrastructure automation with Python-3.pdfCloud Infrastructure automation with Python-3.pdf
Cloud Infrastructure automation with Python-3.pdf
 
GraphQL- Presentation
GraphQL- PresentationGraphQL- Presentation
GraphQL- Presentation
 
Bugs and Where to Find Them (Study Case_ Backend).pdf
Bugs and Where to Find Them (Study Case_ Backend).pdfBugs and Where to Find Them (Study Case_ Backend).pdf
Bugs and Where to Find Them (Study Case_ Backend).pdf
 
Introduction to Elixir and Phoenix.pdf
Introduction to Elixir and Phoenix.pdfIntroduction to Elixir and Phoenix.pdf
Introduction to Elixir and Phoenix.pdf
 
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
Ridwan Fadjar Septian PyCon ID 2021 Regular Talk - django application monitor...
 
CS meetup 2020 - Introduction to DevOps
CS meetup 2020 - Introduction to DevOpsCS meetup 2020 - Introduction to DevOps
CS meetup 2020 - Introduction to DevOps
 
Why Serverless?
Why Serverless?Why Serverless?
Why Serverless?
 
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
SenseHealth Indonesia Sharing Session - Do we really need growth mindset (1)
 
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
Risk Analysis of Dutch Healthcare Company Information System using ISO 27001:...
 
A Study Review of Common Big Data Architecture for Small-Medium Enterprise
A Study Review of Common Big Data Architecture for Small-Medium EnterpriseA Study Review of Common Big Data Architecture for Small-Medium Enterprise
A Study Review of Common Big Data Architecture for Small-Medium Enterprise
 
Mongodb intro-2-asbasdat-2018-v2
Mongodb intro-2-asbasdat-2018-v2Mongodb intro-2-asbasdat-2018-v2
Mongodb intro-2-asbasdat-2018-v2
 
Mongodb intro-2-asbasdat-2018
Mongodb intro-2-asbasdat-2018Mongodb intro-2-asbasdat-2018
Mongodb intro-2-asbasdat-2018
 
Mongodb intro-1-asbasdat-2018
Mongodb intro-1-asbasdat-2018Mongodb intro-1-asbasdat-2018
Mongodb intro-1-asbasdat-2018
 
Resftul API Web Development with Django Rest Framework & Celery
Resftul API Web Development with Django Rest Framework & CeleryResftul API Web Development with Django Rest Framework & Celery
Resftul API Web Development with Django Rest Framework & Celery
 
Memulai Data Processing dengan Spark dan Python
Memulai Data Processing dengan Spark dan PythonMemulai Data Processing dengan Spark dan Python
Memulai Data Processing dengan Spark dan Python
 
Kisah Dua Sejoli: Arduino & Python
Kisah Dua Sejoli: Arduino & PythonKisah Dua Sejoli: Arduino & Python
Kisah Dua Sejoli: Arduino & Python
 
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
Mengenal Si Ular Berbisa - Kopi Darat Python Bandung Desember 2014
 
Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1Modul pelatihan-django-dasar-possupi-v1
Modul pelatihan-django-dasar-possupi-v1
 

Membuat game-shooting-dengan-pygame

  • 1. Membuat Game Shooting dengan PyGame Pemberdayaan Open Source Software Sabtu, 20 September 2014 Gedung Ilmu Komputer, FPMIPA, UPI
  • 2. Pendahuluan ● 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 Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 3. Instalasi PyGame ● sudo apt-get install python-pygame ● pip install pygame ● Instalasi melalui source code PyGame Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 4. Aset Game ● Aset game yang digunakan didapat dari SpriteLib dan FreeSFX ● Aset untuk pelatihan silahkan copy dari pemateri Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 5. Mulai Coding ● 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 Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 6. Import Module yang Dibutuhkan from pygame import * from pygame.sprite import * from random import * from os import * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 7. Membuat Class Bullet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 8. Membuat Class Bullet - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 9. Penjelasan Class Bullet ● 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 10. Membuat Class Player - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 11. Membuat Class Player - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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) Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 12. Penjelasan Class Player ● 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 13. Membuat Class Enemy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 14. Membuat Class Enemy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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() Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 15. Penjelasan Class Enemy ● 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 Game Shooting dengan PyGame. POSS UPI 2014
  • 16. Membuat Variabel untuk Game - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # bagian utama game init() # menciptakan latar dari game screen = 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 game clock = 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 game keepGoing = True bg_1_y = -1440 bg_2_y = 0 score = 0 time_buffer = 0.0 Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 17. Membuat Variabel untuk Game - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # menciptakan objek - objek yang akan tampil di game player = 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 Shooting dengan PyGame. POSS UPI 2014
  • 18. Membuat Game Loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # game loop while 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 Shooting dengan PyGame. POSS UPI 2014
  • 19. Membuat Game Loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Shooting dengan PyGame. POSS UPI 2014
  • 20. Membuat Game Loop - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 21. Jalankan Gamenya :D ! ● Masuk ke dalam direktori game yang sedang kita bangun ● Jalankan game tersebut dengan python main.py Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 22. Ada pertanyaan :D ? Membuat Game Shooting dengan PyGame. POSS UPI 2014
  • 23. Kesimpulan ● 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 Membuat Game Shooting dengan PyGame. POSS UPI 2014