python+pygame简单画板实现代码实例


Posted in Python onDecember 13, 2017

疑问:pygame已经过时了吗?

过没过时不知道,反正这玩意官方已经快四年没有更新了。用的人还是蛮多的(相对于其他同类项目),不过大家都是用来写写小东西玩一玩,没有人用这个做商业项目。pygame其实就是SDL的python绑定,SDL又是基于OpenGL,所以也有人用pygame+pyOpenGL做3D演示什么的。真的要写游戏的话pygame的封装比较底层,不太够用,很多东西都要自己实现(当然自由度也高)。文档也不太好,好在前人留下了很多文章。拿来练手倒是很不错的选择,可以用来实践很多2D游戏中常用的思想和算法。如果是想要直接以上来拿来写2D游戏的话还可以选择cocos2D(注意不是iOS那个,是Python的)这个的API设计的非常好,简单易用。还有场景管理、内置的控制台等等。可惜也有一年没更新……虽然作者说会更新啦,估计他主攻Objective-C那个版本的cocos了,毕竟用的人多……帧动画之类的特性没有真是很可惜(Objective-C的版本就有T_T)如果是想写引擎的话可以试试pyglet。想写3D试试panda3D或者python-orge,这俩我都没用过,不过大家都这么说,应该错不了。总的来说拿python写游戏的人少之又少,你写完了别人玩还要装环境,打包又各种bug,拿来试验游戏中的某种算法做原型还可以。真正写还是算了。当然了,题主要是根本就没打算用pygame写游戏就当我什么都没说吧……

(以上来自知乎的回答,感谢!)

下面是画板截图

python+pygame简单画板实现代码实例

# -*- coding: utf-8 -*-
import pygame
from pygame.locals import *
import math
class Brush:
  def __init__(self, screen):
    self.screen = screen
    self.color = (0, 0, 0)
    self.size = 1
    self.drawing = False
    self.last_pos = None
    self.style = True
    self.brush = pygame.image.load("images/brush.png").convert_alpha()
    self.brush_now = self.brush.subsurface((0, 0), (1, 1)) 
  def start_draw(self, pos):
    self.drawing = True
    self.last_pos = pos 
  def end_draw(self):
    self.drawing = False 
  def set_brush_style(self, style):
    print("* set brush style to", style)
    self.style = style 
  def get_brush_style(self):
    return self.style 
  def get_current_brush(self):
    return self.brush_now 
  def set_size(self, size):
    if size < 1:
      size = 1
    elif size > 32:
      size = 32
    print("* set brush size to", size)
    self.size = size
    self.brush_now = self.brush.subsurface((0, 0), (size*2, size*2)) 
  def get_size(self):
    return self.size 
  def set_color(self, color):
    self.color = color
    for i in xrange(self.brush.get_width()):
      for j in xrange(self.brush.get_height()):
        self.brush.set_at((i, j),
                 color + (self.brush.get_at((i, j)).a,)) 
  def get_color(self):
    return self.color 
  def draw(self, pos):
    if self.drawing:
      for p in self._get_points(pos):
        if self.style:
          self.screen.blit(self.brush_now, p)
        else:
          pygame.draw.circle(self.screen, self.color, p, self.size)
      self.last_pos = pos
 
  def _get_points(self, pos):
    points = [(self.last_pos[0], self.last_pos[1])]
    len_x = pos[0] - self.last_pos[0]
    len_y = pos[1] - self.last_pos[1]
    length = math.sqrt(len_x**2 + len_y**2)
    step_x = len_x / length
    step_y = len_y / length
    for i in xrange(int(length)):
      points.append((points[-1][0] + step_x, points[-1][1] + step_y))
    points = map(lambda x: (int(0.5 + x[0]), int(0.5 + x[1])), points)
    return list(set(points)) 
