0
我正在做一些基本的物理东西与精灵,这是一个额外的拖动重力,使精灵在理论上应该停留在屏幕的顶部边缘。然而,问题在于,当它靠近地面时,精灵振动得越来越快,最终在边界上“挤压”。Pygame - 雪碧弹跳通过边缘
最好的办法来阻止它?如果需要,我可以编码,但没有什么不寻常的地方,我只是认为它需要一个解决方法来降低速度,因为它接近静止。
在此先感谢
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()
这是我的不好的措辞。我不想让它放慢速度,我只是想让它停下来休息。下面的代码,检查出来,你会看到会发生什么。 – Aikman007
男人我已经这样做了,但在'self.dy * = -1.05'之前我有'self.y = self.screen.get_height()',这就是为什么它没有工作。感谢一堆看看,它的作品。非常感谢 :) – Aikman007