Scratchでは、スプライトの「回転方法を左右のみにする」を設定できます。 この設定にすると、スプライトが画面の端で跳ね返ったときに、上下が逆さまにならず、 左右に向きを変えて表示されます。たとえば、キャラクターが右向きに進んで画面の端にぶつかると、 今度は左向きになって戻ってきます。走る人や動物などを自然に動かしたいときに便利な設定です。

Scratch での動き
Arcadeでは、スプライトの左右の向きを scale_x で切り替えることができます。
self.player_sprite.scale_x = -1
とすると右向きに、
self.player_sprite.scale_x = 1
とすると左向きになります。また、左右の壁をスプライトとして用意します。
self.wallR_sprite
self.wallL_sprite
そして、プレイヤーが壁にぶつかったかどうかは、collides_with_sprite() を使って判定します。
self.player_sprite.collides_with_sprite(self.wallR_sprite)
self.player_sprite.collides_with_sprite(self.wallL_sprite)
Arcade での動き
このように、「壁をスプライトとして用意する」→「ぶつかったかを判定する」→「scale_x で向きを変える」 という方法で、Scratchの「端で跳ね返る」動きをArcadeで再現できます。
import arcade
# MyGame クラスの定義 ---
class MyGame(arcade.Window):
def __init__(self, width, height, title):
# 親クラスの初期化関数をコールする
super().__init__(width, height, title)
# 背景色
arcade.set_background_color(arcade.color.SKY_BLUE)
# 魚の初期化
image_source = ":resources:/images/enemies/fishGreen.png"
self.player_sprite = arcade.Sprite(image_source, 1.0)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 128
self.player_sprite.angle = 0
self.player_sprite.change_x=2 # 右へ進む
self.player_sprite.scale_x = -1.0 # 右を向く
self.player_list = arcade.SpriteList()
self.player_list.append(self.player_sprite)
# 左右の壁を作る
wall = ":resources:/images/tiles/boxCrate.png"
self.wallR_sprite = arcade.Sprite(wall, 1.0)
self.wallR_sprite.center_x = 680
self.wallR_sprite.center_y = 240
self.wallR_sprite.scale_y = 4.0
self.player_list.append(self.wallR_sprite)
self.wallL_sprite = arcade.Sprite(wall, 1.0)
self.wallL_sprite.center_x = -40
self.wallL_sprite.center_y = 240
self.wallL_sprite.scale_y = 4.0
self.player_list.append(self.wallL_sprite)
# 1秒間に60回、この関数が呼び出され再描画します。
def on_draw(self):
self.clear()
self.player_list.draw() # スプライトの再描画
def on_update(self, delta_time):
self.player_sprite.update() # 位置をアップデートする
if self.player_sprite.collides_with_sprite(self.wallR_sprite): #右の壁にぶつかった
self.player_sprite.change_x=-2 # 左へ進む
self.player_sprite.scale_x = 1.0 # 左を向く
if self.player_sprite.collides_with_sprite(self.wallL_sprite): #左の壁にぶつかった
self.player_sprite.change_x= 2 # 右へ進む
self.player_sprite.scale_x = -1.0 # 右を向く
# --- クラスの定義終わり
# MyGame を作成
mywindow = MyGame(640, 480, "MyGame Example")
arcade.run()
PCのキーボードが押されたときに何かを実行する場合は、on_key_press(self, key, modifiers)を使います。 ここでは、スペースバーが押されたら、プレイヤーのスプライトをジャンプさせるために、Y方向の移動距離を 「4」に設定しています。さらに、スプライトの画像をジャンプに変更しています。 次にplayer_sprite.update()が実行されると、 この移動距離に従ってスプライトが上方向へ移動し、ジャンプします。
on_update(self, delta_time)の中で、スプライトが最高到達点にとどいたかを判定し、もし届いた時には スプライトの画像をフォールに変更し、Y方向の移動距離を「-3」に設定しています。 さらに、スプライトが下り切って元の位置までくると、スプライトの画像を通常状態に戻し Y方向の移動距離を「0」に設定しています。
import arcade
# MyGame クラスの定義 ---
class MyGame(arcade.Window):
def __init__(self, width, height, title):
# 親クラスの初期化関数をコールする
super().__init__(width, height, title)
# 背景色
arcade.set_background_color(arcade.color.SKY_BLUE)
self.dest= [0,0] # 目的地
# スプライトの初期化
image_source = ":resources:/images/animated_characters/female_person/femalePerson_idle.png"
self.player_sprite = arcade.Sprite(image_source, 0.8)
self.player_sprite.center_x = 64
self.player_sprite.center_y = 80
self.player_sprite.angle = 0
# 通常状態/ジャンプ中/降下中の3つのスプライトを準備する
self.texture_idel = arcade.load_texture(":resources:/images/animated_characters/female_person/femalePerson_idle.png")
self.texture_jump = arcade.load_texture(":resources:/images/animated_characters/female_person/femalePerson_jump.png")
self.texture_fall = arcade.load_texture(":resources:/images/animated_characters/female_person/femalePerson_fall.png")
# 「リスト」はスプライトを管理するためのものです。スプライトは、いずれかのリストに入れる必要があります。
self.player_list = arcade.SpriteList()
self.player_list.append(self.player_sprite)
# 1秒間に60回、この関数が呼び出され再描画します。
def on_draw(self):
self.clear()
arcade.draw_lrbt_rectangle_filled(0, 640, 0, 60, arcade.csscolor.GREEN)
self.player_list.draw() # スプライトの再描画
# 1秒間に60回、この関数が呼び出されます。
def on_update(self, delta_time):
self.player_sprite.update() # 位置をアップデートする
# 一番上に到達したか?
if(self.player_sprite.center_y>280):
self.player_sprite.texture = self.texture_fall
self.player_sprite.change_y= -3
# 降りたきったか?
if(self.player_sprite.center_y<80):
self.player_sprite.center_y = 80
self.player_sprite.texture = self.texture_idel
self.player_sprite.change_y= 0
# もし、スペースバーが押されたらジャンプする
def on_key_press(self, key, modifiers):
if key == arcade.key.SPACE:
self.player_sprite.texture = self.texture_jump
self.player_sprite.change_y= 4
# --- クラスの定義終わり
# MyGame を作成
mywindow = MyGame(640, 480, "MyGame Example")
arcade.run()