프로그램에서 처음으로 클래스를 사용하려고했지만 클래스의 속성을 업데이트하는 데 어려움을 겪고 있습니다.
나는 이것을 위해 파이썬에서 파이 게임 라이브러리를 사용하고 있으며 클래스를 사용하여 화면의 한 지점에서 위로 레이저를 쏘려고 시도하고 있습니다. 그러나 레이저는 그 위치에 머무르며 전혀 올라가지 않습니다. 무엇을해야할지 모르겠습니다.
class Mechanics(Display):
def __init__(self):
super().__init__()
self.laserX_change = 0
self.laserY_change = 10
self.userX_change = 0
self.userX = 360
self.laserX = 0
self.laserY = 480
self.laser_position = 'active'
self.laserImg = pygame.image.load('laser.png')
def fireLaser(self):
self.laserY -= self.laserY_change
if self.laserY <= 0:
self.laserY = 480
self.laser_position = 'active'
def activateLaser(self):
screen.blit(self.laserImg, (self.laserX + 16, self.laserY + 10))
self.fireLaser()
클래스 Running (Mechanics) :
def __init__(self):
Mechanics.__init__(self)
def run(self):
if event.key == pygame.K_SPACE:
if self.laser_position == 'active':
self.laserX = self.userX
laserSound = mixer.Sound('shoot.wav')
laserSound.play()
self.activateLaser()
클래스 "정의"와 클래스의 "인스턴스"를 이해해야한다고 생각합니다. 색상 정보를 저장할 클래스를 정의한다고 가정 해 보겠습니다.
class Colour:
def __init__( self, r, g, b, a=0 ):
self.red = r
self.green = g
self.blue = b
self.alpha = a
그게 전부입니다. 이것은 일반적으로 쓰지 않을 것입니다 Colour.red = 33
. 왜냐하면 이것은 색상의 정의이지 인스턴스가 아니기 때문입니다. 빈 포장 용기에 대한 계획과 같은 정의를 생각하십시오. 콘텐츠 변경을 시작하려면 먼저 만들어야합니다. 그래서 우리는 하나를 만듭니다.
purple = Colour( 24, 64, 319 )
그래서 지금 purple
은의 "인스턴스"입니다 Colour
. 보라색을 변경할 수 있습니다.
# make purple darker
purple.red -= 20
purple.green -= 20
purple.blue -= 20
이것은 Mechanics
(Laser) 클래스 로 수행해야 할 작업 이며 인스턴스를 만든 다음 변경합니다. 하지만 먼저 수업을 약간 조정하고 싶습니다.
class Laser():
def __init__( self, x, y=480, x_change=0, y_change=10 ):
self.laserX = x
self.laserY = y
self.laserX_change = x_change
self.laserY_change = y_change
self.image = pygame.image.load('laser.png').convert_alpha()
self.rect = self.image.get_rect()
self.rect.center = ( x, y )
self.sound = mixer.Sound('shoot.wav')
def soundEffect( self ):
self.sound.play() # pew! pew!
def draw( self, window ):
window.blit( self.image, self.rect )
def update( self ):
self.laserX += self.laserX_change
self.laserY += self.laserY_change
self.rect.move_ip( self.laserX_change, self.laserY_change )
이를 통해 Laser
주어진 (x, y) 좌표에서 를 만들 수 있습니다 . 이 클래스 레이아웃은 레이저 / 총알 등의 게임 요소를 만드는 데 정말 편리합니다. 활성화되면 코드가 플레이어의 좌표에 클래스의 새 인스턴스를 만들 수 있기 때문입니다.
def run(self):
if event.key == pygame.K_SPACE:
if self.laser_position == None:
self.laser_position = Laser( self.userX )
self.laser_position.soundEffect()
# when laser hits, goes off-screen, etc.
# self self.laser_position back to None
클래스 외부에서 클래스의 멤버 변수를 직접 조정 한 적이 전혀 없습니다. 이것은 파이썬 이외의 언어에서 일반적인 방법이며, 그렇지 않으면 눈살을 찌푸리게 될 것입니다 (그리고 코드 리뷰가 좋지 않습니다). 그러나 파이썬에서는 좀 더 수용 가능합니다. 여전히 :하지 마십시오.
뭐! 왜!? 색상 예제로 돌아갑니다. 색상 클래스의 순진한 사용자는 다음과 같이 할 수 있습니다.
# make a REALLY DARK purple
purple.red -= 200
purple.green -= 200
purple.blue -= 200
유효한 색상이 아닌 .red
성분이 -176
( 24-200) 인 보라색을 제공합니다 . 더 나은 접근 방식은 자체 내부 상태에 대한 전문가이기 때문에이를 처리 한 클래스에 함수를 갖는 것입니다.
class Colour:
#...
def makeDarker( self, delta ):
self.red = min( 0, self.red - delta )
self.green = min( 0, self.green - delta )
self.blue = min( 0, self.blue - delta )
다른 언어에서 내부 멤버 변수는 종종 "비공개"로 설정되어 직접 액세스 할 수 없습니다. 그러나 그것은 또 다른 대답입니다.
마지막 메모 : 위의 코드에서 질문의 내용을 미러링했지만 Rect
수업에 PyGame도 추가했습니다 . PyGame Rects는 레이저 이미지의 좌표와 치수를 포함하기 때문에 훌륭 합니다. 충돌 과 드로잉 모두에 쉽게 사용할 수 있습니다 . 따라서 객체에 대해 별도의 X 및 Y를 유지할 필요가 없으며 모두 Rect 안에 보관하십시오.
class Laser:
# ...
def hitPlayer( self, player_rect ):
is_overlapping = self.rect.colliderect( player_rect )
return is_overlapping
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다