怎么在C# Timer中监视输入 Key_down

jimson_ma 2010-04-16 05:39:54
最近写了个程序是关于图像移动的。 就是让图像每秒移动一下, 通过键盘改变方向值。是通过重载Onpaint实现描绘的。

但设置了timer 但是触发不了 Key_down方法 郁闷阿。那位朋友可以帮忙看下,或给个例子。可以直接发我邮箱20045912@163.com

下面是关于timer的方法。

System.Timers.Timer tt = new System.Timers.Timer(1000);

private void btnStart_Click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();

//new Thread().Start();

}

public void bw_DoWork(object sender, DoWorkEventArgs e)
{
tt.Elapsed += new System.Timers.ElapsedEventHandler(timerun);

tt.AutoReset = true;

tt.Enabled = true;
}

public void timerun(object obj, System.Timers.ElapsedEventArgs e)
{
MoveLong();
}
...全文
175 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayarenlcs 2010-04-20
  • 打赏
  • 举报
回复
顶下~~~
shiweijian1986 2010-04-20
  • 打赏
  • 举报
回复
貌似 事件只能服务代码触发
shiweijian1986 2010-04-20
  • 打赏
  • 举报
回复
DLLimport keybd_event 这个winapi函数
hongqun369 2010-04-20
  • 打赏
  • 举报
回复
不知所云~~~
jimson_ma 2010-04-20
  • 打赏
  • 举报
回复
System.Timers.Timer
ystem.Window.Form.Timer 两个我都用过啊。不行的。就是触发不了Key_down事件,所以不能修改方向变量。
yyh673040759 2010-04-17
  • 打赏
  • 举报
回复
如果代码没有问题的话
那么是不是你的时间控件没有启用啊
看一下Timer属性中的状态
hanbaochang 2010-04-16
  • 打赏
  • 举报
回复
System.Timers.Timer
ystem.Window.Form.Timer
有什么区别?
andyhu11 2010-04-16
  • 打赏
  • 举报
回复
路过看看......
hzxsasdfgh 2010-04-16
  • 打赏
  • 举报
回复
最近写了个程序是关于图像移动的。 就是让图像每秒移动一下, 通过键盘改变方向值。是通过重载Onpaint实现描绘的。
不用timer吧!

1:while(true)
{
程序运行ing
}

2:递归
3:或者自己写个委托!
andybang1981 2010-04-16
  • 打赏
  • 举报
回复
在MoveLong(); 方法中有打开TT吗?即TT.START()与TT.STOP(),因为你画图时所用时间一般大于
1秒吧,最好是这样使用,画完一次再开启定时器
zsuswy 2010-04-16
  • 打赏
  • 举报
回复
为什么要在Timer中去做?????????????
ff167 2010-04-16
  • 打赏
  • 举报
回复
你的keydown事件里去控制一个全局变量

然后 MoveLong(); 里去读取这个变量不就可以了。

注意线程安全性。
皇城龙三 2010-04-16
  • 打赏
  • 举报
回复
也就是说不要用System.Timers.Timer,应该用System.Window.Form.Timer
namdamlu 2010-04-16
  • 打赏
  • 举报
回复
学习.....
影子_爱人 2010-04-16
  • 打赏
  • 举报
回复
路过 看看
皇城龙三 2010-04-16
  • 打赏
  • 举报
