2017-06-02 27 views
0

我的代码应该产生多个追逐我的玩家的敌人。相反,敌人只是呆在一个地方。只有当我尝试向spawn坐标的敌方产卵函数输入一个值时才会出现这种情况。继承人代码:不知道如何产生多个敌人

class spawn(object): 
def __init__(self,place1,place2): 
    self.place1=place1 
    self.place2=place2 
def AIPrototype(self):#The important parts to this error star here 
    global x,y,x1,y1 
    pygame.draw.rect(screen,THECOLORS['blue'],(self.place1,self.place2,50,50)) 
    x1=self.place1 
    y1=self.place2#end here 
    if x1<x: 
     xspeed1=1 
     slopex1=x-x1 
    if x1>x: 
     xspeed1=-1 
     slopex1=x1-x 
    if y1<y: 
     yspeed1=1 
     slopey1=y-y1 
    if y1>y: 
     yspeed1=-1 
     slopey1=y1-y  
# 
    hypo1=((slopex1**2)+(slopey1**2))**0.5 
    speedmark1=hypo1/3 
    speedy1=slopey1/speedmark1 
    speedx1=slopex1/speedmark1 
    movex1=speedx1 
    movey1=speedy1 
    if x1<=640 and x1>=0: 
     if x1>x: 
      x1+=xspeed1*movex1 
      if x1<x: 
       xspeed1=0 
    if y1<=480 and x1>=0: 
     if y1>y: 
      y1+=yspeed1*movey1 
      if y1<y: 
       yspeed1=0 
    if x1<=640 and x1>=0: 
     if x1<x: 
      x1+=xspeed1*movex1 
      if x1>x: 
       xspeed1=0 
    if y1<=480 and x1>=0: 
     if y1<y: 
      y1+=yspeed1*movey1 
      if y1>y: 
       yspeed1=0 
# 
    if x1>640: 
     x1=640 
    if x1<0: 
     x1=0 
    if y1>480: 
     y1=480 
    if y1<0: 
     y1=0 
    self.place1=x1#start 
    self.place2=y1#end 

这是产生敌人的作用。这个函数在这里被称为:

clock = pygame.time.Clock() 
keepGoing = True   

try: 
    while keepGoing: 
     clock.tick(60) 

     screen.fill(THECOLORS['red']) 
     pygame.draw.rect(screen,THECOLORS['green'],(x,y,50,50)) 
     char() 
     spawn1=spawn(200,200)#start 
     spawn1.AIPrototype()#end 
     pygame.display.flip() 

我不知道我的编码错误在哪里,所以如果有人能帮我一把,那会很好。

+0

请提供一个[最小,完整且可验证的示例](https://stackoverflow.com/help/mcve),否则可能很难甚至无法帮助您。 – skrx

+0

对不起,有这么多的代码,但我认为我削减了所有不重要的部分。这些都是我认为我的错误可能存在的部分。如果我再去掉,我也可以删除错误。 – Qartx

+0

问题是您的代码示例不完整且可验证。你应该提供一个例子,我们可以复制,粘贴和运行。另一个问题是缺少文件和评论,解释了一切应该如何工作。它也看起来像你一次问两个问题:如何产生多个敌人,以及如何移动它们。移动敌人的代码似乎被破坏了。我建议使用矢量来处理敌人的移动,然后你可以将整个移动代码减少到几行。我可以向你展示一个例子(你知道pygame.Sprites是如何工作的吗?)。 – skrx

回答

0

下面是一个向量的例子。为了获得敌人的速度,我计算向玩家的矢量,然后将其归一化并按比例缩放4(最终速度)。

vel = (player.center - self.pos).normalize() * 4 

然后,你可以添加vel ocity到pos并设置rect.center将更新的POS矢量移动的对象。


产卵新的敌人,首先创建一个应该持有的敌人情况,然后就append新实例当敌人产卵(按下F键产卵他们)的列表。您也可以使用pygame sprites和精灵组而不是敌人类和列表。

import sys 
import pygame as pg 


class Enemy: 

    def __init__(self, pos, color): 
     self.rect = pg.Rect(pos, (26, 45)) 
     self.color = color 
     self.pos = pg.math.Vector2(pos) 

    def update(self, player): 
     vel = (player.center - self.pos).normalize() * 4 
     self.pos += vel 
     self.rect.center = self.pos 

    def draw(self, screen): 
     pg.draw.rect(screen, self.color, self.rect) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    bg_color = pg.Color('gray12') 
    player_color = pg.Color('dodgerblue1') 
    enemy_color = pg.Color('sienna1') 
    clock = pg.time.Clock() 
    player = pg.Rect((100, 300), (26, 50)) 
    enemy_list = [Enemy((100, 300), enemy_color)] 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.KEYDOWN: 
       if event.key == pg.K_f: 
        enemy_list.append(Enemy((400, 0), enemy_color)) 

     keys = pg.key.get_pressed() 
     if keys[pg.K_a]: 
      player.x -= 5 
     elif keys[pg.K_d]: 
      player.x += 5 
     if keys[pg.K_w]: 
      player.y -= 5 
     elif keys[pg.K_s]: 
      player.y += 5 

     for enemy in enemy_list: 
      enemy.update(player) 

     screen.fill(bg_color) 
     pg.draw.rect(screen, player_color, player) 
     for enemy in enemy_list: 
      enemy.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit()