見た目

【Pygame Zero】キャラクターにモザイクを入れてみよう

ratch2025
ラッチ先生
ラッチ先生
スック
スック

スックです。よろしくね!

今回のプロジェクトは、こちら!
ラッチ先生
ラッチ先生

今回のプロジェクトには、
boonボーンの他に 矢印、星が 登場します。

基礎プログラムと 画像を入れた
「見た目05 boonボーンを ねらえ!No.3」zipフォルダを ダウンロードしてください

pythonしよう!見た目05:ボーン・矢印を表示する
pythonしよう!見た目05:boonをねらえ!No.3zipの中身
スック
スック

この基礎プログラムは、こちらの記事で解説しています

参考記事
【Pygame Zero】スクリーンに画像を 表示させる
【Pygame Zero】スクリーンに画像を 表示させる
スポンサーリンク

回転する矢印を クリックすると 星が 飛ぶ

1秒ごと 矢印に触れない所で 表示する

星に当たると モザイクが かかって 消える

pythonしよう!見た目05:星に当たるとモザイクがかかって消える

スペースキーを押すと 再び boonが動き出す

プログラムを 実行してみよう

ラッチ先生
ラッチ先生

今回の「boonボーンを ねらえ!No.3」ゲームでは、
・ 星が 飛び出す
boonボーンが ランダムな場所へ 移る
boonボーン に モザイクをかける
プログラムが あります

そこで、3つのモジュールを 用意しました

pythonしよう!見た目05:pgzhelperモジュールの解説
pythonしよう!見た目05:randomモジュールの解説
pythonしよう!見た目05:visualモジュールの解説
スック
スック

モジュールとは、
関数やプログラムが書かれているファイルのことだよ

ラッチ先生
ラッチ先生

今回のプログラミングには、ポイントが 3つあります

pythonしよう!見た目05:ポイント1の解説
スック
スック

これで、変数boonボーンに「 . (ドット)」を付ければ 使えるよ

pythonしよう!見た目05:ポイント2の解説
スック
スック

processプロセス_animationアニメーション( )メゾットは、
アニメーション終了時に キャラクターを非表示にするよ

pythonしよう!見た目05:ポイント3の解説
スック
スック

それぞれの動きが わかりやすくなるよ

pythonしよう!見た目05:ポイント4の解説
スック
スック

両方 2つに 分けたよ

ラッチ先生
ラッチ先生

最初に、
矢印を動かすプログラムを 作りましょう

Python
star_state = "ready"  #1 変数star_state(状態) 初期値:"ready(準備)"
arrow_direction = 1   #2 変数arrow_direction(方向)初期値:1
Python
def arrow_move():            #3 矢印の動きをまとめる
    global arrow_direction   #4 グローバル変数:arrow_state

    if star_state == "ready":           #5 もし 変数star_stateが"ready"なら
        arrow.angle += arrow_direction  #6 矢印の向きを 変数arrow_directionずつ 増やす
        if arrow.angle > 90 or arrow.angle < 0: #7 もし 矢印の向きが90度より大きく、また、0度より小さいなら
            arrow_direction = -arrow_direction  #8 変数arrow_directionに -1×arrow_directionを代入する
Python
def update():    #9 更新する
    arrow_move() #10 矢印を動かす
pythonしよう!見た目05:update()関数の解説
スック
スック

updateアップデート()関数に
arrowアロー_moveムーヴ() 関数を 入れることによって 矢印が 動くからね

ラッチ先生
ラッチ先生

次は、
defデフ onオン_mouseマウス_downダウン(posポス) 関数を使って、
矢印を クリックしたら 星が 飛び出すプログラムを作るよ

pythonしよう!見た目05:on_mouse_down()関数の解説
Python
def on_mouse_down(pos):  #1 マウスがクリックしたpos(座標)を取得する
    global star_state    #2 グローバル変数: arrow_state

    if star_state == "ready" and arrow.collidepoint_pixel(pos): #3 もし 変数star_stateが "ready" かつ 矢印を クリックしたら 
        star.angle = arrow.angle  #4 矢印の向きを 星の向きに 代入する
        star.move_forward(60)     #5 星を 60px前に出す
        star_state = "shoot"      #6 変数star_stateを "shoot(発射)"にする

ポイント

pythonしよう!見た目05:collidepoint_pixel()メゾットの解説
スック
スック

