클래스 및 인스턴스 업데이트

펭귄 2020

프로그램에서 처음으로 클래스를 사용하려고했지만 클래스의 속성을 업데이트하는 데 어려움을 겪고 있습니다.

나는 이것을 위해 파이썬에서 파이 게임 라이브러리를 사용하고 있으며 클래스를 사용하여 화면의 한 지점에서 위로 레이저를 쏘려고 시도하고 있습니다. 그러나 레이저는 그 위치에 머무르며 전혀 올라가지 않습니다. 무엇을해야할지 모르겠습니다.

창의 크기 : 800 x 600

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()
            
             
Kingsley

클래스 "정의"와 클래스의 "인스턴스"를 이해해야한다고 생각합니다. 색상 정보를 저장할 클래스를 정의한다고 가정 해 보겠습니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이벤트 핸들러 및 클래스 인스턴스 추가

분류에서Dev

클래스 디자인 : 우아하게 인스턴스 변수 초기화 및 업데이트

분류에서Dev

Rails 컨트롤러의 인스턴스 및 클래스 변수

분류에서Dev

동시에 새 인스턴스 업데이트 및 생성

분류에서Dev

Python 데이터 클래스에서 인스턴스 속성 및 필드 혼합

분류에서Dev

OOP 클래스 및 인스턴스

분류에서Dev

Python 콘솔에서 클래스 인스턴스 업데이트

분류에서Dev

클래스 인스턴스의 속성 값 업데이트

분류에서Dev

데이터 및 문자열에 대한 작업을 포함하는 클래스의 문자열 인스턴스

분류에서Dev

"유형", "인스턴스", "클래스"및 "객체"개념의 차이점

분류에서Dev

클래스 및 인스턴스 변수를 사용한 속성 설명 이해

분류에서Dev

개체 인스턴스화 : 동일한 이름의 내부 클래스 및 외부 클래스 (Java)

분류에서Dev

Django 수퍼 클래스 모델 이름 변경 및 서브 클래스 포인터 업데이트

분류에서Dev

인스턴스 정규화 및 그룹 정규화 누락 업데이트

분류에서Dev

AngularJS ng-repeat 및 모든 인스턴스 업데이트 선택 제어

분류에서Dev

관찰자 패턴, 스마트 포인터 및 싱글 톤 클래스

분류에서Dev

다중 클래스 및 인스턴스화의 인터페이스 형식으로 다형성 이해

분류에서Dev

다중 클래스 및 인스턴스화의 인터페이스 형식으로 다형성 이해

분류에서Dev

유형 클래스 및 인스턴스 : 패턴 매개 변수가 목록이 될까요?

분류에서Dev

OOP 인스턴스 업데이트

분류에서Dev

클래스 내에서 System :: String 선언, 업데이트 및 액세스

분류에서Dev

클래스 및 ID 작업

분류에서Dev

"사이"클래스 인스턴스에 대한 CSS 클래스

분류에서Dev

자식 클래스 C #을 인스턴스화 할 때 기본 클래스 특성 업데이트

분류에서Dev

Java의 내부 클래스 및 엔 클로징 인스턴스?

분류에서Dev

Ajax 및 Rails 4 : 인스턴스 변수 생성 및 새로 고침없이 뷰 업데이트

분류에서Dev

Typescript 클래스 및 다중 하위 클래스, 유형 및 인터페이스

분류에서Dev

다른 스레드 및 클래스에서 DataGrid에 바인딩 된 WPF 업데이트 목록

분류에서Dev

QTreeView, 클래스, 인수, 인스턴스 및 속성

Related 관련 기사

  1. 1

    이벤트 핸들러 및 클래스 인스턴스 추가

  2. 2

    클래스 디자인 : 우아하게 인스턴스 변수 초기화 및 업데이트

  3. 3

    Rails 컨트롤러의 인스턴스 및 클래스 변수

  4. 4

    동시에 새 인스턴스 업데이트 및 생성

  5. 5

    Python 데이터 클래스에서 인스턴스 속성 및 필드 혼합

  6. 6

    OOP 클래스 및 인스턴스

  7. 7

    Python 콘솔에서 클래스 인스턴스 업데이트

  8. 8

    클래스 인스턴스의 속성 값 업데이트

  9. 9

    데이터 및 문자열에 대한 작업을 포함하는 클래스의 문자열 인스턴스

  10. 10

    "유형", "인스턴스", "클래스"및 "객체"개념의 차이점

  11. 11

    클래스 및 인스턴스 변수를 사용한 속성 설명 이해

  12. 12

    개체 인스턴스화 : 동일한 이름의 내부 클래스 및 외부 클래스 (Java)

  13. 13

    Django 수퍼 클래스 모델 이름 변경 및 서브 클래스 포인터 업데이트

  14. 14

    인스턴스 정규화 및 그룹 정규화 누락 업데이트

  15. 15

    AngularJS ng-repeat 및 모든 인스턴스 업데이트 선택 제어

  16. 16

    관찰자 패턴, 스마트 포인터 및 싱글 톤 클래스

  17. 17

    다중 클래스 및 인스턴스화의 인터페이스 형식으로 다형성 이해

  18. 18

    다중 클래스 및 인스턴스화의 인터페이스 형식으로 다형성 이해

  19. 19

    유형 클래스 및 인스턴스 : 패턴 매개 변수가 목록이 될까요?

  20. 20

    OOP 인스턴스 업데이트

  21. 21

    클래스 내에서 System :: String 선언, 업데이트 및 액세스

  22. 22

    클래스 및 ID 작업

  23. 23

    "사이"클래스 인스턴스에 대한 CSS 클래스

  24. 24

    자식 클래스 C #을 인스턴스화 할 때 기본 클래스 특성 업데이트

  25. 25

    Java의 내부 클래스 및 엔 클로징 인스턴스?

  26. 26

    Ajax 및 Rails 4 : 인스턴스 변수 생성 및 새로 고침없이 뷰 업데이트

  27. 27

    Typescript 클래스 및 다중 하위 클래스, 유형 및 인터페이스

  28. 28

    다른 스레드 및 클래스에서 DataGrid에 바인딩 된 WPF 업데이트 목록

  29. 29

    QTreeView, 클래스, 인수, 인스턴스 및 속성

뜨겁다태그

보관