ใ€Pygameใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝฟใ„ๆ–นใจใ‚ฐใƒซใƒผใƒ—ๅŒ–ใซใ‚ˆใ‚‹ๅŠน็އ็š„ใช็ฎก็†ๆ–นๆณ•

Pygameใฎใ‚นใƒ—ใƒฉใ‚คใƒˆๆฉŸ่ƒฝใ‚’็”จใ„ใฆใ€่ค‡ๆ•ฐใฎ็”ปๅƒใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๅŠน็އใ‚ˆใ็ฎก็†ใ™ใ‚‹ๆ–นๆณ•ใจใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใ‚’่งฃ่ชฌใ—ใพใ™ใ€‚

ใ€1ใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๅŸบๆœฌ็š„ใชไฝฟใ„ๆ–น

Pygameใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฏใ€ใ‚ฒใƒผใƒ ๅ†…ใฎใ‚ฐใƒฉใƒ•ใ‚ฃใ‚ซใƒซใช่ฆ็ด ๏ผˆใƒ—ใƒฌใ‚คใƒคใƒผใ‚„ๆ•ตใชใฉ๏ผ‰ใ‚’็ฎก็†ใ™ใ‚‹ใŸใ‚ใฎ้žๅธธใซไพฟๅˆฉใชๆฉŸ่ƒฝใงใ™ใ€‚ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ไฝฟ็”จใ™ใ‚‹ใ“ใจใงใ€ไพ‹ใˆใฐไปฅไธ‹ใฎใ‚ˆใ†ใซ่ค‡ๆ•ฐใฎใ‚ฒใƒผใƒ ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎๆ็”ปใ€ๆ›ดๆ–ฐใ€่ก็ชๅˆคๅฎšใชใฉใ‚’ๅŠน็އ็š„ใซ็ฎก็†ใงใใพใ™ใ€‚

ใ€ไปŠๅ›žไฝฟ็”จใ™ใ‚‹็”ปๅƒใ€‘

Pygameใงใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๆ‰ฑใ†ใซใฏใ€ไปฅไธ‹ใฎใ‚ˆใ†ใซpygame.sprite.Spriteใ‚ฏใƒฉใ‚นใ‚’็ถ™ๆ‰ฟใ—ใพใ™ใ€‚

import pygame

class Player(pygame.sprite.Sprite):
    def __init__(self, image_path, pos):
        super().__init__()
        self.image = pygame.image.load(image_path).convert_alpha()
        self.rect = self.image.get_rect(topleft=pos)
    
    # update()`ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟ็”จใ—ใฆใ€ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎ็Šถๆ…‹ใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚
    # ้€šๅธธใ€ไฝ็ฝฎใฎๅค‰ๆ›ดใ‚„ใ‚ขใƒ‹ใƒกใƒผใ‚ทใƒงใƒณใฎๆ›ดๆ–ฐใชใฉใ‚’่กŒใ„ใพใ™ใ€‚
    def update(self):
        # ใ“ใ“ใซๆ›ดๆ–ฐใƒญใ‚ธใƒƒใ‚ฏใ‚’่ฟฝๅŠ 
        # ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎ็”ปๅƒใ‚’็”ป้ขไธŠใซๆ็”ป
        screen.blit(self.image, self.rect)

ๅ‹•็”ป่งฃ่ชฌ็‰ˆ

ใ€1-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ 

ใ‚ตใƒณใƒ—ใƒซใƒ—ใƒญใ‚ฐใƒฉใƒ ใฎใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใงใ™ใ€‚5ไบบใฎๅฅณใฎๅญใŒๅ‹•ใๅ›žใ‚Šใพใ™ใ€‚


ใ€1-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ ใฎ่งฃ่ชฌ

ใ“ใฎใ‚ณใƒผใƒ‰ใฏใ€Pygameใ‚’ไฝฟใฃใฆใ‚นใƒ—ใƒฉใ‚คใƒˆ๏ผˆ็”ปๅƒ๏ผ‰ใ‚’็”ป้ขไธŠใงๅ‹•ใ‹ใ™ใ‚ทใƒณใƒ—ใƒซใชใƒ—ใƒญใ‚ฐใƒฉใƒ ใงใ™ใ€‚ไปฅไธ‹ใซๅ„้ƒจๅˆ†ใฎ่ฉณ็ดฐใช่งฃ่ชฌใ‚’่กŒใ„ใพใ™ใ€‚

ใ‚คใƒณใƒใƒผใƒˆใจๅˆๆœŸ่จญๅฎš

