![]() |
|
[split] image VS drawing - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Game Development (https://python-forum.io/forum-11.html) +--- Thread: [split] image VS drawing (/thread-14714.html) Pages:
1
2
|
RE: Simple code for isometric 2D games - ThePhi - Dec-13-2018 It's very interesting and all... but it's completely OFF-TOPIC (maths for isometric 2D). Seriously, begin your own thread please RE: [split] image VS drawing - Windspar - Dec-13-2018 Mock grass tile and ice block. import pygame
from types import SimpleNamespace
BRED = pygame.Color(200, 110, 110)
def darken_color(color, darken=0.75):
c = color.hsla
color.hsla = c[0], c[1], c[2] * darken, c[3]
def shift_points(points, xshift=0, yshift=0):
return tuple([(p[0] + xshift, p[1] + yshift) for p in points])
def top_points(x=0, y=0, w=64, h=32):
if w < 0:
w = 64 + w
if h < 0:
h = 32 + h
w -= x
h -= y
topleft = x, y + h * 0.5
topright = x + w * 0.5, y + x * 0.5
bottomleft = x + w * 0.5, y + h - x * 0.5
bottomright = x + w, y + h * 0.5
return topleft, topright, bottomright, bottomleft
def side_points(top_points, height=32):
return ((top_points[0],
top_points[3],
(top_points[3][0], top_points[3][1] + height),
(top_points[0][0], top_points[0][1] + height)),
(top_points[3],
top_points[2],
(top_points[2][0], top_points[2][1] + height),
(top_points[3][0], top_points[3][1] + height)))
# Patterns
def square_pattern(surface, color):
top = top_points(x=24, w=-24)
top = shift_points(top, -24, 32)
darken_color(color, 0.6)
pygame.draw.polygon(surface, color, top)
for point_shift in ((16, -8), (16, 0), (16, 8), (32, -8), (32, 0), (32, 8), (48, 0)):
shift = shift_points(top, *point_shift)
pygame.draw.polygon(surface, color, shift)
class DrawBlock:
def __init__(self, block, data):
self.block = block
self.data = data
def draw(self, surface, pos):
self.block.draw(surface, pos, self.data)
class Grass:
def __init__(self, color):
self.surface = pygame.Surface((64, 64)).convert_alpha()
self.surface.fill((0,0,0,0))
pygame.draw.polygon(self.surface, color, [(0,48), (32,32), (64,48), (32,64)])
square_pattern(self.surface, color)
#pygame.draw.polygon(self.surface, BRED, [(0,48), (32,32), (66,48), (32,64)], 1)
def draw(self, surface, pos):
surface.blit(self.surface, pos)
class Block:
def __init__(self, color):
self.surface = pygame.Surface((64, 64)).convert_alpha()
self.surface.fill((0,0,0,0))
self.create_image(color)
def create_image(self, color):
top = top_points()
left, right = side_points(top)
# top
pygame.draw.polygon(self.surface, color, top)
# left
darken_color(color)
pygame.draw.polygon(self.surface, color, left)
# right
darken_color(color)
pygame.draw.polygon(self.surface, color, right)
#pygame.draw.polygon(self.surface, BRED, [(32,32), (0,16), (32,0), (64,16)], 1)
#pygame.draw.polygon(self.surface, BRED, [(0,16), (32,32), (32,64), (0,48)], 1)
#pygame.draw.polygon(self.surface, BRED, [(32,32), (64,16), (64,48), (32,64)], 1)
def draw(self, surface, pos):
surface.blit(self.surface, pos)
class IceBlock(Block):
def create_image(self, color):
top_color = pygame.Color(*color)
Block.create_image(self, color)
top = top_points()
points = (top[0],
(top[0][0] + 8, top[0][1] - 4),
(top[0][0] + 4, top[0][1] + 2))
pygame.draw.polygon(self.surface, color, points)
points = ((top[0][0] + 16, top[0][1] - 8),
(top[0][0] + 20, top[0][1] - 10),
(top[0][0] + 18, top[0][1] + 9),
(top[0][0] + 16, top[0][1] + 8))
pygame.draw.polygon(self.surface, color, points)
points = (top[2],
(int(top[2][0] - 20), int(top[2][1] - 10)),
(int(top[2][0] - 24), int(top[2][1] + 12)))
pygame.draw.polygon(self.surface, color, points)
points = ((int(top[2][0] - 4), int(top[2][1] + 16)),
(int(top[2][0] - 10), int(top[2][1] + 10)),
(int(top[2][0] - 12), int(top[2][1] + 24)),
(int(top[2][0] - 14), int(top[2][1] + 18)),
(int(top[2][0] - 24), int(top[2][1] + 18)),
(int(top[2][0] - 24), int(top[2][1] + 34)),
(int(top[3][0] - 8), int(top[3][1] + 6)),
(int(top[3][0] - 14), int(top[3][1] + 18)),
(int(top[3][0] - 20), int(top[3][1] + 9)),
(int(top[3][0] - 24), int(top[3][1])),
)
for p in points:
self.surface.set_at(p, top_color)
class Tree:
def __init__(self, color, trunk_color, ground_color):
self.tree_top = pygame.Surface((64, 64)).convert_alpha()
self.tree_top.fill((0,0,0,0))
self.trunk = pygame.Surface((64, 64)).convert_alpha()
self.trunk.fill((0,0,0,0))
self.create_image(color, trunk_color, ground_color)
def create_image(self, color, trunk_color, ground_color):
# Tree Top
top, left, right = self.layer(top_points(), 24, 8)
self.draw_polygons(self.tree_top, top, left, right, pygame.Color(*color))
top, left, right = self.layer(top_points(8, w=-8), 16, 8)
self.draw_polygons(self.tree_top, top, left, right, pygame.Color(*color))
top, left, right = self.layer(top_points(16, w=-16), 8, 8)
self.draw_polygons(self.tree_top, top, left, right, pygame.Color(*color))
top, left, right = self.layer(top_points(24, w=-24), 0, 8)
self.draw_polygons(self.tree_top, top, left, right, pygame.Color(*color))
# Trunk
top = shift_points(top_points(), yshift=32)
pygame.draw.polygon(self.trunk, ground_color, top)
square_pattern(self.trunk, ground_color)
top, left, right = self.layer(top_points(23, w=-23), 0, 32)
self.draw_polygons(self.trunk, top, left, right, trunk_color)
def draw_polygons(self, surface, top, left, right, color):
# top
pygame.draw.polygon(surface, color, top)
# left
darken_color(color)
pygame.draw.polygon(surface, color, left)
# right
darken_color(color)
pygame.draw.polygon(surface, color, right)
def layer(self, toptop, height, diff):
top = shift_points(toptop, yshift=height)
left, right = side_points(top, diff)
return top, left, right
def draw(self, surface, pos):
surface.blit(self.trunk, pos)
position = pos[0], pos[1] - 32
surface.blit(self.tree_top, position)
class Scene:
def __init__(self):
self.rect = pygame.Rect(0, 0, 800, 600)
pygame.display.set_caption('Example')
self.surface = pygame.display.set_mode(self.rect.size)
self.clock = pygame.time.Clock()
self.images = [Grass(pygame.Color('lawngreen')),
Block(pygame.Color('cyan')),
Block(pygame.Color('firebrick')),
Tree(pygame.Color('forestgreen'), pygame.Color('brown'), pygame.Color('lawngreen')),
IceBlock(pygame.Color('cyan')),
IceBlock(pygame.Color('firebrick'))
]
self.map = [[3, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 0, 2, 2, 2, 0],
[0, 1, 0, 0, 1, 0, 0, 2, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 2, 0, 0],
[0, 4, 0, 0, 1, 0, 0, 2, 0, 3],
[0, 4, 0, 0, 1, 0, 2, 5, 5, 0],
[3, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
def loop(self):
self.running = True
while self.running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
self.surface.fill((0,0,0))
cx = self.rect.centerx // 2 + len(self.map) * 32 + 16
cy = self.rect.centery // 2 - len(self.map[0]) * 4
w, h = self.rect.size
for row, line in enumerate(self.map):
for col, tile in enumerate(line):
pos = w - (row * 32 + cx) + col * 32, (col + row) * 16 + cy
self.images[tile].draw(self.surface, pos)
pygame.display.flip()
self.clock.tick(30)
pygame.quit()
scene = Scene()
scene.loop()
RE: [split] image VS drawing - ThePhi - Dec-14-2018 ![]() Post the screenshot it would be easier Maybe you could create a database of computer-drawn images (I'm not sure that what you want but anyway) RE: [split] image VS drawing - Windspar - Dec-23-2018 When creating images at runtime. Keeps the program package smaller. Con will have longer load time. New code for creating image during runtime. Github Pygame Blocks
RE: [split] image VS drawing - metulburr - Dec-23-2018 i would definitely not do it that way, but that is quite impressive. |