Python3でPygame入門:チャプター2

はじめに

こんにちは。バイトの片山です。

いつも「パート1」とかやってるくせに「パート2」までなかなかいかない僕の記事ですが、今回はなぜかモチベーションが続いております。

もしかしたら「パート〜」というタイトルをやめて「チャプター〜」にしたのが良かったのかもしれないし、「ねね●ちになりたい!」という情熱が僕を突き動かすのかもしれません。実は仕事がなくて「帰れ!」と言われたのでとりあえず記事書いてバイト代を稼ごうと思っただけです。

さて、本題に入りますが、前回に引き続いてPython3とPygameを使ってねねっ●の高みを目指したいと思います。

なお、前回と同じくこちらのサイトを参考にさせて頂いております。

ね●っち〜

Pygame入門

前回は、ボタン電池を誤飲しそうな赤ちゃんが動くものを作るところまでいきました。

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys

def main():
    pygame.init() # 初期化
    (w, h) = (500, 637)
    (x, y) = (w/2, h/2)
    pygame.display.set_mode((w, h), 0, 32)
    screen = pygame.display.get_surface()
    pygame.display.set_caption("Pygame Test") # ウィンドウの上の方に出てくるアレの指定
    bg = pygame.image.load("pygame_test.jpg").convert_alpha() # 背景画像の指定
    rect_bg = bg.get_rect() # 画像のサイズ取得??だと思われる
    player = pygame.image.load("baby.png").convert_alpha() # キャラ画像の指定
    rect_player = player.get_rect() # 謎
    rect_player.center = (x, y) # キャラ座標

    while(True):
        screen.fill((0, 0, 0, 0)) # 背景色の指定。RGBのはず
        screen.blit(bg, rect_bg) # 背景画像の描画
        screen.blit(player, rect_player) # キャラの描画
        pygame.time.wait(10) # 更新間隔。多分ミリ秒
        pygame.display.update() # 画面更新
        x += 1 # 画面更新毎にx座標を+1
        y += 1 # 画面更新毎にy座標を+1
        rect_player.center = (x, y)
        if x > w: # 端まで来たら座標を0にリセット
            x = 0
        if y > h: # 同上
            y = 0

        for event in pygame.event.get(): # 終了処理
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()

if __name__ == "__main__":
    main()

↓イメージGIF
sake

はみ出たら座標をリセットするという単純なものでした。シュールです。

せっかくなので、ウィンドウをはみ出たら跳ね返るようにしてみようと思います。

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
import random

def main():
    pygame.init() # 初期化
    (w, h) = (500, 637)
    (x, y) = (random.randint(0, w), random.randint(0, h))
    speed_x = random.randint(-10, 10) 
    speed_y = random.randint(-10, 10)    
    pygame.display.set_mode((w, h), 0, 32)
    screen = pygame.display.get_surface()
    pygame.display.set_caption("Pygame Test") # ウィンドウの上の方に出てくるアレの指定
    bg = pygame.image.load("pygame_test.jpg").convert_alpha() # 背景画像の指定
    rect_bg = bg.get_rect() # 画像のサイズ取得??だと思われる
    player = pygame.image.load("baby.png").convert_alpha() # キャラ画像の指定
    rect_player = player.get_rect() # 謎
    rect_player.center = (x, y) # キャラ座標

    while(True):
        screen.fill((0, 0, 0, 0)) # 背景色の指定。RGBのはず
        screen.blit(bg, rect_bg) # 背景画像の描画
        screen.blit(player, rect_player) # キャラの描画
        pygame.time.wait(10) # 更新間隔。多分ミリ秒
        pygame.display.update() # 画面更新
        x += speed_x
        y += speed_y
        if x > w or x < 0: # はみ出たら移動方向を反転
            speed_x *= -1
        if y > h or y < 0: # 同上
            speed_y *= -1
        rect_player.center = (x, y)            

        for event in pygame.event.get(): # 終了処理
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()

if __name__ == "__main__":
    main()

↓イメージGIF
sake

ボタン電池を誤飲しそうな赤ちゃんが跳ね返ってます。


そろそろキー操作でキャラクターを動かしたくなってきました。

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
import random

