Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2017 15:17:12

Sergiev_ne_Posad
Зарегистрирован: 2017-08-09
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка на метод

Встретился с довольно странной проблемой. Есть два модуля, один main, второй player.
В main импортировал всё из player'a, и создал экземпляр класса Player() (находиться этот класс в модуле Player). Далее было необходимо ссылаться на методы класса Player (метод moove и render) по средствам экземпляра. Но интерпретатор выдаёт AttributeError, и говорит, что такого атрибута не существует. Не понял проблему вообще, и решения соответственно тоже не нашёл, 2 дня потратил только, но решил сразу обратиться к гуру. Знаю, что непонятно нифига, но после просмотра кода, думаю всё поймете.

 # Модуль main
import pygame
from Constants import * 
from Player import * # Импорт модуля Player
from pygame.locals import *
class Main():
	def __init__(self, screen):
		# Конструктор
		self.screen = screen
		self.player = Player("Cestuh") # Экземпляр класса Player()
		self.background = pygame.image.load("images/background.jpg")
		self.running = True
		self.main_loop()
	
	def handle_events(self):
		# События
		for event in pygame.event.get():
			if event.type == QUIT:
				self.running == False
			elif event.type == KEYDOWN:
				if event.key == K_RIGHT:
					self.player.direction = RIGHT
					self.player.mooving = [1, 0, 0, 0]
				if event.key == K_DOWN:
					self.player.direction = DOWN
					self.player.mooving = [0, 1, 0, 0]
				if event.key == K_LEFT:
					self.player.direction = LEFT
					self.player.mooving = [0, 0, 1, 0]
				if event.key == K_UP:
					self.player.direction = UP
					self.player.mooving = [0, 0, 0, 1]
			elif event.key == KEYUP:
				if event.key == K_UP:
					self.player.mooving[UP] = 0
				if event.key == K_DOWN:
					self.player.mooving[DOWN] = 0
				if event.key == K_RIGHT:
					self.player.mooving[RIGHT] = 0
				if event.key == K_LEFT:
					self.player.mooving[LEFT] = 0
	
	def render(self):
		# Метод, отвечающий за прорисовку всего
		self.screen.blit(self.background,(0,0))
		self.player.render(screen) # Ссылка на метод render из модуля Player
		pygame.display.flip()
	
	def main_loop(self):
		# Основной цикл, пока он работает - программа работает тоже
		while self.running == True:
			self.player.moove() # Ссылка на метод moove из модуля Player
			self.render()
			self.handle_events()
			
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
game = Main(screen)

 # Модуль Player
import pygame
from Constants import *
from pygame.examples.oldalien import PLAYER_SPEED
class Player():
	def __init__(self, name):
		# Конструктор
		self.state = ALIVE
		self.direction = RIGHT
		self.x = START_X
		self.y = START_Y
		self.name = name
		self.hp = MAX_HP
		self.mp = MAX_MP
		self.image_pack = ["images/archerr.png", "images/archerd.png", "images/archerl.png", "images/archeru.png"]
		self.images = []
		for image in self.image_pack:
			temp = pygame.image.load(image).convert_alpha()
			i = []
			i.append(temp.subsurface(0, 0, 64, 64)) 
			i.append(temp.subsurface(64, 0, 64, 64)) 
			i.append(temp.subsurface(128, 0, 64, 64)) 
			self.images.append(i)
			
		self.mooving = [0, 0, 0, 0]
		
		def moove(self):
			# Метод, отвечающий за движение персонажа
			if self.mooving[RIGHT] == 1:
				self.x += PLAYER_SPEED
			if self.mooving[DOWN] == 1:
				self.y += PLAYER_SPEED
			if self.mooving[LEFT] == 1:
				self.x -= PLAYER_SPEED
			if self.mooving[UP] == 1:
				self.y -= PLAYER_SPEED
			
		def render(self, screen):
			# Прорисовка
			screen.blit(self.images[self.direction][self.state], (self.x, self.y))
		
		def render_ui(self, screen):
			pass

П.С.: Комментариями обозначено самое важное, что относиться к проблеме.

Офлайн

#2 Авг. 9, 2017 15:20:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Ссылка на метод

Зачем вы методы внутрь инициализатора запихали?

 class Player():
	def __init__(self, name):
	       .......
		def moove(self):
			......


 class Player():
	def __init__(self, name):
	       .......
	def moove(self):
	      ......


это прям совсем разный код



Отредактировано FishHook (Авг. 9, 2017 15:21:38)

Офлайн

#3 Авг. 9, 2017 15:42:48

Sergiev_ne_Posad
Зарегистрирован: 2017-08-09
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Ссылка на метод

FishHook
р
Вы гений.

Не заметил, когда код писал, что у меня методы внутри инита сидят, блин, так тупо чувствую себя сейчас.

Спасибо, огромное!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version