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()
Вот как можно решить обе проблемы.
Первая проблема заключается в том, что ширина и высота определяются при создании окна (возможно, есть какой-то способ изменить его впоследствии, и я пока не потрудился изучить).
Вторая проблема заключается в том, что вы обновляете self.c
, например, копию self.snake_head.x
. Поэтому, когда вы думаете, что обновляете .x
из self.snake_head
, вы фактически обновляете копию и ничего более.
Код выше работает вокруг этого. Например, он не идеален - нажатия клавиш не будут запускаться / обновляться до заданного интервала. Но это те вещи, над которыми вы, вероятно, работаете после этой проблемы.