나는 지금 2 주 동안 하나의 문제에 직면하고 있으며, 어디서부터 시작해도 여전히 그것을 파악할 수 없습니다. 문제는 두 점이 서로 쫓는 곡률 애니메이션을 만드는 것입니다. 그들 중 하나는 x 축에서 직선으로 이동하고 다른 하나는 x 축 (y 축에서 예 : p (0 : -10))에서 아래로 시작하며 추적 원리에 따라 두 번째는 시도합니다. 계속 마주 보면서 첫 번째 것을 잡으려고합니다. 실제 답을 얻는 데 도움이되는 코드를 작성했지만 매우 귀중한 방식으로 시각화 할 수 없습니다. 파이썬을 주요 코딩 언어로 사용하고 있습니다.
Luka K에 미리 감사드립니다.
그것은처럼 보인다 enemy following player
되는 지난 주에 요청했다 tkinter
및pygame
객체 간의 벡터를 계산합니다.
diff_x = player_x - enemy_x
diff_y = player_y - enemy_y
그리고 거리
distance = (diff_x**2 + diff_y**2)**0.5 # Pythagoras: a**2 + b**2 = c**2
(길이를 갖는 벡터를 정규화 벡터를 계산 1
)
normal_x = diff_x/distance
normal_y = diff_y/distance
곱에 의해 어떤 당신이 할 수있는 speed
계산을 move_x
하고 move_y
대한enemy
enemy_move_x = enemy_speed * normal_x
enemy_move_y = enemy_speed * normal_y
이동 enemy
하고 선을 그리는 데 사용할 수 있습니다 .
를 그리려면 당신은 다른 모듈을 사용할 수 있습니다 - 어떤 GUI 프레임 워크와 같은 tkinter
, PyQt
, wxPython
또는 게임 / 미디어 등의 라이브러리 pygame
나 pyglet
. 결국 애니메이션 GIF를 만드는 데 사용할 수있는 이미지를 생성 할 수 있습니다.
import tkinter as tk
def follow(player_x, player_y, enemy_x, enemy_y, enemy_speed=5):
diff_x = player_x - enemy_x
diff_y = player_y - enemy_y
distance = (diff_x**2 + diff_y**2)**0.5 # Pythagoras: a**2 + b**2 = c**2
if distance <= enemy_speed:
return diff_x, diff_y
normal_x = diff_x/distance
normal_y = diff_y/distance
enemy_move_x = enemy_speed * normal_x
enemy_move_y = enemy_speed * normal_y
return enemy_move_x, enemy_move_y
def update_game():
global player_x
global player_y
global enemy_x
global enemy_y
# draw line for player
canvas.create_line(player_x, player_y, player_x+player_move_x, player_y+player_move_y, fill='green')
# move player
player_x += player_move_x
player_y += player_move_y
canvas.move(player_id, player_move_x, player_move_y)
# calculate move for enemy
enemy_move_x, enemy_move_y = follow(player_x, player_y, enemy_x, enemy_y, enemy_speed)
# draw line for enemy
canvas.create_line(enemy_x, enemy_y, enemy_x+enemy_move_x, enemy_y+enemy_move_y, fill='red')
# move enemy
enemy_x += enemy_move_x
enemy_y += enemy_move_y
canvas.move(enemy_id, enemy_move_x, enemy_move_y)
root.after(100, update_game) # repeate after 100ms (0.1s)
# --- main ---
# player start position and move ("speed")
player_x = 5
player_y = 50
player_move_x = 4
player_move_y = 0 # try for `1`
# enemy start position and speed
enemy_x = 5
enemy_y = 500
enemy_speed = 5
root = tk.Tk()
canvas = tk.Canvas(root, width=750, height=500)#, bg='gray')
canvas.pack()
player_id = canvas.create_oval(player_x-5, player_y-5, player_x+5, player_y+5, fill='green')
enemy_id = canvas.create_oval(enemy_x-5, enemy_y-5, enemy_x+5, enemy_y+5, fill='red')
update_game()
root.mainloop()
BTW : 적군이 플레이어 를 따라 가도록하는 방법 에 대한 답변 에서 동일한 코드를 가지고 있지만 키를 사용하여 플레이어를 이동해야 WASD
하며 선을 그리지 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다