Pygame曲线移动问题如何解决?

2024-10-03 04:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

VIDEO<;我试着让白色矩形慢慢平滑地向红色矩形弯曲,然后停下来,但由于某种原因,白色矩形没有正确弯曲,并且它的移动方式很快,我希望它平滑地移动,平滑地弯曲,眼睛可以看到,同时也可以向红色矩形弯曲。有没有办法改变我的代码和让它像那样工作? 在我的curvemove rect类中,我有一个
self.yspeed=0.05 self.xspeed=-0.5 self.gravity=-0.01矩形移动的x和y速度以及影响它的重力 然后我在curvemove课上重画 这就是我的rect是如何移动的如果按下V键,那么它应该mave self.move true,然后它应该运行使对象弯曲的代码

        if keys[pygame.K_v]:
            curve_move1.move = True
        if self.move:
            curve_move1.x += curve_move1.xspeed
            curve_move1.y += curve_move1.yspeed
            curve_move1.yspeed += curve_move1.gravity
            # curve it towards the red rectangle

        else:
            curve_move1.move2 = True
class curvemove:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.yspeed = 0.05
        self.xspeed = -0.5
        self.gravity = -0.01
        self.move = False
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)
        # -------------- curve_move1 is our curving rectangle
        if keys[pygame.K_v]:
            curve_move1.move = True
        if self.move:
            curve_move1.x += curve_move1.xspeed
            curve_move1.y += curve_move1.yspeed
            curve_move1.yspeed += curve_move1.gravity
            # curve it towards the red rectangle

        else:
            curve_move1.move2 = True

完整的代码,它的所有矩形,所以你可以测试出来

import pygame
pygame.init()


# our window
window = pygame.display.set_mode((500,500))
pygame.display.set_caption("test map")


# our class
class curvemove:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.yspeed = 0.05
        self.xspeed = -0.5
        self.gravity = -0.01
        self.move = False
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)
        # -------------- curve_move1 is our curving rectangle
        if keys[pygame.K_v]:
            curve_move1.move = True
        if self.move:
            curve_move1.x += curve_move1.xspeed
            curve_move1.y += curve_move1.yspeed
            curve_move1.yspeed += curve_move1.gravity
            # curve it towards the red rectangle

        else:
            curve_move1.move2 = True


white = 255,255,255
red = 205,0,10
curve_move1 = curvemove(250,400,50,50,white)

touched = curvemove(250,200,50,50,red)

# our game fps
fps = 60
clock = pygame.time.Clock()

# d redraw()
def redraw():
    window.fill((0,0,0))
    curve_move1.draw()
    touched.draw()

# our main loop
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()

    if curve_move1.rect.colliderect(touched.rect):
        curve_move1.move = False
        

    redraw()
    pygame.display.update()
pygame.quit()



我想要一种方法,使这个矩形平滑曲线向红色矩形不是快,但正常这是我最好的尝试


Tags: rectselftruemoveifwidthpygamecolor
1条回答
网友
1楼 · 发布于 2024-10-03 04:37:57

重力必须作用在目标的方向上

我建议使用^{}进行计算。计算从物体到目标的方向向量,并将其缩放到重力的大小。根据每个帧中的重力更改运动矢量:

dir_vec = pygame.math.Vector2(target_pos) - self.rect.center
v_len_sq = dir_vec.length_squared()
if v_len_sq > 0:
    dir_vec.scale_to_length(self.gravity)
    self.speed = (self.speed + dir_vec) * self.friction
    self.pos += self.speed

最简单的例子:

import pygame
pygame.init()

class curvemove:
    def __init__(self, x, y, height, width, color):
        self.pos = pygame.math.Vector2(x, y)
        self.color = color
        self.rect = pygame.Rect(x, y, height, width)
        self.speed = pygame.math.Vector2(-5.0, 0)
        self.gravity = 0.5
        self.friction = 0.99
    
    def draw(self):
        self.rect.center = (self.pos.x, self.pos.y)
        pygame.draw.circle(window, self.color, (self.pos.x, self.pos.y), self.rect.width//2)
    
    def update(self, target_pos):
        dir_vec = pygame.math.Vector2(target_pos) - self.rect.center
        v_len_sq = dir_vec.length_squared()
        if v_len_sq > 0:
            dir_vec.scale_to_length(self.gravity)
            self.speed = (self.speed + dir_vec) * self.friction
            self.pos += self.speed

window = pygame.display.set_mode((500,500))
pygame.display.set_caption("test map")
clock = pygame.time.Clock()
white = 255, 255, 255
red = 205, 0, 10
curve_move1 = curvemove(250, 400, 20, 20, white)
touched = curvemove(250, 200, 20, 20, red)
fps = 60
move = False

def redraw():
    window.fill((0,0,0))
    curve_move1.draw()
    touched.draw()

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_v:
                move = True
            if event.key == pygame.K_r:
                move = False
                curve_move1 = curvemove(250, 400, 20, 20, white)

    if (curve_move1.pos - touched.pos).length() < 10:
        move = False
    if move:
        curve_move1.update(touched.rect.center)
    redraw()
    pygame.display.update()
    clock.tick(fps)

pygame.quit()
exit()

使用speedgravityfriction的值来获得不同的效果

例如:

self.speed = pygame.math.Vector2(-10.0, 0)
self.gravity = 1
self.friction = 0.95

例如:

self.speed = pygame.math.Vector2(-10.0, 0)
self.gravity = 1
self.friction = 0.91

相关问题 更多 >