使用 Pyglet 和移动设置 window 的分辨率
Setting resolution for a window using Pyglet and moving
我是在 python 中使用 Pyglet 的新手,我的代码有一些问题。首先,我不知道为什么设置分辨率不起作用。其次,当我尝试移动 "snake" 时,它什么也没做。感谢任何帮助。
import pyglet
import random
pyglet.resource.path = ["resources"]
pyglet.resource.reindex()
class Snake_Window(pyglet.window.Window):
def __init__(self):
super(Snake_Window, self).__init__()
self.width = 1280
self.height = 720
# sets the resolution of window
self.key_handler = pyglet.window.key.KeyStateHandler()
self.push_handlers(self.key_handler)
# sets keys
self.set_caption("Wild Snake")
# gives it a name
self.background_image = pyglet.resource.image("background.png")
self.food_image = pyglet.resource.image("food.png")
self.snake_head_image = pyglet.resource.image("snake_head.png")
self.snake_body_image = pyglet.resource.image("snake_body.png")
# makes images usable
self.center_image(self.food_image)
self.center_image(self.snake_head_image)
self.center_image(self.snake_body_image)
# centers the images using center_image
self.snake_head = pyglet.sprite.Sprite(img=self.snake_head_image, x=200, y=200)
self.snake_head.scale = 0.5
self.snake_head.rotation = 180
self.snake_body = pyglet.sprite.Sprite(img=self.snake_body_image, x=400, y=200)
self.snake_body.scale = 0.5
self.snake_body.rotation = 180
self.snake_head.draw()
self.snake_body.draw()
self.food = []
self.c = self.snake_head.x
self.a = self.snake_head.x
self.b = self.snake_head.y
pyglet.clock.schedule_interval(self.game_tick, 1)
def center_image(self, image):
# sets the center of the image to the actual center
image.anchor_x = image.width / 2
image.anchor_y = image.height / 2
def update_snake_head(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.c = self.a
self.c += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.c = self.a
self.c -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.c = self.b
self.c += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.c = self.b
self.c -= 200
else:
print("čau")
def update_snake_body(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.c = self.a
self.c += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.c = self.a
self.c -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.c = self.b
self.c += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.c = self.b
self.c -= 200
else:
print("čau")
def game_tick(self, dt):
self.update_snake_head()
self.update_snake_body()
self.draw_elements()
def draw_elements(self):
self.clear()
self.snake_head.draw()
self.snake_body.draw()
game_window = Snake_Window()
pyglet.app.run()
import pyglet
import random
pyglet.resource.path = ["resources"]
pyglet.resource.reindex()
class Snake_Window(pyglet.window.Window):
def __init__(self):
super(Snake_Window, self).__init__(width=1280, height=720)
# sets the resolution of window
self.key_handler = pyglet.window.key.KeyStateHandler()
self.push_handlers(self.key_handler)
# sets keys
self.set_caption("Wild Snake")
# gives it a name
self.background_image = pyglet.resource.image("background.png")
self.food_image = pyglet.resource.image("food.png")
self.snake_head_image = pyglet.resource.image("snake_head.png")
self.snake_body_image = pyglet.resource.image("snake_body.png")
# makes images usable
self.center_image(self.food_image)
self.center_image(self.snake_head_image)
self.center_image(self.snake_body_image)
# centers the images using center_image
self.snake_head = pyglet.sprite.Sprite(img=self.snake_head_image, x=200, y=200)
self.snake_head.scale = 0.5
self.snake_head.rotation = 180
self.snake_body = pyglet.sprite.Sprite(img=self.snake_body_image, x=400, y=200)
self.snake_body.scale = 0.5
self.snake_body.rotation = 180
self.snake_head.draw()
self.snake_body.draw()
self.food = []
self.snake_head.x = self.snake_head.x
self.snake_head.y = self.snake_head.y
pyglet.clock.schedule_interval(self.game_tick, 1)
def center_image(self, image):
# sets the center of the image to the actual center
image.anchor_x = image.width / 2
image.anchor_y = image.height / 2
def update_snake_head(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.snake_head.x = self.snake_head.y
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.snake_head.x = self.snake_head.y
self.snake_head.x -= 200
else:
print("čau")
def update_snake_body(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.snake_head.x = self.snake_head.y
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.snake_head.x = self.snake_head.y
self.snake_head.x -= 200
else:
print("čau")
def game_tick(self, dt):
self.update_snake_head()
self.update_snake_body()
self.draw_elements()
def draw_elements(self):
self.clear()
self.snake_head.draw()
self.snake_body.draw()
game_window = Snake_Window()
pyglet.app.run()
以下是解决这两个问题的方法。
第一个问题是宽度和高度是在创建 window 时定义的(之后可能还有一些方法可以更改它,我还没有费心学习)。
第二个问题是您更新 self.c
,例如 self.snake_head.x
的副本。因此,当您认为自己正在更新 self.snake_head
的 .x
时,您实际上是在更新副本,仅此而已。
上面的代码解决了这个问题。它并不完美,例如 - 按键不会 trigger/update 直到给定的时间间隔。但这些是您在这个问题之后可能正在处理的事情。
我是在 python 中使用 Pyglet 的新手,我的代码有一些问题。首先,我不知道为什么设置分辨率不起作用。其次,当我尝试移动 "snake" 时,它什么也没做。感谢任何帮助。
import pyglet
import random
pyglet.resource.path = ["resources"]
pyglet.resource.reindex()
class Snake_Window(pyglet.window.Window):
def __init__(self):
super(Snake_Window, self).__init__()
self.width = 1280
self.height = 720
# sets the resolution of window
self.key_handler = pyglet.window.key.KeyStateHandler()
self.push_handlers(self.key_handler)
# sets keys
self.set_caption("Wild Snake")
# gives it a name
self.background_image = pyglet.resource.image("background.png")
self.food_image = pyglet.resource.image("food.png")
self.snake_head_image = pyglet.resource.image("snake_head.png")
self.snake_body_image = pyglet.resource.image("snake_body.png")
# makes images usable
self.center_image(self.food_image)
self.center_image(self.snake_head_image)
self.center_image(self.snake_body_image)
# centers the images using center_image
self.snake_head = pyglet.sprite.Sprite(img=self.snake_head_image, x=200, y=200)
self.snake_head.scale = 0.5
self.snake_head.rotation = 180
self.snake_body = pyglet.sprite.Sprite(img=self.snake_body_image, x=400, y=200)
self.snake_body.scale = 0.5
self.snake_body.rotation = 180
self.snake_head.draw()
self.snake_body.draw()
self.food = []
self.c = self.snake_head.x
self.a = self.snake_head.x
self.b = self.snake_head.y
pyglet.clock.schedule_interval(self.game_tick, 1)
def center_image(self, image):
# sets the center of the image to the actual center
image.anchor_x = image.width / 2
image.anchor_y = image.height / 2
def update_snake_head(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.c = self.a
self.c += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.c = self.a
self.c -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.c = self.b
self.c += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.c = self.b
self.c -= 200
else:
print("čau")
def update_snake_body(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.c = self.a
self.c += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.c = self.a
self.c -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.c = self.b
self.c += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.c = self.b
self.c -= 200
else:
print("čau")
def game_tick(self, dt):
self.update_snake_head()
self.update_snake_body()
self.draw_elements()
def draw_elements(self):
self.clear()
self.snake_head.draw()
self.snake_body.draw()
game_window = Snake_Window()
pyglet.app.run()
import pyglet
import random
pyglet.resource.path = ["resources"]
pyglet.resource.reindex()
class Snake_Window(pyglet.window.Window):
def __init__(self):
super(Snake_Window, self).__init__(width=1280, height=720)
# sets the resolution of window
self.key_handler = pyglet.window.key.KeyStateHandler()
self.push_handlers(self.key_handler)
# sets keys
self.set_caption("Wild Snake")
# gives it a name
self.background_image = pyglet.resource.image("background.png")
self.food_image = pyglet.resource.image("food.png")
self.snake_head_image = pyglet.resource.image("snake_head.png")
self.snake_body_image = pyglet.resource.image("snake_body.png")
# makes images usable
self.center_image(self.food_image)
self.center_image(self.snake_head_image)
self.center_image(self.snake_body_image)
# centers the images using center_image
self.snake_head = pyglet.sprite.Sprite(img=self.snake_head_image, x=200, y=200)
self.snake_head.scale = 0.5
self.snake_head.rotation = 180
self.snake_body = pyglet.sprite.Sprite(img=self.snake_body_image, x=400, y=200)
self.snake_body.scale = 0.5
self.snake_body.rotation = 180
self.snake_head.draw()
self.snake_body.draw()
self.food = []
self.snake_head.x = self.snake_head.x
self.snake_head.y = self.snake_head.y
pyglet.clock.schedule_interval(self.game_tick, 1)
def center_image(self, image):
# sets the center of the image to the actual center
image.anchor_x = image.width / 2
image.anchor_y = image.height / 2
def update_snake_head(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.snake_head.x = self.snake_head.y
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.snake_head.x = self.snake_head.y
self.snake_head.x -= 200
else:
print("čau")
def update_snake_body(self):
if self.key_handler[pyglet.window.key.RIGHT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.LEFT]:
self.snake_head.x = self.snake_head.x
self.snake_head.x -= 200
elif self.key_handler[pyglet.window.key.UP]:
self.snake_head.x = self.snake_head.y
self.snake_head.x += 200
elif self.key_handler[pyglet.window.key.DOWN]:
self.snake_head.x = self.snake_head.y
self.snake_head.x -= 200
else:
print("čau")
def game_tick(self, dt):
self.update_snake_head()
self.update_snake_body()
self.draw_elements()
def draw_elements(self):
self.clear()
self.snake_head.draw()
self.snake_body.draw()
game_window = Snake_Window()
pyglet.app.run()
以下是解决这两个问题的方法。
第一个问题是宽度和高度是在创建 window 时定义的(之后可能还有一些方法可以更改它,我还没有费心学习)。
第二个问题是您更新 self.c
,例如 self.snake_head.x
的副本。因此,当您认为自己正在更新 self.snake_head
的 .x
时,您实际上是在更新副本,仅此而已。
上面的代码解决了这个问题。它并不完美,例如 - 按键不会 trigger/update 直到给定的时间间隔。但这些是您在这个问题之后可能正在处理的事情。