1

私は信じられないほどC#に慣れていないので、ゲームをプレイしている友人を助けるために小さなアプリを構築しようとしています. これは言語を学ぶための良いプロジェクトだと思いました。

プレイヤーが MWO 用にメカを設定できるようにするフォームを作成していますが、うまくいっていますが、コードがどんどん乱雑になり、すべてが 1 つのファイルにまとめられています。私がやりたいことは、変数を独自の .cs ファイルに分割し、さまざまなメカも独自のファイルに分割することです。

私が実行している問題は、変数を独自のファイル内の新しいクラスに移動すると、クラスとすべての変数をパブリックに設定しても、残りのコードが変数を認識できなくなることです。何が間違っているのかわからないし、忘れているのはかなり単純なことだと確信していますが、一生の間、自分が間違っていることを理解することはできません.

public static class MechCommon_Fields
{
    public const int NUMBER_OF_EQUIPABLE_SECTIONS = 6;
    public const int NUMBER_OF_CRITICAL_SECTIONS = 8;
    public const int NUMBER_OF_SECTIONS = 11;
    public const int UNKNOWN_LOCATION = -1;
    public const int RIGHT_ARM = 0;
    public const int LEFT_ARM = 1;
    public const int RIGHT_TORSO = 2;
    public const int LEFT_TORSO = 3;
    public const int CENTER_TORSO = 4;
    public const int HEAD = 5;
    public const int RIGHT_LEG = 6;
    public const int LEFT_LEG = 7;
    public const int RIGHT_REAR_TORSO = 8;
    public const int LEFT_REAR_TORSO = 9;
    public const int CENTER_REAR_TORSO = 10;
    public const int BOTH_SIDE_TORSOS = 11;
    public const int BOTH_ARMS = 12;
    public const int NUMBER_OF_HARDPOINT_TYPES = 4;
    public const int BALLISTIC = 0;
    public const int ENERGY = 1;
    public const int MISSILE = 2;
    public const int AMS = 3;
    public const int OMNI = 4;
    public const int AMMO = 3;
    public const int OTHER = 4;
    public const int SELECTED = 5;
    public const double SRM_DAMAGE = 2.5;
    public const double LRM_DAMAGE = 1.8;
    public const double SRM_RECYCLE = 3.5;
    public const double LRM_RECYCLE = 3.25;
    public const double SRM_DELAY = 0.25;
    public const double LRM_DELAY = 0.5;
    public const double LRM_IMPULSE = 0.8;
    public const int SRM_RANGE = 270;
    public const int MRM_RANGE = 450;
    public const int LRM_MIN_RANGE = 180;
    public const int ENHANCED_LRM_MIN_RANGE = 90;
    public const int LRM_RANGE = 630;
    public const int LRM_MAX_RANGE = 1000;
    public const int EXTENDED_LRM_MIN_RANGE = 300;
    public const int EXTENDED_LRM_RANGE = 1140;
    public const int EXTENDED_LRM_MAX_RANGE = 1140;
    public const int SRM_SPEED = 300;
    public const int STREAK_SRM_SPEED = 200;
    public const int LRM_SPEED = 100;
    public const int ARTEMIS_IV_CRITICALS = 1;
    public const int ARTEMIS_IV_COST = 1;
    public const double ARTEMIS_IV_TONNAGE = 1.0;
    public const int LASER_RANGE_MODIFIER = 2;
    public const int PROJECTILE_RANGE_MODIFIER = 3;
    public const int INTERNALS = 0;
    public const int ARMOR = 1;
    public const int INTERNALS_TOTAL = 8;
    public const int ARMOR_TOTAL = 8;
    public const int NUMBER_OF_MAIN_SECTION = 6;
    public const int NUMBER_OF_LESSER_SECTION = 3;
    public const int NUMBER_OF_MAIN_SECTION_CRITICALS = 12;
    public const int NUMBER_OF_LESSER_SECTION_CRITICALS = 6;
    public const int BALLISTIC_MAX_RANGE_MODIFIER = 3;
    public const int ENERGY_MAX_RANGE_MODIFIER = 2;
    public const int LOWER_ARM_ACTUATOR = 0;
    public const int HAND_ACTUATOR = 1;
    public const int UNKNOWN_ITEM_TYPE = 0;
    public const int COMPONENT_ITEM_TYPE = 1;
    public const int WEAPON_ITEM_TYPE = 2;
    public const int AMMO_ITEM_TYPE = 3;
    public const int EQUIPMENT_ITEM_TYPE = 4;
    public const int HEAT_SINK_ITEM_TYPE = 5;
    public const int JUMP_JET_ITEM_TYPE = 6;
    public const int ARMOR_ITEM_TYPE = 7;
    public const int INTERNAL_ITEM_TYPE = 8;
    public const int CASE_ITEM_TYPE = 9;
    public const int ENGINE_ITEM_TYPE = 10;
    public const int OTHER_ITEM_TYPE = 11;
    public const int TORSO = 0;
    public const int ARM = 1;
    public const int NUMBER_OF_MOVING_SECTIONS = 2;
    public const int YAW = 0;
    public const int PITCH = 1;
    public const int AXIS_OF_MOVEMENT = 2;
    public const double DOUBLE_HEAT_SINK_DISSIPATION = 1.4;
}

}

