2010-10-20 3 views
5

교수님이 파이 게임 (Pygame)의 객체 지향 프로그래밍에 따라 수업을 들었습니다. 기본적으로 그는 우리가 만들어야 할 게임은 메인 게임 루프가 없다고 말했습니다. 나는 이것을 할 수 있다고 믿는다. (그리고 this question이 가능하다고 말한 바있다.) 나는 이것이 객체 지향 패러다임을 준수하는데 필요하다고 생각하지 않는다.메인 루프가없는 게임 프로그래밍

교수가 준 다이어그램에서 그는 게임 초기화를 보여 주었고 객체가 인스턴스화 될 때 프로그램의 제어 흐름이 객체 사이에 분산 될 것입니다.

기본적으로 저는이 방법으로 게임을 구현하는 것이 가능할 것이라고 믿지만, 이상적인 방법은 아니며 객체 지향 준수에도 필요하지 않습니다. 이견있는 사람?

EDIT : 우리는 소행성 복제품을 만들고 있습니다. 나는 이것이 실시간 액션 게임이라는 사실로 인해 더욱 복잡해집니다.

+0

흠, 어떻게 작동하는지 알지만, 많은 소행성이있을 때 어떻게 좋은 결과를 얻을 수 있는지는 볼 수 없습니다. 어느 쪽이 충돌을 확인할 것입니까? 각자 독자적으로? 그렇다면 불필요한 충돌 검사를 피하기 위해 quadtree를 업데이트 할 대상은 어느 것입니까? 그리고 엔티티가 일종의 글로벌 상태를 조작하게하는 것이 IMO 중 가장 좋은 디자인 선택이 아닙니다. –

답변

7

턴 기반 게임이나 어떤 이벤트가 주도적 인 게임이 될 것입니다. 즉, 데스크탑 GUI 응용 프로그램을 사용하십시오. 그들은 이벤트가 해고 될 때까지 똑딱 거리고 있습니다. 간단한 게임도 마찬가지입니다. 체커를 예로 들어 보겠습니다. 각 게임주기를 반복하는 것은 과도한 행동입니다. 게임이 정지 될 확률은 90 %입니다. 어떤 형태의 이벤트 (여기서는 observer design 패턴이 좋을 것입니다)를 사용하면 더 나은 해결책을 얻을 수 있습니다. 당신은 파이 게임을 사용하고 있습니다. 그래서이 내장에 대한 지원이있을 수 있습니다. 제한된 사용으로 인해 나는 완전히 논평 할 수 없습니다. 어느 쪽이든, 일반적인 원칙은 동일합니다.

당신이 나에게 묻는다면, 모두 쓰레기 처리가 될 것입니다. 이벤트 중심 프로그래밍을 가르치는 것이면 간단한 GUI 응용 프로그램이 더 좋을 것입니다. 게임의 가장 간단한 것조차도 OO 원칙을 고수 할 수있는 기본적인 게임 루프입니다.

+0

고마워, 그게 내가 기본적으로 생각하고 있던 것. 옵서버 디자인 아이디어를 이용해 주셔서 감사합니다. – emberv3

+0

@ emberv3 오신 것을 환영합니다. – Finglas

0

이벤트 구동 형 프로그래밍의 자격이 될 수 있다고 생각합니까? 여전히 객체 지향적 일 수 있습니다. 플래시에서 많이 보게됩니다.

메인 루프의 메인 루프에는 차이가 있습니다. 게임 클래스에서 모든 개체를 초기화 한 다음 입력을 사용하여 게임을 계속 진행할 수 있습니다.

정확하게 당신의 임무의 정확한 매개 변수를 모른 채 말하기 어렵지만, 악마가 세부 사항에 있습니다.

2

흠. 일반적인 경우, 나는이 아이디어가 아마 hokum이라고 생각합니다. SDL (PyGame이 구현 됨)은 이벤트 대기열을 통해 프로그램에 정보를 제공하고 대기열을 사용하면 반복적으로 대기열에서 이벤트를 확인하고 처리하고 다음 이벤트가 도착할 때까지 대기해야합니다.

그러나 여기에는 몇 가지 예외가 있습니다. 이벤트 대기열에 액세스하지 않고 마우스 및 키보드를 해당 상태로 폴링 할 수 있습니다. 문제는 여전히 루프와 같은 것을 필요로하기 때문에 게임이 끝날 때까지 반복적으로 발생합니다.

pygame.time을 사용하면 이벤트 대기열에서 기다리는 대신 타이머를 기다린 다음 위에서 설명한대로 마우스와 키보드를 폴링하는 게임 개체에 제어를 전달할 수 있지만 여전히 '반복'하지만 이벤트 대기열 대신 타이머.

대신 메인 루프를 제거하는 것에 초점을 맞추는 대신 객체 지향적 인 방식으로 사용하는 방법을 생각해보십시오.

예를 들어 실제로 '루트'객체가 필요할 수 있습니다. 실제로는 자체 이벤트 루프가 있지만 들어오는 이벤트를 기반으로 액션을 수행하는 대신 여러 하위 객체의 핸들러를 호출합니다. 예를 들어 루트 객체가 pygame.event.MOUSEBUTTONDOWN 이벤트를 수신하면 'rect'속성에 대해 자식을 검색하고 event.pos 속성이 해당 rect 내에 있는지 확인할 수 있습니다. 해당 자식 개체에 대해 가상의 onClick 메서드를 호출 할 수 있습니다.

관련 문제