반응형

게임을 구입할 수 있는 상점들은 여러개 있지만 가장 유명한 곳은 단연 스팀(Steam) 이라고 할 수 있습니다. 이러한 스팀의 경우에는 일반 Windows 뿐 아니라 MacOS 와 Linux 게임도 판매하고 있습니다.

 

리눅스에서 스팀클라이언트를 실행해서 보다 보면 다음과 같은 내용이 있는 게임이 있습니다.

 

게임을 Steam Play 를 통해 실행한다고 쓰여져 있습니다.

 

그렇다면 Steam Play란 무엇인가?

 

리눅스 사용자라면 Wine 을 들어본 적이 있을것입니다. Wine 은 리눅스에서 윈도우즈 라이브러리인 Win32 를 구현한 것으로 리눅스에서 윈도우즈 실행파일을 실행할 수 있게 해 주는 프로그램입니다.

이 Wine 을 Steam 측에서 수정하여 윈도우용 게임을 리눅스에서 좀 더 원할히 실행할 수 있도록 하는것이 바로 Steam Play 입니다. 스팀에서는 이 프로그램을 Proton 이라고 부르고 있고요. Proton 은 Wine을 해당게임이 더 잘 실행되도록 수정한것으로 소스도 공개되어 있고 자신만의 Proton 을 만들어서 게임을 실행하는데 적용하는것도 가능하다고 FAQ 에 써 있습니다.

 

하지만 Wine 으로 모든 윈도우 게임이 실행 가능하지 않은것 처럼 Proton도 그렇습니다. 따라서 모든 윈도우 게임이 스팀플레이로 리눅스에서 잘 실행되는 것은 아닙니다.

 

스팀에서는 스팀플레이로 잘 실행되는 게임을 리눅스 게임쪽에 표시해 주고 위에서처럼 그런 게임들은 스팀플레이로 실행된다고 알려주고 있습니다.

 

리눅스용 스팀에서는 스팀 플레이에 대한 설정부분이 있습니다.

 

위 스크린샷에서 보면 두개의 설정이 있습니다.

위의 설정은 스팀플레이로 플레이 가능한 게임을 표시해 주겠냐는 것입니다. 이 게임들은 Steam측에서  플레이 가능여부를 테스트 해 본 게임들이기 때문에 실행에 문제는 거의 없을 것입니다.

 

아래쪽 빨간색으로 표시해 놓은 곳은 모든 다른 게임들을 스팀플레이로 실행하겠냐는 설정입니다. 이 경우는 스팀에서 실행여부를 테스트 하지 않았거나 실행에 이런저런 문제가 있는 게임들이기 때문에 게임들이 잘 실행될지는 알 수 없습니다. 그냥 한번 시도해 보는 거죠. ^^;

제 경우는 아래쪽 설정을 사용해 보진 않았습니다. 하지만 리눅스에서 실행해 보고 싶은 게임이 있다면 한번 시도해 보는 것도 손해 볼 건 없겠지요.

 

>

 

스팀 플레이용 게임을 설치해 보면.....

 

이와 같이 Proton 을 함께 설치합니다. 게임이 77.4MB 인데 Proton이 354.3MB 네요. 게임보다 용량이 더 큽니다. 앞에서도 이야기 했듯이 Wine 은 Win32 라이브러리를 구현한 것이니 용량이 큰것도 이해가 갑니다.

 

 

설치가 끝나고 게임을 실행해 보면 위와 같이 Steam Play 로 게임을 실행한다고 알려줍니다.

 

 

실행해보니 잘 됩니다. ^^;

 

>

 

스팀 플레이로 실행되는 게임이(스팀측에서 테스트 완료한 게임) 아직은 그렇게 많지 않은 것 같습니다. 하지만 점점 늘어난다면 리눅스에서 즐길 수 있는 게임이 늘어나게 되니 어찌되었던 좋은일이 아닐 수 없습니다.

 

참....Steam 에서 이런 기능을 넣을지는 몰랐네요. 아무튼 박수를 보냅니다.

 

반응형

스카이림을 안한지가 좀 되었는데 이번에 한번 다시 시작해 봤습니다. 오랜만에 해도 할만하네요.

컴퓨터를 아직 업그레이드 하지 않아서 SE 는 좀 버거워 LE 로 하고 있습니다. 컴퓨터 업그레이드 할려고만 하면 무슨 일이든 터져 버리네요. ㅡㅡ; 사실 게임외에 특별히 불편한 점이 없어서 결국 업그레이드는 느긋하게 하기로....아직 안한 게임도 많고....

 

