簡體   English   中英

試圖讓藍色方塊跟隨紅色方塊,但它不起作用

[英]Trying to make the blue square follow the red square, but it doesn't work

我正在嘗試制作一個程序,您可以在其中扮演一個紅色方塊,一個藍色方塊跟隨您。 很簡單,對吧? 是的,除了這是我第一次這樣做。

我聽說過 A*,但我想嘗試一種更簡單的方法,尤其是在這個例子中,藍色方塊沒有任何障礙來計算它周圍的 go。 它確實有效,但是,藍色方塊不能返回 go。 我不知道為什么。 藍色方塊的移動被放置在一個 function 中,這個 function 被放置在主游戲循環中的另一個 function 中。

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()

如果你沒有障礙,那么 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

這可確保藍色圓圈始終沿紅色圓圈的確切方向移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM