# /usr/bin/python3
# Author: 爱编程的章老师
# @Time: 2021/1/4 0004
# E-mail: [email protected]
import pygame
import sys
def homework():
pygame.init()
screen = pygame.display.set_mode((800, 600))
screen.fill((255,255,255))
# 画房子主体
rect = pygame.Rect(260,390,280,210)
c = 102, 204, 255
pygame.draw.rect(screen, c, rect, 0)
# 画窗户:边框 加两条张
rect = pygame.Rect(285,420,70,70)
c = 102, 204, 153
BLACK = 0,0,0
h_line_start = 285, 455
h_lint_end = 354, 455
v_line_start = 320, 420
v_lint_end = 320, 489
pygame.draw.rect(screen, c, rect, 0)
pygame.draw.rect(screen, BLACK, rect, 1) # 画黑色边框
pygame.draw.line(screen, BLACK, h_line_start, h_lint_end, 1)
pygame.draw.line(screen, BLACK, v_line_start, v_lint_end, 1)
# 画门
rect = pygame.Rect(445,520,55,80)
c = 255, 153, 51
pygame.draw.rect(screen, c, rect, 0)
# 画门把手
pos = 490, 570
r = 6
c = 102, 102, 102
pygame.draw.circle(screen, c, pos, r)
# 红色屋檐 + 黄色三角形
pos_list = [(200, 390), (600, 390), (560, 330), (240, 330)]
c1 = 255, 51,51
triangle_list = [(355, 390), (445, 390), (400, 330)]
c2 = 255, 255, 0
pygame.draw.polygon(screen, c1, pos_list, 0)
pygame.draw.polygon(screen,c2, triangle_list, 0)
# 画烟囱
rect = pygame.Rect(280,290,25,40)
c = 153, 0, 51
pygame.draw.rect(screen, c, rect)
# 画三个黑烟
pos_list = [(295, 265), (320, 240), (340 ,220)]
for index, pos in enumerate(pos_list):
pygame.draw.circle(screen, BLACK, pos, 12 - index * 2)
pygame.display.update()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.quit()
if __name__ == '__main__':
homework()
吐槽一下
这个作业感觉把我自己坑了.数据没凑好.用PS量了半天.读者朋友可以尝试自己作一下图
所有我们的看到的动画,其本质就是一幅幅画面快速连续的切换(播放)所形成的视觉效果.
因此,无论是做游戏的动画效果,还是做动画片的动画效果,其本质就是不断的在生成新的图片,以代替原来的图片.
我们先来看以下代码:
def hand_movement():
pygame.init()
screen = pygame.display.set_mode((800, 600))
WHITE = 255, 255, 255 # 定义白色
screen.fill(WHITE)
GREEN = 0, 255, 0
dx, dy = 0, 0
size = width, height = 100, 100
step = 1 # 定义步长
pygame.display.update()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if dx <= 800 or dy <= 600:
pygame.draw.rect(screen, GREEN, ((dx, dy), size))
pygame.display.update()
dx += step
dy += step
time.sleep(0.1)
pygame.quit()
这断代码的效果如下:
通过这个代码,我们可以看到一个不断向左下角移动的正方形.
但是原来的图片,影响了效果.我们可以尝试把画面不断的刷成白纸,再看一下效果
改进后的代码
def hand_movement2():
pygame.init()
screen = pygame.display.set_mode((800, 600))
WHITE = 255, 255, 255
screen.fill(WHITE)
GREEN = 0, 255, 0
dx, dy = 0, 0
size = width, height = 100, 100
step = 1
pygame.display.update()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if dx <= 800 or dy <= 600:
screen.fill(WHITE)
pygame.draw.rect(screen, GREEN, ((dx, dy), size))
pygame.display.update()
dx += step
dy += step
time.sleep(0.1)
pygame.quit()
pygame中有专门的方法来处理这种移动效果.
rect.move(dx,dy)
rect.move_ip(dx, dy)7
使用举例:
def auto_move():
pygame.init()
screen = pygame.display.set_mode((800, 600))
WHITE = 255, 255, 255
screen.fill(WHITE)
GREEN = 0, 255, 0
rect = pygame.draw.rect(screen, GREEN, (0,0, 100, 100))
dx = dy = 1
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(WHITE)
rect.move(dx, dy)
pygame.draw.rect(screen,GREEN, rect)
pygame.display.update()
time.sleep(0.1)
pygame.quit()
可以看到,虽然rect调用了move()方法,但是画出来的图像是静止的.
效果图如下:
我们要不断的去改变rect的位置
因此,改变后的代码如下:
def auto_move2():
pygame.init()
screen = pygame.display.set_mode((800, 600))
WHITE = 255, 255, 255
screen.fill(WHITE)
GREEN = 0, 255, 0
rect = pygame.draw.rect(screen, GREEN, (0,0, 100, 100))
dx = dy = 1
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(WHITE)
rect = pygame.draw.rect(screen,GREEN, rect.move(0, dy))
pygame.display.update()
time.sleep(0.1)
pygame.quit()
发现,这个正方形还是动起来了
代码说明:
rect = pygame.draw.rect(screen,GREEN, rect.move(dx, dy))
这个代码做了两件事
def auto_move3():
pygame.init()
screen = pygame.display.set_mode((800, 600))
WHITE = 255, 255, 255
screen.fill(WHITE)
GREEN = 0, 255, 0
rect = pygame.draw.rect(screen, GREEN, (0,0, 100, 100))
dx = dy = 1
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(WHITE)
rect.move_ip(dx, 0)
pygame.draw.rect(screen,GREEN, rect)
pygame.display.update()
time.sleep(0.1)
pygame.quit()
可以看到,正方形同样移动起来了
代码分析:
rect.move_ip(dx, dy)
pygame.draw.rect(screen,GREEN, rect)
可以对比发现,move()方法返回一个新的rect,如果不用变量去接收rect.move()的值,这个方法调用将毫无意义
move_ip()方法将自身移动到了新的位置.
在实际使用的时候,可以根据需要来使用.
如:需要移动后,原始位置需要保留的,用move()方法,如果原地位置不需要保留的,两者都可以,不过更倾向于move_ip()方法
移动是我们用到最多的方法.因此,需要我们熟练掌握
设计一个碰到墙壁就反弹的pygame实现