如何移动自己。为冲突将位置命令与另一个类关联-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