


玩家控制的小船:
def play_lives(num_icons, batch=None):
"""
小船图标
:param num_icons: 数量
:param batch: 批处理
:return:
"""
play_lives = []
for i in range(num_icons):
new_sprite = pyglet.sprite.Sprite(img=resources.player_image, x=785 - i * 30, y=585, batch=batch)
new_sprite.scale = 0.5 # 比例
play_lives.append(new_sprite)
return play_lives
运动类physicalobject:
"""运动类physicalobject"""
import pyglet
class Physicalobject(pyglet.sprite.Sprite):
"""
存储对象的速度
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.velocity_x, self.velocity_y = 0.0, 0.0
def update(self, dt):
"""
每个对象都需要在每一帧进行更新
:param dt: “增量时间”或“时间步长”
:return:
"""
self.x += self.velocity_x * dt
self.y += self.velocity_y * dt
self.check_bounds()
def check_bounds(self):
"""对象是否在屏幕一侧出去会移动到屏幕的另一侧"""
min_x = -self.image.width / 2
min_y = -self.image.height / 2
max_x = 800 + self.image.height / 2
max_y = 600 + self.image.height / 2
if self.x < min_x:
self.x = max_x
elif self.x > max_x:
self.x = min_x
if self.y < min_y:
self.y = max_y
elif self.y > max_y:
self.y = min_y
修改小行星让它动:
def asteroids(num_asteroids, play_position, batch=None):
"""
随机位置小行星精灵
:param num_asteroids: 生成小行星数量
:param play_position: 玩家的位置
:param batch 批处理
:return: 返回小行星精灵
"""
asteroids = []
for i in range(num_asteroids):
asteroid_x, asteroid_y = play_position
while distance((asteroid_x, asteroid_y), play_position) < 100:
asteroid_x = random.randint(0, 800)
asteroid_y = random.randint(0, 600)
# new_asteroid = pyglet.sprite.Sprite(img=resources.asteroid_image, x=asteroid_x, y=asteroid_y, batch=batch)
new_asteroid = physicalobject.Physicalobject(img=resources.asteroid_image, x=asteroid_x, y=asteroid_y, batch=batch)
# rotation:Sprite的旋转
new_asteroid.rotation = random.randint(0, 360) # 随机旋转
# 速度
new_asteroid.velocity_x = random.random()*40
new_asteroid.velocity_y = random.random()*40
asteroids.append(new_asteroid)
return asteroids
编写游戏更新功能:
# 游戏对象列表 game_objects = [play_ship] + asteroids
def update(dt):
for obj in game_objects:
obj.update(dt) # 调用Physicalobject的更新
if __name__ == '__main__':
# 每秒调用update函数120次
pyglet.clock.schedule_interval(update, 1 / 120.0)
pyglet.app.run()
运行发现以前静止的小行星在屏幕上平静地漂移,当它们滑出边缘时又重新出现在另一侧。
玩家对象响应键盘输入:player.py
"""键盘输入"""
import math
from let import physicalobject, resources
from pyglet.window import key
class Player(physicalobject.Physicalobject):
"""玩家操控"""
def __init__(self, *args, **kwargs):
super().__init__(img=resources.player_image, *args, **kwargs)
self.thrust = 300.0 # 速度
self.rotate_speed = 200.0 # 角度调整度数
# 按键字典
self.keys = dict(left=False, right=False, up=False)
def on_key_press(self, symbol, modifiers): # 键盘按下
if symbol == key.UP:
self.keys['up'] = True
elif symbol == key.LEFT:
self.keys['left'] = True
elif symbol == key.RIGHT:
self.keys['right'] = True
def on_key_release(self, symbol, modifiers): # 键盘释放
if symbol == key.UP:
self.keys['up'] = False
elif symbol == key.LEFT:
self.keys['left'] = False
elif symbol == key.RIGHT:
self.keys['right'] = False
def update(self, dt):
super(Player, self).update(dt)
if self.keys['left']: # 向左转
self.rotation -= self.rotate_speed * dt # rotation为角度
if self.keys['right']: # 向右转
self.rotation += self.rotate_speed * dt
if self.keys['up']: # 向前行
angle_radians = -math.radians(self.rotation) # 度转换为弧度,radians参数是弧度
force_x = math.cos(angle_radians)*self.thrust*dt
force_y = math.sin(angle_radians)*self.thrust*dt
self.velocity_x += force_x
self.velocity_y += force_y
主函数调用玩家调用:
play_ship = player.Player(x=400, y=300,batch=main_batch)
# 将其推送到事件堆栈中 game_window.push_handlers(play_ship)
现在,能够运行游戏并使用箭头键移动玩家