here an example
Would be easier in pygame or pysfml.
fix poping bug. popping bug so far has no effect on above good. Just added little more stuff.
import tkinter as tk SCREEN = 600, 400 class Bullet: def __init__(self, canvas, x, y, tk_fill, movement): self.bullet = canvas.create_oval(x -3 , y - 3, x + 3, y + 3, fill=tk_fill) self.movement = movement def move(self, canvas): canvas.move(self.bullet, self.movement[0], self.movement[1]) class App(tk.Frame): def __init__(self, master): # put canvas in frame so you can have other goodies tk.Frame.__init__(self, master) self.pack() self.canvas = tk.Canvas(self, width=SCREEN[0], height=SCREEN[1]) self.canvas.pack() self.bullets = []# store bullets self.tick_loop() # start the tick loop self.ship = self.create_ship(300, 370, "blue") master.bind("<Left>", self.go_left) master.bind("<Right>", self.go_right) master.bind("<Up>", self.go_up) master.bind("<Down>", self.go_down) master.bind("<space>", self.space_key) def create_ship(self, x, y, tk_fill): return self.canvas.create_polygon(x, y, x - 20, y + 30, x + 20, y + 30, fill=tk_fill) def tick_loop(self): remove_list = for enum, bullet in enumerate(self.bullets): if self.canvas.coords(bullet.bullet)[1] < 0: remove_list.append(enum) self.canvas.delete(bullet.bullet) else: bullet.move(self.canvas) for index in remove_list: self.bullets.pop(index) # framerate per seconds 1000/30 = 30 frames roughly self.after(int(1000/30), self.tick_loop) def go_left(self, event): self.canvas.move(self.ship, -5, 0) self.canvas.update() def go_right(self, event): self.canvas.move(self.ship, 5, 0) self.canvas.update() def go_up(self, event): self.canvas.move(self.ship, 0, -5) self.canvas.update() def go_down(self, event): self.canvas.move(self.ship, 0, 5) self.canvas.update() def space_key(self, event=0): # only want the first two coords x, y = self.canvas.coords(self.ship)[:2] # just having shoot straight up self.bullets.append(Bullet(self.canvas, x, y, "blue", (0, -10))) def main(): root = tk.Tk() app = App(root) app.mainloop() if __name__ == '__main__': main()Don't like how keypress working but here it is.
Would be easier in pygame or pysfml.
fix poping bug. popping bug so far has no effect on above good. Just added little more stuff.
import tkinter as tk SCREEN = 600, 400 class Bullet: def __init__(self, canvas, x, y, tk_fill, movement): self.bullet = canvas.create_oval(x -3 , y - 3, x + 3, y + 3, fill=tk_fill) self.movement = movement def move(self, canvas): canvas.move(self.bullet, self.movement[0], self.movement[1]) class App(tk.Frame): def __init__(self, master): # put canvas in frame so you can have other goodies tk.Frame.__init__(self, master) self.pack() self.canvas = tk.Canvas(self, width=SCREEN[0], height=SCREEN[1]) self.canvas.pack() self.bullets = [] # store bullets self.tick_loop() # start the tick loop self.ship = self.create_ship(300, 370, "blue") master.bind("<Left>", self.go_left) master.bind("<Right>", self.go_right) master.bind("<Up>", self.go_up) master.bind("<Down>", self.go_down) master.bind("<space>", self.space_key) master.bind("<b>", self.go_b) master.bind("<v>", self.go_v) def create_ship(self, x, y, tk_fill): return self.canvas.create_polygon(x, y, x - 20, y + 30, x + 20, y + 30, fill=tk_fill) def tick_loop(self): remove_list = [] for enum, bullet in enumerate(self.bullets): coords = self.canvas.coords(bullet.bullet) if coords[1] < 0 or coords[0] < 0 or coords[2] > SCREEN[0]: remove_list.append(enum) self.canvas.delete(bullet.bullet) else: bullet.move(self.canvas) # fix poping bug for enum, index in enumerate(remove_list): self.bullets.pop(index - enum) # framerate per seconds 1000/30 = 30 frames roughly self.after(int(1000/30), self.tick_loop) def go_left(self, event): self.canvas.move(self.ship, -5, 0) self.canvas.update() def go_right(self, event): self.canvas.move(self.ship, 5, 0) self.canvas.update() def go_up(self, event): self.canvas.move(self.ship, 0, -5) self.canvas.update() def go_down(self, event): self.canvas.move(self.ship, 0, 5) self.canvas.update() def space_key(self, event=0): # only want the first two coords x, y = self.canvas.coords(self.ship)[:2] # just having shoot straight up self.bullets.append(Bullet(self.canvas, x, y, "blue", (0, -10))) # spread shooting def go_b(self, event): # only want the first two coords x, y = self.canvas.coords(self.ship)[:2] #up self.bullets.append(Bullet(self.canvas, x, y, "red", (0, -8))) #left self.bullets.append(Bullet(self.canvas, x, y, "red", (-8, 0))) #right self.bullets.append(Bullet(self.canvas, x, y, "red", (8, 0))) # triple shoot striaght up def go_v(self, event): # only want the first two coords x, y = self.canvas.coords(self.ship)[:2] #up self.bullets.append(Bullet(self.canvas, x, y, "green", (0, -5))) self.bullets.append(Bullet(self.canvas, x - 50, y, "green", (0, -5))) self.bullets.append(Bullet(self.canvas, x + 50, y, "green", (0, -5))) def main(): root = tk.Tk() app = App(root) app.mainloop() if __name__ == '__main__': main()
99 percent of computer problems exists between chair and keyboard.