回复
不能用工具栏->windows窗体->Timer
要用工具栏->组件->Timer
http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx 记得在大学学java时,同学在下载了很多java的视频,看到里面有些是介绍简单游戏开发的,马士兵老师讲的,挺感兴趣的。一起看了看视频写了写程序。现在毕业了,因为工作用的是C#,最近很想拿C#把以前写的坦克大战重写下,来熟悉熟悉C#的基本语法。 程序很简单,跟java代码相比没有多大改动 开发环境 vs2008 实现方法如下 1.在form添加一个panel,在panel的 Paint方法得到Graphics对象 2.通过Graphics对象再panel画出坦克,子弹等相关内容 3.添加timer控件 来控制panel的重画 实现坦克,子弹的运动 4.根据电脑按下的方向键,确定出坦克的方向,panel重画时根据坦克的方向修改坦克的X,Y轴坐标,来实现坦克的移动 5.通过Rectangle的IntersectsWith函数来进行碰撞检测,实现子弹打击坦克 具体实现代码 1.在项目里面添加枚举类型 /// /// 表示方向的的枚举类型 /// public enum Direction { L, U, D, R, STOP } 2.添加子弹类的相关常量,属性 /// /// 子弹X轴的速度,单位PX /// public static int XSPEED = 10; /// /// 子弹Y轴的速度,单位PX /// public static int YSPEED = 10; /// /// 子弹的宽度 /// public static int WIDTH = 10; /// /// 子弹的高度 /// public static int HEIGHT = 10; /// /// 子弹的坐标 /// int x, y; /// /// 子弹的方向 /// Direction dir; /// /// 子弹的存活状态 /// private bool live = true; /// /// TankClient窗体实例 /// private TankClient tankClient; /// /// 敌我双方的标记 /// private bool good; 3.添加draw方法来画出子弹 public void Draw(Graphics g) { if (!live) { tankClient.missiles.Remove(this); return; } //通过画椭圆函数在界面上显示子弹 g.FillEllipse(Brushes.Black, x, y, Missile.WIDTH, Missile.HEIGHT); Move(); } 4.添加子弹打击坦克的方法 public bool HitTank(Tank t) { //用IntersectsWith来检测两个矩形相碰撞 if (GetRectangle().IntersectsWith((t.GetRectangle())) && t.Live && this.live && this.good != t.Good) { t.Live = false; this.live = false; return true; } return false; } 5.添加坦克类相关属性,常量 /// /// 坦克x轴的速度 /// public static int XSPEED = 5; /// /// 坦克y轴的速度 /// public static int YSPEED = 5; /// /// 坦克的宽度 /// public static int WIDTH = 30; /// /// 坦克的高度 /// public static int HEIGHT = 30; /// /// 坦克的坐标 /// private int x, y; /// /// 标记上下左右键是否按下 /// private bool l = false, u = false, r = false, d = false; /// /// 坦克的方向 /// private Direction dir = Direction.STOP; /// /// 坦克炮筒方向 /// private Direction ptDir = Direction.D; /// /// TankClient窗体实例 /// TankClient tankClient; /// /// 标记敌我双方 /// private bool good; /// /// 控制敌人坦克不规则运行时使用 /// private int step = 0; /// /// 标记坦克的存活状态 /// private bool live = true; 6.在tank类实现画坦克方法 public void Draw(Graphics g) { if (!live) { if (!good) { tankClient.tanks.Remove(this); } return; } if (good) { //通过FillEllipse来画坦克 g.FillEllipse(Brushes.Red, x, y, WIDTH, HEIGHT); } else { g.FillEllipse(Brushes.Blue, x, y, WIDTH, HEIGHT); } //根据炮筒坦克来画出坦克的炮筒 switch (ptDir) { case Direction.D: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y + HEIGHT); break; case Direction.U: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y); break; case Direction.L: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x, y + HEIGHT / 2); break; case Direction.R: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH, y + HEIGHT / 2); break; } Move(); } 7.键盘按键处理的相关代码 public void KeyPressed(KeyEventArgs e) { Keys key = e.KeyCode; switch (key) { case Keys.Right: r = true; break; case Keys.Left: l = true; break; case Keys.Up: u = true; break; case Keys.Down: d = true; break; } LocateDirection(); } 8.tank发子弹的方法 public Missile Fire() { if (!live) return null; int x = this.x + WIDTH / 2 - Missile.WIDTH / 2; int y = this.y + HEIGHT / 2 - Missile.HEIGHT / 2; Missile missile = new Missile(x, y, good, ptDir, tankClient); tankClient.missiles.Add(missile); return missile; } 9.主窗体类加入坦克 myTank = new Tank(50, 20, true, this);//放到前面 this不能用 //y轴比java的减少了30 for (int i = 0; i < 15; i++) { //添加10个坦克x轴间距为40px tanks.Add(new Tank(50+40*(i+1),20,false,this)); //y轴比java的减少了30 } 10.主窗体类调用子弹打击坦克的方法 for (int i = 0; i < missiles.Count; i++) { Missile m = missiles[i]; m.HitTank(myTank); m.HitTanks(tanks); m.Draw(g); } 11.主窗体处理按键代码 private void Form1_KeyDown(object sender, KeyEventArgs e) { myTank.KeyPressed(e); } 12.控制重画代码 private void timer1_Tick(object sender, EventArgs e) { //间隔50毫秒控制panel的重画 panel1.Invalidate(); } 13.这是主要代码基本完成,但是游戏会有闪烁问题 可以通过双缓冲来解决,C#解决时很省事,一个函数就能解决 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); 顺便改了个手机版本的但是手机版本的没能解决双缓冲问题,屏幕有些闪烁,朋友们可以自己改进 http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx 如果你发现有什么不合理的,需要改进的地方,联系328452421@qq.com 朱晓 (泰山学院)。相互交流 谢谢
http://blog.csdn.net/xiaoxiao108/archive/2010/12/18/6084473.aspx 记得在大学学java时,同学在下载了很多java的视频,看到里面有些是介绍简单游戏开发的,马士兵老师讲的,挺感兴趣的。一起看了看视频写了写程序。现在毕业了,因为工作用的是C#,最近很想拿C#把以前写的坦克大战重写下,来熟悉熟悉C#的基本语法。 程序很简单,跟java代码相比没有多大改动 实现方法如下 1.在form添加一个panel,在panel的 Paint方法得到Graphics对象 2.通过Graphics对象再panel画出坦克,子弹等相关内容 3.添加timer控件 来控制panel的重画 实现坦克,子弹的运动 4.根据电脑按下的方向键,确定出坦克的方向,panel重画时根据坦克的方向修改坦克的X,Y轴坐标,来实现坦克的移动 5.通过Rectangle的IntersectsWith函数来进行碰撞检测,实现子弹打击坦克 具体实现代码 1.在项目里面添加枚举类型 /// /// 表示方向的的枚举类型 /// public enum Direction { L, U, D, R, STOP } 2.添加子弹类的相关常量,属性 /// /// 子弹X轴的速度,单位PX /// public static int XSPEED = 10; /// /// 子弹Y轴的速度,单位PX /// public static int YSPEED = 10; /// /// 子弹的宽度 /// public static int WIDTH = 10; /// /// 子弹的高度 /// public static int HEIGHT = 10; /// /// 子弹的坐标 /// int x, y; /// /// 子弹的方向 /// Direction dir; /// /// 子弹的存活状态 /// private bool live = true; /// /// TankClient窗体实例 /// private TankClient tankClient; /// /// 敌我双方的标记 /// private bool good; 3.添加draw方法来画出子弹 public void Draw(Graphics g) { if (!live) { tankClient.missiles.Remove(this); return; } //通过画椭圆函数在界面上显示子弹 g.FillEllipse(Brushes.Black, x, y, Missile.WIDTH, Missile.HEIGHT); Move(); } 4.添加子弹打击坦克的方法 public bool HitTank(Tank t) { //用IntersectsWith来检测两个矩形相碰撞 if (GetRectangle().IntersectsWith((t.GetRectangle())) && t.Live && this.live && this.good != t.Good) { t.Live = false; this.live = false; return true; } return false; } 5.添加坦克类相关属性,常量 /// /// 坦克x轴的速度 /// public static int XSPEED = 5; /// /// 坦克y轴的速度 /// public static int YSPEED = 5; /// /// 坦克的宽度 /// public static int WIDTH = 30; /// /// 坦克的高度 /// public static int HEIGHT = 30; /// /// 坦克的坐标 /// private int x, y; /// /// 标记上下左右键是否按下 /// private bool l = false, u = false, r = false, d = false; /// /// 坦克的方向 /// private Direction dir = Direction.STOP; /// /// 坦克炮筒方向 /// private Direction ptDir = Direction.D; /// /// TankClient窗体实例 /// TankClient tankClient; /// /// 标记敌我双方 /// private bool good; /// /// 控制敌人坦克不规则运行时使用 /// private int step = 0; /// /// 标记坦克的存活状态 /// private bool live = true; 6.在tank类实现画坦克方法 public void Draw(Graphics g) { if (!live) { if (!good) { tankClient.tanks.Remove(this); } return; } if (good) { //通过FillEllipse来画坦克 g.FillEllipse(Brushes.Red, x, y, WIDTH, HEIGHT); } else { g.FillEllipse(Brushes.Blue, x, y, WIDTH, HEIGHT); } //根据炮筒坦克来画出坦克的炮筒 switch (ptDir) { case Direction.D: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y + HEIGHT); break; case Direction.U: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH / 2, y); break; case Direction.L: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x, y + HEIGHT / 2); break; case Direction.R: g.DrawLine(Pens.Black, x + WIDTH / 2, y + HEIGHT / 2, x + WIDTH, y + HEIGHT / 2); break; } Move(); } 7.键盘按键处理的相关代码 public void KeyPressed(KeyEventArgs e) { Keys key = e.KeyCode; switch (key) { case Keys.Right: r = true; break; case Keys.Left: l = true; break; case Keys.Up: u = true; break; case Keys.Down: d = true; break; } LocateDirection(); } 8.tank发子弹的方法 public Missile Fire() { if (!live) return null; int x = this.x + WIDTH / 2 - Missile.WIDTH / 2; int y = this.y + HEIGHT / 2 - Missile.HEIGHT / 2; Missile missile = new Missile(x, y, good, ptDir, tankClient); tankClient.missiles.Add(missile); return missile; } 9.主窗体类加入坦克 myTank = new Tank(50, 20, true, this);//放到前面 this不能用 //y轴比java的减少了30 for (int i = 0; i < 15; i++) { //添加10个坦克x轴间距为40px tanks.Add(new Tank(50+40*(i+1),20,false,this)); //y轴比java的减少了30 } 10.主窗体类调用子弹打击坦克的方法 for (int i = 0; i < missiles.Count; i++) { Missile m = missiles[i]; m.HitTank(myTank); m.HitTanks(tanks); m.Draw(g); } 11.主窗体处理按键代码 private void Form1_KeyDown(object sender, KeyEventArgs e) { myTank.KeyPressed(e); } 12.控制重画代码 private void timer1_Tick(object sender, EventArgs e) { //间隔50毫秒控制panel的重画 panel1.Invalidate(); } 13.这是主要代码基本完成,但是游戏会有闪烁问题 可以通过双缓冲来解决,C#解决时很省事,一个函数就能解决 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true); 顺便改了个手机版本的但是手机版本的没能解决双缓冲问题,屏幕有些闪烁,朋友们可以自己改进 如果你发现有什么不合理的,需要改进的地方,联系328452421@qq.com 朱晓 (泰山学院)。相互交流 谢谢 不好意 资源传错了 没能正确下载的 联系328452421@qq.com ...

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