class Menu:
  def __init__(self, screen):
    self.screen = screen
    self.brush = None
    self.colors = [
      (0xff, 0x00, 0xff), (0x80, 0x00, 0x80),
      (0x00, 0x00, 0xff), (0x00, 0x00, 0x80),
      (0x00, 0xff, 0xff), (0x00, 0x80, 0x80),
      (0x00, 0xff, 0x00), (0x00, 0x80, 0x00),
      (0xff, 0xff, 0x00), (0x80, 0x80, 0x00),
      (0xff, 0x00, 0x00), (0x80, 0x00, 0x00),
      (0xc0, 0xc0, 0xc0), (0xff, 0xff, 0xff),
      (0x00, 0x00, 0x00), (0x80, 0x80, 0x80),
    ]
    self.colors_rect = []
    for (i, rgb) in enumerate(self.colors):
      rect = pygame.Rect(10 + i % 2 * 32, 254 + i / 2 * 32, 32, 32)
      self.colors_rect.append(rect)
    self.pens = [
      pygame.image.load("images/pen1.png").convert_alpha(),
      pygame.image.load("images/pen2.png").convert_alpha(),
    ]
    self.pens_rect = []
    for (i, img) in enumerate(self.pens):
      rect = pygame.Rect(10, 10 + i * 64, 64, 64)
      self.pens_rect.append(rect)
    self.sizes = [
      pygame.image.load("images/big.png").convert_alpha(),
      pygame.image.load("images/small.png").convert_alpha()
    ]
    self.sizes_rect = []
    for (i, img) in enumerate(self.sizes):
      rect = pygame.Rect(10 + i * 32, 138, 32, 32)
      self.sizes_rect.append(rect)
 
  def set_brush(self, brush):
    self.brush = brush
 
  def draw(self):
    for (i, img) in enumerate(self.pens):
      self.screen.blit(img, self.pens_rect[i].topleft)
    for (i, img) in enumerate(self.sizes):
      self.screen.blit(img, self.sizes_rect[i].topleft)
    self.screen.fill((255, 255, 255), (10, 180, 64, 64))
    pygame.draw.rect(self.screen, (0, 0, 0), (10, 180, 64, 64), 1)
    size = self.brush.get_size()
    x = 10 + 32
    y = 180 + 32
    if self.brush.get_brush_style():
      x = x - size
      y = y - size
      self.screen.blit(self.brush.get_current_brush(), (x, y))
    else:
      pygame.draw.circle(self.screen,
                self.brush.get_color(), (x, y), size)
    for (i, rgb) in enumerate(self.colors):
      pygame.draw.rect(self.screen, rgb, self.colors_rect[i])
  def click_button(self, pos):
    for (i, rect) in enumerate(self.pens_rect):
      if rect.collidepoint(pos):
        self.brush.set_brush_style(bool(i))
        return True
    for (i, rect) in enumerate(self.sizes_rect):
      if rect.collidepoint(pos):
        if i:
          self.brush.set_size(self.brush.get_size() - 1)
        else:
          self.brush.set_size(self.brush.get_size() + 1)
        return True
    for (i, rect) in enumerate(self.colors_rect):
      if rect.collidepoint(pos):
        self.brush.set_color(self.colors[i])
        return True
    return False
class Painter:
  def __init__(self):
    self.screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("Painter")
    self.clock = pygame.time.Clock()
    self.brush = Brush(self.screen)
    self.menu = Menu(self.screen)
    self.menu.set_brush(self.brush)
  def run(self):
    self.screen.fill((255, 255, 255))
    while True:
      self.clock.tick(30)
      for event in pygame.event.get():
        if event.type == QUIT:
          return
        elif event.type == KEYDOWN:
          if event.key == K_ESCAPE:
            self.screen.fill((255, 255, 255))
        elif event.type == MOUSEBUTTONDOWN:
          if event.pos[0] <= 74 and self.menu.click_button(event.pos):
            pass
          else:
            self.brush.start_draw(event.pos)
        elif event.type == MOUSEMOTION:
          self.brush.draw(event.pos)
        elif event.type == MOUSEBUTTONUP:
          self.brush.end_draw()
      self.menu.draw()
      pygame.display.update()
def main():
  app = Painter()
  app.run()
 
if __name__ == '__main__':
  main()

总结

以上就是本文关于python+pygame简单画板实现代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python任务调度实例分析
May 19 Python
详解Python中的type()方法的使用
May 21 Python
Python中返回字典键的值的values()方法使用
May 22 Python
Python实现二分查找算法实例
May 26 Python
python利用lxml读写xml格式的文件
Aug 10 Python
Python读取文件内容的三种常用方式及效率比较
Oct 07 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
Python 学习教程之networkx
Apr 15 Python
Python跳出多重循环的方法示例
Jul 03 Python
Python代码太长换行的实现
Jul 05 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
Python实现简单的语音识别系统
Dec 13 #Python
关于反爬虫的一些简单总结
Dec 13 #Python
Python自动化运维_文件内容差异对比分析
Dec 13 #Python
Python实现自动发送邮件功能
Mar 02 #Python
django站点管理详解
Dec 12 #Python
Django 生成登陆验证码代码分享
Dec 12 #Python
python+django加载静态网页模板解析
Dec 12 #Python
You might like
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
onpropertypchange
2006/07/01 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
js怎么覆盖原有方法实现重写
2014/09/04 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
易被忽视的js事件问题总结
2016/05/14 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
python的绘图工具matplotlib使用实例
2014/07/03 Python
Python Requests安装与简单运用
2016/04/07 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
python对XML文件的操作实现代码
2020/03/27 Python
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
项目采购员岗位职责
2014/04/15 职场文书
教师求职信范文
2014/05/24 职场文书
物流管理专业推荐信
2014/09/06 职场文书
春季运动会加油词
2015/07/18 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS