用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板2)
admin
2023-07-31 00:37:07
0

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

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

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

123456     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,))

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

按钮菜单部分

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

12345678910111213141516171819 # 初始化部分        self.sizes = [                pygame.image.load(\”big.png\”).convert_alpha(),                pygame.image.load(\”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) # 绘制部分        for (i, img) in enumerate(self.pens):            self.screen.blit(img, self.pens_rect[i].topleft) # 点击判断部分        for (i, rect) in enumerate(self.pens_rect):            if rect.collidepoint(pos):                self.brush.set_brush_style(bool(i))                return True

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

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

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

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

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

完整代码

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 import pygamefrom pygame.locals import *import math # 2011/08/27 Version 1, first imported 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.space = 1        # if style is True, normal solid brush        # if style is False, png brush        self.style = False        # load brush style png        self.brush = pygame.image.load(\”brush.png\”).convert_alpha()        # set the current brush depends on size        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 < 0.5: size = 0.5        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()

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...