Форум сайта python.su
Всем привет
Кто читал эту книгу, или не читал, но шарит. Не идет вторая игра про человечка. Вылетает ошибка:
Traceback (most recent call last):
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 271, in <module>
g.mainloop()
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 30, in mainloop
sprite.move()
File “C:\Users\Администратор\Desktop\RunningMan Py\RunningMan.py”, line 224, in move
and collided_bottom(1, co, sprite_co):
NameError: name ‘collided_bottom’ is not defined
В архиве лежит сам модуль, если кому не сложно глянуть почему вылетает ошибка.
или вот тут код, но без спрайтов:
from tkinter import * import random import time class Game: def __init__(self): self.tk = Tk() self.tk.title("Running man") self.tk.resizable(0, 0) self.tk.wm_attributes("-topmost", 1) self.canvas = Canvas(self.tk, width=500, height=500, highlightthickness=0) self.canvas.pack() self.tk.update() self.canvas_height = 500 self.canvas_width = 500 self.bg = PhotoImage(file="background.gif") backGroundWidth = self.bg.width() backGroundHeight = self.bg.height() for stroka in range(5): for stolbik in range(5): self.canvas.create_image(stroka * backGroundWidth, stolbik * backGroundHeight, \ image=self.bg, anchor='nw') self.sprites = [] self.running = True def mainloop(self): while 1: if self.running == True: for sprite in self.sprites: sprite.move() self.tk.update_idletasks() self.tk.update() time.sleep(0.01) class Coords: def __init__(self, x1=0, y1=0, x2=0, y2=0): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def within_x(co1, co2): if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \ or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \ or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \ or (co2.x2 > co1.x1 and co2.x2 < co1.x2): return True else: return False def within_y(co1, co2): if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \ or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \ or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \ or (co2.y2 > co1.y1 and co2.y2 < co1.y2): return True else: return False def collided_left(co1, co2): if within_y(co1, co2): if co1.x1 <= co2.x2 and co1.x1 >= co2.x1: return True return False def collided_right(co1, co2): if within_y(co1, co2): if co1.x2 >= co2.x1 and co1.x2 <= co2.x2: return True return False def collided_top(co1, co2): if within_x(co1, co2): if co1.y1 <= co2.y2 and co1.y1 >= co2.y1: return True return False def collided_bottom(y, co1, co2): if within_x(co1, co2): y_calc = co1.y2 + y if y_calc >= co2.y1 and y_calc <= co2.y2: return True return False class Sprite: def __init__(self, game): self.game = game self.endgame = False self.coordinates = None def move(self): pass def coords(self): return self.coordinates class PlatformSprite(Sprite): def __init__(self, game, photo_image, x, y, width, height): Sprite.__init__(self, game) self.photo_image = photo_image self.image = game.canvas.create_image(x, y, \ image=self.photo_image, anchor='nw') self.coordinates = Coords(x, y, x + width, y + height) class StickFigureSprite(Sprite): def __init__(self, game): Sprite.__init__(self, game) self.images_left = [ PhotoImage(file="chel1l.gif"), PhotoImage(file="chel2l.gif"), PhotoImage(file="chel3l.gif"), ] self.images_right = [ PhotoImage(file="chel1r.gif"), PhotoImage(file="chel2r.gif"), PhotoImage(file="chel3r.gif"), ] self.image = game.canvas.create_image(200, 470, \ image=self.images_left[0], anchor='nw') self.x = -2 self.y = 0 self.current_image = 0 self.current_image_add = 1 self.jump_count = 0 self.last_time = time.time() self.coordinates = Coords() game.canvas.bind_all('<KeyPress-Left>', self.turn_left) game.canvas.bind_all('<KeyPress-Right>', self.turn_right) game.canvas.bind_all('<space>', self.jump) def turn_left(self, evt): if self.y == 0: self.x = -2 def turn_right(self, evt): if self.y == 0: self.x = 2 def jump(self, evt): if self.y == 0: self.y = -4 self.jump_count = 0 def animate(self): if self.x != 0 and self.y == 0: if time.time() - self.last_time > 0.1: self.last_time = time.time() self.current_image += self.current_image_add if self.current_image >= 2: self.current_image_add = -1 if self.current_image <= 0: self.current_image_add = 1 if self.x < 0: if self.y != 0: self.game.canvas.itemconfig(self.image, \ image=self.images_left[2]) else: self.game.canvas.itemconfig(self.image, \ image=self.images_left[self.current_image]) elif self.x > 0: if self.y != 0: self.game.canvas.itemconfig(self.image, \ image=self.images_right[2]) else: self.game.canvas.itemconfig(self.image, \ image=self.images_right[self.current_image]) def coords(self): xy = self.game.canvas.coords(self.image) self.coordinates.x1 = xy[0] self.coordinates.y1 = xy[1] self.coordinates.x2 = xy[0] + 27 self.coordinates.y1 = xy[1] + 30 return self.coordinates def move(self): self.animate() if self.y < 0: self.jump_count += 1 if self.jump_count > 20: self.y = 4 if self.y > 0: self.jump_count -= 1 co = self.coords() left = True right = True top = True bottom = True falling = True if self.y > 0 and co.y2 >= self.game.canvas_height: self.y = 0 bottom = False elif self.y < 0 and co.y1 <= 0: self.y = 0 top = False if self.x > 0 and co.x2 >= self.game.canvas_width: self.x = 0 right = False elif self.x < 0 and co.x1 <= 0: self.x = 0 left = False for sprite in self.game.sprites: if sprite == self: continue sprite_co = sprite.coords() if top and self.y < 0 and collided_top(co, sprite_co): self.y = -self.y top = False if bottom and self.y > 0 and collided_bottom(self.y, \ co, sprite_co): self.y = sprite_co.y1 - co.y2 if self.y < 0: self.y = 0 bottom = False top = False if bottom and falling and self.y == 0 and co.y2 < self.game.canvas_height and collided_bottom(1, co, sprite_co): falling = False if left and self.x < 0 and collided_left(co, sprite_co): self.x = 0 left = False if right and self.x > 0 and collided_right(co, sprite_co): self.x = 0 right = False if falling and bottom and self.y == 0 \ and co.y2 < self.game.canvas_height: self.y = 4 self.game.canvas.move(self.image, self.x, self.y) g = Game() platform1 = PlatformSprite(g, PhotoImage(file="platform1.gif"),\ 0, 480, 100, 10) platform2 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \ 150, 440, 100, 10) platform3 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \ 300, 400, 100, 10) platform4 = PlatformSprite(g, PhotoImage(file="platform1.gif"), \ 300, 160, 100, 10) platform5 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \ 175, 350, 66, 10) platform6 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \ 50, 300, 66, 10) platform7 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \ 170, 120, 66, 10) platform8 = PlatformSprite(g, PhotoImage(file="platform2.gif"), \ 45, 60, 66, 10) platform9 = PlatformSprite(g, PhotoImage(file="platform3.gif"), \ 170, 250, 32, 10) platform10 = PlatformSprite(g, PhotoImage(file="platform3.gif"), \ 230, 200, 32, 10) g.sprites.append(platform1) g.sprites.append(platform2) g.sprites.append(platform3) g.sprites.append(platform4) g.sprites.append(platform5) g.sprites.append(platform6) g.sprites.append(platform7) g.sprites.append(platform8) g.sprites.append(platform9) g.sprites.append(platform10) sf = StickFigureSprite(g) g.sprites.append(sf) g.mainloop()
Прикреплённый файлы:
RunningMan Py.7z (10,6 KБ)
Офлайн
Brain
Вот до этого метода у вас была в аргументах методов была ссылка на объект self, и что характерно, атрибуты объекта вы получали правильно - через ссылку на объект
def __init__(self, x1=0, y1=0, x2=0, y2=0): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2
def within_x(co1, co2): if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \ or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \ or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \ or (co2.x2 > co1.x1 and co2.x2 < co1.x2):
def collided_top(co1, co2): if within_x(co1, co2): if co1.y1 <= co2.y2 and co1.y1 >= co2.y1: return True return False
def collided_top(self, co1, co2): if self.within_x(co1, co2):
Отредактировано FishHook (Сен. 19, 2017 17:41:49)
Офлайн
Весь код из книги взят, своего ничего не добавлено.
Офлайн
Покажите фрагмент книги что бы мы могли решить кто прав,а кто нет.
Офлайн
Ну дык оно вам пишет:
Brainтоли вы не все скопипастили, толи чтото упустили
NameError: name ‘collided_bottom’ is not defined
[code python][/code]
Офлайн
BrainУ что вы хотите этим сказать? Какая разница, откуда вы взяли этот код, если он не верен?
Весь код из книги взят, своего ничего не добавлено.
Офлайн
JOHN_16
Покажите фрагмент книги что бы мы могли решить кто прав,а кто нет.
Отредактировано Brain (Сен. 20, 2017 09:36:03)
Прикреплённый файлы:
screens.7z (548,5 KБ)
Офлайн
PEHDOM
толи вы не все скопипастили, толи чтото упустили
collided_bottom,так же как и остальные collided_….. и within_… у вас вроде как методы класса Coords хотя аргумент self отсутвует везде как и декоратор @staticmethod. Из чего можно сделать вывод что скорее всего вы неправильно расствили отсупы, и эти функции должны быть описаны в скрипте, а не в классе .
Офлайн
FishHookПоэтому я и попросил помощи, т.к. опыта мало.
У что вы хотите этим сказать? Какая разница, откуда вы взяли этот код, если он не верен?
Офлайн
Офлайн