本系列教程仅有一些在本机调试通过的代码(如代码中发现bug,恳请包涵)。除代码中出现的一些主要注释外,不会出现太多其他文字解释,但是,文章中会给出主要模块的官方文档地址。再次:该系列文章的目的主要是抛砖,看‘玉’的同志们请移步官方文档。希望同志们,多多尝试,共同进步,谢谢!!!
import math
import pygame,sys
from pygame.locals import *
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400
WHITE = (255,255,255)
GREEN = (0,255,0)
BLUE = (0,0,128)
class Pen():
def __init__(self,screen):
self.color = None
self.size = None
self.last_pos = None
self.statue = False
self.screen = screen
def setPenColor(self,color):
self.color = color
def setPenSize(self,size):
self.size = size
def getPenColor(self):
return self.color
def setPenStatue(self,value):
self.statue= value
def getPenStatue(self):
return self.statue
def getPenSize(self):
return self.size
def start_draw(self,pos):
self.last_pos = pos
def end_draw(self):
self.last_pos = None
def draw(self,pos):
for point in self.get_points(pos):
pygame.draw.rect(self.screen, self.color, (point[0], point[1], self.size, 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 range(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 set(points)
class Menu:
def __init__(self,screen , pen):
self.screen = screen
self.pen = pen
self.size = 5
self.color = [127, 127, 127]
self.ADD = pygame.image.load('big.png')
self.DE = pygame.image.load('small.png')
def create_scales(self):
self.red_scale_surface = pygame.surface.Surface((300, 33))
self.green_scale_surface = pygame.surface.Surface((300, 33))
self.blue_scale_surface = pygame.surface.Surface((300, 33))
for x in range(300):
c = int((x / 300.) * 255.)
red = (c, 0, 0)
green = (0, c, 0)
blue = (0, 0, c)
line_rect = Rect(x, 0, 1, 33)
pygame.draw.rect(self.red_scale_surface, red, line_rect)
pygame.draw.rect(self.green_scale_surface, green, line_rect)
pygame.draw.rect(self.blue_scale_surface, blue, line_rect)
self.red_rect = pygame.Rect(0,0,300,33)
self.green_rect = pygame.Rect(0,33,300,33)
self.blue_rect = pygame.Rect(0,66,300,33)
self.Add_rect = pygame.Rect(300,20,32,32)
self.De_rect = pygame.Rect(350,20,32,32)
def drawMenu(self):
self.create_scales()
self.screen.blit(self.red_scale_surface,(0,0))
self.screen.blit(self.green_scale_surface,(0,33))
self.screen.blit(self.blue_scale_surface,(0,66))
self.screen.blit(self.ADD,(300,20))
self.screen.blit(self.DE,(350,20))
for component in range(3):
pos = (int((self.color[component] / 255.) * 300), component * 33 + 15)
pygame.draw.circle(self.screen, (255, 255, 255), pos, 10)
def click_on(self,pos):
x,y = pos[0],pos[1]
if self.red_rect.collidepoint(pos):
self.color[0] = int(x / 300 * 255.)
elif self.green_rect.collidepoint(pos):
self.color[1] = int(x / 300 * 255.)
elif self.blue_rect.collidepoint(pos):
self.color[2] = int(x / 300 * 255.)
elif self.Add_rect.collidepoint(pos):
self.size += 2
elif self.De_rect.collidepoint(pos):
self.size -= 2
self.setPen()
def setPen(self):
if self.size > 32:
self.size = 32
elif self.size < 5:
self.size = 5
self.pen.setPenColor(self.color)
self.pen.setPenSize(self.size)
class paniter:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
self.pen = Pen(self.screen)
self.pen.setPenColor(BLUE)
self.pen.setPenSize(5)
self.pen.setPenStatue(False)
self.menu = Menu(self.screen,self.pen)
self.clock = pygame.time.Clock()
pygame.display.set_caption("绘画板")
def run(self):
self.screen.fill(WHITE)
pygame.draw.line(self.screen, GREEN, (0, 100), (400, 100), 2)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
self.screen.fill(WHITE)
pygame.draw.line(self.screen, GREEN, (0, 100), (400, 100), 2)
elif event.type == MOUSEBUTTONDOWN :
pos = event.pos
if pos[1] > 100:
self.pen.setPenStatue(True)
self.pen.start_draw(event.pos)
else:
self.menu.click_on(pos)
elif self.pen.getPenStatue() and event.type == MOUSEBUTTONUP:
self.pen.setPenStatue(False)
self.pen.end_draw()
elif self.pen.getPenStatue() and event.type == MOUSEMOTION:
self.pen.draw(event.pos)
self.menu.drawMenu()
pygame.display.update()
self.clock.tick(30)
def main():
app = paniter()
app.run()
main()
注意:颜色,update(), fill(), blit()函数,以及刷帧率
按钮图片:
相关知识
【原创】pygame学习笔记(2)
郁金香插花技巧基础教程
插花艺术基础教程
初学者必备的实用插花基础教程知识
【图】丝网花插花基础教程 丝网花绿绒蒿的制作步骤
手绘植物绘画的简单基础教程
水彩画基础教程:花草、蔬果、动物、静物、风景手绘技法
中国画基础教程——写意花鸟鱼虫【全本
Android 移动应用基础教程(Android Studio)(第2版)学习笔记及源码
花艺配色美学:色彩搭配基础教程
网址: Pygame基础教程(二) https://m.huajiangbk.com/newsview1178758.html
上一篇: Systemd 入门教程:命令篇 |
下一篇: fastapi教程——进阶(一) |