#python #pygame
Вопрос:
движущийся объект. В настоящее время он перемещается влево и вправо по экрану, и я хотел бы, чтобы пользователь мог прыгать по нему.
def moving_object():
global x_speed, y_speed
pygame.draw.rect(win, (200, 140, 150), rectangle)
rectangle.x = x_speed
if rectangle.right >= 500 or rectangle.left <= 0:
x_speed *= -1
класс для моего врага. В настоящее время они перемещаются влево и вправо по экрану, но я бы хотел, чтобы они следовали за пользователем. Они также не могут прыгать
class enemy():
walkRight = [pygame.image.load('R1E.png'), pygame.image.load('R2E.png'), pygame.image.load('R3E.png'), pygame.image.load('R4E.png'), pygame.image.load('R5E.png'), pygame.image.load('R6E.png'), pygame.image.load('R7E.png'), pygame.image.load('R8E.png'), pygame.image.load('R9E.png'), pygame.image.load('R10E.png'), pygame.image.load('R11E.png')]
walkLeft = [pygame.image.load('L1E.png'), pygame.image.load('L2E.png'), pygame.image.load('L3E.png'), pygame.image.load('L4E.png'), pygame.image.load('L5E.png'), pygame.image.load('L6E.png'), pygame.image.load('L7E.png'), pygame.image.load('L8E.png'), pygame.image.load('L9E.png'), pygame.image.load('L10E.png'), pygame.image.load('L11E.png')]
def __init__(self, x, y, width, height, end):
self.x = x
self.y = y
self.width = width
self.height = height
self.end = end
self.WalkCount = 0
self.vel = 3
self.path = [self.x, self.end]
self.hitbox = (self.x 17, self.y 2, 31, 57)
self.health = 10
self.visible = True
def draw(self, win):
self.move()
if self.visible:
if self.WalkCount 1 >= 33:
self.WalkCount = 0
if self.vel > 0:
win.blit(self.walkRight[self.WalkCount //3], (self.x, self.y))
self.WalkCount = 1
else:
win.blit(self.walkLeft[self.WalkCount //3], (self.x, self.y))
self.WalkCount = 1
pygame.draw.rect(win, (255, 0, 0), (self.hitbox[0], self.hitbox[1] - 20, 50, 10))
pygame.draw.rect(win, (0, 255, 0), (self.hitbox[0], self.hitbox[1] - 20, 50, 10))
self.hitbox = (self.x 17, self.y 2, 31, 57)
def move(self):
if self.vel > 0:
if self.x self.vel < self.path[1]:
self.x = self.vel
else:
self.vel = self.vel * -1
self.WalkCount = 0
else:
if self.x - self.vel > self.path[0]:
self.x = self.vel
else:
self.vel = self.vel * -1
self.WalkCount = 0
def hit(self):
if self.health > 0:
self.health -= 1
else:
self.visible = False
pass
Комментарии:
1. для следующих есть только возможность просто увеличить свои координаты в сторону координат игроков, так что ничего особенного, и они пойдут очень прямо. в основном Вы устанавливаете координату, которая является текущей координатой игрока, и в игровом цикле добавляете или уменьшаете координаты x и y для врагов, пока не доберетесь до этой позиции, в противном случае вам придется создать немного более сложный алгоритм поиска пути (самый простой-тот, о котором я вам уже рассказывал, вы можете просто заставить их телепортироваться, что будет намного проще).
Ответ №1:
Итак, вот один из способов создания алгоритма поиска путей:
import pygame
import time
pygame.init()
screen = pygame.display.set_mode((700, 500))
clock = pygame.time.Clock()
to_coords = [550, 100]
from_coords = (150, 400)
def go_to_koeff(from_, to):
dx = to[0] - from_[0]
dy = to[1] - from_[1]
if dx != 0:
dx /= abs(dx)
if dy != 0:
dy /= abs(dy)
return dx, dy
follow_coords_x = from_coords[0]
follow_coords_y = from_coords[1]
velocity = 1
run = True
while run:
clock.tick(60)
screen.fill((0, 0, 0))
pygame.draw.circle(screen, (0, 255, 0), to_coords, 5)
pygame.draw.circle(screen, (255, 0, 0), from_coords, 5)
pygame.draw.circle(screen, (255, 255, 255), (follow_coords_x, follow_coords_y), 5)
koeff = go_to_koeff((follow_coords_x, follow_coords_y), to_coords)
follow_coords_x = velocity * koeff[0]
follow_coords_y = velocity * koeff[1]
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
to_coords[1] -= 3
if keys[pygame.K_DOWN]:
to_coords[1] = 3
if keys[pygame.K_LEFT]:
to_coords[0] -= 3
if keys[pygame.K_RIGHT]:
to_coords[0] = 3
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.display.update()
pygame.quit()
таким образом, в основном весь алгоритм заключается в этой go_to_koeff()
функции: эта функция возвращает коэффициент направления, который можно использовать для изменения того, куда движется белая точка, которую можно увидеть там, где коэффициент умножается на скорость. Этот алгоритм не идеален, но он находит позицию, так что это так. (Вы можете немного поиграть, переместив зеленую точку с помощью клавиш со стрелками, чтобы увидеть, как она движется)
Еще одна идея, которая пришла в голову, состояла в том, чтобы отслеживать позицию игрока в списке и заставлять врага следовать всем координатам в списке, что может быть еще хуже, но вам будет казаться, что он на самом деле следует за вами.
Кроме того, я только что заметил, что происходит какое-то бесполезное изменение имен переменных, но это ни на что особо не влияет.