python - Pygame - 防止 Sprite 重叠

标签 python pygame

我正在使用 python 和 pygame 制作一个太空入侵者类型的游戏。目前,我可以使用箭头键沿着底部来回移动我的用户飞船,而我的敌人则在顶部生成并来回移动。我的问题出在敌人身上。我已将其设置为如果它们距离游戏屏幕边缘 100 像素,它们就会开始向另一个方向返回。这会导致重叠,而那些已经达到极限的人已经在返回,而那些没有达到极限的人仍然在原来的方向上。我希望当边缘的敌人达到极限时,所有敌人立即向另一个方向返回,就像太空入侵者一样。我的代码如下。我在敌人下方保持阵型,试图做我想做的事,但它不起作用。谢谢!

from pygame import *

size_x = 900
size_y = 650

class Object:
    def disp(self, screen):
        screen.blit(self.sprite, self.rect)

class User_Ship(Object):
    def __init__(self):
        self.sprite = image.load("mouse.bmp")
        self.rect = self.sprite.get_rect()
        self.rect.centerx = size_x/2
        self.rect.centery = size_y - 40
        self.count = 0
        self.move_x = 0
        self.move_y = 0

    def checkwith(self, otherrect):
        if self.rect.colliderect(otherrect):
            exit()

    def cycle(self):
        self.rect.centerx += self.move_x
        if self.rect.centerx < 100:
            self.rect.centerx = 100
        if self.rect.centerx > size_x - 100:
            self.rect.centerx = size_x - 100

        self.rect.centery += self.move_y
        if self.rect.centery < 0:
            self.rect.centery = 800

    def right(self):
        self.move_x += 10

    def left(self):
        self.move_x -= 10

    def stop_x(self):
        self.move_x = 0

    def stop_y(self):
        self.move_y = 0

    def shoot(self):
        if keys[pygame.K_SPACE]:
            self.Bullet.x = self.rect.centerx
            self.Bullet.y = self.rect.centery
            self.Bullet.speed = 10

class Enemys(Object):
    def __init__(self):
        self.sprite = image.load("ball.bmp")
        self.rect = self.sprite.get_rect()
        self.rect.centerx = size_x/3
        self.rect.centery = 200
        self.mval = -2

    def KeepFormation(self, otherrect):
        if self.rect.colliderect(otherrect):
            self.rect.centerx += 5

    def cycle(self):
        self.rect.centerx += self.mval
        if self.rect.centerx < 100:
            self.mval = 2
        elif self.rect.centerx > (size_x - 100):
            self.mval = -2

class Bullet(Object):
    def __init__(self):
        self.sprite = image.load("missile.png")
        self.rect = self.sprite.get_rect()
        self.rect.centerx = -100
        self.rect.centery = 100
        self.speed = 0

EnemyList = []
for i in range(14):
    EnemyList.append(Enemys())
    EnemyList[i].rect.centerx = (i) * 50
#   EnemyList[i].count = i * 20 

init()
screen = display.set_mode((size_x, size_y))
m = User_Ship()
en = Enemys()
b = Bullet()
clock = time.Clock()

while True:
    for e in event.get():
        if e.type == QUIT:
            quit()
        if e.type == KEYDOWN:
            if e.key == K_RIGHT:
                m.right()
            elif e.key == K_LEFT:
                m.left()
        if e.type == KEYUP:
            if e.key == K_RIGHT or e.key == K_LEFT:
                m.stop_x()

    m.cycle()
    screen.fill((255,255,255))
    for enemy in EnemyList:
        enemy.cycle()
        enemy.disp(screen)
        enemy.KeepFormation(enemy.rect)
    m.disp(screen)
    b.disp(screen)
    display.flip()
    clock.tick(60)  

最佳答案

添加标志

def cycle(self):
    self.rect.centerx += self.mval
    if self.rect.centerx < 100:
        self.mval = 2
        return True # Direction change!
    elif self.rect.centerx > (size_x - 100):
        self.mval = -2
        return True
    return False # no change

但是您只需让此更改发生一次。因此...

done_once = False
for enemy in EnemyList:
    if not done_once:
        change = enemy.cycle()
    if change and not done_once:
        # call the new enemy function that changes every enemy's direction
        done_once = True
    enemy.disp(screen)
    enemy.KeepFormation(enemy.rect)

处理这个标志,以便每个人现在都应该改变方向。您的 Enemy 类中可能需要另一个函数和 Direction_tracking 变量。祝你好运,干得好!

关于python - Pygame - 防止 Sprite 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992540/

相关文章:

python - 在 Python Dulwich 中向远程添加标签/推送标签

python - 数据类与 typing.NamedTuple 主要用例

python - Scrapy无法通过ID选择

python - Pyganim 在 Sidescroller 游戏中的帮助

python - 如何从我单击的点单击并拖动图像,而不是在 python 的中心

python - 如何限制pygame中的 Sprite 列表

python - 使用相同的字典作为各种函数的参数,有些函数的参数较少

python - 多处理模块是否修复了 CPython 多核使用?

python - 如何使用 Moviepy 和 Pygame 播放 mp4 电影

python - PyGame - 无法使用 blit() 调用在屏幕上提供文本