본문 바로가기

computer

게임런처를 만들어 봅시다 아이닉스 호두마루님글

아이닉스 자료는 퍼오지 않을려고 하는데 무슨이유인지 작성자가 아이닉스 카페를 탈퇴하셨습니다..
 
그래서 임의로 퍼왔습니다. 문제시 삭제 하겠습니다..

 
 
 
안녕하세요 오늘은 비주얼 C#을 이용한 간단한 런쳐만들기를 준비해봤습니다
굳이 런쳐까지 만들어서 사용할 이유라면.. 보통의 PC방은 C,D파티션으로 D드라이브에 게임을 설치하는 세팅을 하실텐데요
잠금상태인 D드라이브의 보호와 폴더접근이 필요한 게임을 손들이 플레이시.. 일일히 열어줘야하는 수고를 덜기위함입니다 ^^
 
사용언어는 마이크로소프트 비주얼 C#2005 이고 장점이라면
Hotmail만 있으면 무료등록해서 사용할수있다는점..
GUI환경을 꾸미기에 대단히 편리한점(그 쉽다는 파이썬조차 GUI로 넘어가면 힘들어지기때문에;;)
대소문자를 구분하는 언어지만 전용에디터의 존재로 코딩도 쉽습니다
 
단점이라면 역시 .Net FramWorks가 깔려있어야 하는부분이겠죠..
하지만 업주님들께서는 범용프로그램이 아닌 개인적인 목적으로 사용하실것이기때문에 큰 단점은 아닌듯합니다
굳이 범용을 원하신다면 C++ API가 대안이겠습니다만. 프로그래밍의 편리함면에서 많이 힘들다는것이 사실입니다
 
다운로드 http://www.microsoft.com/korea/msdn/vstudio/express/visualcsharp/
 
링크를 따라 다운로드해주시고 다음->다음만 눌러주면 설치가 끝나실겁니다
 
첨부 그림파일의 크기가 약간 크지만 정확한 내용전달을 위해 양해바랍니다.
 
자 그럼 시작하겠습니다

 


에디터를 구동시킨후 파일->새 프로젝트 -> windows응용 프로그램을 선택하고
제목은 Star Launcher를 입력해줍니다
네. 오늘 만들어볼 프로그램은 스타크래프트 런쳐입니다.
  
 
비주얼 C#의 메인 화면입니다. 순서대로 설명드리면
1.도구모음 = 사용자와 상호작용하는 모든 컨트롤들이 모여있는 창입니다
2.폼 = 프로그램의 틀이될 메인 폼입니다
3.속성창 = 가장 자주사용하게될 창. 폼또는 컨트롤들의 변경할수있는 속성을 보여줍니다
4.솔루션 탐색기 = 모듈사이의 빠른이동을 도와주는 창
%여러분이 보시는 화면이 다르다면 당황하지마시고 보기(V)에서 창을 활성화시켜주시면 됩니다
 
자. 여기까지하고 일단 저장을 해줍시다. 아직 시작도 안했지만 작업도중 수시로 저장하는 습관을 들이는것이 좋습니다
 
 
다음은 폼을 클릭한채로 속성창을 보시면
 
 
메인폼에서 바꿔주셔야할부분은 Name과 Text, StartPosition입니다.
여기서 혼동이 될부분이 있는데 Name이란 프로그램의 코딩시 사용하게될이름입니다
예를들면 코딩상에서 폼의 크기를 바꿔라 라는 명령을 하게될시에 타겟이될 이름이지요
텍스트는 폼상단에 표시될 제목을 뜻합니다
 
Name = frmLauncher
Text = Star Launcher
StartPosition = CenterScreen(프로그램 실행시 화면의 중앙에 표시하겠다는 뜻)
 
세가지를 바꾸주시구요
 
다음은 폼에 버튼을 하나 추가해보겠습니다.
 
 
어떻게 하면 될까요. 그렇습니다 그냥 도구상자에서 끌어다 놓으면 됩니다.
이제 버튼에대한 속성을 변경해줘야합니다
첫번째 버튼은 스타크래프트의 맵 폴더를 여는 버튼을 만들어보겠습니다.
Name = BtnMaps
text = 맵폴더열기
  
 
이제 이 버튼은 BtnMaps라는 명찰을 달고있는 "맵폴더열기"버튼이 되었습니다
뭔가 그럴싸해보이지만 아직 이버튼은 아무기능도 하지않는. 죽어있는 버튼입니다
이 버튼으로 스타크래프트 맵을 열기위해 코딩을 해줘야할 시간입니다
버튼에대고 더블클릭을 해주세요.
 
 
다음과같은 코딩창이 나타날것입니다. 실질적인 프로그래밍이 들어갈 차례지요
하단의
private void BtnMaps_Click(object sender, EventArgs e)
        {

        }
