如何移动自己。为冲突将位置命令与另一个类关联-python

如何移动自己。为冲突将位置命令与另一个类关联-python,python,tkinter,Python,Tkinter,我想我已经计算出了碰撞,我只需要知道如何将精灵的位置坐标发送到检查碰撞的类。我还需要知道如何检查所有精灵,以便它知道哪一个正在碰撞 class Enemy(object): '''single enemy''' def __init__(self, canvas): # access to canvas self.canvas = canvas self.radius = 12.5 # random self.color = random.choice( ('b

我想我已经计算出了碰撞,我只需要知道如何将精灵的位置坐标发送到检查碰撞的类。我还需要知道如何检查所有精灵,以便它知道哪一个正在碰撞

class Enemy(object):
'''single enemy'''

def __init__(self, canvas):
    # access to canvas
    self.canvas = canvas
    self.radius = 12.5 # random
    self.color = random.choice( ('blue', 'red', 'green') )
    self.x = random.uniform(self.radius, RES_X-self.radius)
    self.y = random.uniform(self.radius, RES_Y-self.radius)
    self.x1 = self.x-self.radius
    self.y1 = self.y-self.radius
    self.x2 = self.x+self.radius
    self.y2 = self.y+self.radius
    self.oval = self.canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=self.color, outline=self.color)
    self.moving = True
    self.start()


def start(self):
    '''start moving'''
    self.moving = True
    # move this enemy after random time
    random_time = random.randint(150, 3000)
    root.after(random_time, self.move)


def move(self):
    global enposx, enposy
    if self.moving: # to stop root.after
        direction = random.randint(1,4)
        if direction == 1: # up
            self.y -= self.radius
            self.y1 -= self.radius
            self.y2 -= self.radius
        elif direction == 2: # down
            self.y += self.radius
            self.y1 += self.radius
            self.y2 += self.radius
        elif direction == 3: # left
            self.x -= self.radius
            self.x1 -= self.radius
            self.x2 -= self.radius
        elif direction == 4: # right
            self.x += self.radius
            self.x1 += self.radius
            self.x2 += self.radius
        self.enposx = int(self.x1-self.radius)
        self.enposy = int(self.y1-self.radius)
        self.canvas.coords(self.oval, self.x1, self.y1, self.x2, self.y2)
上面的代码就是我需要从中传输self.enposx和self.enposy(圆的中心点)的代码

类投射物(对象):
“单一弹丸”
定义初始化(自、父、画布):
#访问画布
self.parent=parent
self.repcount=0
self.canvas=画布
自半径=6#随机
self.color=random.choice((“蓝色”、“红色”、“绿色”、“黄色”、“橙色”))
self.x1=x+self.radius
self.y1=y+self.radius
self.x2=x-self.radius
self.y2=y-self.radius
self.oval=self.canvas.create_oval(self.x1,self.y1,self.x2,self.y2,fill=self.color,outline=self.color)
self.moving=True
self.direction=shootdir
self.start()
def启动(自):
全球方向
“开始移动”
self.moving=True
#随机移动这个敌人
root.after(20,self.move)
def移动(自我):
如果self.repcount<20:
如果self.moving:#停止root.after
如果self.direction==1:#向上
self.y1-=自半径
self.y2-=自半径
elif self.direction==2:#向下
self.y1+=自半径
self.y2+=自半径
elif self.direction==3:#左
self.x1-=自半径
self.x2-=自半径
elif self.direction==4:#正确
self.x1+=自半径
self.x2+=自半径
self.canvas.coords(self.oval、self.x1、self.y1、self.x2、self.y2)
self.proposex,self.proposy=int(self.x1自半径),int(self.y1自半径)
self.repcount+=1
xlist,ylist=[self.proposx,self.enposx],[self.proposy,self.enposy]
xmax,xmin=max(xlist),min(xlist)
ymax,ymin=max(ylist),min(ylist)
xval,yval=int(xmax-xmin),int(ymax-ymin)
如果xval<12.5且yval<12.5:
打印(“点击”)
self.parent.remove(self)
其他:
root.after(20,self.move)
其他:
打印(‘完成’)
self.parent.remove(self)
上面的代码是我需要它发送了,但我不知道如何发送它没有给出一个错误


据我所知,你正在创造一些类似游戏的太空入侵者,你不知道如何比较敌人(x,y)坐标和(玩家)射弹坐标

在继续之前,请注意,我从来没有编程过这种游戏,所以接下来可能(将)需要优化

我建议建造一个专门用于检测“敌人”和“射弹”之间碰撞的第三级:

您可能需要添加一个
get_properties
method/property来捆绑进行数学运算所需的所有信息(请参阅以获取说明)

pending_collisions
属性只是一个建议,它可以帮助您以干净的方式迭代敌人和投射物,然后执行您可能需要的任何操作


这个建议背后的原因是,我不认为处理碰撞属于“投射”类。如果你要摧毁(删除所有对敌人的引用),你可能最终会做类似于
所有敌人的事情。移除(摧毁敌人)
并且在你的射弹类中这样做会让你的代码很快变得混乱。

这是一个俯视rpg,射弹是法师的法术,所以我只移除其中一个敌人,大约10秒后它们会被繁殖回来。我建议你把这个信息报告给你的问题。不过,我的建议还是有点站得住脚,
敌人
只要改变一下就可以对付一个敌人,如果你需要的话。你最好使用一个外部处理器。我想让它检查多个碰撞哈哈,这意味着检查所有精灵的位置与投射物相比。请减少你发布的代码量。我已经做了,哈哈,我刚刚发布了400行需要的类的部分
class Projectile(object):
'''single projectile'''
def __init__(self, parent, canvas):
    # access to canvas
    self.parent = parent
    self.repcount = 0
    self.canvas = canvas
    self.radius = 6 # random
    self.color = random.choice( ('blue', 'red', 'green', 'yellow', 'orange') )
    self.x1 = x + self.radius
    self.y1 = y + self.radius
    self.x2 = x - self.radius
    self.y2 = y - self.radius
    self.oval = self.canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill=self.color, outline=self.color)
    self.moving = True
    self.direction = shootdir
    self.start()


def start(self):
    global direction
    '''start moving'''
    self.moving = True
    # move this enemy after random time
    root.after(20, self.move)


def move(self):
    if self.repcount < 20:
        if self.moving: # to stop root.after
            if self.direction == 1: # up
                 self.y1 -= self.radius
                 self.y2 -= self.radius
            elif self.direction == 2: # down
                self.y1 += self.radius
                self.y2 += self.radius
            elif self.direction == 3: # left
                self.x1 -= self.radius
                self.x2 -= self.radius
            elif self.direction == 4: # right
                self.x1 += self.radius
                self.x2 += self.radius
            self.canvas.coords(self.oval, self.x1, self.y1, self.x2, self.y2)
            self.proposx, self.proposy = int(self.x1-self.radius), int(self.y1-self.radius)
            self.repcount += 1
            xlist, ylist = [self.proposx, self.enposx], [self.proposy, self.enposy]
            xmax, xmin = max(xlist), min(xlist)
            ymax, ymin = max(ylist), min(ylist)
            xval, yval = int(xmax - xmin), int(ymax - ymin)
        if xval < 12.5 and yval < 12.5:
            print("hit")
            self.parent.remove(self)
        else:
            root.after(20, self.move)
    else:
        print('done')
        self.parent.remove(self)
class CollisionManager:
    def __init__(self, enemies, projectiles):
        self.enemies = enemies
        self.projectiles = projectiles
        self.pending_collisions = []

    def detect_collisions(self):
        # Your collision detection magic here
        pass