通过在 Visual Studio C# 中单击按钮,直接从 TextBox 中的输入获取球的速度以进行更改

Get speed of the ball to change directley from input in TextBox by buttonclick in Visual Studio C#

我有一个文本框,您可以在其中填写球的速度。但是当你填写这个值时,速度不会有机会,直到你下次点击按钮(第一次点击让它开始,第二次点击它停止所以它实际上是第三次点击我的意思是当它开始时运行再次)。任何人都知道我如何让它在您单击按钮时直接更改?

这是 "game" 的照片:https://www.dropbox.com/s/xr05vh44y0u7zpl/game.jpg?dl=0

Bounce.cs(表单应用程序的代码版本):

        // ball är en ny boll som skapas här genom klassen och filen Ball.cs. 
        // Här anges även vilken bild som bollen skall ha till utseende.
        // Det ställs även in vilken hastighet och position dessa skall utgå ifrån
        ball = new Ball(Image.FromFile("images/basketball.png"));
        panel.Controls.Add(ball);
        ball.Location = new Point(40, 320);
        ball.speedX = 1;
        ball.speedY = 1;
        running = false; // Ser till att bollarna inte rör på sig
        ball.Start();
    }



    // Delegering som skapats när man dubbelklickat på knappen go som skapat i de grafiska
    // Objektet sender är en event sender som skickar delegationen som en metod, vilket gör att knappen vid tryckning kallar deligationen som ger respons på klickningen
    // Detta för att delegationen ska använda rätt metod, Det skapas automatiskt en kod i designläget som ser ut så här: new System.EventHandler(this.goButton_Click);
    private void throwButton_Click(object sender, EventArgs e)
    {
        // Sparar ner värdet som skrevs in för hastigheten
        speed = Convert.ToDouble(speedTextBox.Text);

        // Om running är sant sätts samma positioner och hastigheter för bollarna som utgångsläget i metoden Bounce(), alltså som i startläget
        // och sätter running till false, vilket innebär att bollarna stannar igen.
        // Menat att om man klickar på knappen när bollarna rör sig skall dessa stanna och gå tillbaka till utgångsläget som dem hade i appen från start
        if (running == true)
        {
            ball.Location = new Point(40, 320);
            ball.speedX = speed;
            ball.speedY = 1;
            running = false;
            speedTextBox.Clear();
            ball.Start();
            return;


        }

        // Om inte så sätts runnig till true för att representera att bollarna skall röra på sig
        running = true;

        // Följande kodrader gör så att metoden RunMe körs i en separat tråd (Befintlig kommentering)
        // så att det inte påverkar applikationens flöde. (Befintlig kommentering)
        worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(RunMe); // knyt metoden RunMe till worker (Befintlig kommentering)
        worker.RunWorkerAsync(); // starta (Befintlig kommentering)


    }

    // Deligation
    public void RunMe(object sender, DoWorkEventArgs e)
    {
        // Loop som kontrollerar var bollarna befinner sig och vart dem skall hamna i olika beräkningar
        // Den tar bollarna b1 och b2 som skapats med hjälp av klassen Ball och använder sig utav olika metoder från klassen
        // Ser till att bollarna studsar på väggarna och botten av panelen (utrymmet dom är i)
        while (running)
        {
            if (ball.speedY > 0 && ball.Location.Y > panel.Size.Height - ball.Size.Height)
            {
                ball.BounceY();
                ball.posY = panel.Size.Height - ball.Size.Height;
            }
            if (ball.speedX > 0 && ball.Location.X > panel.Size.Width - ball.Size.Width)
            {
                ball.BounceX();
            }
            if (ball.speedX < 0 && ball.Location.X < 0)
            {
                ball.BounceX();
            }


            // Ser till att köra deligeringen MoveBallCallback med metoden MoveBall för respektive boll
            this.Invoke(new MoveBallCallback(MoveBall), ball);
            Thread.Sleep(10);
        }

    }

    // Metod för att få bollarna att röra på sig, refererar till klassen Ball med parametern b 
    // och till metoden MoveBall i den klassen
    void MoveBall(Ball b)
    {
        b.MoveBall();
    }

Ball.cs(组件 class):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Bounce
{
class Ball : Label
{
    // Variabler
    public static double gravity = 0;
    public static int collissions = 0;
    public double speedX, speedY;
    public double posX, posY;

    // Konstruerare som ritar upp bollarna genom att använda Image från System.Drawing.Image klass
    public Ball(Image image)
    {
        Image = image;
        BackColor = Color.Transparent; // Sätter bakgrundsfärgen till genomskinlig på kontrollen
        Size = new Size(60, 60); // Sätter storleken på kontrollen
        Visible = true; // Ser till att bollarna syns
    }

    // Metod som får bollen att röra på sig
    public void MoveBall()
    {
        // Lägger till graviteten på hastigheten av Y-vinkeln och lägger på hastigheterna på respektive position
        speedY += gravity;
        posX += speedX;
        posY += speedY;
        Location = new Point((int)(posX), (int)(posY)); // Sätter den nya platsen för bollen till de nya positionerna
    }

    // Metoderna BounceY() och BounceX() ser till att inte ändra graviteten och farten medan dem studsar genom att ta bort de som lades till i metoden MoveBall()
    public void BounceY()
    {
        speedY = -(speedY + gravity); // dont add gravity when bouncing
    }
    public void BounceX()
    {
        speedX = -speedX;
    }

    // Metod som lägger till nuvarande position till variablerna för positionerna (för posX respektive posY)
    public void Start()
    {
        posX = Location.X;
        posY = Location.Y;
    }

if (running) {
   code  ...

   returns from the method. 
}

似乎是停止球的触发器。所以你的

ball.speedX = speed;

在球停止时设置,而不是在它开始时设置。只需将 ball.speedX = speed 移到 if 语句下方,就可以了。该部分在动画开始时运行。

@Sievajets 评论有效。您很有可能启动两个工人来操纵同一个球对象。