2012-04-14 2 views
0

Visual Studio에서 C# 기반의 비교적 기초적인 텍스트 기반 RPG를 만들려고합니다. 나는 클래스의 메소드를 클릭하여 폼에 대한 버튼 클릭에 반응하도록 끊임없이 노력했다. 클릭 한 버튼을 기반으로 한 방법에서 다른 방법으로 이동하는 것과 같습니다.외부 메서드에서 button click 이벤트 내부?

프로그램의 기본 레이아웃을 알려 드리겠습니다.

저는 frmMain과 cls_EVENTS가 있습니다. 그것은 더 복잡해질 것입니다. 그러나 일단 실제로 작동하게되면 시간이 지납니다.

나는 플레이어가 프로그램과 상호 작용하는 곳으로 frmMain을 원한다. 그것은 텍스트 스크린, 버튼, 상태 표시기, 좋은 재미있는 물건의 대부분을 가지고 있습니다. 텍스트 화면 아래에는 현재 장면/이벤트의 사용 가능한 동작을 반영하기 위해 텍스트를 바꿀 계획 인 6 개의 버튼 (각각 btn1-btn6으로 레이블이 지정됨)이 있습니다 (검사하여 바로 그 사람에게 자신과 자신의 어머니 어젯밤에 저녁을 먹었다.)

주 메뉴를 제어하는 ​​컨트롤은 cls_EVENTS에 있으며 주로 주 메뉴 버튼을 호출하여 플레이어를 기본 메뉴로 되돌 리는 것이 더 편리합니다. frmMain 메서드의 코드).

public partial class frmMain : Form 
{ 
    //creates a static copy of the form that references to this form, I believe. 
    public static frmMain MainForm { get; private set; } 

    public frmMain() 
    { 
     InitializeComponent(); 

     // sets the static form as a copy of this form named MainForm. 
     frmMain.MainForm = this; 

     // calls the MainMenu() method in the cls_EVENTS class. 
     cls_EVENTS.MainMenu(); 
    } 

public void btn1_Click(object sender, EventArgs e) 
{ 
} 

//Same thing all the way down to btn6_Click 
//And a couple of functions for manipulating the controls on the form... 
//(enabling buttons, pushing text to the textbox, etc) 

내 cls_EVENTS는 이벤트를 실제로 코딩하고자하는 곳입니다. 텍스트 상자의 텍스트를 변경하는 MainMenu 이벤트처럼 현재 옵션을 반영하도록 버튼의 텍스트를 변경하고 필요하지 않은 버튼을 비활성화하십시오.

public class cls_EVENTS 
{ 
    /*the Main menu, solely here for 'conveinence' (so I can have a Main Menu button on my form)*/ 
    public static void MainMenu() 
    { 
     //clears the text screen 
     frmMain.MainForm.ScreenTextClear(); 

     //Enables the first button, disables the rest. 
     frmMain.MainForm.ButtonEnable(true, false, false, false, false, false); 

     //indent = true, write text to screen. 
     frmMain.MainForm.ScreenText(true, "Welcome to the alpha of this game."); 

     //test to make sure it ADDS TO the text rather then overwriting. 
     frmMain.MainForm.ScreenText(true, "Hi"); 

     //changes the six button texts to the following six strings 
     frmMain.MainForm.ButtonText("New Game", "Load Game", "About", "---", "---", "---"); 

     //problem area 

     //when player clicks button one 
     //start the NewGame() method 

     //when player clicks button two, after I eventually code such a function. 
     //start the LoadGame() function 

     //etc.  
    } 

    Public void NewGame() 
    { 
     //etc. 
    } 
} 

내가 각 버튼은 한 intSelected은 0으로 (에 다른 번호를 추가 할 변수를 확인하는 데에 절전 방법 루프를 사용하여 시도했다, 계속 루프, 인 btn1 1을 추가 , 등)

그러나 이로 인해 프로그램이 중지되었습니다.

게다가 나는 내가하고 싶은 일을 지저분하고 전문가가 아닌 방법으로 생각합니다. 그리고 제가 전문인이 아니더라도 표준이 있습니다.

버튼을 누를 때까지 프로그램 실행을 일시 중지하는 방법을 아는 사람이 있습니까? 또는 내가하고 싶은 일을하는 방법에 대한 더 좋은 아이디어가 있습니까? 무엇이 버튼이 끊임없이 변화 할 것이므로, 단순히 클릭 이벤트에 함수를 코딩 할 수는 없습니다.

나는 C#이 내가 강점이있는 언어가 아니라고 말하고 싶다. 원래 VB.Net에서이 작업을 수행했지만 같은 문제가 발생하여 C#이 좀 더 유연하다고 믿게되었다. . 내가 모호하게 익숙한 C 언어는 C++뿐입니다. 그리고 그 수업은 적어도 1 년 반이 넘었습니다. 그래서, 내가 ' rusty 인 것처럼'바보 같은 '코딩을 용서해주십시오.

+0

어쩌면 시도해보십시오 :'btn1_Click (this, EventArgs.Empty)' –

+0

보기에 오류가 있습니다. cls_EVENTS 파일에 추가했습니다. 그러나 frmMain.MainForm을 추가합니다. btn1_Click의 시작 부분에서 frmMain.MainForm으로 'this'를 대체하면 오류가 제거됩니다. 하지만 결국에는 세미콜론을 예상했습니다. – Joseph

답변

0

좀 더 실험하고 더 많은 Google 검색을 한 후에 내가 찾은 것 같습니다.

public static void MainMenu() 
{ 
    frmMain.MainForm.ScreenTextClear(); 

    frmMain.MainForm.ButtonEnable(true, false, false, false, false, false); 
    frmMain.MainForm.ScreenText(true, "Welcome to the alpha of this game."); 
    frmMain.MainForm.ScreenText(true, "Hi"); 
    frmMain.MainForm.ButtonText("New Game", "Load Game", "About", "---", "---", "---"); 

    // Potential solution. 
    frmMain.MainForm.btn1.Click += delegate(object sender, EventArgs e) 
     { 
      NewGame(); 
     };  
} 

이것은 내가하고 싶은 것을하고있는 것처럼 보입니다. 텍스트가로드되고 단추가 활성화 된 다음 해당 메서드를 클릭하면 해당 메서드가 시작됩니다. 상승 반복.