import rabbyt from rabbyt import lerp, wrap from pygame.locals import* import pygame, random import os.path # Uncomment one of these to use the opengl functions: #from pyglet.gl import * #from OpenGL.GL import * r = lambda: random.random()-.5 class Grass: def __init__(self, xy, lenght, number): self.g = set() self.node_set = NodeSet(512) for x in xrange(number): rand = random.choice((1.,2.,3.)) grass = rabbyt.Sprite('grass.png', shape = (-8,32,8,0), tex_shape = ((rand-1)/3, 1,rand/3,0) ) a = r()*70 grass.rot = rabbyt.sine(a, a+10, startt=x, dt=2000, extend="reverse") grass.scale = random.random()*.5+.5 grass.x = r()*lenght+xy[0] grass.y = xy[1]+r()*5 self.g.add(grass) self.node_set.get(grass.xy).add(grass) class NodeSet(object): def __init__(self, size, make_node=lambda:set()): self.node_size = size self.nodes = {} self.make_node = make_node def get(self, (x, y)): i = (int(x)//self.node_size, int(y)//self.node_size) return self._get_node(i) def _get_node(self, node_key): if not self.nodes.has_key(node_key): node = self.make_node() self.nodes[node_key] = node return self.nodes[node_key] def range(self, (x1, y1, x2, y2)): x1 = int(x1)//self.node_size y1 = int(y1)//self.node_size x2 = int(x2)//self.node_size y2 = int(y2)//self.node_size for y in xrange(y1, y2+1): for x in xrange(x1, x2+1): yield self._get_node((x,y)) rabbyt.init_display((640, 480)) grass = Grass((0,-240),6400,10000) c = pygame.time.Clock() last_fps = 0 cam_x = 0 while not pygame.event.get(pygame.QUIT): c.tick() event = pygame.event.poll() if event.type == KEYDOWN: if event.key == K_ESCAPE: break keystate = pygame.key.get_pressed() cam_x += (keystate[K_RIGHT]-keystate[K_LEFT])*5 if pygame.time.get_ticks()-last_fps >1000: print c.get_fps() last_fps = pygame.time.get_ticks() rabbyt.clear() # Do either this: rabbyt.set_viewport((0,0, 640, 480), (-320+cam_x, 240, 320+cam_x, -240)) # Or this: #glLoadIdentity() #glTranslatef(-cam_x, 0,0) #for s in grass.g: #if cam_x-340 < s.x < cam_x+340: #s.render() for node in grass.node_set.range((-340+cam_x, -240, 320+cam_x, 240)): for s in node: s.render() rabbyt.set_time(pygame.time.get_ticks()) pygame.display.flip() pygame.quit()