-1

Я делаю (по общему признанию, свою первую) игру на Python, и я только сделал базу игры (например, передвигаюсь), и все работает pretty ну, кроме тот факт, что вы можете двигаться прямо с экрана. Как бы добавить обнаружение столкновений в стороны окна? Вот код:Как добавить обнаружение столкновений в стороны окна в Tkinter? [Python 3]

from tkinter import * 
import time 
tk = Tk() 
tk.title("Squarey") 
c = colorchooser.askcolor(title='Choose Squarey\'s Color') 
canvas = Canvas(tk, width=700, height=700) 
canvas.pack() 
class Squarey: 
    def __init__(self, canvas, color): 
     self.canvas = canvas 
     self.id = canvas.create_rectangle(10, 10, 50, 50, fill=color) 
    def draw(self, pos): 
     def move(event): 
      if event.keysym == 'Up': 
       self.canvas.move(self.id, 0, -5) 
      elif event.keysym == 'Down': 
       self.canvas.move(self.id, 0, 5) 
      elif event.keysym == 'Left': 
       self.canvas.move(self.id, -5, 0) 
      else: 
       self.canvas.move(self.id, 5, 0) 
     canvas.bind_all('<KeyPress-Up>', move) 
     canvas.bind_all('<KeyPress-Down>', move) 
     canvas.bind_all('<KeyPress-Left>', move) 
     canvas.bind_all('<KeyPress-Right>', move) 
class Tele: 
    def __init__(self, canvas, pos): 
     self.canvas = canvas 
     self.id = canvas.create_text(10, 10, text=pos) 
    def draw(self, pos): 
     canvas.delete(self.id) 
     self.id = canvas.create_text(350, 350, text=pos) 
squarey = Squarey(canvas, c[1]) 
pos = squarey.canvas.coords(squarey.id) 
tele = Tele(canvas, pos) 
while 1: 
    pos = squarey.canvas.coords(squarey.id) 
    squarey.draw(pos) 
    tele.draw(pos) 
    tk.update_idletasks() 
    tk.update() 
    time.sleep(0.01) 

Надежда каждый может помочь мне; благодаря!

+0

Что вы хотите, чтобы обнаружить столкновение, курсор? Или объект? – Rockybilly

ответ

1

Вы можете получить размер холста, как это:

size, _ = self.canvas.winfo_geometry().split('+', maxsplit=1) 
w, h = (int(_) for _ in size.split('x')) 

и положение вашей Squarey так:

x, y, _, __ = self.canvas.coords(self.id) 

(Там могут быть лучшие способы сделать это, конечно)

Затем просто адаптируйте свою функцию движения следующим образом:

if event.keysym == 'Up': 
    if y > 0: 
     self.canvas.move(self.id, 0, -5) 
elif event.keysym == 'Down': 
    if y+50 < h: 
     self.canvas.move(self.id, 0, 5) 
elif event.keysym == 'Left': 
    if x > 0: 
     self.canvas.move(self.id, -5, 0) 
else: 
    if x+50 < w: 
     self.canvas.move(self.id, 5, 0) 

Это должно сработать для вас (по крайней мере, для меня). Но вы не должны останавливаться на достигнутом, есть некоторые улучшения, которые вы можете сделать.

Первое, что я хотел бы сделать что-то вроде этого:

def __init__(self, canvas, color, width=50, height=50): 
    self.canvas = canvas 
    self.width = width 
    self.height = height 
    self.id = canvas.create_rectangle(10, 10, width, height, fill=color) 

Тогда вы могли бы изменить ход:

left_edge = x 
right_edge = left_edge + self.width 
top_edge = y 
bottom_edge = top_edge + self.height 

if event.keysym == 'Up' and top_edge > 0: 
    ... 
elif event.keysym == 'Down' and bottom_edge < h: 
    ... 
elif event.keysym == 'Left' and left_edge > 0: 
    ... 
elif event.keysym == 'Right' and right_edge < w: 
    ... 
0

Я предполагаю, что вы хотите обнаружить столкновение прямоугольника с краями экрана. Я незнакомец с tkinter, однако у меня есть опыт работы с pygame, позвольте мне объяснить, как я могу.

В pygame положение прямоугольника задается как left_top-угол, (одна сторона), b (другая сторона). Например, если вы хотите обнаружить столкновение, вы должны проверить все стороны, используя эти значения.

Скажем экран (width, height)

# Top side collision 
if y < 0: 
    print "Touched top" 
# Right side collision 
if x + b > width: 
    print "Touched right" 
# Bottom side collision 
if y + a > height: 
    print "Touched bottom" 
# Left side collision 
if x < 0: 
    print "Touched left" 

Я уверен, что очень похоже логика необходима в Tkinter, а также.