"""the simplest pygame example program,最简pygame示例,生成红色的图像""" import pygame image = pygame.Surface((100,100)) # 实例化一个图像 image.fill((255,0,0)) # 给图像所有像素填充为红色 pygame.image.save(image,"red.png")# 保存此图像
"""the simplest pygame image process program,add noise,给图像增加燥音 本程序会在图像上印10X10的蓝色像素点,然后在一个窗口中显示出来。 """ import pygame width,height = 100,100 image = pygame.Surface((width,height)) # 实例化一个图像 image.fill((255,0,255)) # 给图像所有像素填充为品红色 for x in range(width): for y in range(height): if x % 10 ==0 and y % 10 == 0: # or x == y ,etc image.set_at((x,y),(0,0,255))# 重写像素点值 screen = pygame.display.set_mode((width,height)) screen.blit(image,(0,0)) pygame.display.update()
"""the simplest pygame font render program,word2image! 本程序会在青色的背景上显示红色的Python Pygame Font这几个字。 最后会把这个图像保存为文件。 """ import pygame pygame.init() font_filename = pygame.font.get_default_font() # 得到缺省的字体文件名 myfont = pygame.font.Font(font_filename,120) # 新建字体对象 myword = myfont.render("Python Pygame Font",True,(255,0,0)) # 渲染一个字体图层 width,height =myword.get_size() # 得到字体面的宽度和高度 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 screen.fill((0,255,255)) # 填充screen为青色 screen.blit(myword,(0,0)) # 把myword渲染到screen上 pygame.image.save(screen,"lixingqiu.png") # 保存图像 pygame.display.update() # 更新显示
"""the simplest pygame loop template code,basic game loop by lixingqiu pygame最基本的游戏循环样本代码。 """ import pygame from pygame.locals import * # 导入常量 width,height = 480,360 pygame.init() screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame最基本的游戏循环样本代码") running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT:running = False # 这里是游戏逻辑,如碰撞检测会改变个各图像的坐标 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""the simple pygame program code,red square animation,move a object pygame实现最简单的图像缓慢移动代码。原理是不断填充背景,不断重画矩形。 """ import pygame from pygame.locals import * # 导入常量 width,height = 480,360 pygame.init() screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame实现最简单的图像移动代码") redsquare = pygame.Surface((50,50)) # 新建方块图 redsquare.fill((255,0,0)) # 填充为红色 x = 0 running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT:running = False # 这里是游戏逻辑,如碰撞检测会改变个各图像的坐标 x = x + 1 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) screen.blit(redsquare,(x,0)) # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/10份之一秒过后再次循环 clock.tick(10) # set fps 10 pygame.quit()
"""the simple pygame program code,red square animation,bounce on edge. pygame实现最简单的图像移动代码。原理是不断填充背景,不断重画矩形。它碰到边缘会反弹。 """ import random import pygame from pygame.locals import * # 导入常量 width,height = 480,360 pygame.init() screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示碰到边缘就反弹原理样本代码by李兴球") redsquare = pygame.Surface((50,50)) # 新建方块图 redsquare.fill((255,0,0)) # 填充为红色 x = width//2 y = height//2 dx = random.randint(-5,5) # 水平单位位移 dy = random.randint(-5,5) # 垂直单位位移 running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT:running = False # 这里是游戏逻辑,如碰撞检测会改变个各图像的坐标 if x <= 0 or x + 50 >= width: dx = -dx if y <= 0 or y + 50 >= height: dy = -dy x = x + dx y = y + dy # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) screen.blit(redsquare,(x,y)) # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""the simple pygame program code,a square animation,bounce on edge.use rect object. pygame实现最简单的图像移动代码。原理是不断填充背景,不断重画矩形。它碰到边缘会反弹。 使用矩形对象来代表方块的坐标与宽高,使用move_ip来移动矩形对象的位置。 """ import random import pygame from pygame.locals import * # 导入常量 width,height = 480,360 pygame.init() screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示矩形对象by李兴球") w,h = random.randint(25,100),random.randint(25,100) square = pygame.Surface((w,h)) # 新建方块图 square.fill((0,255,255)) # 填充为青色 rect = square.get_rect() # 获取矩形对象 rect.centerx = width//2 # 矩形对象中心点x坐标 rect.centery = height//2 # 矩形对象中心点y坐标 dx = random.randint(-5,5) # 水平单位位移 dy = random.randint(-5,5) # 垂直单位位移 running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT:running = False # 这里是游戏逻辑,如碰撞检测会改变个各图像的坐标 if rect.left <= 0 or rect.right >= width: dx = -dx if rect.top <= 0 or rect.bottom >= height: dy = -dy rect.move_ip(dx,dy) # 移动矩形对象 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) screen.blit(square,rect) # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""demo class use method。the simple pygame program code,a square animation,bounce on edge.use rect object and class,by lixingqiu pygame实现新建方块类来实例化图。本程序会生成不同颜色与大小的长方形,它们会移动,注意while循环的条件判断表达式。 使用的是pygame.event.poll()来从事件队列中取一个事件,如果它的类型为QUIT,则退出while循环。 """ import random import pygame from pygame.locals import * # 导入常量 class Square: """方块类""" def __init__(self): """初始化""" w,h = random.randint(25,100),random.randint(25,100) # temp vars self.image = pygame.Surface((w,h)) # 方块要渲染的图像 r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255) self.image.fill((r,g,b)) # 填充颜色 self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.centerx = width//2 # x坐标移到屏幕中央 self.rect.centery = height//2 # y坐标移到屏幕中央 self.dx = random.randint(-5,5) # 水平单位位移 self.dy = random.randint(-5,5) # 垂直单位位移 def move(self): """移动矩形""" self.rect.move_ip(self.dx,self.dy) self.bounce_on_edge() def bounce_on_edge(self): """碰到边缘就反弹""" if self.rect.left <= 0 or self.rect.right >= width: self.dx = -self.dx if self.rect.top <= 0 or self.rect.bottom >= height: self.dy = -self.dy width,height = 480,360 # define screen'width and height pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示类生成多个颜色方块by李兴球") squares = [ Square() for i in range(10)] clock = pygame.time.Clock() # 时钟对象 while pygame.event.poll().type != QUIT: # 当事件类型不为退出时循环,否则退出 [ square.move() for square in squares ] # 移动每个方块 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) [ screen.blit(square.image,square.rect) for square in squares ] # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""demo ontimer event use method。(Chinese english) 本程序演示pygame的定时器事件,在游戏循环中,会每隔1秒生成一个方块,方块进入屏幕后会自动从自己所在列表中移除。 """ import random import pygame from pygame.locals import * # 导入常量 class Square: """方块类""" def __init__(self,group): """初始化""" w,h = random.randint(25,100),random.randint(25,100) # temp vars self.image = pygame.Surface((w,h)) # 方块要渲染的图像 r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255) self.image.fill((r,g,b)) # 填充颜色 self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.centerx = width//2 # x坐标移到屏幕中央 self.rect.centery = height//2 # y坐标移到屏幕中央 self.dx = random.randint(-5,5) # 水平单位位移 self.dy = random.randint(-5,5) # 垂直单位位移 self.group = group self.group.append(self) # 把自己添加到组中 def move(self): """移动矩形""" self.rect.move_ip(self.dx,self.dy) self.vanish_on_edge() def vanish_on_edge(self): """到边缘消失""" if self.rect.right <= 0 or self.rect.left >= width or \ self.rect.bottom <= 0 or self.rect.top >= height: self.group.remove(self) width,height = 480,360 # define screen'width and height pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示定时器事件by李兴球") squares = [ ] # 以下设置定时器事件 spawn_event = USEREVENT + 1 pygame.time.set_timer(spawn_event,1000) running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == spawn_event: Square(squares) if event.type == QUIT: running = False [ square.move() for square in squares ] # 移动每个方块 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) [ screen.blit(square.image,square.rect) for square in squares ] # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""demo rect object collison. 本程序演示pygame矩形的碰撞检测,本程序设定一个固定矩形,然后在屏幕中央生成一些随机速度的矩形。 它们碰到固定矩形会反向移动。 """ import random import pygame from pygame.locals import * # 导入常量 class Square: """方块类""" def __init__(self,group,position=(0,0)): """初始化""" w,h = random.randint(25,100),random.randint(25,100) # temp vars self.image = pygame.Surface((w,h)) # 方块要渲染的图像 r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255) self.image.fill((r,g,b)) # 填充颜色 self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.center = (width//2,height//2) self.group = group self.group.append(self) # 把自己添加到组中 def move(self): """移动矩形""" self.rect.move_ip(self.dx,self.dy) self.vanish_on_edge() def vanish_on_edge(self): """到边缘消失""" if self.rect.right <= 0 or self.rect.left >= width or \ self.rect.bottom <= 0 or self.rect.top >= height: self.group.remove(self) width,height = 480,360 # define screen'width and height speed = [-5,-4,-3,-2,-1,1,2,3,4,5] pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示矩形碰撞by李兴球") squares = [ ] fixed_square = Square(squares,(100,100)) # 固定不动的方块 fixed_square.dx = 0 # 水平单位位移 fixed_square.dy = 0 # 垂直单位位移 fixed_square.rect.center = (100,100) # 以下设置定时器事件 spawn_event = USEREVENT + 1 pygame.time.set_timer(spawn_event,1000) running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == spawn_event: q = Square(squares) q.dx = random.choice(speed) q.dy = random.choice(speed) if event.type == QUIT: running = False [ square.move() for square in squares ] # 移动每个方块 for square in squares: if square == fixed_square:continue if square.rect.colliderect(fixed_square.rect): # 如果square碰到固定矩形 square.dy = -square.dy square.dx = -square.dx # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) [ screen.blit(square.image,square.rect) for square in squares ] # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
""" demo pygame spriteclass。 本程序演示pygame的sprite类,新建了一个Square类,它继承自pygame.sprite.Sprite。 新建的squares不再是单纯的list了,而是一个 pygame.sprite.Group实例。这样可以对角色进行统一操作。 这前提是精灵要有image和rect属性。 """ import random import pygame from pygame.locals import * # 导入常量 class Square(pygame.sprite.Sprite): """方块类""" def __init__(self,group,position=(0,0)): """初始化""" pygame.sprite.Sprite.__init__(self) w,h = random.randint(25,100),random.randint(25,100) # temp vars self.image = pygame.Surface((w,h)) # 方块要渲染的图像 r,g,b = random.randint(0,255),random.randint(0,255),random.randint(0,255) self.image.fill((r,g,b)) # 填充颜色 self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.center = (width//2,height//2) if group!=None: self.group = group self.group.add(self) # 把自己添加到组中 def update(self): self.move() def move(self): """移动矩形""" self.rect.move_ip(self.dx,self.dy) self.vanish_on_edge() def vanish_on_edge(self): """到边缘消失""" if self.rect.right <= 0 or self.rect.left >= width or \ self.rect.bottom <= 0 or self.rect.top >= height: self.group.remove(self) width,height = 480,360 # define screen'width and height speed = [-5,-4,-3,-2,-1,1,2,3,4,5] pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示继承继承类的矩形与组by李兴球") squares = pygame.sprite.Group() # 新建精灵组 fixed_square = Square(None,(100,100)) # 固定不动的方块,不添加到组中 fixed_square.dx = 0 # 水平单位位移 fixed_square.dy = 0 # 垂直单位位移 fixed_square.rect.center = (100,100) # 以下设置定时器事件 spawn_event = USEREVENT + 1 pygame.time.set_timer(spawn_event,1000) running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == spawn_event: q = Square(squares) q.dx = random.choice(speed) q.dy = random.choice(speed) if event.type == QUIT: running = False squares.update() # 移动每个方块 sprite = pygame.sprite.spritecollideany(fixed_square,squares) if sprite: sprite.dy = -sprite.dy sprite.dx = -sprite.dx # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) squares.draw(screen) # 重画所有精灵 screen.blit(fixed_square.image,fixed_square.rect) # 画固定方块 # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit()
"""demo inherit sprite class example code. 本程序演示继承pygame的sprite类,这个类实例化后会不断地旋转。 """ import pygame from pygame.locals import * # 导入常量 class Square(pygame.sprite.Sprite): """方块类""" def __init__(self,group,image,position=(0,0)): """初始化""" pygame.sprite.Sprite.__init__(self) self.position = position self.raw_image = image # 记录原始图像,image是一个surface self.image = image self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.center = position self._angle = 0 # 设定角度属性 if group!=None: self.group = group self.group.add(self) # 把自己添加到组中 def update(self): self.rotate(1) def rotate(self,dangle): """旋转一定的角度""" self._angle += dangle self.image = pygame.transform.rotate(self.raw_image,self._angle) self.rect = self.image.get_rect() self.rect.center = self.position def main(): width,height = 800,600 # define screen'width and height pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("pygame演示继承精灵类与角色旋转与缩放及by李兴球") image = pygame.image.load("lixingqiu.png").convert_alpha() image = pygame.transform.scale(image,(50,20)) # 缩放图像 squares = pygame.sprite.Group() # 新建精灵组 for x in range(100,width,150): # 生成一些方块 for y in range(50,height,150): Square(squares,image,(x,y)) running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT: running = False squares.update() # 移动每个方块 # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) squares.draw(screen) # 重画所有方块 # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit() if __name__=="__main__": main()
"""demo onpress check,move a arrow like turtle in logo computer language Pygame按键检测_实现简易海龟形式的移动 """ import math import pygame from pygame.locals import * # 导入常量 _turtle_point_list = [(0,25),(50,25),(40,15),(40,35),(50,25)] class Turtle(pygame.sprite.Sprite): """方块类""" def __init__(self,position=(0,0)): """初始化""" pygame.sprite.Sprite.__init__(self) self.position = position self.raw_image = pygame.Surface((50,50)) pygame.draw.lines(self.raw_image,(0,255,255),False,_turtle_point_list) self.image = self.raw_image self.rect = self.image.get_rect() # 方块的矩形对象 self.rect.center = position self._angle = 0 # 设定角度属性(方向) def forward(self,distance): """朝自己的方向前进一定的距离""" dx = distance * math.cos(math.radians(self._angle)) dy = -distance * math.sin(math.radians(self._angle)) self.rect.centerx += dx self.rect.centery += dy def rotate(self,dangle): """旋转一定的角度""" rotate_center = self.rect.center # 记录旋转中心 self._angle += dangle pygame.display.set_caption(str(self._angle) + "_Pygame按键检测_实现简易海龟形式的移动by李兴球") self.image = pygame.transform.rotate(self.raw_image,self._angle) self.rect = self.image.get_rect() self.rect.center = rotate_center # 定位到旋转中心 def main(): width,height = 800,600 # define screen'width and height pygame.init() # pygame初始化 screen = pygame.display.set_mode((width,height))# 新建屏幕对象 pygame.display.set_caption("Pygame按键检测_实现简易海龟形式的移动by李兴球") turtle = Turtle((width//2,height//2)) running = True clock = pygame.time.Clock() # 时钟对象 while running: for event in pygame.event.get(): if event.type == QUIT: running = False ## if event.type == KEYDOWN: ## if event.key == K_UP:turtle.forward(10) ## if event.key == K_DOWN:turtle.forward(-10) ## if event.key == K_LEFT:turtle.rotate(1) ## if event.key == K_RIGHT:turtle.rotate(-1) keys = pygame.key.get_pressed() # 获取所有按键检测 if keys[K_UP] : turtle.forward(10) if keys[K_DOWN] : turtle.forward(-10) if keys[K_LEFT] : turtle.rotate(2) if keys[K_RIGHT] : turtle.rotate(-2) # 渲染各个图像,一般首先渲染screen,它做为背景 screen.fill((0,0,0)) screen.blit(turtle.image,turtle.rect) # 渲染完后更新窗体的显示 pygame.display.update() # 更新显示 # 等待1/60份之一秒过后再次循环 clock.tick(60) # set fps 60 pygame.quit() if __name__=="__main__": main()