私は次のように変数を呼び出してみました: NUMBER_OF_EQUIPABLE_SECTIONS = 10;

と:

MechCommon_Fields.NUMBER_OF_EQUIPABLE_SECTIONS = 10;

どちらも機能せず、私はひどく困惑しています。

あなたが私に与えることができる洞察をありがとう。

わかりました、これは私が抱えている問題のより良い、より最新の例です。

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MechLab
{
    public class Mechs
    {
        public int enginePower;
        public int tonnage;
        public double maxEngineRating;
        public int stockEngineRating;
        public string weightClass;
        public double maxSpeed;

        public string mechChassis;
        public string mechVariant;
        public double speed;
        public long basecost;

        public int ballisticHP;
        public int missileHP;
        public int energyHP;
        public int amsHP;
        public int omniHP;

        public int armorHead;
        public int armorCT;
        public int armorRT;
        public int armorLT;
        public int armorRCT;
        public int armorRRT;
        public int armorRLT;
        public int armorRA;
        public int armorLA;
        public int armorRL;
        public int armorLL;
        public int totalArmor;
    }
}

ここで、別のファイルに、これらの変数の一部を参照してフォームに表示するメソッドがあります。

public void loadMech()
        {
            maxSpeed = ((stockEngineRating / tonnage) * 16.2);

            txtMechChassis.Text = mechChassis;
            txtMechVariant.Text = mechVariant;
            txtSpeed.Text = maxSpeed.ToString();
            txtTonnage.Text = tonnage.ToString();


        }

すべての変数に対して「現在のコンテキストには存在しません」というエラーが表示されます。

4

5 に答える 5

1

Mech_CommonFields使用しようとしているクラスとは異なる名前空間で定義されている場合はusing、ファイルの先頭にディレクティブを追加する必要があり.csます。

using MyProject.Namespace; // replace with your namespace
于 2013-03-28T05:26:26.017 に答える
1

部分クラスを使用できます。詳細はこちら

部分クラスを使用すると、別のファイルで定義されていても、変数、定数などを通常どおり使用できます。

于 2013-03-28T05:21:33.757 に答える
1

あなたが投稿したクラス ( Mech_CommonFields) が、タイプに関係なく、特定のメカのすべてのコンポーネントを定義するように設計されており、実際の値がタイプ間で変化する可能性がある場合、次のように自動プロパティを使用します。

public class Mech_CommonFields
{

    public int NumberOfEquipableSections { get; set; }
    public int NumberOfSections { get; set; }
    public int UnknownLocation { get; set; }
    public int RightArm { get; set; }
    public int LeftArm { get; set; }
    public int RightTorso { get; set; }
    public int LeftTorso { get; set; }
    public int CenterTorso { get; set; }
    // etc.
}

次に、次のような特定のタイプの属性を持つ新しい mech を作成できます。

Mech_CommonFields myMech = new Mech_CommonFields() { 
                               NumberOfEquipableSections = 6,
                               NumberOfSections = 11,
                               UnknownLocation = -1 };

自動プロパティ (上で示したように) を使用すると、オブジェクトをインスタンス化するときに必要なプロパティに値を割り当てるだけで、インスタンス化するときに必要な値でクラスを初期化できます (2 番目のコード例のように)。これには、IntelliSense とうまく連携するという追加の利点があります。中括弧内にいるときに使用するプロパティのリストがポップアップ表示され、そのインスタンスでまだ使用していないもののみが表示されます)。

定数は変更できないため、実行時にフィールドに値を割り当てる必要がある場合は、使用constしても意味がありません。

同様に、静的ではプログラムの実行中にいつでも値を変更できますが、それらを参照するすべてのオブジェクトの値が変更されます。つまり、3 つの mech があり、そのうちの 1 つで NUMBER_OF_EQUIPABLE_SECTIONS の値を 12 に設定すると、それらすべてで 12 に設定されます (フィールド/プロパティが静的としてマークされている場合)。

繰り返しになりますが、クラスをどのように使用しているか、プログラムの残りの部分がどのように見えるかを正確に把握していないため、適切な答えを出すのは難しいですが、これで正しい方向に進むことができれば幸いです。

詳細については、次のリンクを参照してください。

自動実装プロパティ

方法: オブジェクト初期化子を使用してオブジェクトを初期化する

定数

静的

于 2013-03-28T05:45:16.820 に答える
0

各変数の前に static を置くことができます。

このような種類:

public static int AMMO = 3;

これは問題の解決に役立ちます。

于 2013-03-28T05:27:13.520 に答える
0

定数に値を代入することはできません:

MechCommon_Fields.NUMBER_OF_EQUIPABLE_SECTIONS = 10;
于 2013-03-28T05:34:41.973 に答える