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