获取球的速度,通过在Visual Studio C#中单击按钮直接从文本框中的输入更改

本文关键字:按钮 输入 单击 文本 速度 Studio Visual 获取 | 更新日期: 2023-09-27 18:37:13

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

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

弹跳.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();
    }

球.cs(组件类):

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;
    }

获取球的速度,通过在Visual Studio C#中单击按钮直接从文本框中的输入更改

if (running) {
   code  ...
   returns from the method. 
}

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

ball.speedX = speed;

在球停止时设置,而不是在球启动时设置。只需将ball.speedX = speed移到 if 语句下方,您应该没问题。该部分在动画开始时运行。

@Sievajets评论是有效的。您很有可能开始两个工人操纵同一个球对象。