へぇ~、クリックすると
星は、矢印の前に 出てくるんだ

ラッチ先生
ラッチ先生

Actorアクター( )クラスになるプロパティ:visibleビジブル を使って
発射する前は 星を非表示にしよう

pythonしよう!見た目05:visibleプロパティの解説
Python
star.visible = False   #1 星を 非表示にする
Python
def draw():
    screen.fill("white")
    boon.draw()  
    arrow.draw()
    if star.visible:   #2 もし 星が表示なら
        star.draw()    #3 星を 表示する
Python
def star_move():       #4 星の動きをまとめる
    global star_state  #5 グローバル変数 star_state

    if star_state == "shoot":  #6 もし変数star_stateが "shoot(発射)なら
        star.visible = True    #7 星を 表示する
        star.move_forward(30)  #8 30pxずつ 動かす

        if star.x > WIDTH or star.y < 0:  #9 もし 星が端より先へ行ったら
            star.pos = 100, 500  #10 星の座標を 100, 500
            star.visible = False #11 星を 非表示にする
            star_state = "ready" #12 変数star_stateを "ready"にする
Python
def update(): 
    arrow_move() 
    star_move()  #13 星を 動かす
スック
スック

星が 発射できるようになったね!

ラッチ先生
ラッチ先生

scheduleスケジュール_intervalインターバル( ) メゾットを使って
1秒ごと boonボーンをランダムに決めた場所へ 表示されるよ

pythonしよう!見た目05:schedule_interval()メゾットの解説
pythonしよう!見た目05:while文の解説
スック
スック

boonボーンの最初の場所は、決まっているの
狙われるよ

ラッチ先生
ラッチ先生

そうだね。
最初の座標もランダムに決められた場所にしよう!

ただし、矢印に触れられない 範囲にするよ

Python
boon = Actor("boon", (random.randint(200, WIDTH-50), random.randint(50, HEIGHT-50))) 
スック
スック

最初だけ、boonボーンを表示する 範囲を 決めたよ

ラッチ先生
ラッチ先生

boonボーンに モザイクを かけるのに
VisualEffectビジュアルエフェクト( )を使います

Python
boon = VisualEffect("boon", (random.randint(200, WIDTH-50), random.randint(50, HEIGHT-50)))  #1 変数boonに ビジュアルエフェクト(設計図)で作るboonを 代入する
Python
def draw():
    screen.fill("white")
    boon.draw(screen)   #2 スクリーンに boonを 表示する
    arrow.draw()
    if star.visible: 
        star.draw()
pythonしよう!見た目05:ポイント1の解説
ラッチ先生
ラッチ先生

星に触れたら、
mozaicモザイク_animationアニメーション( ) メゾットと使って、
boonボーンに モザイクを かけていくよ

pythonしよう!見た目05:ポイント2の解説
Python
def star_move(): 
    global star_state 

    if star_state == "shoot": 
        star.visible = True 
        star.move_forward(30) 

        if star.x > WIDTH or star.y < 0: 
            star.pos = 100, 500 
            star.visible = False 
            star_state = "ready" 

        elif star.collide_pixel(boon):  #1 もし 星が boonに 触れたら
            clock.unschedule(boon_move) #2 boon_move()関数を 止める
            boon.mozaic_animation()     #3 モザイクアニメーションを 開始する
Python
def update(): 
    global boon_state 
    arrow_move() 
    star_move() 
    result = boon.process_animation()  #4 アニメーションを 実行する
    if result == "finished": #5 変数result(結果)が、finished(終了) なら
        boon_state = "reset" #6 変数boon_stateに reset(リセット)を代入する
pythonしよう!見た目05:unschedule()メゾットの解説
pythonしよう!見た目05:mozaic_animation()メゾットの解説
pythonしよう!見た目05:process_animation()メゾットの解説
ラッチ先生
ラッチ先生

モザイクをかける速さを変えたい場合は、
3つのプロパティを使って調整できます。

スック
スック

ピクセルの増加量で モザイクになっていく速さが 変わるよ

スック
スック

animationアニメーション_speedスピードは、数字が大きくなると 遅くなるよ

スック
スック

モザイクの途中で 止めることが できるよ

みんなも いろいろ試してみてね

ラッチ先生
ラッチ先生

最後に、
onオン_keyキー_downダウン(keyキー)関数を使って
スペースキーを押したら、リセットされて動き出すプログラムを
作るよ

