class BasicMovement(Display): def __init__(self): self.framerate = 0 self.number_meanies = 16 self.display = Display() self.hud = Hud() self.meanie_list = [] pygame.key.set_repeat(100,5) self.meanies = pygame.sprite.Group() self.player = Charactor("held.png", self.display) self.player.speed = 2 self.init_floors() self.init_ladders() self.barrels = pygame.sprite.Group() self.init_barrels() self.testgroup = pygame.sprite.Group() self.init_meanies(0) def init_floors(self): self.steine = pygame.sprite.Group() c = 0 for y in range (300, self.display.bgmax[1], 200): if c % 2 == 0: for x in range(self.display.bgmax[0]/2 + 64, self.display.bgmax[0], 32): s = Boden1([x,y]) self.steine.add(s) else: for x in range(64, self.display.bgmax[0]/2, 32): s = Boden1([x,y]) self.steine.add(s) c += 1 del c ## Place a Floor at bottom of level for x in range(0,self.display.bgmax[0],32): s = Boden1([x, self.display.bgmax[1]-16]) self.steine.add(s) def init_ladders(self): self.ladders = pygame.sprite.Group() for x in range(50, 700, 500): for y in range(0, self.display.bgmax[1], 32): i = Leiter([x,y]) self.ladders.add(i) def init_barrels(self): for y in range(87, self.display.bgmax[1], 200): x = random.randint(0, self.display.bgmax[0]) s = Fass([200, y]) self.barrels.add(s) def init_meanies(self, counter): move_index = 0 while counter < self.number_meanies: mx = random.randint( 0, self.display.bgmax[0]-40 ) my = random.randint( 0, self.display.bgmax[1]-40 ) meanie = Meanie() meanie.state.set_random_move_index() meanie.rect.center = mx,my self.testgroup.add(meanie) if meanie.overlaps(self.testgroup): self.testgroup.remove(meanie) meanie.kill() self.init_meanies(counter) else: self.meanie_list.insert(counter,meanie) self.meanies.add(self.meanie_list[counter]) counter += 1 if counter == self.number_meanies: self.start_game() def start_game(self): del self.testgroup self.gameRunning = True self.mainloop() def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [120,220] while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state(self) # blit player on screen d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update(self) self.meanies.update(self, dirty) self.hud.showinfo(self, dirty) for e in pygame.event.get(): if e.type == QUIT: self.gameRunning = False pygame.quit() sys.exit() elif e.type == KEYDOWN: if e.key == K_ESCAPE: self.gameRunning = False pygame.quit() sys.exit() elif e.key == K_UP and self.player.state.climbing: self.player.movement[1]= - self.player.speed elif e.key == K_DOWN and not self.player.state.falling and self.player.state.climbing: self.player.movement[1]= self.player.speed elif e.key == K_LEFT: if self.player.state.falling: self.player.movement[0] = - self.player.speed/2 else: self.player.movement[0] = - self.player.speed elif e.key == K_RIGHT: if self.player.state.falling: self.player.movement[0] = self.player.speed/2 else: self.player.movement[0] = self.player.speed elif e.type == KEYUP: if e.key == K_UP or e.key == K_DOWN: self.player.movement[1] = 0 elif e.key == K_LEFT or e.key == K_RIGHT: self.player.movement[0] = 0 self.player.update(self) pygame.display.update(dirty)
class Game(): framerate = 0 number_meanies = 32 def __init__(self): self.display = Display() self.player = Charactor(self) self.level = Level(self) self.hud = Hud() self.prepare_stage() def prepare_stage(self): self.level.load_level(0) self.start_game() def start_game(self): self.gameRunning = True self.mainloop() def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state() d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) self.player.update() ## Just for debugging - paint hitareas of charactor ## d = self.draw_hitarea(self.player.feet()) dirty.insert(len(dirty), d) d = self.draw_hitarea(self.player.middle(), (0,0,255)) dirty.insert(len(dirty), d) d = self.draw_hitarea(self.player.head(), (0,255,255)) dirty.insert(len(dirty), d) pygame.display.update(dirty) def draw_hitarea(self, sprite, color=pygame.Color(255,0,0)): sfc = pygame.Surface([sprite.rect.width, sprite.rect.height]) sfc.fill(color) dummy = pygame.sprite.Sprite() dummy.image = sfc dummy.rect = sprite.rect d = self.display.paint_sprite(dummy) return d
class Game(Display, Controller): def __init__(self): self.framerate = 0 self.number_meanies = 32 self.bricks_in_level = 0 self.display = Display() self.hud = Hud() pygame.key.set_repeat(100,5) self.meanies = pygame.sprite.Group() self.player = Charactor(self) self.player.speed = 2 self.init_floors() self.bricks_in_level = len(self.steine) self.init_ladders() self.barrels = pygame.sprite.Group() self.init_barrels() self.testgroup = pygame.sprite.Group() self.init_meanies(0) def init_floors(self): self.steine = pygame.sprite.Group() c = 0 for y in range (300, self.display.bgmax[1], 200): if c % 2 == 0: for x in range(self.display.bgmax[0]/2 + 64, self.display.bgmax[0], 32): s = Boden1([x,y]) self.steine.add(s) else: for x in range(64, self.display.bgmax[0]/2, 32): s = Boden1([x,y]) self.steine.add(s) c += 1 del c ## Place a Floor at bottom of level for x in range(0,self.display.bgmax[0],32): s = Boden1([x, self.display.bgmax[1]-16]) self.steine.add(s) def init_ladders(self): self.ladders = pygame.sprite.Group() for x in range(50, 700, 500): for y in range(0, self.display.bgmax[1], 32): i = Leiter([x,y]) self.ladders.add(i) def init_barrels(self): for y in range(87, self.display.bgmax[1], 800): s = Fass([200, y]) self.barrels.add(s) # s = Fass([340,1960]) # self.barrels.add(s) def init_meanies(self, counter): while counter < self.number_meanies: mx = random.randint( 0, self.display.bgmax[0]-40 ) my = random.randint( 0, self.display.bgmax[1]-40 ) meanie = Meanie() meanie.state.set_random_move_index() meanie.rect.center = mx,my self.testgroup.add(meanie) if meanie.overlaps(self.testgroup): self.testgroup.remove(meanie) meanie.kill() self.init_meanies(counter) else: self.meanies.add(meanie) counter += 1 if counter == self.number_meanies: self.start_game() def start_game(self): del self.testgroup self.gameRunning = True self.mainloop() def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state(self) d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) # for e in pygame.event.get(): # # if e.type == QUIT: # self.gameRunning = False # pygame.quit() # sys.exit() # elif e.type == KEYDOWN: # # if e.key == K_ESCAPE: # self.gameRunning = False # pygame.quit() # sys.exit() # elif e.key == K_UP and self.player.state.climbing: # self.player.movement[1]= - self.player.speed # # self.player.face_up() # # elif e.key == K_DOWN \ # and not self.player.state.falling \ # and self.player.state.climbing: # # self.player.movement[1]= self.player.speed # # self.player.face_down() # # elif e.key == K_LEFT: # if self.player.state.falling: # self.player.movement[0] = - self.player.speed/2 # else: # self.player.movement[0] = - self.player.speed # # if not self.player.state.can_walk_left: # self.player.movement[0] = 0 # # self.player.face_left() # # elif e.key == K_RIGHT: # if self.player.state.falling: # self.player.movement[0] = self.player.speed/2 # else: # self.player.movement[0] = self.player.speed # # if not self.player.state.can_walk_right: # self.player.movement[0] = 0 # # self.player.face_right() # # elif e.type == KEYUP: # if e.key == K_UP or e.key == K_DOWN: # self.player.movement[1] = 0 # elif e.key == K_LEFT or e.key == K_RIGHT: # self.player.movement[0] = 0 self.player.update() pygame.display.update(dirty)
class Game(Display, Controller): def __init__(self): self.framerate = 0 self.number_meanies = 32 self.bricks_in_level = 0 self.display = Display() self.hud = Hud() pygame.key.set_repeat(100,5) self.meanies = pygame.sprite.Group() self.player = Charactor(self) self.player.speed = 2 self.level = Level(self) self.level.load_level(0) self.start_game() # self.testgroup = pygame.sprite.Group() # self.init_meanies(0) # def init_meanies(self, counter): # # while counter < self.number_meanies: # # mx = random.randint( 0, self.display.bgmax[0]-40 ) # my = random.randint( 0, self.display.bgmax[1]-40 ) # # meanie = Meanie() # meanie.state.set_random_move_index() # meanie.rect.center = mx,my # self.testgroup.add(meanie) # # if meanie.overlaps(self.testgroup): # self.testgroup.remove(meanie) # meanie.kill() # self.init_meanies(counter) # else: # self.meanies.add(meanie) # counter += 1 # # if counter == self.number_meanies: # self.start_game() def start_game(self): self.gameRunning = True self.mainloop() def mainloop(self): self.clock = pygame.time.Clock() self.player.rect.center = [self.display.arena[0]/2, self.display.arena[1]/2] controller = Controller() while self.gameRunning: dirty = [] self.clock.tick(FPS) self.framerate = self.clock.get_fps() self.display.paint_background(dirty) self.player.state.set_current_state(self) d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.ladders.update() self.barrels.update() self.meanies.update(dirty) self.hud.showinfo(self, dirty) controller.handle_keyboard_input(self.player) self.player.update() pygame.display.update(dirty)
class BasicMovement(Display): def __init__(self): self.number_meanies = 70 self.display = Display() self.move_schedule = dict() self.move_schedule[0] = [-1,0] self.move_schedule[1] = [0,-1] self.move_schedule[2] = [1,0] self.move_schedule[3] = [0,1] self.meanies = [] pygame.key.set_repeat(100,5) self.solidgroup = pygame.sprite.Group() self.player = Charactor("sprite01.png", self.display) self.player.speed = 2 # self.cloud = LittleSprite("wolke01.png") # self.cloud.movement = [1,0] # self.cloud.speed = 1 # self.cloud.rect.center = [50,50] self.init_floors() self.init_ladders() self.testgroup = pygame.sprite.Group() self.init_meanies(0) def init_floors(self): self.steine = pygame.sprite.Group() c = 0 for y in range (300, self.display.bgmax[1], 200): if c % 2 == 0: for x in range(self.display.bgmax[0]/2 + 16, self.display.bgmax[0], 32): s = Boden([x,y]) self.steine.add(s) else: for x in range(0, self.display.bgmax[0]/2, 32): s = Boden([x,y]) self.steine.add(s) c += 1 del c def init_ladders(self): self.ladders = pygame.sprite.Group() for x in range(50, 700, 500): for y in range(0, self.display.bgmax[1], 32): i = Leiter([x,y]) self.ladders.add(i) def init_meanies(self, counter): move_index = 0 while counter < self.number_meanies: mx = random.randint( 0, self.display.bgmax[0]-40 ) my = random.randint( 0, self.display.bgmax[1]-40 ) meanie = Meanie("meanie1.png") meanie.rect.center = mx,my self.testgroup.add(meanie) if meanie.overlaps(self.testgroup): self.testgroup.remove(meanie) meanie.kill() self.init_meanies(counter) else: meanie.movement = self.move_schedule[move_index] meanie.current_move_index = move_index meanie.speed = 3 move_index +=1 if move_index > 3: move_index = 0 self.meanies.insert(counter,meanie) self.solidgroup.add(self.meanies[counter]) counter += 1 if counter == self.number_meanies: self.start_game() def start_game(self): del self.testgroup self.gameRunning = True self.mainloop() def mainloop(self): print len(self.meanies) self.clock = pygame.time.Clock() fnt = pygame.font.Font(None, 20) self.player.rect.center = [20,220] # blit background on screen # self.display.paint_background() # pygame.display.flip() while self.gameRunning: dirty = [] self.clock.tick(_MIN_TICKS_) framerate = self.clock.get_fps() dirty_background = self.display.screen.blit(self.display.bg, self.display.bgpos) # check wether background was "moved" if self.display.bg_oldpos[0] != self.display.bgpos[0] \ or self.display.bg_oldpos[1] != self.display.bgpos[1]: dirty.insert(len(dirty), dirty_background) self.display.bg_oldpos = copy.copy(self.display.bgpos) self.player.state.set_current_state(self) # blit player on screen d = self.display.paint_sprite(self.player) dirty.insert(len(dirty), d) self.steine.update() self.steine.draw(self.display.screen) self.ladders.update() self.ladders.draw(self.display.screen) # d = self.display.paint_sprite(self.stein) # dirty.insert(len(dirty), d) # blit meanies on screen for i in range(0,self.number_meanies): if self.meanies[i].is_on_screen(): meanie_oldpos = self.meanies[i].rect # ! make blit position relative to scrolling background ! meanie_pos_x = self.meanies[i].rect.left + self.display.bgpos[0] meanie_pos_y = self.meanies[i].rect.top + self.display.bgpos[1] self.meanies[i].rect = meanie_pos_x, meanie_pos_y d = self.display.paint_sprite(self.meanies[i]) dirty.insert(len(dirty), d) self.meanies[i].rect = meanie_oldpos caption = ("bgpos {0} | charpos {1} | fps {2} ").format( self.display.bgpos, self.player.rect.center, framerate ) txt = fnt.render( caption, 1, (0,0,0), (255,255,0)) dirty.insert( len(dirty), self.display.screen.blit(txt, [0, 0] ) ) caption = ("stand {0} | climb {1} | fall {2} ").format( self.player.state.standing, self.player.state.climbing, self.player.state.falling ) txt = fnt.render( caption, 1, (0,0,0), (255,255,0)) dirty.insert( len(dirty), self.display.screen.blit(txt, [0, 20] ) ) for e in pygame.event.get(): if e.type == QUIT: self.gameRunning = False pygame.quit() sys.exit() elif e.type == KEYDOWN: if e.key == K_ESCAPE: self.gameRunning = False pygame.quit() sys.exit() elif e.key == K_UP and self.player.state.climbing: self.player.movement[1]= - self.player.speed elif e.key == K_DOWN and not self.player.state.falling: self.player.movement[1]= self.player.speed elif e.key == K_LEFT: self.player.movement[0] = - self.player.speed elif e.key == K_RIGHT: self.player.movement[0] = self.player.speed elif e.type == KEYUP: if e.key == K_UP or e.key == K_DOWN: self.player.movement[1] = 0 elif e.key == K_LEFT or e.key == K_RIGHT: self.player.movement[0] = 0 if self.player.movement[0] != 0 or self.player.movement[1] != 0: self.player.centered_move() # if self.cloud.is_on_screen(): # if self.display.bgpos[0] < 0: # self.cloud.rect.left += -1 # # d = self.display.paint_sprite(self.cloud) # dirty.insert(len(dirty), d) # if self.display.bgpos[0] < 0: # self.cloud.rect.left -= -1 # # self.cloud.thundercloud # # self.cloud.looping_move() # for i in range(0,self.number_meanies): self.meanies[i].looping_move() self.player_collision_test() self.meanie_collision_test() pygame.display.update(dirty) def player_collision_test(self): player_current_pos = self.player.rect.center self.player.rect.left -= self.display.bgpos[0] self.player.rect.top -= self.display.bgpos[1] for s in self.solidgroup.sprites(): if pygame.sprite.collide_rect(self.player, s): if s.hit_time < pygame.time.get_ticks(): s.image = pygame.transform.flip(s.image, False, True) s.is_upside_down = True s.current_move_index +=1 if s.current_move_index > 3: s.current_move_index = 0 s.movement = self.move_schedule[s.current_move_index] # Meanie will be 'invulnerable' for next three secs s.hit_time = pygame.time.get_ticks() + 3000 self.player.rect.center = player_current_pos def meanie_collision_test(self): # first find all meanies that are currently visible on screen tmpgroup = pygame.sprite.Group() for meanie in self.solidgroup.sprites(): if meanie.is_on_screen(): tmpgroup.add(meanie) tmpgroup2 = tmpgroup.copy() # second compare all meanies in the group for collisions for meanie in tmpgroup.sprites(): for other_meanie in tmpgroup2.sprites(): if meanie.name != other_meanie.name: if pygame.sprite.collide_rect(meanie, other_meanie): if other_meanie.hit_time < pygame.time.get_ticks(): other_meanie.current_move_index += 1 if other_meanie.current_move_index > 3: other_meanie.current_move_index = 0 other_meanie.movement = self.move_schedule[other_meanie.current_move_index] other_meanie.hit_time = pygame.time.get_ticks() + 3000 other_meanie.image = pygame.transform.flip(other_meanie.image, False, True) other_meanie.is_upside_down = True if meanie.hit_time < pygame.time.get_ticks(): meanie.current_move_index += 1 if meanie.current_move_index > 3: meanie.current_move_index = 0 meanie.movement = self.move_schedule[meanie.current_move_index] meanie.hit_time = pygame.time.get_ticks() + 3000 meanie.image = pygame.transform.flip(meanie.image, False, True) meanie.is_upside_down = True