def main():
    pygame.init() # 初期化
    (w, h) = (500, 637)
    (x, y) = (random.randint(0, w), random.randint(0, h))   
    pygame.display.set_mode((w, h), 0, 32)
    screen = pygame.display.get_surface()
    pygame.display.set_caption("Pygame Test") # ウィンドウの上の方に出てくるアレの指定
    bg = pygame.image.load("pygame_test.jpg").convert_alpha() # 背景画像の指定
    rect_bg = bg.get_rect() # 画像のサイズ取得??だと思われる
    player = pygame.image.load("baby.png").convert_alpha() # キャラ画像の指定
    rect_player = player.get_rect() # 謎
    rect_player.center = (x, y) # キャラ座標

    while(True):
        pygame.time.wait(10) # 更新間隔。多分ミリ秒       
        screen.fill((0, 0, 0, 0)) # 背景色の指定。RGBのはず
        screen.blit(bg, rect_bg) # 背景画像の描画
        screen.blit(player, rect_player) # キャラの描画
        pygame.display.update() # 画面更新
        if x > w:
            x = w
        if x < 0:
            x = 0
        if y > h:
            y = h
        if y < 0:
            y = 0

        rect_player.center = (x, y)            

        for event in pygame.event.get(): # 終了処理
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                if event.key == K_LEFT:
                    x -= 10
                if event.key == K_RIGHT:
                    x += 10
                if event.key == K_UP:
                    y -= 10
                if event.key == K_DOWN:
                    y += 10

if __name__ == "__main__":
    main()

十字キーを押すと赤ちゃんが動きます。が、ホールドで動かないのでとても不便です。

ということで、キー長押しでも反応するように改造します。

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import sys
import random

def main():
    pygame.init() # 初期化
    (w, h) = (500, 637)
    (x, y) = (random.randint(0, w), random.randint(0, h))   
    pygame.display.set_mode((w, h), 0, 32)
    screen = pygame.display.get_surface()
    pygame.display.set_caption("Pygame Test") # ウィンドウの上の方に出てくるアレの指定
    bg = pygame.image.load("pygame_test.jpg").convert_alpha() # 背景画像の指定
    rect_bg = bg.get_rect() # 画像のサイズ取得??だと思われる
    player = pygame.image.load("baby.png").convert_alpha() # キャラ画像の指定
    rect_player = player.get_rect() # 謎
    rect_player.center = (x, y) # キャラ座標

    while(True):
        pressed_key = pygame.key.get_pressed()
        if pressed_key[K_LEFT]:
            rect_player.move_ip(-1, 0)
        if pressed_key[K_RIGHT]:
            rect_player.move_ip(1, 0)
        if pressed_key[K_UP]:
            rect_player.move_ip(0, -1)
        if pressed_key[K_DOWN]:
            rect_player.move_ip(0, 1)        
        if x > w:
            x = w
        if x < 0:
            x = 0
        if y > h:
            y = h
        if y < 0:
            y = 0
        screen.fill((0, 0, 0, 0)) # 背景色の指定。RGBのはず
        screen.blit(bg, rect_bg) # 背景画像の描画
        screen.blit(player, rect_player) # キャラの描画           
#       rect_player.center = (x, y) # こいつをちゃんと消しとく
        pygame.display.update() # 画面更新                
        pygame.time.wait(10) # 更新間隔。多分ミリ秒

        for event in pygame.event.get(): # 終了処理
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()

if __name__ == "__main__":
    main()

rect_player.centerのところをコメントアウトしたり消しておいたりしないと位置がリセットされてしまって動けませんので、間違っても入れないようにしましょう。筆者は最初それに気づかずにヒンヒン泣いていました。〜.move_ip()がよしなにやってくれるみたいです。

なんとなくゲームっぽい感じになってきました。多分。

おわりに

ソースコード貼り付けまくってたらなんだかんだで結構長くなってしまいましたのでここで一度区切りにしたいと思います。

関連記事

Python3でPygame入門:チャプター1

用務員バイトの日記:Pygameで遊んでみる

未経験大学生によるPython入門日誌-第1話

未経験大学生によるPython入門日誌-第2話

未経験大学生によるPython入門日誌-第3話

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

Yuki.K

1995年生まれ。慶應大学SFCに在学中。 夢も希望もなくキャンパスを彷徨っていたところ、夢と希望いっぱいのBPS村に引きずり込まれてしまった大学生アルバイト。 雑用担当

Yuki.Kの書いた記事

開発
LinuxでTidalCyclesを動かす

2017年10月03日

関連する記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