【问题标题】:Trying to make the blue square follow the red square, but it doesn't work试图让蓝色方块跟随红色方块,但它不起作用
【发布时间】:2021-10-06 12:35:07
【问题描述】:

我正在尝试制作一个程序,让你扮演一个红色方块,一个蓝色方块跟随你。很简单,对吧?是的,但这是我第一次这样做。

我听说过 A*,但我想尝试一种更简单的方法,尤其是在示例中,蓝色方块计算绕过它们的方式没有任何障碍。它确实有效,但是,蓝色方块无法返回。我不知道为什么。蓝色方块的移动放置在一个函数中,该函数放置在另一个函数中,该函数放置在主游戏循环中。

import pygame,sys
import random

#window
width=1600
height=800
window=pygame.display.set_mode((width,height))
pygame.display.set_caption("simulation")


black=(0,0,0)

#red circle
redCircleCoords=(60, 60)
redCircleSize=(60, 60)
redCircle = pygame.Rect(redCircleCoords[0], redCircleCoords[1], redCircleSize[0], redCircleSize[1])
red=(255,0,0)
velRed=1


#blue circle
blueCircleCoords=(width-120, height-120)
blueCircleSize=(60,60)
blueCircle=pygame.Rect(blueCircleCoords[0], blueCircleCoords[1], blueCircleSize[0], blueCircleSize[1])
blue=(0,0,255)
velBlue=0.5


def redCircleMovement():
    
    pressed=pygame.key.get_pressed()
    
    if pressed[pygame.K_a] and redCircle.x > 0: #left
        redCircle.x-=velRed
    if pressed[pygame.K_d] and redCircle.x < width - 60: #right
        redCircle.x+=velRed
    if pressed[pygame.K_s] and redCircle.y < height - 60: #down
        redCircle.y+=velRed
    if pressed[pygame.K_w] and redCircle.y > 0: #up
        redCircle.y-= velRed

    
def blueCircleMovement():
    
    if redCircle.x > blueCircle.x:
        blueCircle.x+=velBlue
    if redCircle.x < blueCircle.x:
        blueCircle.x-=velBlue
    if redCircle.y > blueCircle.y:
        blueCircle.y+=velBlue
    if redCircle.y < blueCircle.y:
        blueCircle.y-=velBlue
            
    
def draw():
    redCircleVector=(redCircle.x, redCircle.y)
    blueCircleVector=(blueCircle.x, blueCircle.y)
    print('red:',redCircleVector)
    print('blue:',blueCircleVector)
    window.fill(black) #fill the screen with black
    pygame.draw.rect(window, red, redCircle) #draw redCircle
    pygame.draw.rect(window,blue,blueCircle) #draw blueCircle
    pygame.display.flip() #update the display
    

    

def callFunctions():
    draw()
    
    redCircleMovement()
    blueCircleMovement()
    

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    
    callFunctions()

【问题讨论】:

    标签: python pygame path-finding


    【解决方案1】:

    如果你没有障碍,那么A*是没有意义的,所以很好打电话。

    我不确切知道为什么您的代码不起作用,但如果我是您,我会更改它以计算从蓝色指向红色的单位向量。像这样的:

    def get_unit_vec(r_x, r_y, b_x, b_y):
        x_diff = r_x - b_x
        y_diff = r_y - b_y
        magnitude = (x_diff ** 2 + y_diff ** 2) ** .5 # pythagoras
        if magnitude == 0:
            return 0, 0
        return x_diff/magnitude, y_diff/magnitude
    ...
    #updating position
    unit_vec = get_unit_vec(redCircle.x, redCircle.y, blueCircle.x, blueCircle.y)
    blueCircle.x += unit_vec[0] * velBlue
    blueCircle.y += unit_vec[1] * velBlue
    
    

    这样可以确保蓝色圆圈始终按照红色圆圈的确切方向移动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多