C#中timer关于静态的问题?

来源:百度知道 编辑:UC知道 时间:2024/05/30 01:58:53
我初学c#,在做坦克大战游戏,想用timer实现子弹每隔一段时间先前移动一点(就是子弹的移动),可是一个很棘手的问题困扰了我好久了,那就是关于timer的System.Timers.ElapsedEventHandler(OnTimedEvent)事件中的OnTimedEvent处理程序,放在Tank的类中又不能用实例,放在类外又访问不到(无法通过嵌套类型“坦克大战.form1.tank”,来访问外部类型“坦克大战.form1”的非静态成员)

我来贴一下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Timers;
using System.Windows.Forms;

namespace 坦克大战
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//定义mytank和mybullet
public tank MyTank;
public bullet MyBullet;

public class tank
{

public void Shut(System.IntPtr WinHandle)
{
//子弹属性赋值
TankBullet.BulDerection = TankDerection;

1.坦克和子弹不宜嵌套在form1里,他们之间没有所属的关系,

2.像坦克大战这类实时游戏不宜用Timer组件实现移动动画,用主循环实现更为贴切:
while(isRun)
{
tank.MoveLeft(...);
.....
Application.DoEvents();
}

3.个人感觉你的射击逻辑不合理,我说下我的思路:
首先游戏需要有个【主循环】的“引擎”去驱动整个游戏的运行逻辑,而这个【主循环】应该放到【场景】中,其余各个对象(如坦克,子弹等)都隶属于这个场景,由【场景】驱动场景【子对象】的更新逻辑,而坦克移动和子弹移动都应该在更新逻辑里驱动(【子对象】是坦克和子弹的基类):

【场景】
class PlayingFrame
{

List<SubObject> subObjects;

private void Update(...)
{
while(isRun)
{
// 在这里驱动所有子对象(即调用子对象的)
foreach(SubObject so in subObjects)
{subObject.Update(...);}
}
}

}

【子对象基类】
abstract class SubObject
{
publi abstract void Update(...);
}

【坦克】
class Tank:SubObject
{
publi void Update(...)
{
...........
}
}

控制时间由传入的参数指定,

你可以自己写一个计时器的类

其实代码我也没看,但是你说这个问题确实应该用前面朋友说的那样,应该自己写一个线程,用来控制子弹。

Timer组件本来就是一个简单线程类的封装应用