#!/usr/bin/env python import os import OpenGL OpenGL.ERROR_CHECKING = False from OpenGL.GL import * from OpenGL.GLU import * import pygame, pygame.image from pygame.locals import * import numpy textures = [0,0] buflist = False def resize((width, height)): glViewport(0, 0, width, height) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(0, width, height, 0, -1, 10); glMatrixMode(GL_MODELVIEW) glLoadIdentity() def init(): glEnable(GL_TEXTURE_2D) load_textures() make_vbo() glShadeModel(GL_SMOOTH) glClearColor(0.0, 0.0, 0.0, 0.0) glClearDepth(1.0) glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LEQUAL) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) def load_textures(): texturefile = os.path.join('art','test','groundtest.png') textureSurface = pygame.image.load(texturefile) textureData = pygame.image.tostring(textureSurface, "RGBX", 1) glBindTexture(GL_TEXTURE_2D, textures[0]) glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, textureSurface.get_width(), textureSurface.get_height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData ); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) def make_vbo(): global buflist buflist = glGenBuffers(3) vertices = [False] * (20 * 15) for y in range(15): for x in range(20): ty = y * 32 tx = x * 32 # Z coord is used for blit order vertices[x + y * 20] = [tx, ty, y * 0.01, tx + 32, ty, y * 0.01, tx + 32, ty + 32, y * 0.01, tx, ty + 32, y * 0.01] vertices = numpy.array(vertices, dtype=numpy.float32) glBindBuffer(GL_ARRAY_BUFFER, buflist[0]) glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW) indices = numpy.array([x for x in range(4 * 20 * 15)], dtype=numpy.int) glBindBuffer(GL_ARRAY_BUFFER, buflist[2]) glBufferData(GL_ARRAY_BUFFER, indices, GL_STATIC_DRAW) def put_map(themap): uvs = [False] * (20 * 15) index = 0 for line in themap: for tile in line: ty = .0625 * (15 - tile / 16) tx = .0625 * (tile % 16) uvs[index] = [tx, ty + .0625, tx + .0625, ty + .0625, tx + .0625, ty, tx, ty] index += 1 uvs = numpy.array(uvs, dtype=numpy.float32) glBindBuffer(GL_ARRAY_BUFFER, buflist[1]) glBufferData(GL_ARRAY_BUFFER, uvs, GL_STATIC_DRAW) glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnableClientState(GL_INDEX_ARRAY) glBindTexture(GL_TEXTURE_2D, textures[0]) glBindBuffer(GL_ARRAY_BUFFER, buflist[0]) glVertexPointer(3, GL_FLOAT, 0, None) glBindBuffer(GL_ARRAY_BUFFER, buflist[1]) glTexCoordPointer(2, GL_FLOAT, 0, None) glBindBuffer(GL_ARRAY_BUFFER, buflist[2]) glIndexPointer(GL_INT, 0, None) glDrawArrays(GL_QUADS, 0, 4 * 20 * 15) glDisableClientState(GL_VERTEX_ARRAY) glDisableClientState(GL_TEXTURE_COORD_ARRAY) glDisableClientState(GL_INDEX_ARRAY) def draw(): glClear(GL_DEPTH_BUFFER_BIT) # Full redraw: no need to clear color buffer glLoadIdentity() themap = [ [ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 ], [ 17, 0, 1, 1, 1, 33, 1, 1, 1, 1, 1, 1, 2, 33, 3, 17, 17, 17, 17, 17 ], [ 17, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, 17, 19, 3, 17, 17, 17, 17 ], [ 17, 18, 17, 48, 49, 50, 48, 49, 50, 48, 49, 17, 16, 17, 16, 18, 17, 17, 17, 17 ], [ 17, 16, 17, 48, 49, 50, 48, 49, 50, 48, 49, 17, 16, 17, 16, 16, 17, 17, 17, 17 ], [ 17, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 19, 35, 17, 17, 17, 17 ], [ 17, 32, 1, 1, 1, 1, 1, 1, 1, 1, 33, 1, 34, 1, 35, 17, 17, 17, 17, 17 ], [ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], [ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51 ], ] put_map(themap) def main(): video_flags = OPENGL|DOUBLEBUF pygame.init() surface = pygame.display.set_mode((640,480), video_flags) resize((640,480)) init() frames = 0 ticks = pygame.time.get_ticks() start = ticks while 1: event = pygame.event.poll() if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): break # Enforce 33 fps while pygame.time.get_ticks() < ticks + 33: pygame.time.wait(1) ticks = pygame.time.get_ticks() draw() pygame.display.flip() frames = frames+1 #if frames > 200: # break print "fps: %d" % ((frames*1000)/(pygame.time.get_ticks()-start)) if __name__ == '__main__': main() #import cProfile #cProfile.run('main()')