Problem i pygame
Hej Swec!
Ni har hjälpt mig förut. Nu har jag ett både konstigt och svårförklarat problem. Jag kan nog tyvär inte heller isolera problemet till en kodsnutt.
I alla fall, jag ska göra ett försök till förklaring:
Jag har en top down spaceshooter för två spelare. Jag har nu lyckats skapa skott, men det verkar som att update- funktionen aldrig körs i skottobjekten. Detta trots att jag uppdaterar dom på precis samma sätt som objekten player1 och player2.
Spritegrupper skapas och uppdateras i mainloopen:
#---------------Prepare Game Objects------------------------#
playersSprite1 = pygame.sprite.RenderClear()
playersSprite2 = pygame.sprite.RenderClear()
p1 = player1.Player1()
p2 = player2.Player2()
playersSprite1.add( p1 )
playersSprite2.add( p2 )
shot_1 = pygame.sprite.RenderClear()
shot_2 = pygame.sprite.RenderClear()
#test = Shot_1.Shot_p1(100,100,5,5)
#shot_1.add(test)
#----------------------------------------------------------#
#----------------------Main Loop---------------------------#
while 1:
clock.tick(30)
#--Input--#
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit ()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
pygame.quit ()
elif event.key == pygame.K_SPACE:
shot_1.add(Shot_1.Shot_p1( p1.__dict__['x'], p1.__dict__['y'], p1.__dict__['speed'], p1.__dict__['direction'] ) )
elif event.key == pygame.K_q:
shot_2.add( Shot_2.Shot_p2( p2.__dict__['x'], p2.__dict__['y'], p2.__dict__['speed'], p2.__dict__['direction'] ) )
elif event.key == pygame.K_h:
if showhelp == 0:
showhelp = 1
screen.blit(h_background, (0, 0))
elif showhelp == 1:
showhelp = 0
screen.blit(background, (0, 0))
#-----Update all sprites-----#
playersSprite1.update()
playersSprite2.update()
shot_1.update()
shot_2.update()
Utdrag från klassen Shot_1 (typ identisk med shot2):
class Shot_p1(pygame.sprite.Sprite):
def __init__(self,x,y,speed,direction):
pygame.sprite.Sprite.__init__(self) #Initiera masterklassen Sprite
self.image = RecourceLoading.load_image('spr_shot1.png','sprites',-1)
self.rect = self.image.get_rect()
self.original = self.image
self.x = x
self.y = y
self.direction = direction + 90
self.maxSpeed = 9
self.speed = speed + self.maxSpeed
self.xd = 0
self.yd = 0
self.rect.x = self.x
self.rect.y = self.y
self.isdone = 1
print "skott skapas"
update()
def update(self):
print "shot UPDATE"
#Movement, change coordinates
#1:a kvadranten
if self.direction >= 0 and self.direction < 90:
self.xd = math.cos(math.radians(self.direction)) * self.speed
self.yd = -math.sin(math.radians(self.direction)) * self.speed
#2:a kvadranten
if self.direction >= 90 and self.direction < 180:
self.xd = -math.sin(math.radians(self.direction-90)) * self.speed
self.yd = -math.cos(math.radians(self.direction-90)) * self.speed
#3:e kvadranten
if self.direction >= 180 and self.direction < 270:
self.xd = -math.cos(math.radians(self.direction-180)) * self.speed
self.yd = +math.sin(math.radians(self.direction-180)) * self.speed
#4:e kvadranten
if self.direction >= 270 and self.direction < 360:
self.xd = +math.sin(math.radians(self.direction-270)) * self.speed
self.yd = +math.cos(math.radians(self.direction-270)) * self.speed
#Sprite rotation
# if isdone == 1: #needed only to be done once
center = self.rect.center
rotate = pygame.transform.rotate
self.image = rotate(self.original, self.direction)
self.rect = self.image.get_rect(center=center)
# isdone = 1
#Keep direction within one lap, Works!
#if self.direction > 360:
# self.direction = 0
#if self.direction < 0:
# self.direction = 359.999
#Set new x and y values
x+=1
self.x = self.x + self.xd
self.y = self.y + self.yd
self.rect.x = self.x
self.rect.y = self.y
print "x: " + str(self.x) + "xd: " + str(self.xd)
#kill if outside screen
if self.x > 2000 or self.x < -10:
self.kill()
if self.y > 2000 or self.y < -10:
self.kill()
Genom att använda print på olika ställen i koden ahr det visat sig att update inte alls körs i spritesen som ligger i grupperna shot1 och shot2
Vad kan tänkas vara fel?
Tack på förhand!