python - Space shooter game have slight errors -
i've been having trouble levels game , wondering why enemies in game not falling top of screen, , trying make levels class levels not working.can please help!
my code:
import pygame import random # define colors black = (0, 0, 0) white = (255, 255, 255) red = (255, 0, 0) blue = (0, 0, 255) lav = (209, 95, 250) #enemy class block(pygame.sprite.sprite): """ class represents block. """ def __init__(self, color): # call parent class (sprite) constructor super().__init__() self.image = pygame.image.load("enemy2.png") self.rect = self.image.get_rect() def reset_pos(self): self.rect.y = random.randrange(-300,-20) self.rect.x = random.randrange(0,screen_width) #player class player(pygame.sprite.sprite): """ class represents player. """ def __init__(self): """ set player on creation. """ # call parent class (sprite) constructor super().__init__() self.image = pygame.image.load("ss1.png") self.rect = self.image.get_rect() #controls def update(self): """ update player's position. """ # current mouse position. returns position # list of 2 numbers. pos = pygame.mouse.get_pos() # set player x position mouse x position self.rect.x = pos[0] class bullet(pygame.sprite.sprite): """ class represents bullet . """ def __init__(self): # call parent class (sprite) constructor super().__init__() self.image = pygame.image.load("fireball2.png") self.rect = self.image.get_rect() def update(self): """ move bullet. """ self.rect.y -= 6 # --- create window # initialize pygame pygame.init() pygame.display.set_caption("space shooter") # set height , width of screen screen_width = 850 screen_height = 850 screen = pygame.display.set_mode([screen_width, screen_height]) bg = pygame.image.load("bg.png") # --- sprite lists # list of every sprite. blocks , player block well. all_sprites_list = pygame.sprite.group() # list of each block in game block_list = pygame.sprite.group() # list of each bullet bullet_list = pygame.sprite.group() # --- create sprites class level(): """ generic super-class used define level. create child class each level level-specific info. """ def __init__(self, player): """ constructor. pass in handle player. needed when moving platforms collide player. """ self.platform_list = pygame.sprite.group() self.enemy_list = pygame.sprite.group() self.player = player # how far world has been scrolled left/right self.world_shift = 0 # update everythign on level def update(self): """ update in level.""" self.platform_list.update() self.enemy_list.update() def draw(self, screen): """ draw on level. """ # draw background screen.fill(blue) # draw sprite lists have self.platform_list.draw(screen) self.enemy_list.draw(screen) def shift_world(self, shift_x): """ when user moves left/right , need scroll everything: """ # keep track of shift amount self.world_shift += shift_x # go through sprite lists , shift platform in self.platform_list: platform.rect.x += shift_x enemy in self.enemy_list: enemy.rect.x += shift_x # create platforms level class level_01(level): """ definition level 1. """ def __init__(self, player): """ create level 1. """ # call parent constructor level.__init__(self, player) self.level_limit = 10 in range(15): # represents block block = block(blue) # set random location block block.rect.x = random.randrange(825) block.rect.y = random.randrange(500) # add block list of objects block_list.add(block) all_sprites_list.add(block) # create red player block class level_02(level): """ definition level 2. """ def __init__(self, player): """ create level 1. """ # call parent constructor level.__init__(self, player) self.level_limit = -3000 # array type of platform, , x, y location of platform. in range(30): # represents block block = block(blue) # set random location block¸ block.rect.x = random.randrange(650) block.rect.y = random.randrange(350) # add block list of objects block_list.add(block) all_sprites_list.add(block) # go through arrzay above , add platforms player = player() all_sprites_list.add(player) # loop until user clicks close button. done = false # used manage how fast screen updates clock = pygame.time.clock() font = pygame.font.font(none, 25) frame_count = 0 frame_rate = 60 start_time = 90 score = 0 player.rect.y = 600 bg_sound = pygame.mixer.sound("countdown - timer.wav") fire_sound = pygame.mixer.sound("laser-soundbible.com-602495617.wav") bg_sound.play(-1) # -------- main program loop ----------- while not done: # --- event processing event in pygame.event.get(): if event.type == pygame.quit: done = true elif event.type == pygame.mousebuttondown: # fire bullet if user clicks mouse button bullet = bullet() # set bullet player bullet.rect.x = player.rect.x bullet.rect.y = player.rect.y # add bullet lists all_sprites_list.add(bullet) bullet_list.add(bullet) fire_sound.play() # --- game logic # call update() method on sprites all_sprites_list.update() # calculate mechanics each bullet bullet in bullet_list: # see if hit block block_hit_list = pygame.sprite.spritecollide(bullet, block_list, true) # each block hit, remove bullet , add score block in block_hit_list: bullet_list.remove(bullet) all_sprites_list.remove(bullet) score += 1 print(score) # remove bullet if flies off screen if bullet.rect.y < -50: bullet_list.remove(bullet) all_sprites_list.remove(bullet) # --- draw frame screen.blit(bg, [0, 0]) # clear screen font = pygame.font.sysfont('calibri', 25,true, false) text = font.render('enemies shot:'+ str(score),true, lav) screen.blit(text,[650,500]) # draw spites all_sprites_list.draw(screen) total_seconds = start_time - (frame_count // frame_rate) if total_seconds == 0: font = pygame.font.sysfont('calibri', 25,true, false) text = font.render('youre done',true, lav) screen.blit(text,[650,500]) # divide 60 total minutes minutes = total_seconds // 60 # use modulus (remainder) seconds seconds = total_seconds % 60 # use python string formatting format in leading zeros output_string = "time left: {0:00}:{1:02}".format(minutes, seconds) # blit screen text = font.render(output_string, true, lav) screen.blit(text, [650, 525]) # code draw should go above comment frame_count += 10 # limit frames per second clock.tick(frame_rate) # go ahead , update screen we've drawn. pygame.display.flip() pygame.quit()
one quick thing might want take note of clearing screen after update bullets. suggest clearing screen first thing inside while loop. thing don't see anywhere trying move enemies (i wrong). function 1 inside block class might help:
def render(self): self.rect.y +=3
you can change how move blocks in render function, example.
after have entered in need put like:
for block in block_list: block.render()
this go inside while loop anywhere after you've cleared it. might need make block list work. hope helps :)
Comments
Post a Comment