我正在尝试在Python和Tkinter的帮助下编写一个简单的Arkanoid。目标是让球从顶部,右侧和左侧反射。如果球员错过球而接触到底部,则比赛将停止。
以下是代码:
from Tkinter import *
import time
root = Tk()
canv = Canvas(root, highlightthickness=0)
canv.pack(fill='both', expand=True)
top = canv.create_line(0, 0, 640, 0, fill='green', tags=('top'))
left = canv.create_line(0, 0, 0, 480, fill='green', tags=('left'))
right = canv.create_line(639, 0, 639, 480, fill='green', tags=('right'))
bottom = canv.create_line(0, 478, 640, 478, fill='red', tags=('bottom'))
rect = canv.create_rectangle(270, 468, 365, 478, outline='black', fill='gray40', tags=('rect'))
ball = canv.create_oval(0, 20, 20, 40, outline='black', fill='gray40', tags=('ball'))
delta_x = delta_y = 3
new_x, new_y = delta_x, -delta_y
while True:
time.sleep(0.025)
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 1:
new_x, new_y = delta_x, -delta_y
canv.move(ball, new_x, new_y)
print 'fitst if', new_x, new_y
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 2:
new_x, new_y = delta_x, delta_y
canv.move(ball, new_x, new_y)
print '2nd if', new_x, new_y
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 3:
new_x, new_y = -delta_x, delta_y
canv.move(ball, new_x, new_y)
if canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])[0] == 4:
new_x, new_y = delta_x, -delta_y
canv.move(ball, new_x, new_y)
print new_x, new_y
canv.move(ball, new_y, new_y)
canv.update()
def move_right(event):
canv.move(rect, 7, 0)
pass
def move_left(event):
canv.move(rect, -7, 0)
pass
root.bind('<Right>', move_right)
root.bind('<Left>', move_left)
root.geometry('%sx%s+%s+%s' %(640, 480, 100, 100))
root.resizable(0, 0)
root.mainloop()
为什么球以错误的方式反射?
答案 0 :(得分:13)
要移动对象,您需要使用coords
方法或move
方法,这会更改对象的坐标。您可以使用coords
方法获取当前坐标。
要制作动画,您可以使用after
。调用一个函数,然后使用after
在将来的短时间内再次调用自己。未来多远将决定您的帧速率(即:每10毫秒意味着大约每秒100帧)
例如:
def moveit(self):
# move the object
<get the existing coordinates using the coords method>
<adjust the coordinates relative to the direction of travel>
<give the object new coordinates using the coords method>
# cause this movement to happen again in 10 milliseconds
self.after(10, self.moveit)
只需拨打moveit()
一次,就会开始循环。同样的方法可用于更新多个对象,或者您可以为不同的对象使用不同的方法。
编辑:您完全改变了“我如何在画布上移动内容?”的问题。 “为什么它向错误的方向移动?”后者的答案很简单:你告诉它向错误的方向前进。使用调试器或一些打印语句来查看计算delta_y的位置和方式。
答案 1 :(得分:-3)
这是针对此问题的简单方法:
delta_x = delta_y = 3
while True:
objects = canv.find_overlapping(canv.coords(ball)[0], canv.coords(ball)[1], canv.coords(ball)[2], canv.coords(ball)[3])
for obj in objects:
if obj == 1:
delta_y = -delta_y
if obj == 2:
delta_x = -delta_x
if obj == 3:
delta_x = -delta_x
if obj == 4:
delta_y = -delta_y
new_x, new_y = delta_x, delta_y
canv.move(ball, new_x, new_y)
canv.update()
time.sleep(0.025)
root.bind('<Right>', move_right)
root.bind('<Left>', move_left)