changeset 488:ae8eb7c0f7bb

Better wall and bulkhead drawing.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 07 Sep 2013 17:40:59 +0200
parents b2dbdcfbf4bb
children 31d721121966
files nagslang/game_object.py nagslang/level.py nagslang/render.py nagslang/utils.py
diffstat 4 files changed, 59 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/game_object.py	Sat Sep 07 17:38:50 2013 +0200
+++ b/nagslang/game_object.py	Sat Sep 07 17:40:59 2013 +0200
@@ -455,7 +455,7 @@
 
     def __init__(self, space, end1, end2, key_state=None):
         body = make_body(None, None, (0, 0))
-        self.shape = pymunk.Segment(body, tuple(end1), tuple(end2), 3)
+        self.shape = pymunk.Segment(body, tuple(end1), tuple(end2), 7)
         self.shape.collision_type = COLLISION_TYPE_DOOR
         if key_state is None:
             puzzler = puzzle.YesPuzzler()
--- a/nagslang/level.py	Sat Sep 07 17:38:50 2013 +0200
+++ b/nagslang/level.py	Sat Sep 07 17:40:59 2013 +0200
@@ -2,12 +2,14 @@
 
 import pygame
 import pygame.locals as pgl
+import pymunk
 
 from nagslang import collectable
 from nagslang import game_object as go
 from nagslang import enemies
 from nagslang import puzzle
-from nagslang.utils import tile_surface
+from nagslang.utils import (
+    tile_surface, points_to_pygame, extend_line, points_to_lines)
 from nagslang.resources import resources
 from nagslang.yamlish import load, dump
 
@@ -183,25 +185,33 @@
         self.basetile = new_tile
         self._tile_image = None
 
-    def point_to_pygame(self, pos):
-        # Convert a point from pymunk (which is what we store)
-        # to pygame for drawing
-        return (pos[0], self.y - pos[1])
-
     def get_walls(self):
         walls = self.polygons.values()
         walls.extend(self.lines)
         return walls
 
-    def _draw_walls(self):
+    def _draw_wall_line(self, points, width, colour, extend):
+        for line in points_to_lines(points):
+            if extend:
+                line = extend_line(
+                    pymunk.Vec2d(line[0]), pymunk.Vec2d(line[1]), extend)
+            line = points_to_pygame(self._surface, line)
+            pygame.draw.line(self._surface, colour, line[0], line[1], width)
+
+    def _draw_walls_lines(self, width, colour, extend):
         for index, polygon in self.polygons.items():
-            color = POLY_COLORS.get(index, pygame.color.THECOLORS['black'])
-            if len(polygon) > 1:
-                pointlist = [self.point_to_pygame(p) for p in polygon]
-                pygame.draw.lines(self._surface, color, False, pointlist, 2)
+            self._draw_wall_line(polygon, width, colour, extend)
         for line in self.lines:
-            pointlist = [self.point_to_pygame(p) for p in line]
-            pygame.draw.lines(self._surface, LINE_COLOR, False, pointlist, 2)
+            self._draw_wall_line(line, width, colour, extend)
+
+    def _draw_walls(self):
+        inner_colour = pygame.color.THECOLORS['red']
+        mid_colour = pygame.color.THECOLORS['orange']
+        outer_colour = pygame.color.THECOLORS['yellow']
+        self._draw_walls_lines(5, outer_colour, 0)
+        self._draw_walls_lines(3, outer_colour, 1)
+        self._draw_walls_lines(3, mid_colour, 0)
+        self._draw_walls_lines(1, inner_colour, 0)
 
     def get_background(self):
         if self._surface is None:
@@ -221,7 +231,7 @@
         surface.fill(black)
         for index, polygon in self.polygons.items():
             if len(polygon) > 1:
-                pointlist = [self.point_to_pygame(p) for p in polygon]
+                pointlist = points_to_pygame(self._surface, polygon)
                 # filled polygons
                 color = white
                 # If a polygon overlaps on of the existing polygons,
