Pygameใงในใใผในใคใณใใผใใผใฒใผใ ใไฝๆใใๆนๆณใใฝใผในใณใผใไปใใง่ฉณใใ่งฃ่ชฌใใพใใ
- ใ1ใในใใผในใคใณใใผใใผใฒใผใ (็ฐกๆ็)
- ใ1-1ใใตใณใใซใณใผใโ
- ใ1-2ใใตใณใใซใณใผใโ ใฎ่งฃ่ชฌ
- ใ2ใในใใผในใคใณใใผใใผใฒใผใ (็ฐกๆ็โกๆตใฎๅผพๅนใๅฎ่ฃ )
- ใ2-1ใใตใณใใซใณใผใโก
- ใ2-2ใใตใณใใซใณใผใโกใฎ่งฃ่ชฌ
- ใ3ใ็ปๅใจ้ณๆฅฝใไปใใๅฎๆ็
- ใ3-1ใใตใณใใซใณใผใโข
- ใ3-2ใใตใณใใซใณใผใโขใฎ่งฃ่ชฌ
- ้ข้ฃใใผใธ
ใ1ใในใใผในใคใณใใผใใผใฒใผใ (็ฐกๆ็)
Pygameใงในใใผในใคใณใใผใใผใฒใผใ ใไฝๆใใๆนๆณใ่งฃ่ชฌใใพใใ
ใพใใในใใผในใคใณใใผใใผใฒใผใ ใฎ้ชจ็ตใฟใ็่งฃใใใใใซใไปฅไธๅ็ปใฎใใใชใทใณใใซใช็ฉใใไฝๆใใพใใ
ๅ็ป่งฃ่ชฌ็
ๆฌใใผใธใฎๅ ๅฎนใฏไปฅไธๅ็ปใงใ่งฃ่ชฌใใฆใใพใใ
ใ1-1ใใตใณใใซใณใผใโ
Sใญใผใๆผใใจใฒใผใ ใ้ๅงใใใพใใ
ในใใผในใญใผใงใใฌใคใคใผ๏ผ็ท๏ผใใๅผพใ็บๅฐใใใ่ฟซใฃใฆใใใจใคใชใขใณใซๅฝใใใจๆใก่ฝใจใใใจใใงใใพใใ
ใ1-2ใใตใณใใซใณใผใโ ใฎ่งฃ่ชฌ
ไธ่จใณใผใใฎๅ้จๅใซใคใใฆ่งฃ่ชฌใใพใใ
1. ่ฒใฎๅฎ็พฉ
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
DARK_GREEN = (0, 40, 0)
- ใฒใผใ ๅ ใงไฝฟ็จใใ่ฒใRGBๅฝขๅผใงๅฎ็พฉใใฆใใพใใ
2. ใใฌใคใคใผใฏใฉใน
ใใฌใคใคใผใฎในใใฉใคใใๅฎ็พฉใใๅทฆๅณใฎ็งปๅใๅถๅพกใใพใใ
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(GREEN)
self.rect = self.image.get_rect()
self.rect.center = (400, 550)
self.speed = 5
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < 800:
self.rect.x += self.speed
__init__
ใกใฝใใ: ใฏใฉในใฎใณใณในใใฉใฏใฟใงใใใฌใคใคใผใฎๅๆ่จญๅฎใ่กใใพใใsuper().__init__()
: ่ฆชใฏใฉใน๏ผpygame.sprite.Sprite
๏ผใฎๅๆๅใกใฝใใใๅผใณๅบใใพใใself.image = pygame.Surface((30, 30))
: 30×30ใใฏใปใซใฎใตใผใใงใน๏ผ็ปๅ๏ผใไฝๆใใพใใself.image.fill(GREEN)
: ใตใผใใงในใ็ท่ฒใงๅกใใคใถใใพใใself.rect = self.image.get_rect()
: ใตใผใใงในใฎ็ฉๅฝข๏ผrect
๏ผใๅๅพใใพใใในใใฉใคใใฎไฝ็ฝฎใจใตใคใบใ็ฎก็ใใใใใซไฝฟ็จใใใพใใself.rect.center = (400, 550)
: ็ฉๅฝขใฎไธญๅฟใ็ป้ขใฎๆๅฎไฝ็ฝฎ๏ผ400, 550๏ผใซ่จญๅฎใใพใใใใฌใคใคใผใฎๅๆไฝ็ฝฎใ่จญๅฎใใพใใself.speed = 5
: ใใฌใคใคใผใฎ็งปๅ้ๅบฆใ5ใซ่จญๅฎใใพใใ
update
ใกใฝใใ: ใใฌใคใคใผใฎไฝ็ฝฎใๆดๆฐใใพใใใใฎใกใฝใใใฏๆฏใใฌใผใ ๅผใณๅบใใใพใใkeys = pygame.key.get_pressed()
: ็พๅจๆผใใใฆใใใญใผใฎ็ถๆ ใๅๅพใใพใใif keys[pygame.K_LEFT] and self.rect.left > 0
: ๅทฆ็ขๅฐใญใผใๆผใใใฆใใฆใใใฌใคใคใผใ็ป้ขใฎๅทฆ็ซฏใซ้ใใฆใใชใๅ ดๅใซๆกไปถใๆ็ซใใพใใself.rect.x -= self.speed
: ใใฌใคใคใผใๅทฆใซ็งปๅใใใพใใ
if keys[pygame.K_RIGHT] and self.rect.right < 800
: ๅณ็ขๅฐใญใผใๆผใใใฆใใฆใใใฌใคใคใผใ็ป้ขใฎๅณ็ซฏใซ้ใใฆใใชใๅ ดๅใซๆกไปถใๆ็ซใใพใใself.rect.x += self.speed
: ใใฌใคใคใผใๅณใซ็งปๅใใใพใใ
3. ใจใคใชใขใณใฏใฉใน
ใจใคใชใขใณใฎในใใฉใคใใๅฎ็พฉใใๅทฆๅณใซ็งปๅใใชใใ็ป้ข็ซฏใซ้ใใใจไธใซ็งปๅใใพใใ
class Alien(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
self.speed = 2
def update(self):
self.rect.x += self.speed
if self.rect.right >= 800 or self.rect.left <= 0:
self.speed = -self.speed
self.rect.y += 40
__init__
ใกใฝใใ: ใฏใฉในใฎใณใณในใใฉใฏใฟใงใใจใคใชใขใณใฎๅๆ่จญๅฎใ่กใใพใใsuper().__init__()
: ่ฆชใฏใฉใน๏ผpygame.sprite.Sprite
๏ผใฎๅๆๅใกใฝใใใๅผใณๅบใใพใใself.image = pygame.Surface((30, 30))
: 30×30ใใฏใปใซใฎใตใผใใงใน๏ผ็ปๅ๏ผใไฝๆใใพใใself.image.fill(RED)
: ใตใผใใงในใ่ตค่ฒใงๅกใใคใถใใพใใself.rect = self.image.get_rect()
: ใตใผใใงในใฎ็ฉๅฝข๏ผrect
๏ผใๅๅพใใพใใในใใฉใคใใฎไฝ็ฝฎใจใตใคใบใ็ฎก็ใใใใใซไฝฟ็จใใใพใใself.rect.topleft = (x, y)
: ็ฉๅฝขใฎๅทฆไธใฎไฝ็ฝฎใๅผๆฐใจใใฆๆธกใใใx
ใจy
ใซ่จญๅฎใใพใใself.speed = 2
: ใจใคใชใขใณใฎ็งปๅ้ๅบฆใ2ใซ่จญๅฎใใพใใ
update
ใกใฝใใ: ใจใคใชใขใณใฎไฝ็ฝฎใๆดๆฐใใพใใใใฎใกใฝใใใฏๆฏใใฌใผใ ๅผใณๅบใใใพใใself.rect.x += self.speed
: ใจใคใชใขใณใ็พๅจใฎ้ๅบฆใงๆจชๆนๅใซ็งปๅใใใพใใif self.rect.right >= 800 or self.rect.left <= 0
: ใจใคใชใขใณใ็ป้ขใฎๅณ็ซฏ๏ผ800px๏ผใซ้ใใใใๅทฆ็ซฏ๏ผ0px๏ผใซ้ใใๅ ดๅ(ๆใ่ฟใ็จ)self.speed = -self.speed
: ใจใคใชใขใณใฎ็งปๅๆนๅใๅ่ปขใใใพใ๏ผๅณใซ็งปๅใใฆใใๅ ดๅใฏๅทฆใซใๅทฆใซ็งปๅใใฆใใๅ ดๅใฏๅณใซ๏ผใself.rect.y += 40
: ใจใคใชใขใณใ็ธฆๆนๅใซ40ใใฏใปใซไธใซ็งปๅใใใพใใใจใคใชใขใณใ็ป้ข็ซฏใซ้ใใใจใใซไธๆฎตไธใซ้ใใๅไฝใใทใใฅใฌใผใใใพใใ
4. ๅผพใฏใฉใน
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 10))
self.image.fill(WHITE)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.speed = -10
def update(self):
self.rect.y += self.speed
if self.rect.bottom < 0:
self.kill()
- ๅผพใฎในใใฉใคใใๅฎ็พฉใใself.speed=-10ใงไธๆนๅ10pxใใค็งปๅใใพใใ
- updateใกใฝใใๅ ใงใๅผพใ็ป้ขใฎไธ็ซฏใ่ถ ใใๅ ดๅใซself.kill()ใๅผใณๅบใใฆๅ้คใใฆใใพใใ
5. ใกใคใณใซใผใ
ใฒใผใ ใฎๅๆๅใใกใคใณใซใผใใใคใใณใๅฆ็ใในใใฉใคใใฎๆดๆฐใๆ็ปใในใณใข่กจ็คบใใฒใผใ ็ตไบๅคๅฎใ่กใใพใใ
5-1. ๅๆๅ
pygame.init()
- Pygameใฉใคใใฉใชใๅๆๅใใพใใ
5-2. ็ป้ข่จญๅฎ
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Space Invaders")
- ใฒใผใ ใฆใฃใณใใฆใฎใตใคใบใ800×600ใใฏใปใซใซ่จญๅฎใใใฟใคใใซใใSpace Invadersใใซใใพใใ
5-3. ใใฉใณใ่จญๅฎ
font = pygame.font.SysFont(None, 55)
- ในใณใขใใกใใปใผใธใ่กจ็คบใใใใใฎใใฉใณใใ่จญๅฎใใพใใ
5-4. ในใใฉใคใใฐใซใผใใฎไฝๆ
all_sprites = pygame.sprite.Group()
aliens = pygame.sprite.Group()
bullets = pygame.sprite.Group()
- ใฒใผใ ๅ ใฎในใใฉใคใ๏ผใใฌใคใคใผใใจใคใชใขใณใๅผพไธธ๏ผใ็ฎก็ใใใใใฎใฐใซใผใใไฝๆใใพใใ
ใใใใใฎใฐใซใผใใซใฏไปฅไธใฎๅฝนๅฒใใใใพใใ
- all_spritesใฐใซใผใ
- ใฒใผใ ๅ
ใฎใในใฆใฎในใใฉใคใใฎๆดๆฐใจๆ็ปใ็ฎก็ใใพใใไพใใฐใ
all_sprites.update()
ใall_sprites.draw(screen)
ใไฝฟใใใจใงใๅ จในใใฉใคใใฎๆดๆฐใๆ็ปใไธๅบฆใซ่กใใพใใ
- ใฒใผใ ๅ
ใฎใในใฆใฎในใใฉใคใใฎๆดๆฐใจๆ็ปใ็ฎก็ใใพใใไพใใฐใ
- aliensใฐใซใผใ
- ใจใคใชใขใณใฎในใใฉใคใใฎๆไฝใๅคๅฎใ่กใใใใฎใฐใซใผใใงใใไพใใฐใๅผพไธธใจใฎ่ก็ชๅคๅฎใ่กใๅ ดๅใ
pygame.sprite.groupcollide(bullets, aliens, True, True)
ใไฝฟใใใจใงใๅผพไธธใจใจใคใชใขใณใฎ่ก็ชใๅน็็ใซๅคๅฎใงใใพใใ
- ใจใคใชใขใณใฎในใใฉใคใใฎๆไฝใๅคๅฎใ่กใใใใฎใฐใซใผใใงใใไพใใฐใๅผพไธธใจใฎ่ก็ชๅคๅฎใ่กใๅ ดๅใ
- bulletsใฐใซใผใ
- ๅผพไธธใฎในใใฉใคใใฎๆไฝใๅคๅฎใ่กใใใใฎใฐใซใผใใงใใไพใใฐใๅผพไธธใ็ป้ขๅคใซๅบใ้ใซๅ้คใใๅฆ็ใใใจใคใชใขใณใจใฎ่ก็ชๅคๅฎใ่กใ้ใซไฝฟ็จใใพใใ
5-5. ใใฌใคใคใผใจใจใคใชใขใณใฎ็ๆ
player = Player()
all_sprites.add(player)
for i in range(10):
for j in range(3):
alien = Alien(50 + i * 50, 70 + j * 80)
all_sprites.add(alien)
aliens.add(alien)
- ใใฌใคใคใผใจใจใคใชใขใณใ็ๆใใใใใใใฎในใใฉใคใใฐใซใผใใซ่ฟฝๅ ใใพใใ
5-6. ใฒใผใ ใซใผใ
ใฒใผใ ใ็ตไบใใใพใงใฎใกใคใณใซใผใใงใใใคใใณใๅฆ็ใในใใฉใคใใฎๆดๆฐใๆ็ปใ่กใใพใใ
# ในใณใขใฎๅๆๅ
score = 0
# ใใฉใฐ
running = True
game_over = False
game_clear = False
game_started = False
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and not game_over and not game_clear:
bullet = Bullet(player.rect.centerx, player.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
if event.key == pygame.K_s:
game_started = True
- ในใณใขใฎๅๆๅ๏ผscore = 0๏ผ: ใฒใผใ ้ๅงๆใฎในใณใขใ0ใซ่จญๅฎใใพใใ
running
: ใฒใผใ ใซใผใใๅถๅพกใใใใใฎใใฉใฐใงใใTrue
ใฎ้ใฏใฒใผใ ใๅฎ่กใใใพใใgame_over
: ใฒใผใ ใชใผใใผใฎ็ถๆ ใๅคๅฎใใใใใฎใใฉใฐใงใใFalse
ใฎ้ใฏใฒใผใ ใ็ถ่กใใใพใใgame_clear
: ใฒใผใ ใฏใชใขใฎ็ถๆ ใๅคๅฎใใใใใฎใใฉใฐใงใใFalse
ใฎ้ใฏใฒใผใ ใ็ถ่กใใใพใใgame_started
: ใฒใผใ ใ้ๅงใใใใใฉใใใๅคๅฎใใใใใฎใใฉใฐใงใใFalse
ใฎ้ใฏใฒใผใ ใ้ๅงใใใฆใใพใใใwhile running:
:running
ใTrue
ใฎ้ใใฒใผใ ใซใผใใๅฎ่กใใใพใใpygame.event.get()
: Pygameใฎใคใใณใใญใฅใผใใใคใใณใใๅๅพใใพใใif event.type == pygame.QUIT:
: ใฆใฃใณใใฆใฎ้ใใใใฟใณใๆผใใใๅ ดๅใrunning
ใFalse
ใซ่จญๅฎใใฆใฒใผใ ใซใผใใ็ตไบใใพใใif event.type == pygame.KEYDOWN:
: ใญใผใๆผใใใๅ ดๅใฎๅฆ็ใ่กใใพใใevent.key == pygame.K_SPACE and not game_over
: ในใใผในใญใผใๆผใใใใใคใฒใผใ ใชใผใใผใงใชใๅ ดๅใๅผพใ็บๅฐใใพใใ- ๅผพใฎ็ๆ:
bullet = Bullet(player.rect.centerx, player.rect.top)
ใงใใฌใคใคใผใฎไฝ็ฝฎใใๅผพใ็ๆใใall_sprites
ใใใณbullets
ใฐใซใผใใซ่ฟฝๅ ใใพใใ if event.key == pygame.K_s
:S
ใญใผใๆผใใใๅ ดๅใgame_started
ใTrue
ใซ่จญๅฎใใใฒใผใ ใ้ๅงใใพใใ
5-7. ่ก็ชๅคๅฎใจในใณใขๆดๆฐ:
if not game_over and not game_clear and game_started:
# ๆดๆฐ
all_sprites.update()
# ่ก็ชๅคๅฎ
hits = pygame.sprite.groupcollide(bullets, aliens, True, True)
if hits:
score += 10
- ใฒใผใ ใชใผใใผใงใใฒใผใ ใฏใชใข็ถๆ ใงใใชใใใฒใผใ ใ้ๅง็ถๆ ใงใใใฐใๅ จใฆใฎในใใฉใคใใๆดๆฐใใพใใ
- ๅผพไธธใจใจใคใชใขใณใฎ่ก็ชใๅคๅฎใใ่ก็ชใใใใฐในใณใขใๆดๆฐใใพใ(10็นๅ ็ฎ)ใ
- pygame.sprite.groupcollidemใกใฝใใใฎๅผๆฐTrue, Trueใฏใ่ก็ชใใๅผพใจใจใคใชใขใณใฎในใใฉใคใไธกๆนใๅ้คใใพใใ
pygame.sprite.groupcollide(group1, group2, dokill1, dokill2, collided=None)
- group1: ๆๅใฎในใใฉใคใใฐใซใผใ๏ผไพ๏ผbullets๏ผใ
- group2: 2็ช็ฎใฎในใใฉใคใใฐใซใผใ๏ผไพ๏ผaliens๏ผใ
- dokill1: Trueใฎๅ ดๅใgroup1ใฎ่ก็ชใใในใใฉใคใใๅ้คใใพใใ
- dokill2: Trueใฎๅ ดๅใgroup2ใฎ่ก็ชใใในใใฉใคใใๅ้คใใพใใ
- collided: ่ก็ชๅคๅฎใซไฝฟ็จใใใซในใฟใ ้ขๆฐ๏ผ็็ฅๅฏ่ฝ๏ผใใใใฉใซใใงใฏ็ฉๅฝขใฎ่ก็ชๅคๅฎใไฝฟ็จใใใพใใ
- ๆปใๅค: ่ก็ชใใในใใฉใคใใฎใใขใๅซใ่พๆธใ่ฟใใพใใ่พๆธใฎใญใผใฏgroup1ใฎในใใฉใคใใๅคใฏใใใซ่ก็ชใใgroup2ใฎในใใฉใคใใฎใชในใใงใใ
5-8. ใฒใผใ ใฏใชใขๅคๅฎ:
# ใฒใผใ ใฏใชใขๅคๅฎ
if not aliens:
game_clear = True
# ใฒใผใ ใชใผใใผๅคๅฎ๏ผใจใคใชใขใณใใใฌใคใคใผใฎไฝ็ฝฎใพใงๅฐ้ใใๅ ดๅ๏ผ
for alien in aliens:
if alien.rect.bottom >= player.rect.top:
game_over = True
- ใในใฆใฎใจใคใชใขใณใๅใใใใใฒใผใ ใฏใชใขใจใใพใใ
- ใคใชใขใณใใใฌใคใคใผใฎไฝ็ฝฎใพใงๅฐ้ใใๅ ดๅใใฒใผใ ใชใผใใผใจใใพใใ
5-9. ๆ็ปใจ็ป้ขๆดๆฐ:
# ๆ็ป
screen.fill(DARK_GREEN)
all_sprites.draw(screen)
# ในใณใข่กจ็คบ
score_text = font.render(f"Score: {score}", True, WHITE)
screen.blit(score_text, (10, 10))
# ใฒใผใ ใชใผใใผ่กจ็คบ
if game_over:
game_over_text = font.render("GAME OVER", True, WHITE)
screen.blit(game_over_text, (300, 250))
restart_text = font.render("Press 'R' to Restart", True, WHITE)
screen.blit(restart_text, (250, 300))
# ๅคใในใใฉใคใใฐใซใผใใฎๅ้ค
all_sprites.empty()
aliens.empty()
bullets.empty()
# ใฒใผใ ใฏใชใข่กจ็คบ
if game_clear:
game_clear_text = font.render("GAME CLEAR", True, WHITE)
screen.blit(game_clear_text, (300, 250))
- ็ป้ขใๅกใใคใถใใในใใฉใคใใๆ็ปใใพใใ
- ในใณใขใๅคๅฎใใฉใฐใซๅฟใใฆใฒใผใ ใชใผใใผใใฒใผใ ใฏใชใขใกใใปใผใธใ่กจ็คบใใพใใ
- ใฒใผใ ใชใผใใผๆใฏในใใฉใคใใฐใซใผใใ็ฉบใซใใพใใ
- ็ป้ขใๆดๆฐใใใใฌใผใ ใฌใผใใ่จญๅฎใใพใใ
5-10. ็ตไบๅฆ็:
pygame.quit()
sys.exit()
- ใฒใผใ ใ็ตไบใใใทในใใ ใ็ตไบใใพใใ
ใ2ใในใใผในใคใณใใผใใผใฒใผใ (็ฐกๆ็โกๆตใฎๅผพๅนใๅฎ่ฃ )
ๆฌกใซใใจใคใชใขใณใฎๅผพๅนใๅฎ่ฃ ใใไปฅไธๅ็ปใฎใใใซๆน่ฏใใพใใ
ใ2-1ใใตใณใใซใณใผใโก
Sใญใผใๆผใใจใฒใผใ ใ้ๅงใใใพใใ
ในใใผในใญใผใงใใฌใคใคใผ๏ผ็ท๏ผใใๅผพใ็บๅฐใใใ่ฟซใฃใฆใใใจใคใชใขใณใซๅฝใใใจๆใก่ฝใจใใใจใใงใใพใใ
ใจใคใชใขใณใใใฌใคใคใผใฎไฝ็ฝฎใพใงๅฐ้ใใใใใจใคใชใขใณใฎๅผพใซใใฌใคใคใผใๅฝใใใจใฒใผใ ใชใผใใผใงใใ
ใ2-2ใใตใณใใซใณใผใโกใฎ่งฃ่ชฌ
ใตใณใใซใณใผใโ ใจ็ฐใชใ้จๅใไธญๅฟใซ่งฃ่ชฌใใพใใ
ใจใคใชใขใณใฏใฉใน
# ใจใคใชใขใณใฏใฉใน
class Alien(pygame.sprite.Sprite):
def __init__(self, x, y, all_sprites, alien_bullets):
super().__init__()
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
self.speed = 2
self.all_sprites = all_sprites
self.alien_bullets = alien_bullets
def update(self):
self.rect.x += self.speed
if self.rect.right >= 800 or self.rect.left <= 0:
self.speed = -self.speed
self.rect.y += 40
if random.randint(1, 300) == 1: # 1/300ใฎ็ขบ็ใงๅผพใ็บๅฐ
bullet = AlienBullet(self.rect.centerx, self.rect.bottom)
self.all_sprites.add(bullet)
self.alien_bullets.add(bullet)
- ๅๆๅใกใฝใใ (
__init__
): ใจใคใชใขใณใฎๅๆ่จญๅฎใ่กใใพใใx
ใจy
ใฏใจใคใชใขใณใฎๅๆไฝ็ฝฎใงใใself.image
ใฏใจใคใชใขใณใฎ่ฆใ็ฎใๅฎ็พฉใใใใใฎใตใผใใงในใงใใใตใคใบใฏ30×30ใใฏใปใซใงใ่ฒใฏ่ตค๏ผRED
๏ผใซ่จญๅฎใใใฆใใพใใself.rect
ใฏใจใคใชใขใณใฎไฝ็ฝฎใจใตใคใบใ็ฎก็ใใ็ฉๅฝข๏ผrect๏ผใชใใธใงใฏใใงใใself.rect.topleft
ใฏใจใคใชใขใณใฎๅทฆไธใฎไฝ็ฝฎใ่จญๅฎใใพใใself.speed
ใฏใจใคใชใขใณใฎ็งปๅ้ๅบฆใ่จญๅฎใใพใใself.all_sprites
ใจself.alien_bullets
ใฏใใจใคใชใขใณใๅผพใ็บๅฐใใ้ใซไฝฟ็จใใในใใฉใคใใฐใซใผใใงใใ
- ๆดๆฐใกใฝใใ (
__init__
): ใจใคใชใขใณใฎๆดๆฐใ่กใใพใใself.rect.x += self.speed
ใงใจใคใชใขใณใๅทฆๅณใซ็งปๅใใใพใใ- ใจใคใชใขใณใ็ป้ขใฎๅณ็ซฏ๏ผ800ใใฏใปใซ๏ผใซ้ใใใจใ
self.rect.right >= 800
ใ็ใจใชใใ้ๅบฆใฎ็ฌฆๅทใๅ่ปขใใใพใ๏ผself.speed = -self.speed
๏ผใใใใซใใใใจใคใชใขใณใฏๅๅฏพๆนๅใซ็งปๅใใพใใ - ๅๆงใซใใจใคใชใขใณใ็ป้ขใฎๅทฆ็ซฏใซ้ใใใจใๅใๅฆ็ใ่กใใใพใใ
- ใจใคใชใขใณใๆนๅใๅคใใใใณใซใ
self.rect.y += 40
ใงใจใคใชใขใณใไธใซ็งปๅใใใพใใ - ๅผพใฎ็บๅฐ:
random.randint(1, 300) == 1
ใง1/300ใฎ็ขบ็ใงๅผพใ็บๅฐใใพใใ AlienBullet
ใฏใฉในใฎใคใณในใฟใณในใไฝๆใใใจใคใชใขใณใฎไธญๅฟใใๅผพใ็บๅฐใใพใใ- ใจใคใชใขใณใๅผพใ็บๅฐใใๅบฆใซใๆฐใใๅผพใ
self.all_sprites
ใจself.alien_bullets
ใฎในใใฉใคใใฐใซใผใใซ่ฟฝๅ ใใพใใ
ใจใคใชใขใณใฎๅผพใฏใฉใน
ใใฎใฏใฉในใซใใใใจใคใชใขใณใ็บๅฐใใๅผพใฏไธๆนๅใซ็งปๅใใ็ป้ขๅคใซๅบใๅ ดๅใฏ่ชๅ็ใซๅ้คใใใพใใ
# ใจใคใชใขใณใฎๅผพใฏใฉใน
class AlienBullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 10))
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.speed = 5
def update(self):
self.rect.y += self.speed
if self.rect.top > 600:
self.kill()
- ๅๆๅใกใฝใใ (
__init__
): ใจใคใชใขใณใฎๅผพใฎๅๆ่จญๅฎใ่กใใพใใx
ใจy
ใฏๅผพใฎๅๆไฝ็ฝฎใงใใself.image
ใฏๅผพใฎ่ฆใ็ฎใๅฎ็พฉใใใใใฎใตใผใใงในใงใใใตใคใบใฏ5×10ใใฏใปใซใงใ่ฒใฏ่ตค๏ผRED
๏ผใซ่จญๅฎใใใฆใใพใใself.rect
ใฏๅผพใฎไฝ็ฝฎใจใตใคใบใ็ฎก็ใใ็ฉๅฝข๏ผrect๏ผใชใใธใงใฏใใงใใself.rect.center
ใฏๅผพใฎไธญๅฟไฝ็ฝฎใ่จญๅฎใใพใใself.speed
ใฏๅผพใฎ็งปๅ้ๅบฆใ่จญๅฎใใพใใ
- **updateใกใฝใใ
- ็งปๅ:
self.rect.y += self.speed
ใงๅผพใไธๆนๅใซ็งปๅใใใพใใ self.speed
ใฏๆญฃใฎๅคใชใฎใงใๅผพใฏไธใซๅใใฃใฆ็งปๅใใพใใ- ็ป้ขๅคใฎๅฆ็:
if self.rect.top > 600
ใงๅผพใ็ป้ขใฎไธ็ซฏ๏ผ600ใใฏใปใซ๏ผใ่ถ ใใใใฉใใใใใงใใฏใใพใใ - ็ป้ขๅคใซๅบใๅผพใฏ
self.kill()
ใงๅ้คใใใพใใใใใซใใใใกใขใชใฎ็ก้ง้ฃใใ้ฒใใพใใ
- ็งปๅ:
ใจใคใชใขใณใฎๅผพ็จใฎในใใฉใคใใฐใซใผใไฝๆ
main้ขๆฐๅ ใงใจใคใชใขใณใ็บๅฐใใๅผพใ็ฎก็ใใใใใฎในใใฉใคใใฐใซใผใใไฝๆใใฆใใพใใ
alien_bullets = pygame.sprite.Group()
ๅผพใฎๆดๆฐ
ใกใคใณใซใผใๅ
ใงใalien_bullets
ใฐใซใผใๅ
ใฎใในใฆใฎๅผพใๆดๆฐใใพใใ
alien_bullets.update()
ๅผพใฎๆ็ป
alien_bullets
ใฐใซใผใๅ
ใฎใในใฆใฎๅผพใๆ็ปใใพใใ
alien_bullets.draw(screen)
่ก็ชๅคๅฎ
ใใฌใคใคใผใจใจใคใชใขใณใฎๅผพใฎ่ก็ชใๅคๅฎใใๅผพใๅฝใใฃใใใฒใผใ ใชใผใใผใจใใพใใ
player_hits = pygame.sprite.spritecollide(player, alien_bullets, True)
if player_hits:
game_over = True
ใชในใฟใผใๆใฎๅๆๅ
ใฒใผใ ใชใผใใผๅพใalien_bulletsใฎในใใฉใคใใฐใซใผใใ็ฉบใซใใพใใ
# ในใใฉใคใใฐใซใผใใ็ฉบใซใใ
all_sprites.empty()
aliens.empty()
bullets.empty()
alien_bullets.empty()
ใ3ใ็ปๅใจ้ณๆฅฝใไปใใๅฎๆ็
ใตใณใใซใณใผใโกใซ้ณใจ็ปๅใๅ ฅใใฆใไปฅไธๅ็ปใฎใใใซใฒใผใ ใใใใใพใใ
ใไฝฟ็จใใ้ณๅฃฐใใกใคใซใ
- shoot.mp3ใปใปใป8bitใทใงใใ3ใใๅใใพใใใ
- hit.mp3ใปใปใป8bit็็บ2ใใๅใใพใใใ
- clear.mp3ใปใปใป8bitๅๅฉ1ใใๅใใพใใใ
- gameover.mp3ใปใปใป8bitๅคฑๆ3ใใๅใใพใใใ
- gameplay.mp3ใปใปใปSF2ใใๅใใพใใใ
ใไฝฟ็จใใ็ปๅใใกใคใซใ
ใ3-1ใใตใณใใซใณใผใโข
ใ3-2ใใตใณใใซใณใผใโขใฎ่งฃ่ชฌ
ใตใณใใซใณใผใโกใจ็ฐใชใ้จๅใไธญๅฟใซ่งฃ่ชฌใใพใใ
็ปๅใจ้ณๅฃฐใใกใคใซใฎใใน
ใฒใผใ ๅ ใง็ปๅใ้ณๅฃฐใ่ชญใฟ่พผใ้ใซไฝฟ็จใใพใใ
# ็ปๅใใกใคใซใฎใใน
PLAYER_IMG_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/img/player.png"
ALIEN_IMG_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/img/alien.png"
# ้ณๅฃฐใใกใคใซใฎใใน
SHOOT_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/shoot.mp3"
HIT_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/hit.mp3"
CLEAR_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/clear.mp3"
GAMEOVER_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/gameover.mp3"
GAMEPLAY_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/gameplay.mp3"
PLAYER_IMG_PATH
ใฏใใใฌใคใคใผใญใฃใฉใฏใฟใผใฎ็ปๅใใกใคใซใฎใในใงใใALIEN_IMG_PATH
ใฏใใจใคใชใขใณใญใฃใฉใฏใฟใผใฎ็ปๅใใกใคใซใฎใในใงใใSHOOT_SOUND_PATH
ใฏใใใฌใคใคใผใๅผพใ็บๅฐใใ้ใฎ้ณๅฃฐใใกใคใซใฎใในใงใใHIT_SOUND_PATH
ใฏใๅผพใใจใคใชใขใณใซๅฝใใฃใใจใใฎ้ณๅฃฐใใกใคใซใฎใในใงใใCLEAR_SOUND_PATH
ใฏใใฒใผใ ใฏใชใขๆใฎ้ณๅฃฐใใกใคใซใฎใในใงใใGAMEOVER_SOUND_PATH
ใฏใใฒใผใ ใชใผใใผๆใฎ้ณๅฃฐใใกใคใซใฎใในใงใใGAMEPLAY_SOUND_PATH
ใฏใใฒใผใ ใใฌใคไธญใซๆตใใ้ณๆฅฝใฎใใกใคใซใฎใในใงใใ
ใใฌใคใคใผใฏใฉในใฎๅฎ็พฉ
# ใใฌใคใคใผใฏใฉใน
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.image.load(PLAYER_IMG_PATH).convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = (400, 550)
self.speed = 5
def update(self):
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_RIGHT] and self.rect.right < 800:
self.rect.x += self.speed
self.image
ใฏใใใฌใคใคใผใฎ็ปๅใ่ชญใฟ่พผใฟใพใใconvert_alpha()
ใไฝฟใใใจใงใ็ปๅใฎ้ๆ้จๅใๅฆ็ใงใใพใใself.rect
ใฏใ็ปๅใฎ็ฉๅฝข๏ผๅ่งๅฝข๏ผ้ ๅใๅๅพใใพใใใใใซใใใ็ปๅใฎไฝ็ฝฎใ่ก็ชๅคๅฎใ็ฎก็ใงใใพใใself.rect.center
ใงใใใฌใคใคใผใฎๅๆไฝ็ฝฎใ่จญๅฎใใพใใ(400, 550)
ใฏใใใฌใคใคใผใฎไธญๅฟๅบงๆจใงใใ
ใจใคใชใขใณใฏใฉในใฎๅฎ็พฉ
# ใจใคใชใขใณใฏใฉใน
class Alien(pygame.sprite.Sprite):
def __init__(self, x, y, all_sprites, alien_bullets):
super().__init__()
self.image = pygame.image.load(ALIEN_IMG_PATH).convert_alpha()
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
self.speed = 2
self.all_sprites = all_sprites
self.alien_bullets = alien_bullets
self.image
ใฏใใจใคใชใขใณใฎ็ปๅใ่ชญใฟ่พผใฟใพใใconvert_alpha()
ใไฝฟใใใจใงใ็ปๅใฎ้ๆ้จๅใๅฆ็ใงใใพใใself.rect
ใฏใ็ปๅใฎ็ฉๅฝข๏ผๅ่งๅฝข๏ผ้ ๅใๅๅพใใพใใใใใซใใใ็ปๅใฎไฝ็ฝฎใ่ก็ชๅคๅฎใ็ฎก็ใงใใพใใself.rect.topleft
ใงใใจใคใชใขใณใฎๅๆไฝ็ฝฎใ่จญๅฎใใพใใ(x, y)
ใฏใใจใคใชใขใณใฎๅทฆไธใฎๅบงๆจใงใใ
้ณๅฃฐใใกใคใซใฎใญใผใ
gameplay_sound_played = False
shoot_sound = pygame.mixer.Sound(SHOOT_SOUND_PATH)
hit_sound = pygame.mixer.Sound(HIT_SOUND_PATH)
clear_sound = pygame.mixer.Sound(CLEAR_SOUND_PATH)
gameover_sound = pygame.mixer.Sound(GAMEOVER_SOUND_PATH)
gameplay_sound = pygame.mixer.Sound(GAMEPLAY_SOUND_PATH)
shoot_sound.set_volume(0.2)
hit_sound.set_volume(0.2)
pygame.mixer.Sound
ใไฝฟใฃใฆใๅ้ณๅฃฐใใกใคใซใใญใผใใใพใใshoot_sound
ใฏใๅผพใ็บๅฐใใ้ใฎ้ณๅฃฐใงใใhit_sound
ใฏใๅผพใใจใคใชใขใณใซๅฝใใฃใใจใใฎ้ณๅฃฐใงใใclear_sound
ใฏใใฒใผใ ใฏใชใขๆใฎ้ณๅฃฐใงใใgameover_sound
ใฏใใฒใผใ ใชใผใใผๆใฎ้ณๅฃฐใงใใgameplay_sound
ใฏใใฒใผใ ใใฌใคไธญใซๆตใใ้ณๆฅฝใงใใ
- set_volumeใกใฝใใใไฝฟใฃใฆใshoot_soundใจhit_soundใฎ้ณ้ใ่จญๅฎใใพใใใใใงใฏใ0.2๏ผๆๅคง้ณ้ใฎ20%๏ผใง้ณ้ใ่จญๅฎใใพใใ
้ณๅฃฐใใกใคใซใฎๅ็
if not gameplay_sound_played and not game_over and not game_clear and game_started:
gameplay_sound.play(-1)
gameplay_sound_played = True
- ใฒใผใ ไธญ้ณๆฅฝใใพใ ๅ็ใใใฆใใชใใใฒใผใ ใ็ตไบใใฆใใชใใใฒใผใ ใใฏใชใขใใใฆใใชใใใฒใผใ ใ้ๅงใใใฆใใใจใใ4ใคใฎๆกไปถใๅ
จใฆๆบใใใฆใใๅ ดๅใ
gameplay_sound.play(-1)
ใกใฝใใใๅผใณๅบใใใจใงใใฒใผใ ไธญ็จใฎ้ณๆฅฝใ็ก้ใซใผใใงๅ็ใใพใใ-1
ใฏ็ก้ใซใผใใๆๅณใใพใใ
if event.key == pygame.K_SPACE and not game_over:
shoot_sound.play()
- play()ใกใฝใใใๅผใณๅบใใใจใงใๅผพใ็บๅฐใใ้ณใๅ็ใใพใใ
if hits:
hit_sound.play()
- play()ใกใฝใใใๅผใณๅบใใใจใงใๅผพใใจใคใชใขใณใซๅฝใใฃใ้ณใๅ็ใใพใใ
if player_hits:
gameover_sound.play()
- play()ใกใฝใใใๅผใณๅบใใใจใงใ่ชๆฉใซๅผพใๅฝใใฃใใจใใซใฒใผใ ใชใผใใผใฎ้ณใๅ็ใใพใใ
if alien.rect.bottom >= player.rect.top:
gameover_sound.play()
- play()ใกใฝใใใๅผใณๅบใใใจใงใใจใคใชใขใณใ่ชๆฉใฎไฝ็ฝฎใพใงๅฐ้ใใใจใใซใฒใผใ ใชใผใใผใฎ้ณใๅ็ใใพใใ
if not aliens and not game_clear:
clear_sound.play()
- play()ใกใฝใใใๅผใณๅบใใใจใงใใจใคใชใขใณใๅ จใฆๆๅขใใใจใใซใฒใผใ ใฏใชใขใฎ้ณใๅ็ใใพใใ
if game_over:
gameplay_sound.stop()
๏ผ็ฅ๏ผ
if game_clear:
gameplay_sound.stop()
- stop()ใกใฝใใใๅผใณๅบใใใจใงใใฒใผใ ใชใผใใผใใใใฏใฒใผใ ใฏใชใขๆใซใใฒใผใ ใใฌใคไธญใฎBGMใๅๆญขใใพใใ
้ข้ฃใใผใธ
Pygameใฎไฝฟใๆนใซใคใใฆใฏไปฅไธใใผใธใง่งฃ่ชฌใใฆใใพใใ

Pythonๅ จ่ฌใซใคใใฆใฏไปฅไธใใผใธใง่งฃ่ชฌใใฆใใพใใ

ใณใกใณใ