2016-12-16 2 views
-1

В настоящее время я делаю базовую инкрементальную игру в C# в WFA. Вот код:Как делиться объявлением целого числа между двумя формами?

namespace Xadrs 
{ 
public partial class Form1 : Form 
{ 


    public void Ref() 
    { 
     label2.Text = Points.ToString(); 
     button2.Text = "Level up! (" + Upgradeprice.ToString() + ")"; 
     label4.Text = Upgrade.ToString(); 
     label6.Text = Upgradeautoclick.ToString(); 
     button4.Text = "Level up PPS! (" + Upgradeautoclickprice.ToString() + ")"; 
    } 
    public int ach_beginner = 0; 
    public int ach_intermediate = 0; 
    public int ach_expert = 0; 
    public int ach_master = 0; 



    int Points = 0; 
    int Upgrade = 1; 
    int Upgradeautoclick = 0 ; 
    int Upgradeautoclickprice = 110; 
    int Upgradeprice = 25; 


    public Form1() 
    { 
     InitializeComponent(); 
     Ref(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (Upgrade == 5) 
     { 
      Points++; 
      Ref(); 
     } 


    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Points += Upgrade; 
     Ref(); 


    } 



    private void button2_Click(object sender, EventArgs e) 
    { 
     if (Points >= Upgradeprice) 
     { 
      Upgrade += 1; 
      Points -= Upgradeprice; 
      Upgradeprice += Upgradeprice/4; 

     } 
     else 
     { 
      MessageBox.Show("Not Enough Nico points..."); 
     } 
     Ref(); 

     if (Upgrade == 5) 
     { 
      MessageBox.Show("Beginner: Reach 5 PPS.\nReward: AutoClick!", "ACHIEVEMENT UNLOCKED!"); 
      ach_beginner = 1; 
      timer1.Enabled = true; 
      Upgradeautoclick = 1; 
      button4.Visible = true; 
      Ref(); 
     } 
    } 

    Form2 achievements = new Form2(); 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Form2.Show();    
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     if (Points >= Upgradeautoclickprice) 
     timer1.Interval = timer1.Interval/2; 
     Points -= Upgradeautoclickprice; 
     Upgradeautoclickprice += Upgradeautoclickprice; 
    } 

и form2 Я хочу иметь:

if (ach_beginner = 1) 
    { 
     //Text in this label = something like: Beginner - Reach 5 Points per click 
     labelwithachievement.Visible = true; 
    } 

но ach_beginner не объявлен в form2. Я хотел бы как-то «соединить» это целое число с объявлением от form1 в form2.

+1

Что вы имеете в виду под «декларацией акций»? –

ответ

1

Все что вам нужно - это параметр. Вы вызываете метод Form2.Show. Как и любой другой метод, метод Form2 может стать параметром. Таким образом, в Form2 вы можете сделать следующее:

public void Show(int ach_beginner) 
{  
    //Do sth. with your int 

    this.Show(); 
} 

Если вы звоните Form2 на Form1 теперь вы можете передать целое число:

private void button3_Click(object sender, EventArgs e) 
{ 
    Form2.Show(ach_beginner);    
} 

Я думаю, что это самый простой подход. Вместо того, чтобы переопределять метод Show, вы также можете создать Свойство. В Form2 объявляю:

public int AchBeginner {get;set;} 

В Form1 вы установите это значение перед вызовом метода Show:

private void button3_Click(object sender, EventArgs e) 
{ 
    Form2.AchBeginner = ach_beginner; 
    Form2.Show();    
} 

Как пояснил Дэвид в комментариях, то значение не будет обновляться на Form2. Если вы хотите, чтобы достичь этого можно использовать интерфейс:

public interface IBeginner 
{ 
    int AchBeginner{get;set;} 
} 

public void Form1 : Form, IBeginner 
{ 
    public int AchBeginner{get;set;} 

    //The place you create Form2 
    Form2.Beginner = this; 
} 

public void Form2 : Form 
{ 
    public IBeginner Beginner{get;set;} 

    //Here you can access 
    int achBeginner = Beginner.AchBeginner: 
} 

UPDATE

Основываясь на комментарий от автора вопроса я думаю, это событие будет наиболее полезным думать. Таким образом, вы можете сказать своему Form2, что ваш персонаж на Form1 достигает уровня 5. Например:

public class LevelEventArgs : EventArgs 
{ 
    public int Level {get;} 

    public LevelEventArgs(int level) 
    { 
     Level = level; 
    } 
} 

//Form1 need to implement an Event which later can notify any subscriber (Form2 in this case) 
public class Form1 : Form 
{ 
    public event EventHandler<LevelEventArgs> LevelUp; 

    //When your character reach new level do following: 
    LevelUp?.Invoke(this, new LevelEventArgs(ach_beginner)); 

    //Show Form2 
    Form2 form = new Form2(this); 
    form.Show(); 
} 

Form2 необходимо подписаться это событие в настоящее время. Для этого нужно положить Form1 в Form2 (или лучше в интерфейс, как описано выше)

public class Form2 : Form 
{ 
    public Form2(Form form1) 
    { 
     //Register Event LevelUp from Form1 
     form1.LevelUp += (args) => 
     { 
      if (args.Level == 5) 
      //Level 5 reached 
     } 
    } 
} 
+0

Это передает значение. Если значение изменяется в 'Form1', оно не будет обновляться в экземпляре' Form2'. – David

+0

@David И почему это проблема в этом контексте? – Servy

+0

@Servy: Я не знаю, так как я не знаю, как это приложение используется, но это может быть проблемой и, безусловно, стоит отметить. – David

1

Не думайте о нем, как делить само целое число, а не думать о нем, как Form2 имеет зависимость от чего-то в Form1 ,

Поскольку переменная в настоящее время общественного (мы вернемся к этому в минуту), в самой простой все, что вам нужно сделать, это предоставить Form2 со ссылкой на экземпляр Form1.Поставьте недвижимость на Form2 и требуют значение в его конструкторе:

private Form1 form1Instance; 

public Form2(Form1 form1) 
{ 
    this.form1Instance = form1; 
} 

Затем, когда вы создаете экземпляр Form2, передать ему ссылку на текущий экземпляр Form1:

Form2 achievements = new Form2(this); 

Тогда в Form2 вы можете обратиться к своей новой переменной-члена, чтобы получить информацию из Form1:

if (this.form1Instance.ach_beginner == 1) 

Замечание относительно общедоступных переменных ... Общепризнано, что наилучшим методом является обнародование объектов публично вместо переменных. Так заменить это:

public int ach_beginner = 0; 

с этим:

public int Ach_Beginner { get; set; } 

и обновлять ссылки на него соответствующим образом. Для этого существует множество причин, но в конечном итоге идея состоит в том, что класс должен скрывать свои ценности и обеспечивать доступ к ним, а не просто предоставлять сами ценности.


Это довольно простое начало идеи предоставления зависимости к объекту, и есть целый ряд мест, где вы можете пойти здесь. Например, если вы не хотите передавать все формы в качестве зависимостей (поскольку они включают в себя значительно больше данных/функциональных возможностей, чем в противном случае требуется для зависимости), вы можете инкапсулировать свои значения в свой собственный объект и пройти около , что объект как зависимость.

Экстраполируя оттуда, вы можете продолжать отделять бизнес-логику от элементов пользовательского интерфейса (например, форм и элементов управления) и начинать перемещать вашу логику в те объекты и компоненты бизнес-логики. Это сделает вашу логику более переносимым на другие платформы пользовательского интерфейса, проще тестировать и т.д.

Например, предположим, что у вас есть класс, такие как:

public class LevelInfo // guessing on an appropriate name here 
{ 
    public int Ach_Beginner { get; set; } 
    public int Ach_Intermediate { get; set; } 
    public int Ach_Expert { get; set; } 
    public int Ach_Master { get; set; } 
} 

Тогда в Form1 использовать этот объект вместо:

private LevelInfo levelInfo = new LevelInfo(); 

// elsewhere... 

levelInfo.Ach_Beginner = 1; 
// etc. 

Form2 Тогда может потребовать ссылку на что объект:

private LevelInfo levelInfo; 

public Form2(LevelInfo level) 
{ 
    this.levelInfo = level; 
} 

и использовать этот объект:

if (this.levelInfo.Ach_Beginner == 1) 

На данный момент LevelInfo является отсоединен от пользовательского интерфейса и может содержать портативную бизнес-логику/информацию.

+0

Ваше решение противоречит вашим собственным объяснениям. Вы заявили, что есть зависимость от этого * одного значения *, и все же вы раскрыли целую форму, полную всех видов поведения, в которых нет никакой зависимости. – Servy

+0

Итак, учитывая, что вы понимаете, что предлагаемое вами решение на самом деле не является хорошим решением, зачем его представлять? Почему бы не предложить * хорошее * решение вместо этого? – Servy

+0

Я думаю, что в этом случае интерфейс был бы лучшим решением. – Sebi

Смежные вопросы