如何通过不断向其rect.x和rect.y添加一个chage速率来使对象在圆形路径中移动?

时间:2015-04-26 17:37:23

标签: python pygame

以下是我写的代码。 当我不断计算其位置并将坐标赋给obj.rect.x和object.rect.y时,对象沿着圆形路径移动。

我需要知道的是如何通过下面的方式旋转对象。 obj.rect.x + = incrementx obj.rect.y + =增量

我在我的代码中实现了这个,然后动作变成了除了circluar之外的任何东西。 请帮忙。

使用的两张图片都在这里。 http://s5.postimg.org/fs4adqqib/crate_B.png http://s5.postimg.org/vevjr44ab/plt0.png

import sys, os, pygame
from math import sin,cos,pi, radians
from pygame.locals import *
from standard_object_creator import *

SCREENW = 800
SCREENH = 700

BLUE = (0, 50, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
PURPLE = (145, 0, 100)
YELLOW = (220,220,  0)
pygame.init()
FPSCLOCK = pygame.time.Clock()

FONT1= "data\Cookie-Regular.ttf"

if sys.platform == 'win32' or sys.platform == 'win64':
    #os.environ['SDL_VIDEO_CENTERED'] = '2'# center of screen
    os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (10,30)#top left corner

SCREEN = pygame.display.set_mode((SCREENW, SCREENH))

## self, imagelist, posx, posy, speedx = 0, speedy = 0, value = 0


plat = pygame.image.load("grfx\plt0.png").convert_alpha()
box = pygame.image.load("grfx\crateB.png").convert_alpha()

FPS = 160  # frames per second

platforms = pygame.sprite.Group()
boxes = pygame.sprite.Group()

def maketext(msg,fontsize, colour = YELLOW, font = FONT1):
    mafont = pygame.font.Font(font, fontsize)
    matext = mafont.render(msg, True, colour)
    matext = matext.convert_alpha()
    return matext


box = object_factory ([box], 340, 50, 0, 1)
boxes.add(box)

center_x = 450 # x pos in relation to screen width
center_y = 400 # y pos in relation to screen height
radius = 200
angle = -90 #pi / 4 # starting angle 45 degrees
omega = .001 #Angular velocity

for x in xrange(6):
    xpos = radius * cos(angle)  #+ center_x #Starting position x
    ypos = radius * sin(angle)  #+ center_x #Startinh position y
    obj = object_factory([plat], xpos, ypos)
    obj.angle = angle
    obj.omega = omega  #angula velocity
    obj.radius = radius
    platforms.add(obj)
    angle += 60

    mouseposlist = []
    all2gether = [platforms, boxes]

    while True:

        SCREEN.fill(BLACK)

        ## MOVE THE SPRITE IN A CIRCLE. Each object is placed by varying the step)
        for obj in platforms:

            obj.angle = obj.angle + obj.omega

            ## THE CODE BELOW WORKS

            obj.rect.x = center_x + (cos(obj.angle) * obj.radius)
            obj.rect.y = center_y + (sin(obj.angle) * obj.radius)

            ## How can I get the same thing to work in this way? by adding the rate of change to the box objects rect.x and rec.t? Why does this not work?

            #obj.rect.x += obj.radius * obj.omega * cos(obj.angle)
            #obj.rect.y -= obj.radius * obj.omega * sin(obj.angle)

            pygame.draw.line(SCREEN, BLUE, (center_x, center_y), (obj.rect.x, obj.rect.y), 2)

        for hp in boxes:
            hp.rect.x += hp.speedx
            hp.rect.y += hp.speedy
            hp.move()
            hp.collide(platforms)

        for thing in all2gether:
            thing.update()
            thing.draw(SCREEN)

        pygame.draw.line(SCREEN, BLUE, (0, SCREENH / 2), (SCREENW, SCREENH / 2), 2)
        pygame.draw.line(SCREEN, BLUE, (SCREENW / 2, 0), (SCREENW / 2, SCREENH), 2)

        pygame.display.update()
        FPSCLOCK.tick(FPS)
        ##--------------------------------------------------------------
        pygame.event.pump()
        keys = pygame.key.get_pressed()
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    pos = pygame.mouse.get_pos()
                    val = [pos[0], pos[1], 0, 0]
                    print val
                    mouseposlist.append(val)
                elif event.button == 3 and mouseposlist != []:
                    mouseposlist.pop(-1)

            if event.type == KEYDOWN and event.key == K_ESCAPE:
                print mouseposlist
                pygame.quit()
                sys.exit()


        pygame.time.wait(0)

2 个答案:

答案 0 :(得分:0)

用于将精灵移动到圆圈中的解决方案是位置方程的时间评估。您需要计算角度作为时间的函数。 x = r * cos(欧米茄*时间)。你的第一个解决方案是循环时间,通过角速度提供的分数角度增加omega。要评估位置,请将时间量乘以角速度....

答案 1 :(得分:0)

我设法解决我的问题并想分享它。新代码如下。 这适用于Python / Pygame

center_of_rotation_x = SCREENW/2
center_of_rotation_y = SCREENH/2
radius = 200
angle = radians(45)  #pi/4 # starting angle 45 degrees
omega = 0.1 #Angular velocity

x = center_of_rotation_x + radius * cos(angle) #Starting position x
y = center_of_rotation_y - radius * sin(angle) #Starting position y
SCREEN.blit(star, (x, y)) # Draw current x,y
angle = angle + omega # New angle, we add angular velocity
x = x + radius * omega * cos(angle + pi / 2) # New x
y = y - radius * omega * sin(angle + pi / 2) # New y

上面的代码按原样运行。但是当作为一个类应用时,它的工作方式不同我将在另一个问题中提出这个问题