"""
Show how to use acceleration and friction
Artwork from https://kenney.nl
If Python and Arcade are installed, this example can be run from the command line with:
python -m arcade.examples.sprite_move_keyboard_accel
"""
import arcade
SPRITE_SCALING = 0.5
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
SCREEN_TITLE = "Better Move Sprite with Keyboard Example"
# Important constants for this example
# Speed limit
MAX_SPEED = 3.0
# How fast we accelerate
ACCELERATION_RATE = 0.1
# How fast to slow down after we let off the key
FRICTION = 0.02
class Player(arcade.Sprite):
def update(self):
self.center_x += self.change_x
self.center_y += self.change_y
# Check to see if we hit the screen edge
if self.left < 0:
self.left = 0
self.change_x = 0 # Zero x speed
elif self.right > SCREEN_WIDTH - 1:
self.right = SCREEN_WIDTH - 1
self.change_x = 0
if self.bottom < 0:
self.bottom = 0
self.change_y = 0
elif self.top > SCREEN_HEIGHT - 1:
self.top = SCREEN_HEIGHT - 1
self.change_y = 0
class MyGame(arcade.Window):
"""
Main application class.
"""
def __init__(self, width, height, title):
"""
Initializer
"""
# Call the parent class initializer
super().__init__(width, height, title)
# Variables that will hold sprite lists
self.player_list = None
# Set up the player info
self.player_sprite = None
# Track the current state of what key is pressed
self.left_pressed = False
self.right_pressed = False
self.up_pressed = False
self.down_pressed = False
# Set the background color
arcade.set_background_color(arcade.color.AMAZON)
def setup(self):
""" Set up the game and initialize the variables. """
# Sprite lists
self.player_list = arcade.SpriteList()
# Set up the player
self.player_sprite = Player(":resources:images/animated_characters/female_person/femalePerson_idle.png",
SPRITE_SCALING)
self.player_sprite.center_x = 50
self.player_sprite.center_y = 50
self.player_list.append(self.player_sprite)
def on_draw(self):
"""
Render the screen.
"""
# This command has to happen before we start drawing
self.clear()
# Draw all the sprites.
self.player_list.draw()
# Display speed
arcade.draw_text(f"X Speed: {self.player_sprite.change_x:6.3f}", 10, 50, arcade.color.BLACK)
arcade.draw_text(f"Y Speed: {self.player_sprite.change_y:6.3f}", 10, 70, arcade.color.BLACK)
def on_update(self, delta_time):
""" Movement and game logic """
# Add some friction
if self.player_sprite.change_x > FRICTION:
self.player_sprite.change_x -= FRICTION
elif self.player_sprite.change_x < -FRICTION:
self.player_sprite.change_x += FRICTION
else:
self.player_sprite.change_x = 0
if self.player_sprite.change_y > FRICTION:
self.player_sprite.change_y -= FRICTION
elif self.player_sprite.change_y < -FRICTION:
self.player_sprite.change_y += FRICTION
else:
self.player_sprite.change_y = 0
# Apply acceleration based on the keys pressed
if self.up_pressed and not self.down_pressed:
self.player_sprite.change_y += ACCELERATION_RATE
elif self.down_pressed and not self.up_pressed:
self.player_sprite.change_y += -ACCELERATION_RATE
if self.left_pressed and not self.right_pressed:
self.player_sprite.change_x += -ACCELERATION_RATE
elif self.right_pressed and not self.left_pressed:
self.player_sprite.change_x += ACCELERATION_RATE
if self.player_sprite.change_x > MAX_SPEED:
self.player_sprite.change_x = MAX_SPEED
elif self.player_sprite.change_x < -MAX_SPEED:
self.player_sprite.change_x = -MAX_SPEED
if self.player_sprite.change_y > MAX_SPEED:
self.player_sprite.change_y = MAX_SPEED
elif self.player_sprite.change_y < -MAX_SPEED:
self.player_sprite.change_y = -MAX_SPEED
# Call update to move the sprite
# If using a physics engine, call update on it instead of the sprite
# list.
self.player_list.update()
def on_key_press(self, key, modifiers):
"""Called whenever a key is pressed. """
if key == arcade.key.UP:
self.up_pressed = True
elif key == arcade.key.DOWN:
self.down_pressed = True
elif key == arcade.key.LEFT:
self.left_pressed = True
elif key == arcade.key.RIGHT:
self.right_pressed = True
def on_key_release(self, key, modifiers):
"""Called when the user releases a key. """
if key == arcade.key.UP:
self.up_pressed = False
elif key == arcade.key.DOWN:
self.down_pressed = False
elif key == arcade.key.LEFT:
self.left_pressed = False
elif key == arcade.key.RIGHT:
self.right_pressed = False
def main():
""" Main function """
window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
window.setup()
arcade.run()
if __name__ == "__main__":
main()
这段代码是一个使用加速度和摩擦力控制精灵移动的示例。代码中使用了Arcade库来创建游戏窗口和精灵,并在每帧更新精灵的位置和速度。
首先,代码定义了一些常量,包括屏幕的宽度和高度,精灵的缩放比例以及速度和加速度的限定值。
然后,代码定义了一个名为Player的精灵类,继承自Arcade库中的Sprite类。在Player类中,有一个update方法用于更新精灵的位置。在update方法中,精灵的中心坐标根据change_x和change_y属性的值进行更新。
接下来,代码定义了一个名为MyGame的游戏窗口类,继承自Arcade库中的Window类。在MyGame类中,有初始化方法(init)、设置方法(setup)、渲染方法(on_draw)、更新方法(on_update)以及键盘按下和释放的回调方法(on_key_press和on_key_release)。
在初始化方法中,代码设置了背景颜色并创建了精灵列表和一个Player精灵对象。
在设置方法中,代码设置了Player精灵对象的初始位置,并将其添加到精灵列表中。
在渲染方法中,代码首先清空屏幕,然后绘制精灵列表中的所有精灵,并显示精灵的速度。
在更新方法中,代码首先根据摩擦力减小精灵的速度,然后根据加速度更新精灵的速度,并限制速度在一定范围内。最后,调用精灵列表的update方法来移动精灵。
在键盘按下和释放的回调方法中,代码根据按下和释放的键来设置对应的标志位,用于在更新方法中判断按键状态。
最后,代码定义了一个main函数,在函数中创建了一个MyGame对象,并调用其setup方法来初始化游戏,然后调用arcade库的run函数开始游戏循环。
通过运行这段代码,可以得到一个窗口显示精灵,并通过键盘控制精灵的移动。精灵会根据按键的状态以一定的加速度进行移动,并受到速度限制和摩擦力的影响。