Mercurial > fujo
changeset 113:4d8bb5e53054 default tip
Add a license
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Tue, 10 Jul 2018 17:49:08 +0200 |
| parents | 26f67cc887c3 |
| children | |
| files | LICENSE fujo/__main__.py fujo/display.py fujo/game.py |
| diffstat | 4 files changed, 60 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/LICENSE Tue Jul 10 17:49:08 2018 +0200 @@ -0,0 +1,4 @@ +Copyright 2014 by Radomir Dopieralski. + +This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 +International License (https://creativecommons.org/licenses/by-sa/4.0/).
--- a/fujo/__main__.py Sun Jan 12 12:24:50 2014 +0100 +++ b/fujo/__main__.py Tue Jul 10 17:49:08 2018 +0200 @@ -7,7 +7,7 @@ from .resources import RES -MODE = 480, 480 +MODE = 320, 200 pygame.display.init()
--- a/fujo/display.py Sun Jan 12 12:24:50 2014 +0100 +++ b/fujo/display.py Tue Jul 10 17:49:08 2018 +0200 @@ -51,12 +51,20 @@ class Display(object): def __init__(self): - self.screen = pygame.display.get_surface() - self.size = self.screen.get_width(), self.screen.get_height() + self.real_screen = pygame.display.get_surface() + self.screen_size = (self.real_screen.get_width(), + self.real_screen.get_height()) + self.size = 480, 480 + self.scale = 1 + self.screen = pygame.Surface(self.size) self.windows = Sprites() self.labels = Sprites() self.clock = pygame.time.Clock() self.quit = False + self.camera = pygame.Rect( + 0, 0, + self.screen_size[0] / self.scale, + self.screen_size[1] / self.scale) def tick(self): self.clock.tick(24) @@ -65,10 +73,10 @@ self.quit = True def update(self): - self.windows.clear(self.screen, self.windows_background) - self.labels.clear(self.screen, self.windows_background) - self.sprites.clear(self.screen, self.windows_background) - self.shadows.clear(self.screen, self.windows_background) + self.windows.clear(self.real_screen, self.windows_background) + self.labels.clear(self.screen, self.clear_background) + self.sprites.clear(self.screen, self.clear_background) + self.shadows.clear(self.screen, self.clear_background) self.sprites.update(self) self.labels.update() self.shadows.update() @@ -80,23 +88,35 @@ self.screen.blit(self.fog, rect, rect, special_flags=pygame.BLEND_MULT) dirty_labels = self.labels.draw(self.screen) - dirty_windows = self.windows.draw(self.screen) - dirty.extend(dirty_windows) dirty.extend(dirty_shadows) dirty.extend(dirty_labels) - pygame.display.update(dirty) + view = self.screen.subsurface(self.camera) + pygame.transform.scale(view, self.screen_size, self.real_screen) + real_dirty = self.windows.draw(self.real_screen) + for rect in dirty: + rect = rect.move(-self.camera.x, -self.camera.y) + real_rect = pygame.Rect( + rect.x * self.scale, rect.y * self.scale, + rect.width * self.scale, rect.height * self.scale) + real_dirty.append(real_rect) + pygame.display.update(real_dirty) def refresh(self): - self.screen.blit(self.background, (0, 0)) - self.screen.blit(self.fog, (0, 0), special_flags=pygame.BLEND_MULT) - self.windows_background = self.screen.copy() + self.clear_background.blit(self.background, (0, 0)) + self.clear_background.blit(self.fog, (0, 0), + special_flags=pygame.BLEND_MULT) + view = self.clear_background.subsurface(self.camera) + pygame.transform.scale(view, self.screen_size, self.windows_background) + self.screen.blit(self.background, (0, 0)) self.shadows.update() self.shadows.draw(self.screen) self.sprites.draw(self.screen) self.screen.blit(self.overlay, (0, 0)) self.screen.blit(self.fog, (0, 0), special_flags=pygame.BLEND_MULT) - self.windows.draw(self.screen) + view = self.screen.subsurface(self.camera) + pygame.transform.scale(view, self.screen_size, self.real_screen) + self.windows.draw(self.real_screen) pygame.display.flip() def spawn_mob(self, mob): @@ -110,6 +130,8 @@ self.shadows.add(things.Shadow(thing, 1)) def render_level(self, level): + self.windows_background = pygame.Surface(self.screen_size) + self.clear_background = pygame.Surface(self.size) self.background = pygame.Surface(self.size) self.overlay = pygame.Surface(self.size, pygame.SRCALPHA) self.fog = pygame.Surface(self.size)
--- a/fujo/game.py Sun Jan 12 12:24:50 2014 +0100 +++ b/fujo/game.py Tue Jul 10 17:49:08 2018 +0200 @@ -41,8 +41,23 @@ self.player.status_window = self.status_window self.player.update_status() self.display.render_level(self.level) + self.center() self.display.refresh() + def center(self): + camera = self.display.camera + r = self.display.screen.get_rect() + camera.center = self.player.rect.center + if camera.top < 0: + camera.top = 0 + if camera.left < 0: + camera.left = 0 + if camera.right > r.width: + camera.right = r.width + if camera.bottom > r.height: + camera.bottom = r.height + + def tick(self): if pygame.key.get_pressed()[pygame.K_ESCAPE]: menu = window.Menu((256, 64, 80, 32), [ @@ -52,6 +67,11 @@ self.running = menu.run(self.display) in (None, 'continue') menu.kill() elif self.player.animation is None: + margin = 48 + if not self.display.camera.inflate(-margin, -margin).contains( + self.player.rect): + self.center() + self.display.refresh() if self.player.dead: self.running = False return
