from tkinter import* from math import pi, sin, cos class Canon: def __init__(self, boss, x, y): self.boss = boss self.x1, self.y1 = x, y self.lbu = 50 self.x2, self.y2 = x + self.lbu, y self.buse = boss.create_line(self.x1, self.y1, self.x2, self.y2, width =10) r = 15 boss.create_oval(x-r, y-r, x+r, y+r, fill='blue', width =3) self.obus =boss.create_oval(x, y, x, y, fill='red') self.anim =False self.xMax =int(boss.cget('width')) self.yMax =int(boss.cget('height')) def orienter(self, angle): self.angle = float(angle)*2*pi/90 self.x2 = self.x1 + self.lbu*cos(self.angle) self.y2 = self.y1 - self.lbu*sin(self.angle) self.boss.coords(self.buse, self.x1, self.y1, self.x2, self.y2) def deplacer(self, x, y): dx, dy = x -self.x1, y -self.y1 self.boss.move(self.buse, dx, dy) self.boss.move(self.corps, dx, dy) self.x1 += dx self.y1 += dy self.x2 += dx self.y2 += dy def feu(self): if not self.anim: self.anim =True self.boss.coords(self.obus, self.x2 -3, self.y2 -3, self.x2 +3, self.y2 +3) v = 15 self.vy = -v *sin(self.angle) self.vx = v *cos(self.angle) self.animer_obus() def animer_obus(self): if self.anim: self.boss.move(self.obus, int(self.vx), int(self.vy)) c = self.boss.coords(self.obus) xo, yo = c[0] +3, c[1] +3 if yo > self.yMax or xo > self.xMax: self.anim =False self.vy += 0.2 self.boss.after(30, self.animer_obus) def test_obstacle(self, xo, yo): if yo >self.yMax or xo <0 or xo >self.xMax: self.anim =False return for id in self.guns: gun = self.guns[id] if xo < gun.x1 +self.rc and xo > gun.x1 -self.rc \ and yo < gun.y1 +self.rc and yo > gun.y1 -self.rc : self.anim =False self.explo = self.boss.create_oval(xo -12, yo -12, xo +12, yo +12, fill ='yellow', width =0) self.hit =id self.boss.after(150, self.fin_explosion) break class Canon2: def __init__(self, boss, x, y): self.boss = boss self.x1, self.y1 = x, y self.lbu = 50 self.x2, self.y2 = x + self.lbu, y self.buse = boss.create_line(self.x1, self.y1, self.x2, self.y2, width =10) r = 15 boss.create_oval(x-r, y-r, x+r, y+r, fill='blue', width =3) self.obus =boss.create_oval(x, y, x, y, fill='red') self.anim =False self.xMax =int(boss.cget('width')) self.yMax =int(boss.cget('height')) def orienter(self, angle): self.angle = float(angle)*2*pi/90 self.x2 = self.x1 + self.lbu*cos(self.angle) self.y2 = self.y1 - self.lbu*sin(self.angle) self.boss.coords(self.buse, self.x1, self.y1, self.x2, self.y2) def feu(self): if not self.anim: self.anim =True self.boss.coords(self.obus, self.x2 -3, self.y2 -3, self.x2 +3, self.y2 +3) v = 15 self.vy = -v *sin(self.angle) self.vx = v *cos(self.angle) self.animer_obus() def animer_obus(self): if self.anim: self.boss.move(self.obus, int(self.vx), int(self.vy)) c = self.boss.coords(self.obus) xo, yo = c[0] +3, c[1] +3 if yo > self.yMax or xo > self.xMax: self.anim =False self.vy += 0.2 self.boss.after(30, self.animer_obus) if __name__ == '__main__': f = Tk() f.title('salut') can = Canvas(f,width =1250, height =800, bg ='ivory', relief =SUNKEN) can.pack(padx =10, pady =10) my_image = PhotoImage(file='F:\\Capture2(2).gif') can.create_image(0, 50, anchor = NW, image=my_image) can.create_rectangle( 0, 50, 1250, 800, width = 8, ) c1 = Canon(can, 76, 720) c2 = Canon2(can, 1230, 720) s1 =Scale(f, label='angle', from_=90, to=0, command=c1.orienter) s1.pack(side=LEFT, pady =5, padx =20) s1.set(8) s2 =Scale(f, label='angle', from_=90, to=0, command=c2.orienter) s2.pack(side=LEFT, pady =5, padx =20) s2.set(36) Button(f, text='Feu !', command =c1.feu).pack(side=LEFT) Button(f, text='Feu !', command =c2.feu).pack(side=LEFT) f.mainloop()