--- a/nagslang/render.py	Sat Sep 07 17:38:50 2013 +0200
+++ b/nagslang/render.py	Sat Sep 07 17:40:59 2013 +0200
@@ -6,7 +6,8 @@
 import pymunk
 
 from nagslang.options import options
-from nagslang.utils import tile_surface, vec_from_angle
+from nagslang.utils import (
+    tile_surface, vec_from_angle, points_to_pygame, extend_line)
 from nagslang.widgets.text import LabelWidget, MultiLineWidget
 
 
@@ -47,29 +48,20 @@
 
 
 class BulkheadRenderer(Renderer):
-    def _offset_point(self, vec, to_vec, length):
-        offset = vec_from_angle((to_vec - vec).angle, abs(length))
-        if length < 0:
-            offset = -offset
-        return vec + offset
-
-    def _to_pygame(self, surface, *points):
-        return [pymunk.pygame_util.to_pygame(p, surface) for p in points]
-
     def draw_bulkhead_line(self, surface, a, b):
-        ai = self._offset_point(a, b, 2)
-        bi = self._offset_point(b, a, 2)
-        a, b, ai, bi = self._to_pygame(surface, a, b, ai, bi)
+        ai, bi = extend_line(a, b, -2)
+        a, b, ai, bi = points_to_pygame(surface, (a, b, ai, bi))
         pygame.draw.line(
-            surface, pygame.color.THECOLORS['black'], a, b, 8)
+            surface, pygame.color.THECOLORS['black'], a, b, 7)
         pygame.draw.line(
-            surface, pygame.color.THECOLORS['lightblue'], ai, bi, 6)
+            surface, pygame.color.THECOLORS['lightblue'], ai, bi, 5)
 
     def render(self, surface):
         shape = self.game_object.get_shape()
         if self.game_object.puzzler.get_state():
-            ai = self._offset_point(shape.a, shape.b, 10)
-            bi = self._offset_point(shape.b, shape.a, 10)
+            offset = vec_from_angle((shape.b - shape.a).angle, 10)
+            ai = shape.a + offset
+            bi = shape.b - offset
             self.draw_bulkhead_line(surface, shape.a, ai)
             self.draw_bulkhead_line(surface, bi, shape.b)
         else:
--- a/nagslang/utils.py	Sat Sep 07 17:38:50 2013 +0200
+++ b/nagslang/utils.py	Sat Sep 07 17:40:59 2013 +0200
@@ -1,7 +1,8 @@
 import pygame
 import pygame.locals as pgl
 
-from pymunk.vec2d import Vec2d
+import pymunk
+import pymunk.pygame_util
 
 
 def convert_colour(colour):
@@ -15,19 +16,39 @@
 
 
 def vec_from_angle(angle, length=1):
-    vec = Vec2d(length, 0)
+    vec = pymunk.Vec2d(length, 0)
     vec.angle = angle
     return vec
 
 
 def vec_with_length(coords, length=1):
-    vec = Vec2d(coords)
-    # Don't crash if we're created a zero length vector
+    vec = pymunk.Vec2d(coords)
+    # Don't crash if we've created a zero length vector
     if vec.length != 0:
         vec.length = length
     return vec
 
 
+def points_to_lines(points):
+    if len(points) < 2:
+        return
+    last_point = points[0]
+    for point in points[1:]:
+        yield (last_point, point)
+        last_point = point
+
+
+def extend_line(a, b, length):
+    offset = vec_from_angle((a - b).angle, abs(length))
+    if length < 0:
+        offset = -offset
+    return (a + offset, b - offset)
+
+
+def points_to_pygame(surface, points):
+    return [pymunk.pygame_util.to_pygame(p, surface) for p in points]
+
+
 def tile_surface(size, tile_image):
     # create a surface, approriately tiled
     surface = pygame.surface.Surface(size, pgl.SRCALPHA)