Python
def on_key_down(key):  #1 押されたキーを 取得する
    global boon_state  #2 グローバル変数:boon_state

    if boon_state == "reset" and key == keys.SPACE: #3 もし 変数が"reset" かつ スペースキーが 押されたら
        boon.reset_effects()   #4 boonを リセット(元に戻す)する
        boon.x = random.randint(200, WIDTH-50) #5 boonのx座標を 200~750からランダムに 決める
        boon.y = random.randint(50, HEIGHT-50) #6 boonのy座標を 50~540からランダムに 決める
        boon_state = "move"  #7 変数boon_stateに "move"を代入する
        clock.schedule_interval(boon_move, 1.0)  #8 boon_move関数を 1秒後ごとに 実行する
スック
スック

これで、今回の学習は終了! おつかれさま

ラッチ先生
ラッチ先生

今回は、
boonボーンに 当てると モザイクがかかる的当てゲームの
プログラムを 作りました。

boonを ねらえ!No.3
Python
import pgzrun
from pgzhelper import *
from visual import VisualEffect
import random

WIDTH = 800
HEIGHT = 590

boon = VisualEffect("boon", (random.randint(200, WIDTH-50), random.randint(50, HEIGHT-50))) 
arrow = Actor("arrow", (100, 500))
star = Actor("star", (100, 500))

star_state = "ready" 
arrow_direction = 1 
star.visible = False 
boon_state = "move" 

def draw():
    screen.fill("white")
    boon.draw(screen)  
    arrow.draw()
    if star.visible: 
        star.draw()

def arrow_move(): 
    global arrow_direction 

    if star_state == "ready": 
        arrow.angle += arrow_direction 

        if arrow.angle > 90 or arrow.angle < 0: 
            arrow_direction = -arrow_direction

def on_mouse_down(pos): 
    global star_state 

    if star_state == "ready" and arrow.collidepoint_pixel(pos): 
        star.angle = arrow.angle 
        star.move_forward(60) 
        star_state = "shoot" 

def star_move(): 
    global star_state 

    if star_state == "shoot": 
        star.visible = True 
        star.move_forward(30) 

        if star.x > WIDTH or star.y < 0: 
            star.pos = 100, 500 
            star.visible = False 
            star_state = "ready" 

        elif star.collide_pixel(boon): 
            clock.unschedule(boon_move) 
            boon.mozaic_animation() 

def boon_move():
    while True: 
        boon.x = random.randint(50, WIDTH-50)
        boon.y = random.randint(50, HEIGHT-50)
        if not boon.collide_pixel(arrow): 
            break 

clock.schedule_interval(boon_move, 1.0)

def update(): 
    global boon_state 
    arrow_move() 
    star_move() 
    result = boon.process_animation() 
    if result == "finished": 
        boon_state = "reset" 

def on_key_down(key): 
    global boon_state 

    if boon_state == "reset" and key == keys.SPACE: 
        boon.reset_effects()  
        boon.x = random.randint(200, WIDTH-50) 
        boon.y = random.randint(50, HEIGHT-50)
        boon_state = "move" 
        clock.schedule_interval(boon_move, 1.0) 

pgzrun.go()
ラッチ先生
ラッチ先生

キャラクターの見た目を 変えるVisualEffectビジュアルエフェクト( )を使って、
boonボーンに モザイクをかけるプログラムを作りました。

pythonしよう!見た目05:visualモジュールの解説
ラッチ先生
ラッチ先生

キャラクターにモザイクをかけるプログラムを作る手順です。

pythonしよう!見た目05:ポイント1の解説
pythonしよう!見た目05:ポイント2の解説
ラッチ先生
ラッチ先生

モザイクをかけるアニメーションの変更は、
この3つのプロパティで 行おう

スック
スック

みんなも試してみてね
それじゃ、またね!

スポンサーリンク
ABOUT ME
ラッチ先生
ラッチ先生
こんにちは!
「Pythonしよう!楽しく学べるプログラミング教室」の学長、ラッチです。

scratchのように楽しく学べるPython講座です。
・図やアニメーションを使って、わかりやすく楽しく学べる!
・毎回の授業が新しい発見の連続!
・プログラミングの考え方が身につき、自分のやりたいことが形にできるように。

この3点をモットーにサイトを立ち上げました。 よろしくお願いします
記事URLをコピーしました