>

 

제가 스카이림 모드에 대한 글을 몇번 블로그에 썼었는데 이 모드를 여태 몰랐다는게 좀 의아 할 정도로 좋은 모드가 있더군요. 바로 Haven Bag 입니다. 이 Bag 안에 왠만한게 다 있습니다. 이 모드가 있으면 집이 크게 필요가 없습니다.

 

외부에서 본 haven bag

치트를 쳐서 바깥에서 본 haven bag 입니다. 정말로 Bag 입니다. 실제로 내부 공간은 넓지 않지만 이 안에 마법부여대, 도가니, 모루, 연금술대등 있을건 다 있습니다.

게다가 상자에 물건을 보관할 수 있어서 정말 편합니다. 스카이림의 무게제한은 다니다 보면 좀 너무 부족 하다는 생각이 들죠. 그래서 많은 분들은 치트로 무게 제한을 높여서 사용하기도 합니다. 하지만 이 모드가 있으면 그냥 Bag 에 들어가서 상자에 물건을 저장하고 나오면 됩니다.

 

>

 

내부의 모습입니다. 작지만 여기에서 모든 제작을 다 할 수 있습니다.  뒤에는 침대도 있습니다.

 

>

 

명칭이 다 잘 생각이 안나서 그냥 스크린샷으로....도가니도 축소되어 존재하고 있습니다.

 

>

 

왼쪽엔 이런것들이....

 

>

 

이 Bag의 사용법은 간단합니다. 모드를 적용하면 위의 스크린샷처럼 방어구에 Haven Bag 이 나타납니다. 방어구를 장비하는 것처럼 Haven Bag 을 선택하면 바로 이 Bag 안으로 들어 오게 됩니다. 시간과 장소에 구애를 받지 않고 말이죠. ^^;

그런데 저 같은 경우 처음에 이 Bag 에서 나가는 방법을 몰라 좀 헤맸었는데요. 오른쪽 설명에 보면 들어가고 나갈때 쓴다고 되어있습니다. 즉 이 Bag 에서 나가려면 방어구 해제 하듯이 한번 다시 선택해 주면 되는 거더군요.

 

>

 

이 모드를 쓰는 이유는 물론 편한점도 있지만 스카이림에 존재하는 버그인 세이브 파일 문제를 해결하기 위한 용도로 쓰기도 합니다. 세이브 하기전에 이 Bag 에 들어와서 세이브를 하면 됩니다.

이 Bag 안은 크기도 작고 별다른게 없어서 세이브 파일 문제(로딩중 CTD)를 해결하는데 도움이 된다는 이야기가 있습니다. 세이브 파일 정리도 된다고 하는 이야기도 있는데 제가 직접 확인할 방법은 없네요.

단점은 세이브 파일 이름이 모두 Haven Bag 으로 나와서 어디서 세이브 한건지 구분이 안된다는 건데...이것도 무슨 모드로 해결 할 수 있다고 하지만 저는 딱히 필요가 없어서 사용하지는 않고 있습니다.

 

>

 

저는 이 모드를 LE 에서 쓰고 있지만 찾아보니 SE 도 있더군요. SE 용은 써본적이 없지만 SE 를 플레이 하는 분들을 위해 같이 링크를 남겨둡니다.

 

LE 용 https://www.nexusmods.com/skyrim/mods/21454

 

SE 용 https://www.nexusmods.com/skyrimspecialedition/mods/2809

 

>

 

스카이림이 나온지도 오래된데다. 사실 이 모드도 엄청난 뒷북이라 딱히 정보성이라기 보단 제 자신을 위한 기록으로 남겨 둡니다.

 

기록이라고 하니까 하나 생각나는데 최근 플레이 하다가 다른 공간으로 이동할때(로딩이 있는 경우) CTD 가 자주 발생해서 이런저런 모드들을 지우고 배열하고 하다 보니, 마법을 좀 편하게 쓰려고 설치해 놓은 Smart Cast 라는 모드를 지우니 CTD 가 좀 적어 지는것 같았습니다. 뭐....확신은 없고 좀더 써봐야 겠지만 그냥 기록으로 남겨둡니다.

 

 

반응형

지금까지 진행된 프로젝트를 실행했을 경우 공이 이리저리 잘 튕기고 막대로 공을 튕겨내는 것도 가능하긴 하지만 공이 움직이는 각도는 바뀌지 않습니다.
이럴 경우 공의 움직임은 너무 단조롭게 됩니다. 따라서 실제 벽돌깨기 게임을 보면 공을 튕겨내는 막대의 어느 위치에 공이 맞느냐에 따라 공이 움직이는 각도가 달라지게 됩니다.

공이 맞는 위치에 따라 공의 이동 방향이 달라집니다

위 그림에서 보듯 공이 어디에 부딪치느냐에 따라 공의 방향을 바꿔 줄것 입니다.

    #barx : 막대의 x 좌표
    def collideBar(self,barx):
        self.diry *=-1
        
        #공의 x 좌표가 바의 x 좌표보다 작은건 바의 왼쪽부분에 부딪쳤다는것입다
        #이때 공은 왼쪽방향으로 반사됩니다.
        #반대의 경우엔 바의 오른쪽에 부딪쳤다는 것으로 공은 오른쪽방향으로 반사됩니다
        bx = barx - self.rect.center[0]
        if self.rect.center[0] < barx:
            self.moveLeft(bx)
        elif barx < self.rect.center[0]: 
            self.moveRight(bx)

막대와 공의 충돌시에 호출되는 함수에 막대의 x 좌표를 인자로 넘겨 줍니다.

barx 좌표는 공을 튕겨내는 막대 중심의 X 좌표 입니다. 공의 x 좌표는 rect.center[0] 로 얻을 수 있기 때문에 이 두 변수를 비교해서 공이 막대의 왼쪽에 맞았는지 오른쪽에 맞았는지를 판단 할 수 있게 됩니다.

또한 위의 두 값을 빼기를 해보면(barx -self.rect.center[0]) 막대의 어느 위치에 충돌했는지도 알 수 있습니다. 따라서 이 충돌 위치에 따라 공의 새로운 이동각도를 구할 수 있습니다.

 

    def moveLeft(self,bx):
        self.angle = 191 + bx
        self.dirx=1
        
    def moveRight(self,bx):
        self.angle = 169 + bx
        self.dirx=1

위의 moveLeft 와 moveRight 함수는 각각 공을 왼쪽으로 보낼것인지 오른쪽으로 보낼것인지에 따라 호출 됩니다.

공을 왼쪽으로 보내기 위해서는 180 ~ 270 도 사이의 각도로 설정을 해야 합니다. 다만 180 과 270도는 수직, 수평으로 공이 이동되기 때문에 실제로는 190~260도 사이로 값을 변경하게 됩니다.
따라서 각도는 191에 "barx -self.rect.center[0]" 값을 더해서 공의 새로운 이동 각도를 구하게 됩니다.

공을 오른쪽으로 보내는 것도 마찬가지 입니다.
공을 오른쪽으로 보내기 위해서는 90~180 도 사이의 각도로 설정해야 합니다. 다만 위와 같은 이유로 실제 각도는 100~170 도 사이에서 결정되게 됩니다.

사실 이 경우는 막대의 크기가 144로 반으로 나눌경우 72 이기 때문에 좀 쉽게 한 편입니다. 위에서 설명했듯이 각도의 범위가 100~170 도로 막대의 길이와 비슷했기에 단순히 더하고 빼는 것 만으로 새로운 각도를 쉽게 구할 수 있었습니다. 만일 막대의 크기가 크거나 작아서 새로운 공의 이동각도를 단순히 더하기 빼기로 구하기 어려울 경우엔 막대의 길이와 각도와의 비율을 이용해서 새로운 공의 이동 각도를 구해야 할 것입니다.


마지막으로 소스에서 "self.dirx=1" 란 문장이 있는데 이는 각도에 맞게 공을 이동 시키기 위한 것입니다. 공이 왼쪽이나 오른쪽벽에 부딪히면 dirx에 -1 을 곱해 부호를 바꿔주어 공이 벽에서 반사되어 움직이게 됩니다. 그런데 우리가 원하는 대로, 예를 들어 100~170도 사이로 공을 보내려고 할때는 dirx가 마이너스 값이면 공은 반대로 190~260도 방향으로 날아가게 됩니다. 그렇기 때문에 우리가 원하는 각도를 입력해서 공의 방향을 정해줄 때는 dirx는 언제나 플러스 값으로 바꿔주어야 합니다. 

지금 생각엔 아예 처음부터 각도와 부호를 이용해서 이동방향을 정해주는게 더 간단했을지도 모르겠다는 생각도 들기는 합니다만......여러분이 직접 바꿔 보는것도 좋겠지요. ^^;

 

+ Recent posts