class SplashScreen(GameState): def __init__(self): super(SplashScreen, self).__init__() self.title = self.font.render("Planet Golf", True, pg.Color("dodgerblue")) self.title_rect = self.title.get_rect(center=self.screen_rect.center) self.next_state = "GAMEPLAY" self.starfield = Starfield(self.screen_rect) def get_event(self, event): if event.type == pg.QUIT: self.quit = True elif event.type == pg.KEYUP: if event.key == pg.K_RETURN: self.done = True elif event.key == pg.K_ESCAPE: self.quit = True def update(self, dt): self.starfield.update() self.persist['level'] = "planets.txt" def draw(self, surface): surface.fill(pg.Color("black")) surface.blit(self.title, self.title_rect) self.starfield.draw(surface)
class LunarSurface(object): def __init__(self, depth=3): self.starfield = Starfield() self.textures = [] mul = 0.125 / 2.0 for _ in range(depth): texture = pygame.Surface((512, screen_height * 2)) texture.set_colorkey((255, 0, 255)) texture.fill((255, 0, 255)) heightmap = heightmap_1d(9) for x in range(512): min_y = int((heightmap[x] * mul + 1.0) / 2.0 * screen_height) for y in range(min_y, screen_height * 2): noise = random.uniform(0.9, 1.0) color = tuple(255.0 * noise * mul for _ in range(3)) texture.set_at((x, y), color) self.textures.append(texture) mul *= 2 def update(self, delta): self.starfield.update(delta) def render(self, screen, camera): self.starfield.render(screen, camera) mul = 0.125 for texture in self.textures: x = int(-camera.pos[0] * 10.0 * mul) % 512 y = camera.pos[1] * 10.0 * mul screen.blit(texture, (x, y)) screen.blit(texture, (x - 512, y)) mul *= 2
class FinishScreen(GameState): def __init__(self): super(FinishScreen, self).__init__() self.next_state = "GAMEPLAY" self.starfield = Starfield(self.screen_rect) def get_event(self, event): if event.type == pg.QUIT: self.quit = True elif event.type == pg.KEYUP: if event.key == pg.K_RETURN: self.done = True elif event.key == pg.K_ESCAPE: self.next_state = "SPLASH" self.done = True def startup(self, persistent): self.persist = {} self.persist['level'] = persistent['level'] self.success = persistent['success'] self.score = float(persistent['score']) self.rank = 0 self.highscores = [] if self.success and self.score > 0: try: for line in open("highscore_" + self.persist['level'], "r+").readlines(): self.highscores.append(float(line)) except: pass import bisect self.rank = bisect.bisect_left(self.highscores, self.score) self.highscores.insert(self.rank, self.score) with open("highscore_" + self.persist['level'], "w+") as f: for score in self.highscores: f.write("{0}\n".format(score)) def update(self, dt): self.starfield.update() def draw(self, surface): surface.fill(pg.Color("black")) self.starfield.draw(surface) if self.success: title = self.font.render( "Success! You scored {0} points! [Rank {1}].".format(self.score, self.rank), True, pg.Color("dodgerblue")) title_rect = title.get_rect(center=self.screen_rect.center) surface.blit(title, title_rect) else: title = self.font.render( "You failed! Press 'return' to restart.", True, pg.Color("dodgerblue")) title_rect = title.get_rect(center=self.screen_rect.center) surface.blit(title, title_rect)
def main(): WINSIZE = 640, 480 NUMBER_OF_STARS = 250 STARTING_ANGLE = 180 CLOSEST_STAR_COLOR = (255, 255, 255) STAR_SIZE_IN_PIXELS = 1 #_V_ = 1 pygame.init() pygame.key.set_repeat(1, 1) screen = pygame.display.set_mode(WINSIZE, pygame.SWSURFACE) stars = Starfield(screen, screen.get_rect(), NUMBER_OF_STARS, STARTING_ANGLE, (40, 4), STAR_SIZE_IN_PIXELS, CLOSEST_STAR_COLOR) ship1 = Ship(screen) done = False while not done: screen.fill(THECOLORS["black"]) stars.update() ship1.draw() ship1.resetSprt() pygame.display.update() events = pygame.event.get() for e in events: if (e.type == QUIT): done = True break elif (e.type == KEYDOWN): if (e.key == K_ESCAPE): done = True break #Test for movement dx, dy = 0, 0 if (e.key == K_DOWN): dy += 1 if (e.key == K_UP): dy -= 1 if (e.key == K_LEFT): dx -= 1 if (e.key == K_RIGHT): dx += 1 ship1.move(dx, dy) #if(e.key == K_PLUS): #stars.set_speed(( print "Exiting!" return
def main(): WINSIZE = 640,480 NUMBER_OF_STARS = 250 STARTING_ANGLE = 180 CLOSEST_STAR_COLOR = (255, 255, 255) STAR_SIZE_IN_PIXELS = 1 #_V_ = 1 pygame.init() pygame.key.set_repeat(1,1) screen = pygame.display.set_mode(WINSIZE,pygame.SWSURFACE) stars = Starfield(screen,screen.get_rect(),NUMBER_OF_STARS,STARTING_ANGLE,(40,4),STAR_SIZE_IN_PIXELS,CLOSEST_STAR_COLOR) ship1 = Ship(screen) done = False while not done: screen.fill(THECOLORS["black"]) stars.update() ship1.draw() ship1.resetSprt() pygame.display.update() events = pygame.event.get() for e in events: if(e.type == QUIT): done = True break elif (e.type == KEYDOWN): if(e.key == K_ESCAPE): done = True break #Test for movement dx,dy = 0,0 if(e.key == K_DOWN): dy += 1 if(e.key == K_UP): dy -= 1 if(e.key == K_LEFT): dx -= 1 if(e.key == K_RIGHT): dx += 1 ship1.move(dx,dy) #if(e.key == K_PLUS): #stars.set_speed(( print "Exiting!" return
class Gameplay(GameState): def __init__(self): super(Gameplay, self).__init__() self.initial_velocity = None self.next_state = "FINISHED" def startup(self, persistent): self.persist = persistent self.persist['success'] = False self.persist['score'] = 0 self.entities = [] self.started = False self.paused = False self.starfield = Starfield(self.screen_rect) self.show_cursor = False self.time = 0.0 # Load level for line in open(self.persist['level']).readlines(): mass, size, pos, vel, mutable, color = line.split(":") pos = pos.split(",") vel = vel.split(",") mutable = mutable.startswith('1') entity = Planet( float(size), mass=float(mass), pos=Vector2d(float(pos[0]), float(pos[1])), vel=Vector2d(float(vel[0]), float(vel[1])), elasticity = 0.97,) entity.mutable = mutable c = map(int, color.split(",")) entity.color = pg.Color(*c) self.entities.append(entity) def get_event(self, event): if event.type == pg.QUIT: self.quit = True elif event.type == pg.MOUSEBUTTONUP: self.started = True elif event.type == pg.KEYUP: if event.key == pg.K_p: self.paused = not self.paused elif event.key == pg.K_ESCAPE: self.done = True def update(self, dt): dt /= 100.0 if not self.started: p = pg.mouse.get_pos() self.cursor = Vector2d([float(i) for i in p]) player = self.entities[0].pos diff = self.cursor - player if diff.length() < 1000: self.show_cursor = True diff /= 50 self.initial_velocity = diff self.entities[0].vel = Vector2d( float(diff[0]), float(diff[1])) else: self.show_cursor = False elif not self.paused: self.time += dt entity_set = list(self.entities) # Success condition if self.entities[0].collides_with(self.entities[-1]): self.persist['init_vel'] = self.initial_velocity self.persist['success'] = True self.persist['score'] = self.time self.done = True return for entity in entity_set: entity_set.remove(entity) for other in entity_set: if entity.collides_with(other): entity.resolve_collision(other) force = entity.calc_gravity(other) entity.apply_force(entity.pos, force) other.apply_force(other.pos, -force) for entity in self.entities: if entity.mutable == True: entity.update(0, dt) self.starfield.update() else: pass def draw(self, surface): surface.fill(pg.Color("Black")) self.starfield.draw(screen) if not self.started and self.show_cursor: pg.draw.aaline( surface, pg.Color("dodgerblue"), self.entities[0].pos, self.cursor) for entity in self.entities: pg.gfxdraw.aacircle( surface, int(entity.pos[0]), int(entity.pos[1]), int(entity.radius), entity.color) pg.gfxdraw.filled_circle( surface, int(entity.pos[0]), int(entity.pos[1]), int(entity.radius), entity.color) label = self.font.render(str(self.initial_velocity), True, pg.Color("dodgerblue")) surface.blit(label, (10, 40)) label = self.font.render(str(self.time), True, pg.Color("dodgerblue")) surface.blit(label, (10, 80)) if not self.started: text = "Use mouse to launch satellite." title = self.font.render(text, True, pg.Color("dodgerblue")) title_rect = title.get_rect(center=self.screen_rect.center) surface.blit(title, title_rect) elif self.paused: title = self.font.render("PAUSED", True, pg.Color("dodgerblue")) title_rect = title.get_rect(center=self.screen_rect.center) surface.blit(title, title_rect)