0

我正在用精灵做一些基本的物理工作,这个是重力和一些额外的阻力,所以理论上精灵应该停留在屏幕的顶部边缘。然而问题是,随着它越来越接近地面,精灵振动得越来越快,最终“挤压”在边界上。

有什么好的方法来阻止这种情况?如果需要,我可以 pst 代码,但没有什么不寻常的,我只是认为它需要一种解决方法来降低速度,因为它越来越接近静止。

import pygame, math, random

pygame.init() 

class Circle(pygame.sprite.Sprite):
    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        self.dx = 0
        self.dy = 0
        self.ddx = 0
        self.ddx = 0
        self.forceX = 0
        self.forceY = 0
        self.x = random.randrange(20,self.screen.get_width())
        self.y = self.screen.get_height()/2
        self.radius = random.randrange(5,30)
        self.image = pygame.Surface((self.radius*2,self.radius*2))
        self.image.set_colorkey((0,0,0))
        self.image.set_alpha(120)
        self.mass = self.radius/15.0
        pygame.draw.circle(self.image, (175,255,0), (self.radius,self.radius), self.radius)
        self.image = self.image.convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = (self.x, self.y)

    def update(self):
        self.calcPos()
        self.checkBounds()
        self.rect.centerx = self.x
        self.rect.centery = self.y
        self.forceX = 0
        self.forceY = 0


    def calcPos(self): 
        self.ddx = self.forceX
        self.ddy = self.forceY
        self.dy += self.ddy
        self.dx += self.ddx
        self.x += self.dx
        self.y += self.dy 

    def applyForce(self, force):
        self.forceX += force[0]/self.mass
        self.forceY += force[1]/self.mass

    def checkBounds(self):
        if self.y > self.screen.get_height():
            self.dy *= -1.05
        if self.x > self.screen.get_width(): 
            self.dx *= -1.05
        if self.y < 0: 
            self.dy *= -1.05
        if self.x < 0: 
           self.dx *= -1.05

def main():
    screen = pygame.display.set_mode((600,400))
    background = pygame.Surface((screen.get_size()))
    background.fill((150,150,150)) 
    background = background.convert()

    circleGRP = pygame.sprite.Group() #Add balls
    for x in range(10):
        circleGRP.add(Circle(screen))

    wind = (1, 0)
    gravity = (0, 1.0)

    clock = pygame.time.Clock()
    mainLoop = True

    while mainLoop: 
        clock.tick(30) #Clock
        for event in pygame.event.get(): #Key events
            if event.type == pygame.QUIT:
                mainLoop = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    mainLoop = False
            elif event.type == pygame.MOUSEBUTTONDOWN: #Add wind
                if pygame.mouse.get_pressed()[0]:
                    for circle in circleGRP:
                        circle.applyForce(wind)

#----------------------------------------------------------------------------                   
        for circle in circleGRP: #Add gravity
            gravity = (0, 1.0)
            gravity = tuple([each * circle.mass for each in gravity])
            circle.applyForce(gravity)

            circleX = circle.dx * -1 #Add friction
            circleY = circle.dy * -1
            friction = (circleX/80* circle.mass* (circle.radius/5), circleY/80* circle.mass* (circle.radius/5))
            circle.applyForce(friction)

 #----------------------------------------------------------------------------    
        circleGRP.update()  
        screen.blit(background, (0,0))
        circleGRP.draw(screen)
        pygame.display.flip()

    pygame.quit()

if __name__ == "__main__":
    main()    
4

1 回答 1

0

我真的需要查看代码,但是如果我正确理解您想要的内容,您可以根据到顶部的距离获得速度,例如,如果 y 是您的精灵的位置:

ydir=y/50
y+=int(ydir)

编辑:

def checkBounds(self):
    if self.y > self.screen.get_height():
        self.dy *= -1.05
        self.y=self.screen.get_height()

最后一行是唯一必要的更改,每个循环都会将球推过它的边界,这会在球没有向上的力时引起问题,这使得球无法通过其下界,同样的事情可能是为其他人完成。

于 2013-07-08T02:55:42.017 回答