前置代碼
```
# setup
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
def random_color():
red = random.randint(0, 255)
green = random.randint(0, 255)
blue = random.randint(0, 255)
return (red, green, blue)
def draw_tree(x, y):
# tree trunk (50 wide and 100 tall)
pygame.draw.rect(screen, (117, 90, 0), (x, y-100, 50, 100))
# leaves are a circle
pygame.draw.circle(screen, (27, 117, 0), (x+25, y-120), 50)
def draw_house(x, y):
# pink house
pygame.draw.rect(screen, (255, 171, 244), (x, y-180, 200, 180))
# brown door
pygame.draw.rect(screen, (89, 71, 0), (x+80, y-60, 40, 60))
# yellow door knob
pygame.draw.circle(screen, (255, 204, 0), (x+112, y-30), 4)
# triangle roof
pygame.draw.polygon(screen, (125, 125, 125), ((
x, y-180), (x+100, y-250), (x+200, y-180)))
draw_window(x+20, y-90)
draw_window(x+130, y-90)
draw_window(x+20, y-20)
draw_window(x+130, y-20)
def draw_window(x, y):
# glass
pygame.draw.rect(screen, random_color(), (x, y-50, 50, 50))
# frame
pygame.draw.rect(screen, (0, 0, 0), (x, y-50, 50, 50), 5)
pygame.draw.rect(screen, (0, 0, 0), (x+23, y-50, 5, 50))
pygame.draw.rect(screen, (0, 0, 0), (x, y-27, 50, 5))
def draw_butterfly(x, y, size):
pygame.draw.polygon(screen,random_color(),[[x+0,y+0],[x+size*10,y+0],[x+size*17,y+size*10],[x+size*17,y+size*18],[x+size*5,y+size*18]])
pygame.draw.polygon(screen,random_color(),[[x+size*36,y+0],[x+size*26,y+0],[x+size*19,y+size*10],[x+size*19,y+size*18],[x+size*31,y+size*18]])
pygame.draw.polygon(screen,random_color(),[[x+0,y+size*40],[x+size*10,y+size*40],[x+size*17,y+size*30],[x+size*17,y+size*22],[x+size*5,y+size*22]])
pygame.draw.polygon(screen,random_color(),[[x+size*36,y+size*40],[x+size*26,y+size*40],[x+size*19,y+size*30],[x+size*19,y+size*22],[x+size*31,y+size*22]])
pygame.draw.ellipse(screen,(0,0,0),[x+size*13,y+size*10,size*10,size*20])
pygame.draw.line(screen,(0,0,0),[x+size*16,y+0],[x+size*18,y+size*20],2)
pygame.draw.line(screen,(0,0,0),[x+size*20,y+0],[x+size*18,y+size*20],2)
# this function is able to draw clouds of different sizes
def draw_cloud(x, y, size):
# put int() around any multiplications by decimals to get rid of this warning:
# DeprecationWarning: integer argument expected, got float
pygame.draw.circle(screen, (255, 255, 255), (x, y), int(size*.5))
pygame.draw.circle(screen, (255, 255, 255),
(int(x+size*.5), y), int(size*.6))
pygame.draw.circle(screen, (255, 255, 255),
(x+size, int(y-size*.1)), int(size*.4))
# green ground
pygame.draw.rect(screen, (0, 160, 3), (0, 400, 640, 80))
# light blue sky
pygame.draw.rect(screen, (100, 200, 255), (0, 0, 640, 400))
draw_tree(60, 400) # x and y location are the bottom left of tree trunk
draw_tree(550, 400)
draw_tree(450, 420)
draw_tree(85, 450)
draw_house(225, 400)
draw_cloud(60, 120, 80)
draw_cloud(200, 50, 40)
draw_cloud(450, 100, 120)
draw_cloud(300, 50, 70)
draw_butterfly(50,50,1)
draw_butterfly(150,80,2)
draw_butterfly(430,200,3)
pygame.display.flip()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
```
作業要求是1.云彩做平移,x超過邊界重新出現在另一邊
2.蝴蝶圍繞一點做布朗運動(不超過螢屏邊界)
外教給了一個簡單的載入圖片然后移動圖片的代碼例子
但是需要get到xy和長寬代入后面
我翻了很久的帖子也沒找到怎么get單個圖形或一組圖形(所有的云彩)的數值
可以的話想請教一下
完全小白,第一次接觸python就被分到了外教慘兮兮
uj5u.com熱心網友回復:
外教給的圖片移動的范例
# setup
import pygame
import math
from scipy.stats import norm
import time
pygame.init()
screen = pygame.display.set_mode([640, 480])
white = [255, 255, 255]
def simple_movement(x, y, s_x, s_y):
return int(x+s_x), int(y+s_y)
def sin_movement(x, y, s_x, s_y):
return int(x+s_x), int(y+math.sin((x+s_x)/screen.get_width()*2*math.pi*s_y)*my_R.get_height())
def Brownian_movement(x, y, s, delta, dt):
return int(x + s*norm.rvs(delta**2*dt)), int(y + s*norm.rvs(delta**2*dt))
# load the R image (must be saved in the same place as this file)
my_R = pygame.image.load('R.jpg')
# set variables to use in our program
x_Rh = 0
y_Rh = 2*my_R.get_height()
speed_x_Rh = 5
speed_y_Rh = 0
x_Rs = 0
y_Rs0 = screen.get_height()-3*my_R.get_height()
speed_x_Rs = 2.5
speed_y_Rs = 5
x_Rr = screen.get_width()/2
y_Rr = screen.get_height()/2
speed_Rr = 50
delta = 0.25
dt = 0.1
my_time = time.gmtime()
my_pre_sec = my_time[5]
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
running = False
pygame.time.delay(17) # pause for 17 milliseconds
screen.fill(white) # make the screen completely white
# the animation logic
my_time = time.gmtime()
if my_time[5] != my_pre_sec:
my_pre_sec = my_time[5]
(x_Rh, y_Rh) = simple_movement(x_Rh, y_Rh, speed_x_Rh, speed_y_Rh)
if x_Rh > screen.get_width():
x_Rh = 0
(x_Rs, y_Rs) = sin_movement(x_Rs, y_Rs0, speed_x_Rs, speed_y_Rs)
if x_Rs > screen.get_width():
x_Rs = 0
(x_Rr, y_Rr) = Brownian_movement(x_Rr, y_Rr, speed_Rr, delta, dt)
if x_Rr > screen.get_width():
x_Rr = screen.get_width() - my_R.get_width()
elif x_Rr < 0:
x_Rr = 0
if y_Rr > screen.get_height():
y_Rr = screen.get_height() - my_R.get_height()
elif y_Rr < 0:
y_Rr = 0
# draw the image on the screen at the x and y location
screen.blit(my_R, [x_Rh, y_Rh])
screen.blit(my_R, [x_Rs, y_Rs])
screen.blit(my_R, [x_Rr, y_Rr])
# draw a line on the screen from the center to the Brownian moving R image
pygame.draw.line(screen, pygame.color.THECOLORS['red'], (screen.get_width(
)/2, screen.get_height()/2), (x_Rr, y_Rr), 2)
# update the relavant portions in the display
pygame.display.update()
pygame.quit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/38566.html
