課題11-1 指定された正方形に収まるように画像をスケールする #
難易度 ⭐
fit_to_square 関数を作成してください。第1引数に画像(img)を受け取り、第2引数に長さ(len)を整数型で受け取ってください。
長さは与えられなければ、100が与えられたものとしてください。
関数の中では、img を len×lenの正方形に内接しつつ、縦横比を維持した画像に変換して返してください。
そして、スケール前後の画像を両方とも画面に表示してください。
ファイル名は fit_to_square.py としてください。
画像はコマンドライン引数の1つ目で、長さはコマンドライン引数の2つ目で指定してください。
import pygame as pg
import sys
def fit_to_square(...):
(w, h) = # 元の画像の大きさを取得する。
if w == 0 or h == 0 or length <= 0:
return img
scale = # 倍率を求める。
new_size = # 倍率をもとに変換後の画像サイズを求める。
return pg.transform.scale(img, new_size)
# 1. ゲームの準備をする。
pg.init()
screen = pg.display.set_mode((800, 600))
orig = pg.image.load(sys.argv[1]) # 画像をロードする。
length = 100 # スケール後の画像の大きさ
if len(sys.argv) == 3: # 大きさがコマンドライン引数で指定されていれば
length = int(sys.argv[2]) # その大きさを用いる。
img = fit_to_square(orig, length) # 指定の大きさにスケールした画像を得る。
# 2. メインループ
while True:
# 2-1 画面を初期化する。
screen.fill(pg.Color("WHITE"))
# 2-3. 絵を描いたり、判定したりする。
screen.blit(orig, (10, 10)) # 元の画像を描画する。
screen.blit(img, (10 + orig.get_width() + 10, 10)) # 元の画像の横に変換後の画像を描画する。
# 2-4. 画面を表示する。
pg.display.update()
# 2-5. 閉じるボタンが押されたら終了する。
for event in pg.event.get(): # イベント一覧を取得して、各イベントを調べる。
if event.type == pg.QUIT: # もし、閉じるボタンが押されたら。
pg.quit() # PyGame を終了する。これだけではウィンドウは閉じない。
sys.exit() # ウィンドウを閉じて、プログラムを終了する。
課題11-2 指定された長方形に収まるように画像をスケールする #
難易度 ⭐⭐
fit_to_rect 関数を作成してください。第1引数に画像(img)を受け取り、第2引数に長方形の大きさをタプル(size)で受け取ってください。
長方形の大きさは与えられなければ、(100, 100) が与えられたものとしてください。
関数の中では、img を size の長方形に内接しつつ、縦横比を維持した画像に変換して返してください。
そして、スケール前後の画像を両方とも画面に表示してください。
ファイル名は fit_to_rect.py としてください。
画像はコマンドライン引数の1つ目で、長方形の幅、高さはコマンドライン引数の2つ目、3つ目で指定してください。
import pygame as pg
import sys
def fit_to_rect(...):
(w, h) = # 元の画像の大きさを取得する。
(size_width, size_height) = # 指定のスケールの大きさを取得する。
if w == 0 or h == 0 or size_width <= 0 or size_height <= 0:
return img
scale = # 倍率を求める。
new_size = # 倍率をもとに変換後の画像サイズを求める。
return pg.transform.scale(img, new_size)
# 1. ゲームの準備をする。
pg.init()
screen = pg.display.set_mode((800, 600))
orig = pg.image.load(sys.argv[1]) # 画像をロードする。
want_size = (100, 100) # スケール後の画像の大きさ
if len(sys.argv) == 4: # 大きさがコマンドライン引数で指定されていれば
want_size = (int(sys.argv[2]), int(sys.argv[3])) # その大きさを用いる。
img = fit_to_rect(orig, want_size) # 指定の大きさにスケールした画像を得る。
# 2. メインループ
while True:
# 2-1 画面を初期化する。
screen.fill(pg.Color("WHITE"))
# 2-3. 絵を描いたり、判定したりする。
screen.blit(orig, (10, 10)) # 元の画像を描画する。
screen.blit(img, (10 + orig.get_width() + 10, 10)) # 元の画像の横に変換後の画像を描画する。
# 2-4. 画面を表示する。
pg.display.update()
# 2-5. 閉じるボタンが押されたら終了する。
for event in pg.event.get(): # イベント一覧を取得して、各イベントを調べる。
if event.type == pg.QUIT: # もし、閉じるボタンが押されたら。
pg.quit() # PyGame を終了する。これだけではウィンドウは閉じない。
sys.exit() # ウィンドウを閉じて、プログラムを終了する。
課題11-3 例題7の改良 #
難易度 ⭐⭐
例題7. キャラクタを動かすに対して、以下の改良を加えましょう。
h,j,k,lでも左、下、上、右に動かせるようにしよう。- シフトキーを押すと、早く動くようにしよう(5倍)。
- 右マウスクリックした位置に即座に移動(ワープ)できるようにしよう。