Déplacer une bille à l'intérieur Tkinter Toile Widget (simple jeu Arkanoid)
Je suis en train d'écrire une simple Arkanoid avec l'aide de Python et Tkinter. L'objectif est de rendre le ballon réfléchir à partir du haut, les côtés droit et gauche. Et si le joueur rate la balle de sorte qu'il touche le bas côté, le jeu s'arrête.
Voici le code:
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()
Pourquoi le ballon qui se reflète dans le mauvais sens?
Ne pas "réfléchir" impliquent le mouvement? Vous devez déplacer la balle autour de lui d'abord, la mise à jour de sa position périodiquement, en fonction de la vitesse. Après que vous obtenez la balle en mouvement, lors de sa boîte englobante coupe le rectangle, inverser le signe de la vitesse (par exemple, x vitesse de +5 à -5) selon le côté de l'intersection s'est produite. Aussi, si ce n'est un devoir à la maison, s'il vous plaît ajouter les "devoirs" de la balise.
Vous devriez vraiment éviter d'utiliser
votre code ne s'exécute pas. À tous. Il a l'indentation des erreurs, et les références au "soi" qui n'est jamais mis n'importe où.
j'ai juste corrigé le code. il devrait fonctionner maintenant.
Vous devriez vraiment éviter d'utiliser
while True
et time.sleep
. Aucun de ces travaux, avec une boucle d'événements. Utiliser le code que je vous ai montré où vous mettez à jour l'écran à l'aide after
.votre code ne s'exécute pas. À tous. Il a l'indentation des erreurs, et les références au "soi" qui n'est jamais mis n'importe où.
j'ai juste corrigé le code. il devrait fonctionner maintenant.
OriginalL'auteur SaulTigh | 2011-11-02
Vous devez vous connecter pour publier un commentaire.
Pour déplacer un objet, vous devez utiliser le
coords
méthode ou lamove
méthode, qui change les coordonnées de l'objet. Vous pouvez utiliser lecoords
méthode pour obtenir les coordonnées actuelles.À faire de l'animation, vous pouvez utiliser
after
. Appeler une fonction, puis de l'utiliserafter
à s'appeler lui-même encore un peu de temps à l'avenir. Comment loin dans le futur permettra de déterminer votre taux de trame (c'est à dire: toutes les 10ms signifie à peu près de 100 images par seconde)Par exemple:
Une fois que vous appelez
moveit()
juste une fois, le début du cycle. La même méthode peut être utilisée pour mettre à jour plus d'un objet, ou vous pouvez avoir des méthodes différentes pour différents objets.edit: Vous avez complètement changé votre question de "comment puis-je changer quelque chose sur une toile?" au "pourquoi faut-il se déplacer dans la mauvaise direction?". La réponse de ce dernier est simple: vous la raconter pour se déplacer dans la mauvaise direction. Utiliser un débogueur ou certains des instructions d'impression, de voir où et comment vous calculez delta_y.
OriginalL'auteur Bryan Oakley
voici un hack pour ce problème:
sleep
dans une interface graphique, et, normalement, vous ne devriez pas avoir une boucle infinie soit. Une interface graphique a déjà une boucle infinie -- la boucle d'événements.OriginalL'auteur SaulTigh