Как сделать так, чтобы изображение перемещалось и вращалось внутри группы? - PullRequest
0 голосов
/ 23 апреля 2019

В настоящее время я работаю над игрой сверху вниз, созданной в форме Windows. В игре ваш персонаж вращается вслед за мышью, и вы можете сделать выстрел из своего персонажа в направлении мыши. Чтобы создать несколько областей в игре, я решил использовать групповые блоки как отдельные области в игре, которые можно переключать между кнопками, но я столкнулся с проблемой. Я больше не могу вращать или перемещать своего персонажа или даже стрелять в групповые ящики.

Я попытался установить точки останова и обнаружил, что методы keyup, keydown и mousemove не вызываются, но я не знаю почему. По какой-то причине я получаю ошибку, когда освобождаю место в методе btnSave_Click, который я отметил в коде.

статическое изображение originalImage; bool pRight, pLeft, pUp, pDown;

    string[] Saves;
    Save[] RSaves = new Save[4];
    Save yoursave;
    Save temp;
    int slot;

    NewGame newgame;
    SavedGames savedgames;

    string savedata, name = "";
    int lvl = 1;
    double exp = 0, money = 0;

    int pSpeed = 5;
    double deltaY, deltaX;
    float interval = 7;
    Point start;
    Point nextStart;
    Point cursor;
    float radian;
    const double Rad2Grad = (180 / Math.PI);


    public MainGame()
    {
        InitializeComponent();
        pbPlayer.BringToFront();

        gbxTown.AllowDrop = true;
        gbxQ1.AllowDrop = true;
        pbShot.Location = pbPlayer.Location;
       // newgame = new NewGame();
       // savedgames = new SavedGames();
        originalImage = pbPlayer.Image;
    }

    public void setSaves(string savedata, int slot)
    {
        Saves = savedata.Split('#');
        string a1 = Saves[0];
        string a2 = Saves[1];
        string a3 = Saves[2];
        string a4 = Saves[3];

        RSaves[0] = temp.StringToSaves(temp, a1);
        RSaves[1] = temp.StringToSaves(temp, a2);
        RSaves[2] = temp.StringToSaves(temp, a3);
        RSaves[3] = temp.StringToSaves(temp, a4);

        yoursave = RSaves[slot - 1];
        name = yoursave.getName();
        this.slot = slot;

        Controls.Add(pbPlayer);
        Controls.Add(pbShot);
    }

    private void MainGame_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.A)
        {
            pRight = false;
            pLeft = true;
        }

        else if (e.KeyData == Keys.D)
        {
            pRight = true;
            pLeft = false;
        }

        else if (e.KeyData == Keys.S)
        {
            pUp = true;
            pDown = false;
        }

        else if (e.KeyData == Keys.W)
        {
            pUp = false;
            pDown = true;
        }

        if (e.KeyData == Keys.Space)
        {
            start = pbPlayer.Location;
            cursor = Cursor.Position;
            nextStart = start;

            deltaY = cursor.Y - start.Y;
            deltaX = cursor.X - start.X;

            double test = Angle(start, cursor);

            radian = (float)(Angle(start, cursor) - 175);

            timer2.Enabled = true;
        }

    }

    private void MainGame_KeyUp_1(object sender, KeyEventArgs e)
    {
        if (e.KeyData == Keys.A)
        {
            pLeft = false;
        }

        else if (e.KeyData == Keys.D)
        {
            pRight = false;
        }

        else if (e.KeyData == Keys.S)
        {
            pUp = false;
        }

        else if (e.KeyData == Keys.W)
        {
            pDown = false;
        }

        if (e.KeyData == Keys.Space)
        {
            timer2.Stop();
            pbShot.Location = start;
        }

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        MovePlayer();
        //checkCollision();
    }

    private void btnNextArea_Click(object sender, EventArgs e)
    {
        pbPlayer.Parent = gbxQ1;
        pbShot.Parent = gbxQ1;
        gbxQ1.Location = new Point(0, 0);
        gbxTown.Location = new Point(605, 0);
        pbPlayer.Location = new Point(100, 200);
        pbShot.Location = pbPlayer.Location;
    }

    private void btnSave_Click(object sender, EventArgs e)
    {
        newgame = new NewGame();
        savedgames = new SavedGames();

        RSaves[slot - 1] = new Save(name, money, lvl, exp);

        for (int i = 0; i < 4; i++) //When the Spacebar is released, a System.IndexOutOfRangeException error happens for i.
        {
            Saves[i] = RSaves[i].SavesToString();
        }

        savedata = Saves[0] + Saves[1] + Saves[2] + Saves[3];


        System.IO.File.WriteAllLines(@"saves.txt", Saves);
        newgame.setSaves(savedata);
        savedgames.setSaves(savedata);
    }

    private void btnBack_Click(object sender, EventArgs e)
    {
        pbPlayer.Parent = gbxTown;
        pbShot.Parent = gbxTown;
        gbxTown.Location = new Point(0, 0);
        gbxQ1.Location = new Point(605, 0);
        pbPlayer.Location = new Point(100, 200);
        pbShot.Location = pbPlayer.Location;
    }

    private void MainGame_MouseMove_1(object sender, MouseEventArgs e)
    {
        var y2 = e.Y;
        var y1 = (this.pbPlayer.Location.Y + (this.pbPlayer.Height / 2));
        var x2 = e.X;
        var x1 = (this.pbPlayer.Location.X + (this.pbPlayer.Width / 2));

        var angle = (float)Math.Atan2((y1 - y2), (x1 - x2));

        pbPlayer.Image = RotateImage(originalImage, (angle * 57));
    }

    private double Angle(Point start, Point end)
    {
        return (float)Math.Atan2(end.Y - start.Y, end.X - start.X) * 57;
    }


    private void timer2_Tick_1(object sender, EventArgs e)
    {
        nextStart.X -= Convert.ToInt16(interval * ((float)Math.Cos(radian / Rad2Grad)));
        nextStart.Y -= Convert.ToInt16(interval * ((float)Math.Sin(radian / Rad2Grad)));

        pbShot.Location = nextStart;
    }


    public static Image RotateImage(Image img, float rotationAngle)
    {
        Bitmap bmp = new Bitmap(img.Width, img.Height);
        Graphics gfx = Graphics.FromImage(bmp);

        gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);
        gfx.RotateTransform(rotationAngle);
        gfx.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2);
        gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
        gfx.DrawImage(img, new Point(0, 0));
        gfx.Dispose();

        return bmp;
    }

    private void MovePlayer()
    {
        if (pRight == true && pbPlayer.Left < 900)
        {
            pbPlayer.Left += pSpeed;
        }

        else if (pLeft == true && pbPlayer.Left > 0)
        {
            pbPlayer.Left -= pSpeed;
        }

        else if (pUp == true && pbPlayer.Top < 600)
        {
            pbPlayer.Top += pSpeed;
        }

        else if (pDown == true && pbPlayer.Top > 0)
        {
            pbPlayer.Top -= pSpeed;
        }
    }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...