# -*- coding: utf-8 -*-
import sys
import pygame
from pygame.locals import *
  • sysใƒขใ‚ธใƒฅใƒผใƒซใ‚’ใ‚คใƒณใƒใƒผใƒˆใ—ใฆใ„ใพใ™ใ€‚
  • pygameใƒขใ‚ธใƒฅใƒผใƒซใจใใฎใƒญใƒผใ‚ซใƒซๅฎšๆ•ฐใ‚’ใ‚คใƒณใƒใƒผใƒˆใ—ใฆใ„ใพใ™ใ€‚

็”ป้ขใ‚ตใ‚คใ‚บใจ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใƒ‘ใ‚นใฎ่จญๅฎš

SCREEN = Rect(0, 0, 600, 400)   # ็”ป้ขใ‚ตใ‚คใ‚บ

GIRL1_IMG_PATH = "/Users/github/sample/python/pygame/sprite/girl1.png"
GIRL2_IMG_PATH = "/Users/github/sample/python/pygame/sprite/girl2.png"
GIRL3_IMG_PATH = "/Users/github/sample/python/pygame/sprite/girl3.png"
GIRL4_IMG_PATH = "/Users/github/sample/python/pygame/sprite/girl4.png"
GIRL5_IMG_PATH = "/Users/github/sample/python/pygame/sprite/girl5.png"
  • SCREENใฏ็”ป้ขใฎใ‚ตใ‚คใ‚บใ‚’่จญๅฎšใ™ใ‚‹ใŸใ‚ใฎ็Ÿฉๅฝขใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚
  • ๅ„ใ‚นใƒ—ใƒฉใ‚คใƒˆ็”ปๅƒใฎใƒ•ใ‚กใ‚คใƒซใƒ‘ใ‚นใ‚’ๅฎš็พฉใ—ใฆใ„ใพใ™ใ€‚

ใ‚ฏใƒฉใ‚นใฎๅฎš็พฉใจๅˆๆœŸๅŒ–๏ผˆใ‚นใƒ—ใƒฉใ‚คใƒˆ๏ผ‰

Pygameใ‚’ไฝฟใฃใฆใ‚นใƒ—ใƒฉใ‚คใƒˆ๏ผˆ็”ปๅƒใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆ๏ผ‰ใ‚’็ฎก็†ใ™ใ‚‹ใ‚ฏใƒฉใ‚น Girl ใ‚’ๅฎš็พฉใ—ใฆใ„ใพใ™ใ€‚

class Girl(pygame.sprite.Sprite):
    def __init__(self, filepath, pos, vxy, angle=0):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(filepath).convert_alpha()
        if angle != 0: 
            self.image = pygame.transform.rotate(self.image, angle)
  • Girl ใ‚ฏใƒฉใ‚นใฏ pygame.sprite.Sprite ใ‚’็ถ™ๆ‰ฟใ—ใฆใ„ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€Pygameใฎใ‚นใƒ—ใƒฉใ‚คใƒˆๆฉŸ่ƒฝใ‚’ๅˆฉ็”จใงใใพใ™ใ€‚
  • __init__ ใƒกใ‚ฝใƒƒใƒ‰ใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๅˆๆœŸๅŒ–ใ‚’่กŒใ„ใพใ™ใ€‚
    • filepath ใฏ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
    • pos ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๅˆๆœŸไฝ็ฝฎ๏ผˆx, y๏ผ‰ใงใ™ใ€‚
    • vxy ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใฎ็งปๅ‹•้€Ÿๅบฆ๏ผˆvx, vy๏ผ‰ใงใ™ใ€‚
    • angle ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๅ›ž่ปข่ง’ๅบฆใงใ™๏ผˆใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฏ0๏ผ‰ใ€‚
  • self.image ใซ็”ปๅƒใ‚’่ชญใฟ่พผใฟใ€ๅฟ…่ฆใซๅฟœใ˜ใฆๅ›ž่ปขใ•ใ›ใพใ™ใ€‚

็Ÿฉๅฝขใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎไฝœๆˆ

        x, y = pos
        vx, vy = vxy
        w = self.image.get_width()
        h = self.image.get_height()
        self.rect = Rect(x, y, w, h)
  • pos ใ‹ใ‚‰ไฝ็ฝฎใ‚’ใ€vxy ใ‹ใ‚‰้€Ÿๅบฆใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚
  • ็”ปๅƒใฎๅน… (w) ใจ้ซ˜ใ• (h) ใ‚’ๅ–ๅพ—ใ—ใ€Rect ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ—ใพใ™ใ€‚Rect ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใจใ‚ตใ‚คใ‚บใ‚’็ฎก็†ใ—ใพใ™ใ€‚

