Pygame移动一个物体

时间:2011-12-09 05:23:21

标签: python pygame

所以我试图简单地在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()

4 个答案:

答案 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)

这是一个非常好的教程,它甚至包含一些非常类似于你的基本图形的代码

http://inventwithpython.com/chapter17.html