今日は「リソースを使わずに背景とスコアの表示」を学びます。
もくじ
今日書いたコード
結果:地面に草原のグラデーション
import pyxel
GAME_TITLE = "TAXI PICUP" #ゲームタイトル。定数を定義する
CAR_ACCEL_X = 0.06 #車の左右移動の加速度
CAR_ACCEL_UP = 0.04 #車の前移動の加速度
CAR_ACCEL_DOWN = 0.02 #車の後ろ移動の加速度
MAX_CAR_SPEED = 0.8 #車の最大速度
OBJECT_SPAWN_INTERVAL = 150 #オブジェクトの出現間隔
class OneKeyGame:
def __init__(self):
#pyxelを初期化する
pyxel.init(160, 120, title=GAME_TITLE)
#リソースファイルを読み込む
pyxel.load("taxi_picup.pyxres") #pyxel.load関数の呼び出し
#ゲームをリセットする
self.is_title = True
self.reset_game()
#アプリの実行を開始する
pyxel.run(self.update, self.draw)
#ゲームをリセットする
def reset_game(self): #ゲームで使う変数を一括で初期化
#得点を初期化する
self.score = 0
#出現タイマーを初期化する
self.timer = 0
#車を初期化する
self.car_x = (pyxel.width - 8) / 2 #X座標
self.car_y = pyxel.height / 4 #Y座標
self.car_vx = 0 #X移動の速度
self.car_vy = 0 #Y移動の速度
self.car_dir = 1 #車の左右の向き(-1:左, +1:右)
self.is_turbo = False #ターボ中かどうか
self.is_exploding = False #爆発中かどうか
#マップの配置を初期化する
self.survivors = [] #客の配置
self.rock = [] #岩の配置
#アプリを更新する
def update(self):
pass
#地面を描画する
def draw_ground(self): #draw_ground関数を追加
num_grads = 10 #グラデーションの数
grad_width = 6 #グラデーションの幅
grad_height = 160
grad_start_x = pyxel.width - grad_width * num_grads #描画開始位置
pyxel.cls(9)
for i in range(num_grads):
pyxel.dither((i + 1) / num_grads) #ディザリングを有効にする
pyxel.rect(
grad_start_x + i * grad_width,
0,
pyxel.width,
grad_height,
11,
)
pyxel.dither(1) #ディザリングを無効にする
#タクシーを描画する
def draw_car(self): #draw_car関数を追加
pyxel.blt( #pyxel.blt関数で画像を描画する
self.car_x,
self.car_y,
0,
8,
0,
8,
8,
0,
)
#スコアを描画する
def draw_score(self): #draw_score関数を追加
score = f"SCORE:{self.score:05}"
for i in range(1, -1, -1):
color = 7 if i == 0 else 0
pyxel.text(3 + i, 3, score, color)
#アプリを描画する
def draw(self):
#画面を描画する
self.draw_ground()
self.draw_car()
self.draw_score()
OneKeyGame()

コードの要点
pyxel.dither関数:ディザリングを設定する。引数はアルファの段階で範囲は0.0~1.0で指定
背景はディザー入りの四角をrange関数を使ってずらしながら複数回描画してグラデーションを表現した
score = f”SCORE:{self.score}”
f-strings(f文字列)と呼ばれる書き方
score変数に代入されてる数字が文字列に反映される
pyxel.text関数:文字を描画する
pyxel.text(x, y, string, color)
x:文字を表示するX座標
y:文字を表示するY座標
string:描画する文字列
color:描画する文字の色番号