如果我移动我的玩家,我的敌人就会停止移动
My enemies stop moving if i move my player
抱歉延迟,但可以看到我的敌人(绿色)生成,但如果我移动我的玩家(灰色),他们有时会停止移动,直到我再次移动我的玩家。
但即使在移动我的玩家之后,先前存在的敌人也不会靠近玩家并保持与玩家的距离
this is the file which contains the main loop of the game
this is the file which contains the player class
this is the file which contains the enemy class
and this is the file which is the main run file
我觉得问题存在于我的主循环 class 中,如下所示:
import pygame, random
from Folder.scripts.TopDown.script_files.td_Player import Player
from Folder.scripts.TopDown.script_files.td_enemy import Enemy
from Folder.scripts.TopDown.script_files.td_colours import colours
pygame.init()
class Main:
def __init__(self):
self.FPS = 60
self.WIDTH = self.HEIGHT = 1280
self.MAP = pygame.Surface((self.WIDTH, self.HEIGHT))
self.enemies = []
def main(self,WINDOW ,clock):
WINDOW.fill(colours['white'])
player = Player()
camera_pos = (0, 0)
enemy_time = 0
run = True
while run:
clock.tick(self.FPS)
enemy_y = random.randint(0, 1220)
enemy_x = random.randint(0, 1220)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
current_time = pygame.time.get_ticks()
if current_time > enemy_time:
enemy_time = current_time + 1000
self.enemies.append(Enemy(enemy_y, enemy_x))
camera_pos = player.movement(camera_pos)
self.WindowUpdate(WINDOW, player, camera_pos)
pygame.quit()
def WindowUpdate(self,WINDOW, player, camera_pos):
player_x, player_y = player.playerMove()
WINDOW.fill((255, 255, 255))
self.MAP.fill(colours['gray'])
player.renderPlayer(self.MAP)
WINDOW.blit(self.MAP, camera_pos)
for e in self.enemies:
e.renderEnemy(WINDOW)
e.enemyMovement(player_x, player_y)
pygame.display.update()
Enemy
class:
import pygame, os, random, math
pygame.init()
# current_time = pygame.time.get_ticks()
# if current_time > self.enemy_time:
# self.enemy_time = current_time + 1000
# self.enemies.append()
class Enemy:
def __init__(self, enemy_y, enemy_x):
self.ENEMY_HEIGHT = self.ENEMY_WIDTH = 64
self.ENEMY_ACCELERATION = 5
self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)
self.ENEMY = {
'up': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_up.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'down': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_down.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'left': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_left.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'right': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_right.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH))
}
self.enemy_state = 'up'
def enemyMovement(self, player_x, player_y):
ene_x, ene_y = player_x - self.enemy_rect.x, player_y - self.enemy_rect.y
dist = math.hypot(ene_x, ene_y)
ene_x, ene_y = ene_x // dist, ene_y // dist
self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION
self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION
print(self.enemy_rect.x, self.enemy_rect.y)
def renderEnemy(self, WINDOW):
WINDOW.blit(self.ENEMY[self.enemy_state] , (self.enemy_rect.x, self.enemy_rect.y))
我希望展示我的问题的视频的 imgur link 被嵌入。任何输入或帮助将不胜感激
ene_x // dist
和 ene_y // dist
的结果始终为 0。要计算移动,您必须使用 /
(除法)运算符而不是 //
(楼层划分)运算符
ene_x, ene_y = ene_x // dist, ene_y // dist
ene_x, ene_y = ene_x / dist, ene_y / dist
由于pygame.Rect
应该表示屏幕上的一个区域,因此pygame.Rect
对象只能存储整数数据。
The coordinates for Rect objects are all integers. [...]
当对象的位置增加时,运动的小数部分丢失:
self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION
self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION
如果要以浮点精度存储对象位置,则必须将对象的位置分别存储在单独的变量和属性中,并同步 pygame.Rect
对象。 round
坐标并将其分配给矩形的位置(例如.topleft
):
x, y = # floating point coordinates
rect.topleft = round(x), round(y)
将浮点坐标添加到Enemy
class:
class Enemy:
def __init__(self, enemy_y, enemy_x):
# [...]
self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)
self.x, self.y = self.enemy_rect.topleft
# [...]
def enemyMovement(self, player_x, player_y):
ene_x, ene_y = player_x - self.x, player_y - self.y
dist = math.hypot(ene_x, ene_y)
ene_x, ene_y = ene_x / dist, ene_y / dist
self.x += ene_x * self.ENEMY_ACCELERATION
self.y += ene_y * self.ENEMY_ACCELERATION
self.enemy_rect = round(self.x), round(self.y)
抱歉延迟,但可以看到我的敌人(绿色)生成,但如果我移动我的玩家(灰色),他们有时会停止移动,直到我再次移动我的玩家。
但即使在移动我的玩家之后,先前存在的敌人也不会靠近玩家并保持与玩家的距离
this is the file which contains the main loop of the game
this is the file which contains the player class
this is the file which contains the enemy class
and this is the file which is the main run file
我觉得问题存在于我的主循环 class 中,如下所示:
import pygame, random
from Folder.scripts.TopDown.script_files.td_Player import Player
from Folder.scripts.TopDown.script_files.td_enemy import Enemy
from Folder.scripts.TopDown.script_files.td_colours import colours
pygame.init()
class Main:
def __init__(self):
self.FPS = 60
self.WIDTH = self.HEIGHT = 1280
self.MAP = pygame.Surface((self.WIDTH, self.HEIGHT))
self.enemies = []
def main(self,WINDOW ,clock):
WINDOW.fill(colours['white'])
player = Player()
camera_pos = (0, 0)
enemy_time = 0
run = True
while run:
clock.tick(self.FPS)
enemy_y = random.randint(0, 1220)
enemy_x = random.randint(0, 1220)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
current_time = pygame.time.get_ticks()
if current_time > enemy_time:
enemy_time = current_time + 1000
self.enemies.append(Enemy(enemy_y, enemy_x))
camera_pos = player.movement(camera_pos)
self.WindowUpdate(WINDOW, player, camera_pos)
pygame.quit()
def WindowUpdate(self,WINDOW, player, camera_pos):
player_x, player_y = player.playerMove()
WINDOW.fill((255, 255, 255))
self.MAP.fill(colours['gray'])
player.renderPlayer(self.MAP)
WINDOW.blit(self.MAP, camera_pos)
for e in self.enemies:
e.renderEnemy(WINDOW)
e.enemyMovement(player_x, player_y)
pygame.display.update()
Enemy
class:
import pygame, os, random, math
pygame.init()
# current_time = pygame.time.get_ticks()
# if current_time > self.enemy_time:
# self.enemy_time = current_time + 1000
# self.enemies.append()
class Enemy:
def __init__(self, enemy_y, enemy_x):
self.ENEMY_HEIGHT = self.ENEMY_WIDTH = 64
self.ENEMY_ACCELERATION = 5
self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)
self.ENEMY = {
'up': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_up.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'down': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_down.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'left': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_left.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH)),
'right': pygame.transform.scale(pygame.image.load(
os.path.join(r'C:\Users\ajeen\PycharmProjects\Games\Folder\scripts\TopDown\assets', 'enemy_right.png')),
(self.ENEMY_HEIGHT, self.ENEMY_WIDTH))
}
self.enemy_state = 'up'
def enemyMovement(self, player_x, player_y):
ene_x, ene_y = player_x - self.enemy_rect.x, player_y - self.enemy_rect.y
dist = math.hypot(ene_x, ene_y)
ene_x, ene_y = ene_x // dist, ene_y // dist
self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION
self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION
print(self.enemy_rect.x, self.enemy_rect.y)
def renderEnemy(self, WINDOW):
WINDOW.blit(self.ENEMY[self.enemy_state] , (self.enemy_rect.x, self.enemy_rect.y))
我希望展示我的问题的视频的 imgur link 被嵌入。任何输入或帮助将不胜感激
ene_x // dist
和 ene_y // dist
的结果始终为 0。要计算移动,您必须使用 /
(除法)运算符而不是 //
(楼层划分)运算符
ene_x, ene_y = ene_x // dist, ene_y // dist
ene_x, ene_y = ene_x / dist, ene_y / dist
由于pygame.Rect
应该表示屏幕上的一个区域,因此pygame.Rect
对象只能存储整数数据。
The coordinates for Rect objects are all integers. [...]
当对象的位置增加时,运动的小数部分丢失:
self.enemy_rect.x += ene_x * self.ENEMY_ACCELERATION self.enemy_rect.y += ene_y * self.ENEMY_ACCELERATION
如果要以浮点精度存储对象位置,则必须将对象的位置分别存储在单独的变量和属性中,并同步 pygame.Rect
对象。 round
坐标并将其分配给矩形的位置(例如.topleft
):
x, y = # floating point coordinates
rect.topleft = round(x), round(y)
将浮点坐标添加到Enemy
class:
class Enemy:
def __init__(self, enemy_y, enemy_x):
# [...]
self.enemy_rect = pygame.Rect(enemy_x, enemy_y, self.ENEMY_HEIGHT, self.ENEMY_WIDTH)
self.x, self.y = self.enemy_rect.topleft
# [...]
def enemyMovement(self, player_x, player_y):
ene_x, ene_y = player_x - self.x, player_y - self.y
dist = math.hypot(ene_x, ene_y)
ene_x, ene_y = ene_x / dist, ene_y / dist
self.x += ene_x * self.ENEMY_ACCELERATION
self.y += ene_y * self.ENEMY_ACCELERATION
self.enemy_rect = round(self.x), round(self.y)