我发现这个小应用程序,我一直在玩这个过去一段时间。我想知道,如果我想简单地将图像旋转一圈?或者使整个图像上下弹跳,我将如何修改此程序呢?我尝试的所有东西都会拉伸图像 - 即使我确实让它向左或向右移动。关于我能做什么的任何想法?代码如下
public partial class Form1 : Form
{
private int width = 15;
private int height = 15;
Image pic = Image.FromFile("402.png");
private Button abort = new Button();
Thread t;
public Form1()
{
abort.Text = "Abort";
abort.Location = new Point(190, 230);
abort.Click += new EventHandler(Abort_Click);
Controls.Add(abort);
SetStyle(ControlStyles.DoubleBuffer| ControlStyles.AllPaintingInWmPaint| ControlStyles.UserPaint, true);
t = new Thread(new ThreadStart(Run));
t.Start();
}
protected void Abort_Click(object sender, EventArgs e)
{
t.Abort();
}
protected override void OnPaint( PaintEventArgs e )
{
Graphics g = e.Graphics;
g.DrawImage(pic, 10, 10, width, height);
base.OnPaint(e);
}
public void Run()
{
while (true)
{
for(int i = 0; i < 200; i++)
{
width += 5;
Invalidate();
Thread.Sleep(30);
}
}
}
}
答案 0 :(得分:1)
所以我不知道你想要实现什么,但是为了让筹款不受影响,WinForms是一个GDI +库,它更多的是用于GUI的东西,所以像动画这样的东西可能会更好地处理像SFML这样的图形库。
无论如何,有一百万种方法可以达到你想要的效果。在围绕一个圆圈移动的东西方面,你需要一点点简单的触发。对于弹跳动作,我会说遵循正弦曲线是最简单的方法。
这是一些用于弹跳的伪代码(不确定这是否是语法完美的):
字段定义:
private double frame = 0;
的OnPaint:
Graphics g = e.Graphics;
g.DrawImage(pic, 10, 10 + Math.sin(frame)*10, width, height);
frame+=.01;
base.OnPaint(e);
这样,每次触发绘制事件时,t都会增加.01弧度。罪有一个在-1和1之间振荡的域,你可以乘以10倍来获得这种弹跳效果。
Frame代表您的“关键帧”。如果您想加快速度,请将frame+=__
增加到更高的值。如果要增加范围,请更改偏移量Math.sin(frame)*__