Ваш код не работает, потому что вы всегда проверяете ключи в newchicken
, когда вы повторяете baddies
, хотя я думаю, что вы должны проверить b
.
Но вместо этого вы должны сделать следующее:изменить свой код таким образом, чтобы отделить различные логические проблемы вашей игры.Кроме того, просто используйте класс вместо dict
для группировки данных и поведения, которые принадлежат друг другу.
Давайте немного подумаем:
У нас есть какая-то сущность, которая в основном состоитиз трех вещей: изображение, положение и поведение.Вы уже знаете это, потому что вы создали эти диктовки:
newchicken = {'rect':pygame.Rect(100,600,45,63),
'surface':pygame.transform.scale(enemyImage,(45,63)),
'diagonal2': "diagonal2"
}
Давайте немного подправим это и используем Sprite
(действительно, прочитайте документы), в котором уже есть эти вещи(более менее).Наш класс класса может выглядеть так (и не говорите мне, что вы не хотите использовать классы. Это глупо, ИМХО, поскольку вы уже используете десятки классов):
class Animal(pg.sprite.Sprite):
def __init__(self, color, pos, logic, *groups):
super().__init__(*groups)
self.image = pg.surface.Surface((40, 40))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
self.logic = logic
self.direction = pg.Vector2((0, 0))
def update(self):
self.logic(self)
Итак, у нас есть image
(который является простым прямоугольником, поэтому в конце мы имеем рабочую игру, которую каждый может скопировать / вставить и запустить), rect
, который хранит позицию, таинственный аргумент logic
, который является функцией ("AI")«нашего животного), который будет называться каждый тик, и direction
, который определяет, в каком направлении будет идти животное.
Итак, давайте создадим реальную логику, которая будет перемещать животных.Мы создаем три функции, одну для вертикального перемещения, одну для горизонтального перемещения и одну, которая всегда будет двигаться к курсору мыши:
def move_vertical(animal):
if animal.direction.length() == 0:
animal.direction = pg.Vector2(5, 0)
animal.rect.move_ip(*animal.direction)
if not screen_rect.contains(animal.rect):
animal.direction *= -1
animal.rect.move_ip(animal.direction)
def move_horizontal(animal):
if animal.direction.length() == 0:
animal.direction = pg.Vector2(0, 5)
animal.rect.move_ip(*animal.direction)
if not screen_rect.contains(animal.rect):
animal.direction *= -1
animal.rect.move_ip(animal.direction)
def move_to_mouse(animal):
pos = pg.mouse.get_pos()
v = pg.Vector2(pos) - pg.Vector2(animal.rect.center)
if v.length() > 0:
v.normalize_ip()
v *= 5
animal.rect.move_ip(*v)
Если мы теперь хотим создать Animal
, мы просто передаем однуиз этих функций для конструктора.Нет необходимости в массивных блоках if / else в вашем основном цикле (обратите внимание, насколько он прост и понятен в конце).
Итак, вот наш последний пример.Обратите внимание, как мы создаем четырех животных: двух, которые движутся вертикально, одного, который движется горизонтально, и одного, который следует за мышью.
import pygame as pg
pg.init()
clock = pg.time.Clock()
running = True
screen = pg.display.set_mode((640, 480))
screen.fill((255, 255, 255))
screen_rect = screen.get_rect()
def move_vertical(animal):
if animal.direction.length() == 0:
animal.direction = pg.Vector2(5, 0)
animal.rect.move_ip(*animal.direction)
if not screen_rect.contains(animal.rect):
animal.direction *= -1
animal.rect.move_ip(animal.direction)
def move_horizontal(animal):
if animal.direction.length() == 0:
animal.direction = pg.Vector2(0, 5)
animal.rect.move_ip(*animal.direction)
if not screen_rect.contains(animal.rect):
animal.direction *= -1
animal.rect.move_ip(animal.direction)
def move_to_mouse(animal):
pos = pg.mouse.get_pos()
v = pg.Vector2(pos) - pg.Vector2(animal.rect.center)
if v.length() > 0:
v.normalize_ip()
v *= 5
animal.rect.move_ip(*v)
class Animal(pg.sprite.Sprite):
def __init__(self, color, pos, logic, *groups):
super().__init__(*groups)
self.image = pg.surface.Surface((40, 40))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
self.logic = logic
self.direction = pg.Vector2((0, 0))
def update(self):
self.logic(self)
sprites = pg.sprite.Group()
Animal(pg.color.Color('yellow'), ( 10, 10), move_vertical, sprites)
Animal(pg.color.Color('red'), (200, 400), move_vertical, sprites)
Animal(pg.color.Color('orange'), (500, 100), move_horizontal, sprites)
Animal(pg.color.Color('brown'), (100, 200), move_to_mouse, sprites)
while running:
for e in pg.event.get():
if e.type == pg.QUIT:
running = False
sprites.update()
screen.fill((255, 255, 255))
sprites.draw(screen)
pg.display.update()
clock.tick(60)
![enter image description here](https://i.stack.imgur.com/KPO3E.gif)