FIT2-2024b 第04回 簡単なゲーム
前回授業の復習
何ができたか?
b-7-2
https://scrapbox.io/files/67183b234ca63ced11cd4d02.mov
code:python
import pyxel
pyxel.init(200, 200)
x = 0
y = 0
def update():
global x, y
# スペースキーが押されている間だけx,yを更新する
if pyxel.btn(pyxel.KEY_SPACE):
x = pyxel.mouse_x
y = pyxel.mouse_y
def draw():
global x, y
pyxel.cls(7)
pyxel.line(0, 0, x, y, 0)
pyxel.run(update, draw)
大事な要素3つ
1. global x,y gobal宣言について
2 . x = pyxel.mouse_x / pyxel.btn() マウス入力、キー入力
3. pyxel.run() イベントループについて
1. global x,y gobal宣言について
global x,yのコードを削るとエラーになります
理由は以下2つが別物として内部で解釈されるため
インデントの最上位で定義された変数(global変数)
def update (=関数の中)で定義された変数
why: コードが膨大になると関数を多用する => 関数同士で名前衝突が多発するため
2 pyxel.btn キー入力
pyxel.btn … 「キーを押している間ずっとtrueになる」
pyxel.btnp … 「キーを押した瞬間だけtrueになる」
def updateは1/30秒ごとに繰り返し実行されていることに留意
pyxel.btnを利用していると…
ユーザーが実際にスペースを一瞬押しただけのつもりでも、2/30秒以上押してしまうと「2回処理が発生」してしまう
例えば…ボールの向き反転のコード
3. pyxel.run について(=イベントループ)
ゲームの動きをなめらかに実現するための考え方
以下コードでもアニメーションは実現できるが、計算が終わり次第描画されるため「PCが重いとゆっくり動く」「軽いと早く動く」不安定なゲームになってしまう
code:python
import pyxel
pyxel.init(200, 200)
a = 0
while True:
a = a + 1
pyxel.cls(7)
pyxel.circ(a, a, 10, 0)
pyxel.flip()
pyxel.runを利用すれば、update,drawが1/30秒ごとに一定のリズムで実行されるので便利
code:python
import pyxel
a = 0
def update():
global a
a += 1
def draw():
global a
pyxel.circ(a, a, 10, 0)
pyxel.run(update, draw)
本日のゴール
ボールをキャッチする簡単なゲームを作ってもらいます
https://scrapbox.io/files/63587ae062b3ae002254a98c.mov
今回の講義
そろそろ一つ楽をする方法を教えます
pyxel run ファイル名.py を都度terminalに入れてきた
① 情報基礎2の教材ディレクトリに .vscode ディレクトリを作成、中に tasks.json を定義
https://gyazo.com/df196d5106a22f8c8094738b17d0b929
②tasks.jsonの中身を以下の通り定義
code:JSON
{
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "pyxel",
"type": "shell",
"command": "pyxel run ${file}",
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
③cmd+shift+b で実行できます!
windowsの方は ctrl + shift + b で可能
落ちるボールをキャッチするゲームを作ります!
今週の課題
今回もB-9-1まで必須提出
B-9-2は応用問題 (Sを取りたい方)
次回授業で「リスト」を教わればゲームを作るための主要な技術要素は終わり!
そろそろネタぎめを是非進めましょう