main.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. import pyglet
  2. from pyglet.gl import *
  3. from pyglet.window import key
  4. import math
  5. import os
  6. from PIL import Image
  7. from anarchmap import AnarchMap
  8. assets_folder = '../anarch/assets/'
  9. class LevelModel:
  10. def get_tex(self,file):
  11. tex = pyglet.image.load(file).get_texture()
  12. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
  13. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
  14. return pyglet.graphics.TextureGroup(tex)
  15. def get_texture(self, textureIndex):
  16. tex = pyglet.image.load()
  17. def add_block(self, x, y, z, wall_tex, ceil_color=0, floor_color=0):
  18. X, Y, Z = x+1, y+1, z+1
  19. tex_coords = ('t2f', (0, 0, 1, 0, 1, 1, 0, 1))
  20. white = [255]*4
  21. self.batch.add(4, GL_QUADS, self.wall_textures[wall_tex], ('v3f', (X, y, z, x, y, z, x, Y, z, X, Y, z)), tex_coords) # back
  22. self.batch.add(4, GL_QUADS, self.wall_textures[wall_tex], ('v3f', (x, y, Z, X, y, Z, X, Y, Z, x, Y, Z)), tex_coords) # front
  23. self.batch.add(4, GL_QUADS, self.wall_textures[wall_tex], ('v3f', (x, y, z, x, y, Z, x, Y, Z, x, Y, z)), tex_coords) # left
  24. self.batch.add(4, GL_QUADS, self.wall_textures[wall_tex], ('v3f', (X, y, Z, X, y, z, X, Y, z, X, Y, Z)), tex_coords) # right
  25. self.batch.add(4, GL_QUADS, None, ('v3f', (x, y, z, X, y, z, X, y, Z, x, y, Z)), ('c4b', white * 4)) # bottom
  26. self.batch.add(4, GL_QUADS, None, ('v3f', (x, Y, Z, X, Y, Z, X, Y, z, x, Y, z)), ('c4b', white * 4)) # top
  27. def __init__(self, basepath):
  28. self.base_path = basepath
  29. self.batch = pyglet.graphics.Batch()
  30. # build list of wall textures
  31. idxs = range(16)
  32. filename_template = os.path.join(self.base_path, 'wall_texture{}.png')
  33. self.wall_textures = list(map(lambda x: self.get_tex(filename_template.format(x)), idxs))
  34. # self.add_block(0, 0, -1, 0)
  35. # self.add_block(0, 2, -1, 0)
  36. def load_level_image(self, file):
  37. self.ceiling_color = 0xff0000
  38. self.floor_color = 0x0000ff
  39. self.map = AnarchMap(file)
  40. # TODO: set background image (background[0|1|2].png) from "background" + map.backgroundTex + ".png"
  41. for x in range(64):
  42. for y in range(64):
  43. item = self.map.levelMap[x][y]
  44. if not item[0]:
  45. continue
  46. else:
  47. tile_index = self.map.defineName(item[0])
  48. floor_tex = self.map.floorDict[item[0]][0]
  49. floor_ht = self.map.floorDict[item[0]][1]
  50. # print("tile: %s, %s, %s" % (tile_index, item[0], floor_ht))
  51. self.add_block(0-x, floor_ht / 32, 0-y, floor_tex)
  52. def draw(self):
  53. self.batch.draw()
  54. class Camera:
  55. def __init__(self, pos=(0, 0, 0), rot=(0, 0)):
  56. self.pos = list(pos)
  57. self.rot = list(rot)
  58. def mouse_motion(self, dx, dy):
  59. dx/= 8
  60. dy/= 8
  61. self.rot[0] += dy
  62. self.rot[1] -= dx
  63. if self.rot[0]>90:
  64. self.rot[0] = 90
  65. elif self.rot[0] < -90:
  66. self.rot[0] = -90
  67. def update(self,dt,keys):
  68. sens = 0.1
  69. s = dt*10
  70. rotY = -self.rot[1]/180*math.pi
  71. dx, dz = s*math.sin(rotY), math.cos(rotY)
  72. if keys[key.W]:
  73. self.pos[0] += dx*sens
  74. self.pos[2] -= dz*sens
  75. if keys[key.S]:
  76. self.pos[0] -= dx*sens
  77. self.pos[2] += dz*sens
  78. if keys[key.A]:
  79. self.pos[0] -= dz*sens
  80. self.pos[2] -= dx*sens
  81. if keys[key.D]:
  82. self.pos[0] += dz*sens
  83. self.pos[2] += dx*sens
  84. if keys[key.SPACE]:
  85. self.pos[1] += s
  86. if keys[key.LSHIFT]:
  87. self.pos[1] -= s
  88. class Window(pyglet.window.Window):
  89. def push(self,pos,rot):
  90. glPushMatrix()
  91. rot = self.player.rot
  92. pos = self.player.pos
  93. glRotatef(-rot[0],1,0,0)
  94. glRotatef(-rot[1],0,1,0)
  95. glTranslatef(-pos[0], -pos[1], -pos[2])
  96. def Projection(self):
  97. glMatrixMode(GL_PROJECTION)
  98. glLoadIdentity()
  99. def Model(self):
  100. glMatrixMode(GL_MODELVIEW)
  101. glLoadIdentity()
  102. def set2d(self):
  103. self.Projection()
  104. gluPerspective(0, self.width, 0, self.height)
  105. self.Model()
  106. def set3d(self):
  107. self.Projection()
  108. gluPerspective(70, self.width/self.height, 0.05, 1000)
  109. self.Model()
  110. def setLock(self, state):
  111. self.lock = state
  112. self.set_exclusive_mouse(state)
  113. lock = False
  114. mouse_lock = property(lambda self:self.lock, setLock)
  115. def __init__(self, *args, **kwargs):
  116. super().__init__(*args, **kwargs)
  117. self.set_minimum_size(300,200)
  118. self.keys = key.KeyStateHandler()
  119. self.push_handlers(self.keys)
  120. pyglet.clock.schedule(self.update)
  121. self.model = LevelModel(assets_folder)
  122. self.player = Camera((0.5,1.5,1.5),(-30,0))
  123. self.model.load_level_image('level0.gif')
  124. def on_mouse_motion(self,x,y,dx,dy):
  125. if self.mouse_lock: self.player.mouse_motion(dx,dy)
  126. def on_key_press(self, KEY, _MOD):
  127. if KEY == key.ESCAPE:
  128. self.close()
  129. elif KEY == key.E:
  130. self.mouse_lock = not self.mouse_lock
  131. def update(self, dt):
  132. self.player.update(dt, self.keys)
  133. def on_draw(self):
  134. self.clear()
  135. self.set3d()
  136. self.push(self.player.pos,self.player.rot)
  137. self.model.draw()
  138. glPopMatrix()
  139. if __name__ == '__main__':
  140. window = Window(width=400, height=300, caption='AnarchMap', resizable=True)
  141. glClearColor(0.5,0.7,1,1)
  142. glEnable(GL_DEPTH_TEST)
  143. #glEnable(GL_CULL_FACE)
  144. pyglet.app.run()