'Cannot see bullets when game is running
Hello, so I can only see the bullet when i'm closing my game's window, but I do not see the mistake. import pygame, math, random, os pygame.init() clock = pygame.time.Clock() width = 800 height = 608 screen = pygame.display.set_mode((width, height)) running = True gameover = False levelferdig = False levelnr = 0 ferdig = False jump = False
levels =[[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,8,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,7,0,0,0],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0],
[1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]],
[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[9,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,1],
[0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1],
[0,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1],
[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0],
[0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0],
[0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0],
[0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,1,1]]]
ghostgruppe = pygame.sprite.Group()
tilegruppe = pygame.sprite.Group()
utganggruppe = pygame.sprite.Group()
backgroundgruppe_1 = pygame.sprite.Group()
backgroundgruppe_2 = pygame.sprite.Group()
moving_sprites = pygame.sprite.Group()
spillergruppe = pygame.sprite.Group()
bullet_img = pygame.transform.scale(pygame.image.load(os.path.join('Bullets', 'bullet.png.png')), (10,10))
background_image_2 = pygame.image.load('skog.png').convert()
background_image_1 = pygame.image.load("beach.png").convert()
pygame.display.set_caption('pygame') #setter navnet på spillet når du åpner spillet
icon = pygame.image.load('menneske.png')
pygame.display.set_icon(icon)
font = pygame.font.Font('freesansbold.ttf', 72 ) #font som skal brukes
gameovertekst = font.render('Game over', True, (255,0,0)) #farge og tekst gameover
gameoverrect = gameovertekst.get_rect()
gameoverrect.center = (width/2, height/2)
font = pygame.font.Font('freesansbold.ttf', 72 ) #font som skal brukes
levelferdigtekst = font.render('Ferdig', True, (0,255,0)) #farge og tekst gameover
levelferdigrect = levelferdigtekst.get_rect()
levelferdigrect.center = (width/2, height/2)
ferdigtekst = font.render('Victory', True, (0,0,255))
ferdigrect = levelferdigtekst.get_rect()
ferdigrect.center = (width/2, height/2)
class Spiller(pygame.sprite.Sprite):
def __init__(self,x,y):
super().__init__()
self.spiller_animation = False
self.sprites = []
self.sprites.append(pygame.image.load('spiller.rett(1).png'))
self.sprites.append(pygame.image.load('spiller.høyre(1).png'))
self.sprites.append(pygame.image.load('spiller.venstre(1).png'))
self.sprites.append(pygame.image.load('spiller.hopp(1).png'))
self.current_sprite = 0
self.image = self.sprites[self.current_sprite]
self.rect = self.image.get_rect()
self.rect.topleft =[x,y]
self.bullets = [] #list
self.x = x
self.y = y
self.stepIndex = 0
self.face_right = True
self.face_left = False
self.fy = 10
self.fx = 10
self.jump = False
def direction(self):
if self.face_right:
return 1
if self.face_left:
return -1
def animation(self):
self.spiller_animation = True
def skytt(self):
if trykketliste[pygame.K_RIGHT] and not gameover:
bullet = Bullet(self.x, self.y, self.direction())
self.bullets.append(bullet)
for bullet in self.bullets:
bullet.move()
def reset(self):
self.fartx = 0
self.farty = 0
def update(self,speed):
if self.spiller_animation == True:
self.current_sprite += speed
if int(self.current_sprite) >= len(self.sprites):
self.current_sprite = 0
self.is_animating = False
self.image = self.sprites[int(self.current_sprite)]
self.rect.x += self.fartx
tiletreffliste = pygame.sprite.spritecollide(self,tilegruppe, False)
if tiletreffliste:
if self.fartx > 0:
self.rect.right = tiletreffliste[0].rect.left
else:
self.rect.left = tiletreffliste[0].rect.right
self.rect.y += self.farty
tiletreffliste = pygame.sprite.spritecollide(self, tilegruppe, False)
if tiletreffliste:
if self.farty > 0:
self.rect.bottom = tiletreffliste[0].rect.top
else:
self.rect.top = tiletreffliste[0].rect.bottom
utgangtreffliste = pygame.sprite.spritecollide(self, utganggruppe, False)
if utgangtreffliste:
global levelferdig
levelferdig = True
global levelnr
levelnr += 1
restart()
class Bullet:
def __init__(self,x,y, direction):
super().__init__()
self.x = x + 15
self.y = y + 25
self.direction = direction
def draw_bullet(self):
screen.blit(bullet_img, (self.x, self.y))
def move(self):
if self.direction == 1:
self.x += 15
if self.direction == -1:
self.x -= 15
class Ghost(pygame.sprite.Sprite):
def __init__(self, x, y, fx,fy):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('ghost.png').convert_alpha()
self.rect = self.image.get_rect() #self rect rektangler, fin rektangel bilde som passer
self.rect.x = x
self.rect.y = y
self.fartx = fx
self.farty = fy
def flytt(self):
self.rect.x = self.rect.x + self.fartx
self.rect.y = self.rect.y + self.farty
def update(self):
# Flytter høyre/venstre og sjekker kollisjon
self.rect.x += self.fartx
tiletreffliste = pygame.sprite.spritecollide(self,tilegruppe, False)
if tiletreffliste:
if self.fartx > 0:
self.rect.right = tiletreffliste[0].rect.left
else:
self.rect.left = tiletreffliste[0].rect.right
self.fartx *= -1
self.rect.y += self.farty
tiletreffliste = pygame.sprite.spritecollide(self, spillergruppe, False)
if tiletreffliste:
if self.farty > 0:
self.rect.bottom = tiletreffliste[0].rect.top
else:
self.rect.top = tiletreffliste[0].rect.bottom
self.farty *= -1
def treffTile(self):
if self.rect.x > width or self.rect.x < 0:
self.fartx = self.fartx * -1
if self.rect.y > height or self.rect.y < 0:
self.farty = self.farty * -1
class Tile(pygame.sprite.Sprite):
def __init__(self,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('sand.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
class Utgang(pygame.sprite.Sprite):
def __init__(self,x,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('dør.png')
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
def restart():
global gameover
global levelferdig
gameover = False
levelferdig = False
for tile in tilegruppe:
tile.kill()
for utgang in utganggruppe:
utgang.kill()
for ghost in ghostgruppe:
ghost.kill()
spiller.reset()
for i in range(5): #hvor mange ghosts skal vi ha
ghost = Ghost(random.randint(0,width),random.randint(0, height), random.randint(1,8),random.randint(1,8))
ghostgruppe.add(ghost)
if levelnr < len(levels):
for y,rad in enumerate(levels[levelnr]):
for x,verdi in enumerate(rad):
if verdi == 1:
tile = Tile(x*32,y*32)
tilegruppe.add(tile)
if verdi == 9:
utgang = Utgang(x*32, y*32)
utganggruppe.add(utgang)
if verdi == 8:
spiller.rect.x = x*32
spiller.rect.y = y*32
else:
global ferdig
ferdig = True
#skytt
spiller = Spiller(100, 100)
moving_sprites.add(spiller)
restart()
while running:
pygame.display.bullet()
spiller.farty = 0
spiller.fartx = 0
trykketliste = pygame.key.get_pressed()
spiller.skytt()
background_image_1 = pygame.image.load("beach.png").convert()
screen.blit(background_image_1, [0,0])
if trykketliste[pygame.K_RIGHT] and not gameover:
spiller.farty = -1
spiller.sprites.append(pygame.image.load('spiller.venstre(1).png'))
spiller.animation()
spiller.skytt()
if trykketliste[pygame.K_LEFT] and not gameover:
spiller.farty = 1
spiller.sprites.append(pygame.image.load('spiller.høyre(1).png'))
spiller.animation()
if trykketliste[pygame.K_UP] and not gameover:
spiller.fartx = -1
spiller.animation()
spiller.sprites.append(pygame.image.load('spiller.hopp(1).png'))
if trykketliste[pygame.K_DOWN]and not gameover:
spiller.fartx = 1
spiller.animation()
spiller.sprites.append(pygame.image.load('spiller.rett(1).png'))
if jump is False and trykketliste[pygame.K_SPACE] and not gameover:
jump = True
spiller.animation()
spiller.sprites.append(pygame.image.load('spiller.hopp(1).png'))
if jump is True:
spiller.rect.y -= spiller.farty *4
spiller.farty -= 1
if spiller.farty < -10:
jump = False
spiller.farty = 10
if levelnr == 1:
background_image_1 = pygame.image.load("skog.png").convert()
screen.blit(background_image_2, [0,0])
spillertruffet = pygame.sprite.groupcollide(spillergruppe, ghostgruppe, False, False, pygame.sprite.collide_mask)
if spillertruffet:
gameover = True
ghosttruffet = pygame.sprite.groupcollide(ghostgruppe, spillergruppe, True, True, pygame.sprite.collide_mask)
if ghosttruffet:
spiller.kill()
#Gruppene oppdateres
ghostgruppe.update()
tilegruppe.update()
utganggruppe.update()
spillergruppe.update()
moving_sprites.draw(screen)
moving_sprites.update(0.25)
#gruppene vises på skjermen.
ghostgruppe.draw(screen)
tilegruppe.draw(screen)
utganggruppe.draw(screen)
spillergruppe.draw(screen)
if gameover:
screen.blit(gameovertekst,gameoverrect)
if levelferdig:
screen.blit(levelferdigtekst, levelferdigrect)
spillergruppe.draw(screen)
clock.tick(60)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.K_n:
levelnr = O
restart()
for bullet in spiller.bullets:
bullet.draw_bullet()
pygame.time.delay(30)
pygame.display.flip()
pygame.quit()
Solution 1:[1]
You have to draw the bullets after drawing the background. Use a loop to iterate through the list of bullets and call the draw_bullet method for each bullet:
while running:
# pygame.display.bullet() <--- DELETE
spiller.farty = 0
spiller.fartx = 0
trykketliste = pygame.key.get_pressed()
spiller.skytt()
background_image_1 = pygame.image.load("beach.png").convert()
screen.blit(background_image_1, [0,0])
# INSERT
for bullet in spiller.bullets:
bullet.draw_bullet()
# [...]
pygame.display.update()
# [...]
screen.blit(background_image_1, [0,0]) draws the background and hides anything previously drawn. pygame.display.update() updates the display and makes everything that is drawn visible. Therefor you need to draw all the objects of the scene after screen.blit(background_image_1, [0,0]) and before pygame.display.update().
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
