获取球的速度,通过在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;
}
if (running) {
code ...
returns from the method.
}
似乎是停止球的触发器。所以你的
ball.speedX = speed;
在球停止时设置,而不是在球启动时设置。只需将ball.speedX = speed
移到 if 语句下方,您应该没问题。该部分在动画开始时运行。
@Sievajets评论是有效的。您很有可能开始两个工人操纵同一个球对象。