最近自学python语言的过程中接触到了Pygame,这也是我第一次接触到游戏引擎。作为一个男生对游戏有天然的兴趣,所以当看到pygame时自己做个小游戏的想法便油然而生,在这个过程中遇到了很多问题。基于学习和讨论的基于学习和讨论的目的写了这个文章。
遇到的问题:怎么实现敌方精灵的自动追踪?
在查阅了相关资料后有了解决办法—— 转向力 = 所需速度 - 当前速度
在上述公式中,我们已知精灵的当前速度和目标位置只需要计算施加的速度即可,我们可以这样设计敌人精灵,
(假设我们的目标位置是鼠标位置)
class Mob(pg.sprite.Sprite):
def __init__(self):
self.groups = all_sprites
pg.sprite.Sprite.__init__(self, self.groups)
self.image = pg.Surface((MOB_SIZE, MOB_SIZE))
self.image.fill(YELLOW)
self.rect = self.image.get_rect()
self.pos = vec(randint(0, WIDTH), randint(0, HEIGHT))#当前位置
self.vel = vec(MAX_SPEED, 0).rotate(uniform(0, 360))#当前速度
self.acc = vec(0, 0)#施加速度
self.rect.center = self.pos
def follow_mouse(self):
mpos = pg.mouse.get_pos()#鼠标位置
self.acc = (mpos - self.pos)
MAX_SPEED = 5 #最大速度
MAX_FORCE = 0.1 #最大力量
def seek(self, target):
self.desired = (target - self.pos).normalize() * MAX_SPEED
steer = (self.desired - self.vel)
if steer.length() > MAX_FORCE:
steer.scale_to_length(MAX_FORCE)
return steer
APPROACH_RADIUS = 120 #表示距离的常量
继续改进def seek(self, target)函数,
def seek_with_approach(self, target):
self.desired = (target - self.pos)#需要目标向量
dist = self.desired.length()#目标向量大小
self.desired.normalize_ip()
if dist < APPROACH_RADIUS:
self.desired *= dist / APPROACH_RADIUS * MAX_SPEED
else:
self.desired *= MAX_SPEED
steer = (self.desired - self.vel)
if steer.length() > MAX_FORCE:
steer.scale_to_length(MAX_FORCE)
return steer