所以我试图简单地在pygame中移动一个对象。我一直在寻找教程,但我能找到的是如何使它看起来像下雪,哈哈。我一直在尝试将该方法实现为移动对象,但我没有运气。我想做的就是在屏幕上移动一个物体,当它到达屏幕的末端时,它会重置并再次移动。所以我试图移动我放在我的代码中的对象(两个多边形,线和圆)在屏幕上,水平或垂直,并不重要。
import pygame, sys, time, random
from pygame.locals import *
pygame.init()
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Paint")
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
windowSurface.fill(WHITE)
pygame.draw.polygon(windowSurface,BLUE,((146, 0), (250, 100), (230, 265), (44, 250), (0,110)))
pygame.draw.polygon(windowSurface,RED,((70, 0), (150, 200), (0, 50)))
pygame.draw.line(windowSurface,BLACK,(60, 60), (120, 60), 8)
pygame.draw.circle(windowSurface, GREEN , (150,150), 15, 0)
pygame.display.update()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
答案 0 :(得分:3)
用你的方法,你做不到。使用pygame背后的想法是绘制你想要绘制每个帧的所有对象。您必须先在while True
循环内移动绘图。
然后,由于你每帧都画了一切,你可以:
所以最后,你可以拥有类似的东西(改变对象是你的任务)
# ... pygame and app initialization
# get screen size
info = pygame.display.Info()
sw = info.current_w
sh = info.current_h
# initial position
x = y = 0
# initial direction
dx = 5
dy = 2
while True:
# update position with direction
x += dx
y += dy
# check bounds
if x - dx < 0 or x + dx > sw:
dx = -dx
if y - dy < 0 or y + dy > sh:
dy = -dy
# then draw and use x/y in your drawing instructions!
# ... pygame events ...
答案 1 :(得分:1)
为了做你想做的事,你将不得不在“while True:”循环中改变一些东西。下面是一个代码示例,它将执行您要执行的操作:
import pygame, sys, pygame.locals#1
pygame.init()#2
window=pygame.display.set_mode((500, 400), 0, 32)#3
pygame.display.set_caption("Paint")#4
BLACK = (0, 0, 0)#5
WHITE = (255, 255, 255)#6
RED = (255, 0, 0)#7
GREEN = (0, 255, 0)#8
BLUE = (0, 0, 255)#9
pentagon=pygame.Surface((250, 265))#10
pentagon.fill((0, 0, 0))#11
pygame.draw.polygon(pentagon, BLUE, ((146, 0), (250, 100), (230, 265), (44, 250), (0,110)))#12
pentagon.set_colorkey((0, 0, 0))#13
triangle=pygame.Surface((150, 200))#14
triangle.fill((0, 0, 0))#15
pygame.draw.polygon(triangle, RED, ((70, 0), (150, 200), (0, 50)))#16
triangle.set_colorkey((0, 0, 0))#17
line=pygame.Surface((60, 8))#18
line.fill(BLACK)#19
circle=pygame.Surface((30, 30))#20
circle.fill((0, 0, 0))#21
pygame.draw.circle(circle, GREEN , (15, 15), 15, 0)#22
circle.set_colorkey((0, 0, 0))#23
rects={'pentagon': pentagon.get_rect(), 'triangle': triangle.get_rect(), 'line': line.get_rect(), 'circle': circle.get_rect()}#24
rects['line'].centery=60#25
rects['line'].left=60#26
rects['circle'].centerx=150#27
rects['circle'].centery=150#28
while True:#29
for event in pygame.event.get():#30
if event.type==pygame.locals.QUIT:#31
pygame.quit()#32
sys.exit()#33
for rect in rects:#34
rects[rect].right+=1#35
if rects[rect].right>500:#36
if rect=='line':#37
rects['line'].centery=60#38
rects['line'].left=60#39
elif rect=='circle':#40
rects['circle'].centerx=150#41
rects['circle'].centery=150#42
else:#43
rects[rect].topleft=(0, 0)#44
window.fill(WHITE)#45
window.blit(pentagon, rects['pentagon'])#46
window.blit(triangle, rects['triangle'])#47
window.blit(line, rects['line'])#48
window.blit(circle, rects['circle'])#49
pygame.time.Clock().tick(40)#50
pygame.display.update()#51
我会尽力解释这段代码。
第1-9行,你已经知道了。
第10行从你可能不知道的事情开始。曲面对象是一种矩形图片,可以附加到任何其他表面,或使用pygame.draw绘制。信不信由你,窗户实际上是一个表面。
第10行创建一个曲面,第11行用黑色填充,第12行在其上绘制五边形。
第13行基本上使所有黑色的像素都透明。
第14-17行,你现在应该明白了。
第18行为该线创建一个新的曲面对象,但不是在其上绘制线条,而是用黑色填充并单独留下。这是因为,如果您查看旧程序中的行,您可以看到它实际上只是一个矩形而没有其他内容。
第20-23行你应该明白。
第24行制作一个矩形字典。矩形显示表面对象的位置,并且是将它们绘制到任何东西上所必需的。
第25-28行改变了直线和圆的位置。我这样做的原因是因为考虑到你的程序左上角没有直线和圆圈,我认为你可能会喜欢它。
第29-33行你应该明白。
第34行开始一个for循环,它将遍历所有的rects。
第35行将每个镜片的右侧向右移动一个像素。
第36行检查矩形的右边是否已经碰到窗口的右边缘。
第37行检查击中一侧的线是否为线,如果是,则线38-39将其移动到您拥有它的位置。
第40行检查击中一侧的那个是圆圈,如果是,则第41-42行将它移动到你拥有它的位置。
第43-44行将矩形放在左上角,其他两个形状开始。
第45行你应该知道。
第46-49行使用surface.blit()函数。此函数的第一个参数是曲面,第二个参数是矩形。
第50行不允许超过40帧通过。
第51行更新屏幕。
我真的希望这会有所帮助,如果你投票或接受了我的回答,我会很感激,考虑到我花了多长时间才能写出来。如果您有任何问题,请询问。谢谢!
答案 2 :(得分:1)
一点都不困难。首先,我们将在移动您的对象上解决您的问题:
import pygame, sys, time, random
from pygame.locals import *
pygame.init()
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Paint")
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
windowSurface.fill(WHITE)
x, y = 250, 200
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
pressed = pygame.key.get_pressed()
if pressed[K_UP]: y - 5
if pressed[K_DOWN]: y + 5
if pressed[K_LEFT]: x - 5
if pressed[K_RIGHT]: x + 5
pygame.display.update()
pygame.draw.polygon(windowSurface,BLUE,((x - 104, y - 200), (x, y - 100), (x - 20, y + 65), (x - 206, y + 50), (x - 250, y - 90)))
pygame.draw.polygon(windowSurface,RED,((x - 180, y - 200), (x - 100, y), (x - 250, y - 150)))
pygame.draw.line(windowSurface,BLACK,(x - 190, y - 140), (x - 130, y - 140), 8)
pygame.draw.circle(windowSurface, GREEN , (x - 100, y - 50), 15, 0)
在上面的代码行中,所有坐标都转换为x,y变量的形式。按下箭头键时,会对变量进行更改,从而更改形状的坐标和位置。
答案 3 :(得分:0)
这是一个非常好的教程,它甚至包含一些非常类似于你的基本图形的代码