annotate nagslang/game_object.py @ 81:a1b4d09e6f23

Floor switch with horrible hackery.
author davidsharpe@lantea.local
date Sun, 01 Sep 2013 22:53:37 +0200
parents 7f038ee778ad
children 11b0017b5e4b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
1 import math
62
1d67a8c9861d WTF whitespace?!?!?!?!
Jeremy Thurgood <firxen@gmail.com>
parents: 60
diff changeset
2
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
3 import pygame
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
4 import pymunk
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
5
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
6 from nagslang.constants import SWITCH_PUSHERS, COLLISION_TYPE_SWITCH
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
7
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
8 class Puzzler(object):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
9 def get_state(self, space):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
10 raise NotImplementedError()
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
11
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
12 def notify(self):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
13 pass
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
14
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
15
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
16 class FloorSwitchPuzzler(Puzzler):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
17 def __init__(self, shape):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
18 self.shape = shape
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
19
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
20 def get_state(self, space):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
21 for shape in space.shape_query(self.shape):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
22 if shape.collision_type in SWITCH_PUSHERS:
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
23 return True
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
24 return False
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
25
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
26
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
27 class Physicser(object):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
28 def add_to_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
29 raise NotImplementedError()
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
30
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
31 def remove_from_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
32 raise NotImplementedError()
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
33
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
34 def render_position(self, surface):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
35 raise NotImplementedError()
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
36
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
37 def render_angle(self):
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
38 raise NotImplementedError()
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
39
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
40
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
41 class NullPhysicser(Physicser):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
42 def add_to_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
43 pass
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
44
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
45 def remove_from_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
46 pass
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
47
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
48 def render_position(self):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
49 return (0, 0)
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
50
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
51 def render_angle(self):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
52 return 0
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
53
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
54
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
55 class SingleShapePhysicser(Physicser):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
56 def __init__(self, shape):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
57 self._shape = shape
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
58
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
59 def add_to_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
60 space.add(self._shape, self._shape.body)
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
61
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
62 def remove_from_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
63 space.remove(self._shape, self._shape.body)
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
64
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
65 def render_position(self, surface):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
66 pos = self._shape.body.position
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
67 import pymunk.pygame_util
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
68 return pymunk.pygame_util.to_pygame(pos, surface)
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
69
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
70 def render_angle(self):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
71 return self._shape.body.angle
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
72
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
73
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
74 class Renderer(object):
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
75 def render(self, surface, pos, angle):
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
76 raise NotImplementedError()
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
77
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
78
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
79 def image_pos(image, pos):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
80 return (pos[0] - image.get_width() / 2,
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
81 pos[1] - image.get_height() / 2)
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
82
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
83
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
84 class ImageRenderer(Renderer):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
85 def __init__(self, image):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
86 self._image = image
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
87
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
88 def render(self, surface, pos, angle):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
89 surface.blit(self._image, image_pos(self._image, pos))
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
90
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
91
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
92 class FacingImageRenderer(Renderer):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
93 def __init__(self, left_image, right_image):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
94 self._images = {
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
95 'left': left_image,
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
96 'right': right_image,
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
97 }
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
98
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
99 def get_image(self, angle):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
100 if abs(angle) < math.pi / 2:
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
101 return self._images['right']
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
102 return self._images['left']
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
103
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
104 def render(self, surface, pos, angle):
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
105 image = self.get_image(angle)
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
106 surface.blit(image, image_pos(image, pos))
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
107
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
108
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
109 class ShapeRenderer(Renderer):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
110 def __init__(self, shape):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
111 self._shape = shape
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
112
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
113 def render(self, surface, pos, angle):
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
114 import pymunk.pygame_util
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
115 pymunk.pygame_util.draw(surface, self._shape)
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
116
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
117
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
118 class GameObject(object):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
119 """A representation of a thing in the game world.
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
120
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
121 This has a rendery thing, physicsy things and maybe some other things.
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
122 """
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
123
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
124 def __init__(self, renderer, physicser=None, puzzler=None):
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
125 self.renderer = renderer
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
126 if physicser is None:
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
127 physicser = NullPhysicser()
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
128 self.physicser = physicser
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
129 self.puzzler = puzzler
59
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
130
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
131 def add_to_space(self, space):
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
132 self.physicser.add_to_space(space)
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
133
b412704a6737 Start of game object stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
134 def render(self, surface):
60
34a87ec12124 Fix long line.
Jeremy Thurgood <firxen@gmail.com>
parents: 59
diff changeset
135 return self.renderer.render(
63
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
136 surface, self.physicser.render_position(surface),
7f038ee778ad Put werewolf facing direction magic back.
Jeremy Thurgood <firxen@gmail.com>
parents: 62
diff changeset
137 self.physicser.render_angle())
81
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
138
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
139
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
140 class FloorSwitch(GameObject):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
141 def __init__(self, position):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
142 body = pymunk.Body()
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
143 body.position = position
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
144 self.shape = pymunk.Circle(body, 30)
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
145 self.shape.collision_type = COLLISION_TYPE_SWITCH
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
146 self.shape.sensor = True
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
147 super(FloorSwitch, self).__init__(
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
148 ShapeRenderer(self.shape),
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
149 SingleShapePhysicser(self.shape),
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
150 FloorSwitchPuzzler(self.shape),
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
151 )
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
152
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
153 def add_to_space(self, space):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
154 # XXX: Hacky hack.
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
155 self._space = space
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
156
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
157 def render(self, surface):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
158 if self.puzzler.get_state(self._space):
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
159 self.shape.color = pygame.color.THECOLORS['green']
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
160 else:
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
161 self.shape.color = pygame.color.THECOLORS['red']
a1b4d09e6f23 Floor switch with horrible hackery.
davidsharpe@lantea.local
parents: 63
diff changeset
162 super(FloorSwitch, self).render(surface)