Archivo de Python:
Ejecución del programa:
Código:
import pygame from pygame.locals import * import math import worldManager import time worldMap =[ [8,8,8,8,8,8,8,8,8,8,8,4,4,6,4,4,6,4,6,4,4,4,6,4],#24 [8,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,4], [8,0,3,3,0,0,0,0,0,8,8,4,0,0,0,0,0,0,0,0,0,0,0,6], [8,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6], [8,0,3,3,0,0,0,0,0,8,8,4,0,0,0,0,0,0,0,0,0,0,0,4], [8,0,0,0,0,0,0,0,0,0,8,4,0,0,0,0,0,6,6,6,0,6,4,6], [8,8,8,8,0,8,8,8,8,8,8,4,4,4,4,4,4,6,0,0,0,0,0,6], [7,7,7,7,0,7,7,7,7,0,8,0,8,0,8,0,8,4,0,4,0,6,0,6], [7,7,0,0,0,0,0,0,7,8,0,8,0,8,0,8,8,6,0,0,0,0,0,6], [7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,4], [7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,6,0,6,0,6,0,6], [7,7,0,0,0,0,0,0,7,8,0,8,0,8,0,8,8,6,4,6,0,6,6,6], [7,7,7,7,0,7,7,7,7,8,8,4,0,6,8,4,8,3,3,3,0,3,3,3], [2,2,2,2,0,2,2,2,2,4,6,4,0,0,6,0,6,3,0,0,0,0,0,3], [2,2,0,0,0,0,0,2,2,4,0,0,0,0,0,0,4,3,0,0,0,0,0,3], [2,0,0,0,0,0,0,0,2,4,0,0,0,0,0,0,4,3,0,0,0,0,0,3], [1,0,0,0,0,0,0,0,1,4,4,4,4,4,6,0,6,3,3,0,0,0,3,3], [2,0,0,0,0,0,0,0,2,2,2,1,2,2,2,6,6,0,0,5,0,5,0,5], [2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,0,5,0,5,0,0,0,5,5], [2,0,0,0,0,0,0,0,2,0,0,0,0,0,2,5,0,5,0,5,0,5,0,5], [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5], [2,0,0,0,0,0,0,0,2,0,0,0,0,0,2,5,0,5,0,5,0,5,0,5], [2,2,0,0,0,0,0,2,2,2,0,0,0,2,2,0,5,0,5,0,0,0,5,5], [2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,5,5,5,5,5,5,5,5,5] ];#24 #worldMap =[ # [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2], # [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2] #]; sprite_positions=[ (20.5, 11.5, 2), #green light in front of playerstart #green lights in every room (18.5,4.5, 2), (10.0,4.5, 2), (10.0,12.5,2), (3.5, 6.5, 2), (3.5, 20.5,2), (3.5, 14.5,2), (14.5,20.5,2), #row of pillars in front of wall: fisheye test (18.5, 10.5, 1), (18.5, 11.5, 1), (18.5, 12.5, 1), #some barrels around the map (21.5, 1.5, 0), (15.5, 1.5, 0), (16.0, 1.8, 0), (16.2, 1.2, 0), (3.5, 2.5, 0), (9.5, 15.5, 0), (10.0, 15.1,0), (10.5, 15.8,0), ] def load_image(image, darken, colorKey = None): ret = [] if colorKey is not None: image.set_colorkey(colorKey) if darken: image.set_alpha(127) for i in range(image.get_width()): s = pygame.Surface((1, image.get_height())).convert() #s.fill((0,0,0)) s.blit(image, (- i, 0)) if colorKey is not None: s.set_colorkey(colorKey) ret.append(s) return ret def main(): t = time.clock() #time of current frame oldTime = 0. #time of previous frame pygame.mixer.init()#inicializar el modulo mezclador pygame.mixer.music.load("MuseUprising.mp3") pygame.mixer.music.play(-1) size = w, h = 640,480 pygame.init() window = pygame.display.set_mode(size)#Inicializa una ventana o pantalla para visualizar pygame.display.set_caption("Gh0stenstein") screen = pygame.display.get_surface()#toma una referencia de la superficie de visualizacion actualmente configurada #pixScreen = pygame.surfarray.pixels2d(screen) pygame.mouse.set_visible(False) clock = pygame.time.Clock() #crea un objeto para ayudar a rastrear el tiempo f = pygame.font.SysFont(pygame.font.get_default_font(), 20) #crear un objeto Font a partir de las fuentes del sistema wm = worldManager.WorldManager(worldMap,sprite_positions, 22, 11.5, -1, 0, 0, .66) weapons = [Weapon("fist"), Weapon("pistol"), Weapon("shotgun"), Weapon("dbshotgun"), Weapon("chaingun"), Weapon("plasma"), Weapon("rocket"), Weapon("bfg"), Weapon("chainsaw") ] weapon_numbers = [K_1,K_2,K_3,K_4,K_5,K_6,K_7,K_8,K_0] weapon = weapons[0] #creacion de un bucle infinito que no cierre la ventana while(True): clock.tick(60)#se le pasa como parametro es el framerate, #con el nos aseguramos de que el juego no va a mas de esa velocidad. wm.draw(screen) # tiempo de entrada y contador de FPS frameTime = float(clock.get_time()) / 1000.0 # frameTime is the time this frame has taken, in seconds t = time.clock() text = f.render(str(clock.get_fps()), False, (255, 255, 0)) screen.blit(text, text.get_rect(), text.get_rect()) weapon.draw(screen, t) pygame.display.flip()#Actualiza la pantalla completa de la superficie a la pantalla # speed modifiers moveSpeed = frameTime * 6.0 # the constant value is in squares / second rotSpeed = frameTime * 2.0 # el valor de la constante es en radianes / segundo for event in pygame.event.get(): #get events from the queue if event.type == QUIT: #si se preciona la x de la ventana se detandra el bucle y cerrara el juego return elif event.type == KEYDOWN: if event.key == K_ESCAPE: return elif event.key == K_SPACE: #shoot weapon.play() elif event.key in weapon_numbers: weapon.stop() weapon = weapons[weapon_numbers.index(event.key)] elif event.type == KEYUP: if event.key == K_SPACE: weapon.stop() else: pass keys = pygame.key.get_pressed() #obtiene el estado de todos los botones del teclado if keys[K_UP]: # move forward if no wall in front of you moveX = wm.camera.x + wm.camera.dirx * moveSpeed if(worldMap[int(moveX)][int(wm.camera.y)]==0 and worldMap[int(moveX + 0.1)][int(wm.camera.y)]==0):wm.camera.x += wm.camera.dirx * moveSpeed moveY = wm.camera.y + wm.camera.diry * moveSpeed if(worldMap[int(wm.camera.x)][int(moveY)]==0 and worldMap[int(wm.camera.x)][int(moveY + 0.1)]==0):wm.camera.y += wm.camera.diry * moveSpeed if keys[K_DOWN]: # move backwards if no wall behind you if(worldMap[int(wm.camera.x - wm.camera.dirx * moveSpeed)][int(wm.camera.y)] == 0):wm.camera.x -= wm.camera.dirx * moveSpeed if(worldMap[int(wm.camera.x)][int(wm.camera.y - wm.camera.diry * moveSpeed)] == 0):wm.camera.y -= wm.camera.diry * moveSpeed if (keys[K_RIGHT] and not keys[K_DOWN]) or (keys[K_LEFT] and keys[K_DOWN]): # gira hacia la derecha # tanto la direccion de la camara como el plano de la camara deben girarse oldDirX = wm.camera.dirx wm.camera.dirx = wm.camera.dirx * math.cos(- rotSpeed) - wm.camera.diry * math.sin(- rotSpeed) wm.camera.diry = oldDirX * math.sin(- rotSpeed) + wm.camera.diry * math.cos(- rotSpeed) oldPlaneX = wm.camera.planex wm.camera.planex = wm.camera.planex * math.cos(- rotSpeed) - wm.camera.planey * math.sin(- rotSpeed) wm.camera.planey = oldPlaneX * math.sin(- rotSpeed) + wm.camera.planey * math.cos(- rotSpeed) if (keys[K_LEFT] and not keys[K_DOWN]) or (keys[K_RIGHT] and keys[K_DOWN]): # rotate to the left # both camera direction and camera plane must be rotated oldDirX = wm.camera.dirx wm.camera.dirx = wm.camera.dirx * math.cos(rotSpeed) - wm.camera.diry * math.sin(rotSpeed) wm.camera.diry = oldDirX * math.sin(rotSpeed) + wm.camera.diry * math.cos(rotSpeed) oldPlaneX = wm.camera.planex wm.camera.planex = wm.camera.planex * math.cos(rotSpeed) - wm.camera.planey * math.sin(rotSpeed) wm.camera.planey = oldPlaneX * math.sin(rotSpeed) + wm.camera.planey * math.cos(rotSpeed) fps = 8 class Weapon(object): def __init__(self, weaponName="shotgun", frameCount = 5): self.images = [] self.loop = False self.playing = False self.frame = 0 self.oldTime = 0 for i in range(frameCount): img = pygame.image.load("pics/weapons/%s%s.bmp" % (weaponName, i+1)).convert() img = pygame.transform.scale2x(img) img = pygame.transform.scale2x(img) img.set_colorkey(img.get_at((0,0))) self.images.append(img) def play(self): self.playing = True self.loop = True def stop(self): self.playing = False self.loop = False def draw(self, surface, time): if(self.playing or self.frame > 0): if(time > self.oldTime + 1./fps): self.frame = (self.frame+1) % len(self.images) if self.frame == 0: if self.loop: self.frame = 1 else: self.playing = False self.oldTime = time img = self.images[self.frame] surface.blit(img, (surface.get_width()/2 - img.get_width()/2, surface.get_height()-img.get_height())) if __name__ == '__main__': main()
Video sobre Graficacion en 3D: https://www.youtube.com/watch?v=uuUbdluqSiE
No hay comentarios:
Publicar un comentario