2015-06-13 1 views
0

Так что я возился, получая повсюду вещи, и я делаю движение коробки с картинками, которое я сделал. Однако может ли кто-нибудь показать мне, как сделать движение более свободным, но не замедлить его?More Fluent Image Movement

Код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace meh 
{ 
    public partial class Form1 : Form 
    { 
     PictureBox Test = new PictureBox(); 
     public Form1() 
     { 
      InitializeComponent(); 
      FormBorderStyle = FormBorderStyle.None; 
      WindowState = FormWindowState.Maximized; 


      Test.Image = Properties.Resources.PlatinumGrass; 
      Test.Location = new Point(0, 0); 
      Test.Width = 32; 
      Test.Height = 32; 
      this.Controls.Add(Test); 
      KeyDown += new KeyEventHandler(Form1_KeyDown); 


     } 

     private void Form1_KeyDown(object sender, KeyEventArgs e) 
     { 
      int x = Test.Location.X; 
      int y = Test.Location.Y; 
      int xmax = Screen.PrimaryScreen.Bounds.Width - 32; 
      int ymax = Screen.PrimaryScreen.Bounds.Height - 32; 
      if (e.KeyCode == Keys.Right && x < xmax) x += 20; 
      if (e.KeyCode == Keys.Left && x > 0) x -= 20; 
      if (e.KeyCode == Keys.Up && y > 0) y -= 20; 
      if (e.KeyCode == Keys.Down && y < ymax) y += 20; 

      Test.Location = new Point(x, y); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 
+0

Он может двигаться только так быстро, как ваша клавиатура повторяет ключ, когда вы держите его. Что является системной настройкой и нерегулярной, пауза после 1-го числа длиннее паузы на последующих. Вместо этого вы хотите использовать KeyDown/Up для установки переменной, указывающей, каким образом изображение должно перемещаться. И используйте таймер 31 мс, чтобы заставить его двигаться. Такой таймер представляет собой полуприличную эмуляцию «игрового цикла». Google «окна формирует игровой цикл» для хитов. –

+0

Извините, что я совершенно новый, как я могу использовать KeyDown/Up с кодом, который у меня есть сейчас? @HansPassant – UltimateAlloy

ответ

0

Я предлагаю не использовать WinForms для разработки игр

, но вы можете добавить эти строки, чтобы сформировать конструктор, чтобы сделать некоторые улучшения.

SetStyle(ControlStyles.ResizeRedraw, true); 
SetStyle(ControlStyles.UserPaint, true); 
SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

также вы можете добавить цикл для перемещения части, чтобы улучшить его немного

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int xmax = Screen.PrimaryScreen.Bounds.Width - 32; 
    int ymax = Screen.PrimaryScreen.Bounds.Height - 32; 

    for (int i = 0; i < 10; i++) 
    { 
     int x = Test.Location.X; 
     int y = Test.Location.Y; 
     if (e.KeyCode == Keys.Right && x < xmax) x += 2; 
     if (e.KeyCode == Keys.Left && x > 0) x -= 2; 
     if (e.KeyCode == Keys.Up && y > 0) y -= 2; 
     if (e.KeyCode == Keys.Down && y < ymax) y += 2; 
     Test.Location = new Point(x, y); 
     Application.DoEvents(); 
    } 
} 
+1

Вместо Application.DoEvents(); таймер был бы лучше .. – TaW