用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板2)

By | 2011/08/27

趁热打铁赶快把我们这个画板完成吧~

……鼠绘无能,不准笑!所有评论中“噗嗤”、“画的好搓啊”、“画的好棒啊”等,都会被我无情扑杀掉!但是能告诉我怎样画可以更漂亮的话,绝对欢迎。

上次讲Brush的时候,因为觉得太简单把color设置跳过了,现在实际写的时候才发现,因为我们设置了颜色需要对刷子也有效,所以实际上set_color方法还有一点点收尾工作需要做:

也就是在设定color的时候,顺便把笔刷的颜色也改了,但是要保留原来的alpha值,其实也很简单就是了……

按钮菜单部分

上图可以看到,按钮部分分别为铅笔、毛笔、尺寸大小、(当前样式)、颜色选择者几个组成。我们只以笔刷选择为例讲解一下,其他的都是类似的。

这些代码实际上是我这个例子最想给大家说明的地方,按钮式我们从未接触过的东西,然而游戏中按钮的应用我都不必说。

不过这代码也都不困难,基本都是我们学过的东西,只不过变换了一下组合而已,我稍微说明一下:

初始化部分:读入图标,并给每个图标一个Rect
绘制部分: 根据图表的Rect绘制图表
点击判断部分:根据点击的位置,依靠“碰撞”来判断这个按钮是否被点击,若点击了,则做相应的操作(这里是设置样式)后返回True。这里的collidepoint()是新内容,也就是Rect的“碰撞”函数,它接收一个坐标,如果在Rect内部,就返回True,否则False。

好像也就如此,有了一定的知识积累后,新东西的学习也变得易如反掌了。

在这个代码中,为了明晰,我把各个按钮按照功能都分成了好几组,在实际应用中按钮数量很多的时候可能并不合适,请自己斟酌。

完整代码

OK,这就结束了~ 下面把整个代码贴出来。不过,我是一边写代码一遍写文章,思路不是很连贯,而且python也好久不用了……如果有哪里写的有问题(没有就怪了),还请不吝指出!

200行左右,注释也不是很多,因为在这两篇文章里都讲了,有哪里不明白的请留言,我会根据实际情况再改改。

本次使用的资源文件打包

这次的pygame知识点:

  • 屏幕Surface和图像Surface
  • 图像绘制和图形绘制(是不是有人不明白“图像”和“图形”的区别?简单的说,图像指的是那些图片文件,图形指的是用命令画出来形状)
  • 按钮的实现(新内容

认真的朋友一定发现了本次没有涉及到动画和声音,毕竟这次只是简单的例子,太复杂了不免让人生畏。

实际用一下,会发现这个例子有很多不足,比如画错了不能撤消,只能用白色画掉(当然真正的艺术家都不用橡皮来着);调节画笔大小的时候太麻烦,点一下跳个0.5(你可以试着加上快捷键);窗口尺寸不能变,图片不能打开不能保存……不足一大堆啊,不说了,自己都要伤心了~ 但是只要你掌握了原理,所有的自己期望的功能都能慢慢实现。看着手中的程序慢慢成长,不是很有成就感么?它甚至有可能变的史无前例的强大,难道不是么?

下一个实战是什么?尽请期待~

# 另,非常欢迎有绘图高手用这个画个漂亮点的给我,我好把题头的图片换掉,太吓人了……

16 thoughts on “用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板2)

  1. laceysmth72

    刚开始学习python,想了解学习简单小游戏的编程。网页中看不到代码

    Reply
    1. xishui Post author

      您使用的是什么浏览器?居然看不到代码么,IE,FF,Chrome应该都没问题的,即使禁用了JavaScript也应该能看到,实在不行请查看源代码……

      Reply
  2. wing

    哈哈,博主画的比我好多了~
    另外鼠标移出窗口很容易出现除0错误,得加上length == 0的处理
    我是加了
    if length == 0: return points
    结果是好了,不过鼠标会自动跳回窗口内

    Reply
  3. wing

    呃,对了,还有draw.circle最后一个参数不接受float,是不是因为我用的pygame1.9.2pre

    Reply
  4. Edward

    类型转换(float)报错的几处可以强制转换为int型
    self.size.__int__()类似这样,可以正常运行。

    Reply
  5. 尹越

    请问pygame.mouse.get_pos()怎么还原回event.pos?就是将鼠标单击事件的坐标还原回鼠标单击事件本身。。。

    Reply
  6. pplong

    颜色这一块没看懂
    self.brush.set_at((i, j),
    color + (self.brush.get_at((i, j)).a,))
    求解答!

    Reply
  7. xiaoming

    float出错是笔刷跟铅笔的绘制形式不同,笔刷是 blit,绘制起始点就是鼠标的位置,所以相对于你画的那个点是在左上角的,而铅笔则是画圆,起始点是圆心,所以相对于画出来的那个点就是在正中央

    Reply
  8. 白胡子哥

    这个例子我估计又得啃一天了 ,蓝瘦,香菇。

    Reply
  9. Pingback: 用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板2)-演道网

  10. xzm2017

    画笔和刷子来回切换为什么会直接关闭画板的窗口

    Reply
    1. xzm2017

      解决了,数据类型错误,把size改为整形数就行了!

      Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注