็งปๅ‹•้€Ÿๅบฆใจ่ง’ๅบฆใฎ่จญๅฎš

        self.vx = vx
        self.vy = vy
        self.angle = angle
  • ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎ็งปๅ‹•้€Ÿๅบฆ (vx, vy) ใจๅ›ž่ปข่ง’ๅบฆ (angle) ใ‚’่จญๅฎšใ—ใพใ™ใ€‚

ๆ›ดๆ–ฐใƒกใ‚ฝใƒƒใƒ‰

    def update(self):
        self.rect.move_ip(self.vx, self.vy)
        if self.rect.left < 0 or self.rect.right > SCREEN.width:
            self.vx = -self.vx
        if self.rect.top < 0 or self.rect.bottom > SCREEN.height:
            self.vy = -self.vy
        self.rect = self.rect.clamp(SCREEN)
  • update ใƒกใ‚ฝใƒƒใƒ‰ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚
    • move_ip ใƒกใ‚ฝใƒƒใƒ‰ใงใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • ใ‚นใƒ—ใƒฉใ‚คใƒˆใŒ็”ป้ขใฎ็ซฏใซ้”ใ—ใŸๅ ดๅˆใ€้€Ÿๅบฆใฎ็ฌฆๅทใ‚’ๅ่ปขใ•ใ›ใฆ่ทณใญ่ฟ”ใ‚Šใพใ™ใ€‚
    • clamp ใƒกใ‚ฝใƒƒใƒ‰ใงใ‚นใƒ—ใƒฉใ‚คใƒˆใŒ็”ป้ขๅค–ใซๅ‡บใชใ„ใ‚ˆใ†ใซใ—ใพใ™ใ€‚

ๆ็”ปใƒกใ‚ฝใƒƒใƒ‰

    def draw(self, screen):
        screen.blit(self.image, self.rect)
  • draw ใƒกใ‚ฝใƒƒใƒ‰ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’็”ป้ขใซๆ็”ปใ—ใพใ™ใ€‚
    • screen.blit ใƒกใ‚ฝใƒƒใƒ‰ใง็”ปๅƒใ‚’ๆŒ‡ๅฎšใ•ใ‚ŒใŸไฝ็ฝฎ (self.rect) ใซๆ็”ปใ—ใพใ™ใ€‚

ใƒกใ‚คใƒณ้–ขๆ•ฐ

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN.size)

    # ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝœๆˆ
    girl1 = Girl(GIRL1_IMG_PATH,(200, 200), (2, 0), 0)
    girl2 = Girl(GIRL2_IMG_PATH,(200, 200), (0, 2), -20)
    girl3 = Girl(GIRL3_IMG_PATH,(200, 200), (2, 3), 0)
    girl4 = Girl(GIRL4_IMG_PATH,(200, 200), (1, 2), 20)
    girl5 = Girl(GIRL5_IMG_PATH,(200, 200), (2, 1), 0)

    clock = pygame.time.Clock()
    running = True

    while running:
        clock.tick(30)
        screen.fill((0, 20, 0)) 

        # ๅ„ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐ
        girl1.update()
        girl2.update()
        girl3.update()
        girl4.update()
        girl5.update()

        # ๅ„ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ็”ป
        girl1.draw(screen)
        girl2.draw(screen)
        girl3.draw(screen)
        girl4.draw(screen)
        girl5.draw(screen)

        pygame.display.update()

        # ใ‚คใƒ™ใƒณใƒˆๅ‡ฆ็†
        for event in pygame.event.get():
            if event.type == QUIT: 
                running = False
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:   
                    running = False

if __name__ == "__main__":
    main()
  • main้–ขๆ•ฐใงPygameใ‚’ๅˆๆœŸๅŒ–ใ—ใ€็”ป้ขใ‚’่จญๅฎšใ—ใพใ™ใ€‚
  • Girlใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’ไฝœๆˆใ—ใ€ใใ‚Œใžใ‚Œ็•ฐใชใ‚‹็”ปๅƒใ€ไฝ็ฝฎใ€้€Ÿๅบฆใ€่ง’ๅบฆใ‚’่จญๅฎšใ—ใพใ™ใ€‚
  • ใƒกใ‚คใƒณใƒซใƒผใƒ—ๅ†…ใงใƒ•ใƒฌใƒผใƒ ใƒฌใƒผใƒˆใ‚’่จญๅฎšใ—ใ€็”ป้ขใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚
  • updateใƒกใ‚ฝใƒƒใƒ‰ใงๅ„ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใ€drawใƒกใ‚ฝใƒƒใƒ‰ใง็”ป้ขใซๆ็”ปใ—ใพใ™ใ€‚
  • ใ‚คใƒ™ใƒณใƒˆๅ‡ฆ็†ใงใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ้–‰ใ˜ใ‚‹ใƒœใ‚ฟใƒณใ‚„Escใ‚ญใƒผใŒๆŠผใ•ใ‚ŒใŸๅ ดๅˆใซใƒซใƒผใƒ—ใ‚’็ต‚ไบ†ใ—ใพใ™ใ€‚

