Mercurial > nagslang
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)