이부분이 지금 생성한 버튼에대한 이벤트의 영역입니다
private void란 리턴값이 없는 함수..정도로만 이해하시면 됩니다
BtnMap_Click이란 말그대로 이 버튼을 클릭했을때..라는뜻이겠죠?
 
하지만 잠시 버튼에대한 이벤트를 작성하기 이전에.. 필요한 작업이 있습니다
상단의 using 이라고 쭉 나열된 구문에 다음을 추가해줍니다
using System.IO;
using System.Diagnostics;
using System.Threading;
using Microsoft.Win32;

코딩시 함수를 사용할때 필요한 구문입니다. 사전작업이라고 보시면 됩니다
 
이제 버튼이 눌렸을때에대한 이벤트를 작성해보겠습니다
private void BtnMaps_Click(object sender, EventArgs e)
        {

        #프로그래밍이 들어갈자리
        }
 
한줄씩 코딩하며 천천히 설명드리겠습니다
 
프로그램은 스타크래프트가 어디있는지 알수없습니다. 즉 경로에대한 정보가 필요하겠지요
경로는 어디에 있는가. 바로 레지스트리에 저장되어있습니다.
우리가 할일을 레지스트리에서 경로정보를 꺼내서. 변수에 담기만 하면 되는겁니다
string key;
key라는 문자형 변수를 만들고
key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
스타크래프트 레지정보에있는 경로정보를 key에 담습니다 Convert.Tostring이라는것은 문자형으로 바꾼다는 뜻입니다
 
private void BtnMaps_Click(object sender, EventArgs e)
        {

        string key;
        key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
        
}
 
이런식으로 되셨을겁니다. 이제 버튼을 누르면 key라는 변수에 경로정보를 삽입하는 과정까지 성공입니다
key라는 변수의 정보를 확인해보면 제경우에는 D:Program filesStarcraft 라고 나옵니다
여기에 맵폴더의 경로를 추가로 더해주면 됩니다.
string maps;
변수를 새로하나 만들고
maps = key + @"mapsdownload";
합쳐줬으니 maps = D:Program filesStarcraftmapsdownload 가 되었겠죠
 
이제 경로에대한 문제는 해결했고 다음은 막혀있는 D드라이브의 폴더를 어떻게 여느냐..
여기서는 도스명령어를 이용하면 됩니다. 익숙한 subst명령어가 있지요
 
Process.Start("subst", @"Z: /d");
기존에 z:가 있을지도 모르는 경우를 대비해서 없애줍니다
Thread.Sleep(100);
100밀리초의 마진을 두시구요
Process.Start("subst", @"Z: " + " " + '"'+maps+'"');
맵폴더의 경로를 z:에 할당합니다
Thread.Sleep(100);
Process.Start("explorer", "z:");
z:를 엽니다
 
버튼에대한 이벤트 코딩을 정리해봤습니다.
private void BtnMaps_Click(object sender, EventArgs e)
        {
            string key;
            string maps;
            key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
            maps = key + @"mapsdownload";
            Process.Start("subst", @"Z: /d");
            Thread.Sleep(100);
            Process.Start("subst", @"Z: " + " " + '"' + maps + '"');
            Thread.Sleep(100);
            Process.Start("explorer", "z:");
        }

 
여기까지 되셨다면 F5를 눌러서 테스트를 한번 해봅시다 성공하셨나요?
리플레이폴더도 버튼을 새로만들어서 경로를 바꿔주기만 하면되니 간단하실겁니다
어째서 ""앞에 자꾸 @를 붙이는지 의아하신분도 있으실겁니다 @"문자열" 이건 버바팀방식이라는 따옴표안에있는
문자열을 있는그대로 표시하고싶을때 쓰는 방식입니다 자바스크립트처럼 문자열안에있는 ""나 띄어쓰기등도
인식의 문제가 발생하기때문에 문자열을쓸때는 @"" 요런식으로 해주시면 됩니다
 
다음은 드디어 게임을 실행해볼 차례입니다
디자인 화면으로 돌아와서 버튼을 복사후. 다음과같이 Name과 Text를 설정해주시구요
Name = BtnStart
Text = 게임실행 


 
게임실행을 위해 필요한 준비물은 데몬과 스타크래프트의 CD 이미지 파일입니다
여기서부터는 미리 코딩을 쭉 보여드리고 시작해보겠습니다
private void BtnStart_Click(object sender, EventArgs e)
        {

            string key; 
key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
  string deamonKey = @"C:Program FilesDAEMON Tools litedaemon.exe";
            string StarImageKey = @"D:이미지BroodWar.ccd";
            Process.Start(deamonKey, @"-safedisc off");
            Thread.Sleep(100);
            Process.Start(deamonKey, @"-mount 0, "+'"'+StarImageKey+'"');
            Thread.Sleep(4000);
            Process.Start(
key+@"StarCraft.exe");
            this.Close();
            this.Dispose();

}
 