ใ€2ใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎใ‚ฐใƒซใƒผใƒ—ๅŒ–

ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ™ใ‚‹ใจใ€่ค‡ๆ•ฐใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅŠน็އ็š„ใซ็ฎก็†ใงใใพใ™ใ€‚
ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ™ใ‚‹ๆ–นๆณ•ใฏใ„ใใคใ‹ใ‚ใ‚Šใพใ™ใŒใ€ไปŠๅ›žใฏpygame.sprite.RenderUpdates()ใ‚’ไฝฟใ†ๆ–นๆณ•ใ‚’่งฃ่ชฌใ—ใพใ™ใ€‚
pygame.sprite.RenderUpdates()ใฏใ€Pygameใงใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ็”ปใ‚’ๅŠน็އ็š„ใซ็ฎก็†ใ™ใ‚‹ใŸใ‚ใฎใ‚ฏใƒฉใ‚นใงใ™ใ€‚ใ“ใฎใ‚ฏใƒฉใ‚นใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐใจๆ็”ปใ‚’่กŒใ†้š›ใซใ€ๅค‰ๆ›ดใ•ใ‚ŒใŸ้ƒจๅˆ†ใ ใ‘ใ‚’ๅ†ๆ็”ปใ™ใ‚‹ใ“ใจใงใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚’ๅ‘ไธŠใ•ใ›ใพใ™ใ€‚

ๅŸบๆœฌ็š„ใชไฝฟใ„ๆ–น

  1. ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎไฝœๆˆ
    group = pygame.sprite.RenderUpdates()
    
    • RenderUpdatesใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ใ“ใฎใ‚ฐใƒซใƒผใƒ—ใซใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใงใ€ๅŠน็އ็š„ใชๆ็”ปใŒๅฏ่ƒฝใซใชใ‚Šใพใ™ใ€‚
  2. ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎ่ฟฝๅŠ 
    group.add(sprite)
    
    • ไฝœๆˆใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚่ค‡ๆ•ฐใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ไธ€ๅบฆใซ่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚
  3. ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐ
    group.update()
    
    • ใ‚ฐใƒซใƒผใƒ—ๅ†…ใฎใ™ในใฆใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚„็Šถๆ…‹ใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚ๅ„ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎupdateใƒกใ‚ฝใƒƒใƒ‰ใŒๅ‘ผใณๅ‡บใ•ใ‚Œใพใ™ใ€‚
  4. ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ็”ป
    dirty_rects = group.draw(screen)
    pygame.display.update(dirty_rects)
    
    • ใ‚ฐใƒซใƒผใƒ—ๅ†…ใฎใ™ในใฆใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’็”ป้ขใซๆ็”ปใ—ใ€ๅค‰ๆ›ดใ•ใ‚ŒใŸ้ ˜ๅŸŸ๏ผˆ็Ÿฉๅฝข๏ผ‰ใฎใƒชใ‚นใƒˆใ‚’่ฟ”ใ—ใพใ™ใ€‚ใ“ใฎใƒชใ‚นใƒˆใ‚’ไฝฟใฃใฆใ€็”ป้ขใฎๆ›ดๆ–ฐใ‚’ๅŠน็އ็š„ใซ่กŒใ„ใพใ™ใ€‚ ใ“ใฎๆ‰‹ๆณ•ใฏใ€็”ป้ขๆ›ดๆ–ฐๆ™‚ใ€ๅ…จไฝ“ใ‚’ๆใๆ›ใˆใšใซใ‚นใƒ—ใƒฉใ‚คใƒˆใŒๆ›ดๆ–ฐใ•ใ‚ŒใŸไธ€้ƒจๅˆ†ใ ใ‚’ๆใๆ›ใˆใ‚‹ใ“ใจใงใƒ‘ใƒ•ใ‚ฉใƒผใƒžใƒณใ‚นใ‚’ๅ‘ไธŠใ•ใ›ใพใ™ใ€‚ๅ…จไฝ“ใ‚’ๆ›ธใๆ›ใˆใŸใ„ๅ ดๅˆใฏใ€Œpygame.display.update()ใ€ใจใ—ใพใ™๏ผˆdirty_rectsใ‚’ไธŽใˆใชใ„๏ผ‰ใ€‚

ใ€2-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ก

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ ใ‚’pygame.sprite.RenderUpdates()ใงใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ™ใ‚‹ใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚


ใ€2-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใฎ่งฃ่ชฌ

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ ใจ็•ฐใชใ‚‹้ƒจๅˆ†ใฎใฟ่งฃ่ชฌใ—ใพใ™ใ€‚

ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎไฝœๆˆใจ่ฟฝๅŠ 

    group = pygame.sprite.RenderUpdates()
    group.add(girl1)
    group.add(girl2)
    group.add(girl3)
    group.add(girl4)
    group.add(girl5)
  • pygame.sprite.RenderUpdates()๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’็ฎก็†ใ™ใ‚‹ใ‚ฐใƒซใƒผใƒ—ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚
  • group.add(...)๏ผšไฝœๆˆใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚

ใƒกใ‚คใƒณใƒซใƒผใƒ—

    running = True

    while running:
        clock.tick(30)
        screen.fill((0, 20, 0)) 
        group.update()
        # ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’ๆ็”ป
        dirty_rects = group.draw(screen)

        # ็”ป้ขๆ›ดๆ–ฐ
        pygame.display.update(dirty_rects)
  • group.update()๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚
  • group.draw(screen)๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’็”ป้ขใซๆ็”ปใ—ใพใ™ใ€‚ๅค‰ๆ•ฐdirty_rectsใซใฏใ€ๅค‰ๆ›ดใ•ใ‚ŒใŸ้ ˜ๅŸŸ๏ผˆ็Ÿฉๅฝข๏ผ‰ใฎใƒชใ‚นใƒˆใŒๆ ผ็ดใ•ใ‚Œใพใ™ใ€‚
  • ใƒชใ‚นใƒˆdirty_rectsใ‚’pygame.display.updateใซๆธกใ—ใ€ๅค‰ๆ›ดใ•ใ‚ŒใŸ้ƒจๅˆ†ใ ใ‘ใ‚’ๅ†ๆ็”ปใ™ใ‚‹ใ“ใจใงใ€็”ป้ขใฎๆ›ดๆ–ฐใ‚’ๅŠน็އ็š„ใซ่กŒใ„ใพใ™ใ€‚

ใ€3-1ใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎใ‚ฐใƒซใƒผใƒ—ๅŒ– ใใฎ2

Pygameใงใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ™ใ‚‹ใจใใ€pygame.sprite.Sprite.__init__(self, self.containers)ใ‚’ไฝฟใ†ๆ–นๆณ•ใŒใ‚ใ‚Šใพใ™ใ€‚
ใ“ใ‚Œใฏใ€Pygameใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฏใƒฉใ‚นใฎๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ใซใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใŒๆ‰€ๅฑžใ™ใ‚‹ใ‚ฐใƒซใƒผใƒ—ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใŸใ‚ใฎใ‚‚ใฎใงใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ไฝœๆˆใ™ใ‚‹้š›ใซ่‡ชๅ‹•็š„ใซๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ•ใ‚Œใพใ™
ใ“ใฎๆ–นๆณ•ใฎใƒกใƒชใƒƒใƒˆใฏไปฅไธ‹ใฎใจใŠใ‚Šใงใ™ใ€‚

  • ใ‚ณใƒผใƒ‰ใฎ็ฐกๆฝ”ๅŒ–๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ไฝœๆˆใ™ใ‚‹ใŸใณใซgroup.add(…)`ใงใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ™ใ‚‹ๅฟ…่ฆใŒใชใใชใ‚Šใพใ™ใ€‚
  • ไธ€่ฒซๆ€งใฎ็ขบไฟ๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใŒๅธธใซๆŒ‡ๅฎšใ•ใ‚ŒใŸใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ•ใ‚Œใ‚‹ใŸใ‚ใ€็ฎก็†ใŒๅฎนๆ˜“ใซใชใ‚Šใพใ™ใ€‚

ใ€3-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ข

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใ‚’pygame.sprite.Sprite.__init__(self, self.containers)ใงใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใ‚ฐใƒซใƒผใƒ—ๅŒ–ใ™ใ‚‹ใจไปฅไธ‹ใฎใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚


ใ€3-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ขใฎ่งฃ่ชฌ

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใจใฎๅค‰ๆ›ด็ฎ‡ๆ‰€ใ‚’่งฃ่ชฌใ—ใพใ™ใ€‚

1. ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๅˆๆœŸๅŒ–

Girlใ‚ฏใƒฉใ‚นใฎๅˆๆœŸใƒกใ‚ฝใƒƒใƒ‰ใฎไปฅไธ‹ใฎ็ฎ‡ๆ‰€ใงใ™ใ€‚

pygame.sprite.Sprite.__init__(self, self.containers)
  • pygame.sprite.Sprite.__init__(self, self.containers)ใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฏใƒฉใ‚นใฎ่ฆชใ‚ฏใƒฉใ‚นใงใ‚ใ‚‹pygame.sprite.SpriteใฎๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ—ใพใ™ใ€‚
  • self.containersใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใŒๆ‰€ๅฑžใ™ใ‚‹ใ‚ฐใƒซใƒผใƒ—ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใŸใ‚ใฎๅผ•ๆ•ฐใงใ™ใ€‚ใ“ใฎๅผ•ๆ•ฐใซใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—๏ผˆไพ‹ใˆใฐpygame.sprite.Groupใ‚„pygame.sprite.RenderUpdates๏ผ‰ใŒๆธกใ•ใ‚Œใพใ™ใ€‚

2. ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎ่จญๅฎš

# ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎไฝœๆˆ
girl_group = pygame.sprite.RenderUpdates()

# Girlใ‚ฏใƒฉใ‚นใซใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹
Girl.containers = girl_group
  • girl_group = pygame.sprite.RenderUpdates()๏ผšใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚
  • Girl.containers = girl_group๏ผšGirlใ‚ฏใƒฉใ‚นใฎcontainersๅฑžๆ€งใซใ€ไฝœๆˆใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—(girl_group)ใ‚’ๅ‰ฒใ‚Šๅฝ“ใฆใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€Girlใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใŒไฝœๆˆใ•ใ‚Œใ‚‹ใจใ€่‡ชๅ‹•็š„ใซใ“ใฎใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ•ใ‚Œใพใ™ใ€‚

3. ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝœๆˆใจ่ฟฝๅŠ 

girl1 = Girl(GIRL1_IMG_PATH, (200, 200), (2, 0), 0)
  • girl1 = Girl(GIRL1_IMG_PATH, (200, 200), (2, 0), 0)๏ผšGirlใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’ไฝœๆˆใ—ใพใ™ใ€‚ใ“ใฎใจใใ€__init__ใƒกใ‚ฝใƒƒใƒ‰ๅ†…ใงpygame.sprite.Sprite.__init__(self, self.containers)ใŒๅ‘ผใณๅ‡บใ•ใ‚Œใ€girl1ใฏ่‡ชๅ‹•็š„ใซgirl_groupใซ่ฟฝๅŠ ใ•ใ‚Œใพใ™ใ€‚

Pygameใงใ‚นใƒ—ใƒฉใ‚คใƒˆๅŒๅฃซใฎ่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Šใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ๆ–นๆณ•ใ‚’ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ไป˜ใใง่ฉณใ—ใ่งฃ่ชฌใ—ใพใ™ใ€‚

ใ€4ใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆๅŒๅฃซใฎ่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Š

ไปŠใฎใพใพใ ใจใ€็”ปๅƒใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆๅŒๅฃซใฎ่ก็ชๆ™‚ใ€ใใฎใพใพใ™ใ‚ŠๆŠœใ‘ใฆใ—ใพใ„ใพใ™ใ€‚
Pygameใงใฏใ€self.rect.colliderect ใ‚’ไฝฟใฃใฆใ‚นใƒ—ใƒฉใ‚คใƒˆๅŒๅฃซใฎ่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Šใ‚’ๅฎŸ่ฃ…ใงใใพใ™ใ€‚

self.rect.colliderect(other_rect) ใฏใ€2ใคใฎ็Ÿฉๅฝข๏ผˆRect ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆ๏ผ‰ใŒ่ก็ชใ—ใฆใ„ใ‚‹ใ‹ใฉใ†ใ‹ใ‚’ๅˆคๅฎšใ™ใ‚‹ใƒกใ‚ฝใƒƒใƒ‰ใงใ™ใ€‚
่ก็ชใ—ใฆใ„ใ‚‹ๅ ดๅˆใฏ True ใ‚’่ฟ”ใ—ใ€ใใ†ใงใชใ„ๅ ดๅˆใฏ False ใ‚’่ฟ”ใ—ใพใ™ใ€‚

ใ€4-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ฃ

5ใคใฎ็”ปๅƒใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใŒ่ก็ชใ—ใŸใ‚‰่ทณใญ่ฟ”ใ‚‹ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰ใงใ™ใ€‚


ใ€4-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ฃใฎ่งฃ่ชฌ

ไธŠ่จ˜ใ‚ณใƒผใƒ‰ใฎใ†ใกใ€่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Šใ‚’ๅฎŸ่ฃ…ใ—ใฆใ„ใ‚‹้ƒจๅˆ†ใฏไปฅไธ‹ใฎใจใŠใ‚Šใงใ™ใ€‚

def update(self):
    self.rect.move_ip(self.vx, self.vy)
    if self.rect.left < 0 or self.rect.right > SCREEN.width:
        self.vx = -self.vx
    if self.rect.top < 0 or self.rect.bottom > SCREEN.height:
        self.vy = -self.vy
    self.rect = self.rect.clamp(SCREEN)

    for sprite in self.containers:
        if sprite != self and self.rect.colliderect(sprite.rect):
            self.vx = -self.vx
            self.vy = -self.vy
  • update ใƒกใ‚ฝใƒƒใƒ‰ใงใฏใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใ€็”ป้ขใฎ็ซฏใซ้”ใ—ใŸๅ ดๅˆใ‚„ไป–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใจ่ก็ชใ—ใŸๅ ดๅˆใซ้€Ÿๅบฆใ‚’ๅ่ปขใ•ใ›ใพใ™ใ€‚ใคใพใ‚Šใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใฏ็”ป้ขใฎ็ซฏใ‚„ไป–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใซ่ก็ชใ™ใ‚‹ใจ่ทณใญ่ฟ”ใ‚‹ๅ‹•ใใ‚’ใ—ใพใ™ใ€‚
  • self.rect.move_ip(self.vx, self.vy):ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚’็พๅœจใฎ้€Ÿๅบฆ๏ผˆvx, vy๏ผ‰ใซๅŸบใฅใ„ใฆๆ›ดๆ–ฐใ—ใพใ™ใ€‚
  • if self.rect.left < 0 or self.rect.right > SCREEN.width:
    • ใ‚นใƒ—ใƒฉใ‚คใƒˆใŒ็”ป้ขใฎๅทฆ็ซฏใพใŸใฏๅณ็ซฏใซ้”ใ—ใŸๅ ดๅˆใ€vxใฎ็ฌฆๅทใ‚’ๅ่ปขใ•ใ›ใฆๅๅฐ„ใ•ใ›ใพใ™ใ€‚
  • if self.rect.top < 0 or self.rect.bottom > SCREEN.height:
    • ใ‚นใƒ—ใƒฉใ‚คใƒˆใŒ็”ป้ขใฎไธŠ็ซฏใพใŸใฏไธ‹็ซฏใซ้”ใ—ใŸๅ ดๅˆใ€vyใฎ็ฌฆๅทใ‚’ๅ่ปขใ•ใ›ใฆๅๅฐ„ใ•ใ›ใพใ™ใ€‚
  • self.rect = self.rect.clamp(SCREEN):
    • ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใ‚’็”ป้ขๅ†…ใซๅˆถ้™ใ—ใพใ™ใ€‚
  • ไป–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใจใฎ่ก็ชๅ‡ฆ็†:
    • for sprite in self.containers:ใงๅŒใ˜ใ‚ณใƒณใƒ†ใƒŠๅ†…ใฎไป–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใƒซใƒผใƒ—ใ—ใพใ™ใ€‚ใคใพใ‚Šใ€ self.containers ๅ†…ใฎไป–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ใƒซใƒผใƒ—ใ—ใ€่‡ชๅˆ†่‡ช่บซไปฅๅค–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใจ่ก็ชใ—ใฆใ„ใ‚‹ใ‹ใ‚’ self.rect.colliderect(sprite.rect) ใงๅˆคๅฎšใ—ใพใ™ใ€‚
    • if sprite != self and self.rect.colliderect(sprite.rect):่‡ชๅˆ†่‡ช่บซไปฅๅค–ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใจ่ก็ชใ—ใŸๅ ดๅˆใ€vxใจvyใฎ็ฌฆๅทใ‚’ๅ่ปขใ•ใ›ใฆๅๅฐ„ใ•ใ›ใพใ™ใ€‚
ใ€Pygameใ€‘ใ‚นใƒ—ใƒฉใ‚คใƒˆๅŒๅฃซใฎ่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Šใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ๆ–นๆณ•
Pygameใงใ‚นใƒ—ใƒฉใ‚คใƒˆๅŒๅฃซใฎ่ก็ชๅˆคๅฎšใจ่ทณใญ่ฟ”ใ‚Šใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ๆ–นๆณ•ใ‚’ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ไป˜ใใง่ฉณใ—ใ่งฃ่ชฌใ—ใพใ™ใ€‚

้–ข้€ฃใƒšใƒผใ‚ธ

Pygameใฎไฝฟใ„ๆ–นใซใคใ„ใฆใฏไปฅไธ‹ใƒšใƒผใ‚ธใง่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

ใ€Pygame่ถ…ๅ…ฅ้–€ใ€‘ไฝฟใ„ๆ–นใจใ‚ตใƒณใƒ—ใƒซใ‚ฒใƒผใƒ ใ‚’่งฃ่ชฌ
Pygameใง2Dใ‚ฒใƒผใƒ ใ‚’็ฐกๅ˜ใซๅˆถไฝœใ™ใ‚‹ๆ–นๆณ•ใ‚’ๅ…ฅ้–€่€…ๅ‘ใ‘ใซ่งฃ่ชฌใ—ใพใ™ใ€‚

Pythonๅ…จ่ˆฌใซใคใ„ใฆใฏไปฅไธ‹ใƒšใƒผใ‚ธใง่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

ใ€Python่ถ…ๅ…ฅ้–€ใ€‘ไฝฟใ„ๆ–นใจใ‚ตใƒณใƒ—ใƒซ้›†
Pythonใฎไฝฟใ„ๆ–นใซใคใ„ใฆใ€ๅŸบ็คŽๆ–‡ๆณ•ใ‹ใ‚‰ๅฟœ็”จไพ‹ใพใงๅ…ฅ้–€่€…ๅ‘ใ‘ใซ่งฃ่ชฌใ—ใพใ™ใ€‚
ใ“ใฎ่จ˜ไบ‹ใ‚’ๆ›ธใ„ใŸไบบ
่ฅฟไฝๆŠ€็ ”

Pythonไฝฟ็”จๆญด10ๅนดไปฅไธŠใ€‚็ ”็ฉถใ€ไป•ไบ‹ใ€่ถฃๅ‘ณใงใƒ‡ใƒผใ‚ฟๅˆ†ๆžใ‚„ไฝœๆฅญ่‡ชๅ‹•ๅŒ–ใชใฉใซๆดป็”จใ—ใฆใใŸใƒŽใ‚ฆใƒใ‚ฆใ‚’ๆƒ…ๅ ฑ็™บไฟกใ—ใฆใ„ใพใ™ใ€‚
่ฉณใ—ใ„ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใ‚„ใŠๅ•ๅˆใ›ใฏใ“ใกใ‚‰ใฎใƒšใƒผใ‚ธใพใงใ€‚
โ‡“Youtubeใ‚„X๏ผˆๆ—งTwitter๏ผ‰ใงใ‚‚ๆƒ…ๅ ฑ็™บไฟกไธญใงใ™๏ผ

่ฅฟไฝๆŠ€็ ”ใ‚’ใƒ•ใ‚ฉใƒญใƒผใ™ใ‚‹
PyGame

ใ‚ณใƒกใƒณใƒˆ

  1. ๅŒฟๅ ใ‚ˆใ‚Š:

    11่กŒ็›ฎใฎใจใ“ใ‚ใŒๆง‹ๆ–‡ใŒ้•ใ†ใจ่ฟ”ใ•ใ‚Œใพใ™ใ€‚

    • ็ฎก็†ไบบ ใ‚ˆใ‚Š:

      โ€ปๅŒฟๅๆง˜
      ใ‚ณใƒกใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
      Python3ใ ใจใ‚จใƒฉใƒผใŒๅ‡บใ‚‹ใ‚ˆใ†ใชใฎใงไฟฎๆญฃใ„ใŸใ—ใพใ—ใŸใ€‚

  2. ๅŒฟๅ ใ‚ˆใ‚Š:

    ๅค‰ๆ›ดใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
    ๅค‰ๆ›ดใ—ใŸใ‚ใจใฎใ‚‚ใฎใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจไธ‹ใฎใ‚จใƒฉใƒผใŒ่ตทใใพใ™ใ€‚
    ‘Sprite’ object has no attribute ‘img’
    ใ“ใ‚Œใฏpyhotn3ใซใฏใชใ„ใฎใงใ—ใ‚‡ใ†ใ‹๏ผŸ

    • ็ฎก็†ไบบ ใ‚ˆใ‚Š:

      โ€ปๅŒฟๅๆง˜
      ใ‚ณใƒกใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
      ๅฝ“ๆ–นใฎ็’ฐๅขƒใงใ‚‚ๅŒๆง˜ใฎใ‚จใƒฉใƒผใŒๅ‡บใพใ—ใŸใฎใงไฟฎๆญฃ่‡ดใ—ใพใ—ใŸใ€‚