我在pygame中进行了一次小小的shmup,当敌人被击败时,他们很少有机会在死敌的位置产生一个“buff”物体,然后在随机方向慢慢漂浮。我遇到的问题是当对象在x或y轴上的坐标= 0时,对象将停止在该平面上移动。换句话说,它骑在屏幕的左边缘和顶边缘。但是,如果x或y坐标跳过0并且例如为-1,则它继续在正确的轨迹上。
以下是相关课程:
class Buff(pygame.sprite.Sprite):
def __init__(self,name,origin): ###origin is simply the dead enemy's rect coords
pygame.sprite.Sprite.__init__(self)
self.name = name
if name == "shield":
self.images = [pygame.image.load("p_1.png").convert_alpha(),pygame.image.load("p_2.png").convert_alpha()]
elif name == "health":
self.images = [pygame.image.load("m_1.png").convert_alpha(),pygame.image.load("m_2.png").convert_alpha()]
self.sound = pygame.mixer.Sound("healed.wav")
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.x = origin[0]
self.rect.y = origin[1]
self.index = 0
self.anim = 0
self.angle = random.randrange(0,360) #### direction is set to a random degree
self.rads = math.radians(self.angle) #### converted to radians for funtionality
def Barrier(self,): #### Cleanup
if self.rect.x > DISPLAY[0]: #### DISPLAY is a tuple holding the screen size value (x,y)
return True
if self.rect.x < 0-self.rect[2]:
return True
if self.rect.y > DISPLAY[1]:
return True
if self.rect.y < 0-self.rect[3]:
return True
return False
def update(self,): ####This update function is run every gameloop iteration
if self.Barrier():
buffs.remove(self)
self.anim+=1
if self.anim > 30:
self.anim = 0
self.index+=1
if self.index > 1:
self.index = 0
self.image = self.images[self.index]
###### BELOW IS RELEVANT MOVEMENT CODE #######
self.rect.x+=math.cos(self.rads)*1.2
self.rect.y+=math.sin(self.rads)*1.2
没有外部代码操纵对象的坐标,任何更改都由包含的更新功能处理。我只是不明白为什么一个特定的坐标(在这种情况下为0)可以否定加法。