하나씩 설명드리면
string key; 
key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
맵폴더열기와 마찬가지로 경로정보가 필요하므로 레지스트리에서 읽어옵니다
string deamonKey = @"C:Program FilesDAEMON Tools litedaemon.exe";
데몬의 경로를 저장하고. 이번에는 간단하게 절대경로로 써봤습니다
string StarImageKey = @"D:이미지BroodWar.ccd";
스타 이미지의 경로를 저장합니다.
 
Process.Start(deamonKey, @"-safedisc off");
            Thread.Sleep(100);
            Process.Start(deamonKey, @"-mount 0, "+'"'+StarImageKey+'"');
            Thread.Sleep(5000);

데몬을 실행시켜서 이미지를 마운트하고 5초를 기다리라는 구문
 
 Process.Start(key+@"StarCraft.exe");
            this.Close();
            this.Dispose();

프로그램을 실행하고 this(본프로그램)을 닫습니다
 
이번에는 절대경로를 썼다는점이 다른데, 사실 스타의 경로같은 부분도
key = @d:starcraft"; 같은 형식으로 절대경로를 써도 됩니다만 굳이 레지방식을 취한 이유는
다른시스템에서도 사용이 가능한 형식을 알려드리고 싶었습니다 스타가 C에있건 D에있건 새폴더에 들어있건 상관없이 말이죠..
따로 ini파일을 생성해서 경로를 담는 방식도 있겠지만
레지스트리란 편리한 저장소를 이용해주는것이 더 좋겠지요 ^^
 
key 라는 변수도 방금과같은 방식으로 매번 레지에서 읽어오는것보다는.
프로그램이 시작할때 전역변수에 미리 담아두시는것이 한결 코딩이 깔끔해지실겁니다
그 부분을 수정해서. 전체 코딩을 올려드리겠습니다
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;
using Microsoft.Win32;

namespace WindowsApplication2
{
    public partial class FrmLauncher : Form
    {
        string key;
        string maps;

        public FrmLauncher()
        {
            InitializeComponent();
        }

        private void FrmLauncher_Load(object sender, EventArgs e)
        {
            key = Convert.ToString(Registry.GetValue(@"HKEY_LOCAL_MACHINESOFTWAREBlizzard EntertainmentStarcraft", "InstallPath", ""));
        }

        private void BtnMaps_Click(object sender, EventArgs e)
        {
            maps = key + @"mapsdownload";
            Process.Start("subst", @"Z: /d");
            Thread.Sleep(100);
            Process.Start("subst", @"Z: " + " " + '"' + maps + '"');
            Thread.Sleep(100);
            Process.Start("explorer", "z:");
        }

        private void BtnStart_Click(object sender, EventArgs e)
        {
            string deamonKey = @"C:Program FilesDAEMON Tools litedaemon.exe";
            string StarImageKey = @"D:이미지BroodWar.ccd";
            Process.Start(deamonKey, @"-safedisc off");
            Thread.Sleep(100);
            Process.Start(deamonKey, @"-mount 0, " + '"' + StarImageKey + '"');
            Thread.Sleep(4000);
            Process.Start(key + @"StarCraft.exe");
            this.Close();
            this.Dispose();
        }
    }
}

 
채 60줄이 안되는 코딩으로 멋진 프로그램이 탄생했습니다.
이제 남은일은 파일을 빌드해서 사용하는 일이겠죠? 상단의 빌드-> 솔루션 빌드하시면
기본경로인 내문서 -> Visual C# 2005-> Project -> 프로그램이름 -> bin -> Release에 실행파일이 생성될것입니다
 
 
처음엔 조악하지만 C#강점인 GUI환경이면 간단한 포토샵만으로도 꽤 멋지게 꾸밀수있습니다
아래는 제가 만든 예제입니다 별도의 프로그램으로 레지스트리에 경로를 저장해서 사용하는 방식이구요
다른부분은 본문의 방식과 비슷합니다
 
 
 
일부러 소스코드를 첨부하지않은것은 본문에 써놓은것을 하나하나 타이핑해가면서 익히시는것이 더 좋다고 생각되어서입니다
더 자세한 부분은 데브피아를 참조하시면 될듯합니다
그럼 오늘도 열공하시고 좋은하루되세요~


'computer' 카테고리의 다른 글

마이크로프로세서(Micro processor)  (0) 2011.01.01
RISC와 CISC  (0) 2010.12.21
1의 보수, 2의 보수  (0) 2010.06.11
DDoS란?  (0) 2009.07.08