| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1652 人关注过本帖
标题:关于C#多线程程序设计
只看楼主 加入收藏
观弈寒儒
Rank: 7Rank: 7Rank: 7
来 自:自 来
等 级:黑侠
帖 子:359
专家分:545
注 册:2011-1-9
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:22 
关于C#多线程程序设计
想写个双人坦克小游戏,想要双人玩需要用到多线程,以下是我写的代码,没能实现效果,想请教以下大家哪里错了,先谢谢了。
程序代码:
        Thread thread1, thread2;
        Message m;
        Keys k;
        int x1 = 0, y1 = 0, x2, y2;
        Bitmap pic1 = new Bitmap("C:\\Users\\llq664301573\\Desktop\\res\\己方1上.gif");
        Bitmap pic2 = new Bitmap("C:\\Users\\llq664301573\\Desktop\\res\\己方1下.gif");
        Bitmap pic3 = new Bitmap("C:\\Users\\llq664301573\\Desktop\\res\\己方1左.gif");
        Bitmap pic4 = new Bitmap("C:\\Users\\llq664301573\\Desktop\\res\\己方1右.gif");
        public void func1()
        {
            switch (k)
            {
                case Keys.Up:
                    y1 -= 8;
                    pictureBox1.Top = y1;
                    pictureBox1.Image = pic1;
                    pictureBox1.Width = pic1.Width;
                    pictureBox1.Height = pic1.Height;
                    break;
                case Keys.Down:
                    y1 += 8;
                    pictureBox1.Top = y1;
                    pictureBox1.Image = pic2;
                    pictureBox1.Width = pic2.Width;
                    pictureBox1.Height = pic2.Height;
                    break;
                case Keys.Left:
                    x1 -= 8;
                    pictureBox1.Left = x1;
                    pictureBox1.Image = pic3;
                    pictureBox1.Width = pic3.Width;
                    pictureBox1.Height = pic3.Height;
                    break;
                case Keys.Right:
                    x1 += 8;
                    pictureBox1.Left = x1;
                    pictureBox1.Image = pic4;
                    pictureBox1.Width = pic4.Width;
                    pictureBox1.Height = pic4.Height;
                    break;
                default:
                    break;
            }
            Thread.Sleep(10);
        }
        public void func2()
        {
            switch (k)
            {
                case Keys.W:
                    y2 -= 8;
                    pictureBox2.Top = y2;
                    pictureBox2.Image = pic1;
                    pictureBox2.Width = pic1.Width;
                    pictureBox2.Height = pic1.Height;
                    break;
                case Keys.S:
                    y2 += 8;
                    pictureBox2.Top = y2;
                    pictureBox2.Image = pic2;
                    pictureBox2.Width = pic2.Width;
                    pictureBox2.Height = pic2.Height;
                    break;
                case Keys.A:
                    x2 -= 8;
                    pictureBox2.Left = x2;
                    pictureBox2.Image = pic3;
                    pictureBox2.Width = pic3.Width;
                    pictureBox2.Height = pic3.Height;
                    break;
                case Keys.D:
                    x2 += 8;
                    pictureBox2.Left = x2;
                    pictureBox2.Image = pic4;
                    pictureBox2.Width = pic4.Width;
                    pictureBox2.Height = pic4.Height;
                    break;
                default:
                    break;
            }
            Thread.Sleep(10);
        }
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            m = msg;
            k = keyData;
            thread1 = new Thread(new ThreadStart(func1));//生成线程类对象
            thread1.Start();
            thread2 = new Thread(new ThreadStart(func2));//生成线程类对象
            thread2.Start();
           
            return base.ProcessCmdKey(ref msg, keyData);
        }

搜索更多相关主题的帖子: 小游戏 多线程 
2011-04-03 22:25
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:10 
不会C#,占楼

免费赠送河蟹一只
2011-04-03 22:27
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:20 
楼主,就算是100人玩,也不需要双线程啊

你就整一循环就够了

多线程的话,没有超过1000人同时在线,就不值得用

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:27
观弈寒儒
Rank: 7Rank: 7Rank: 7
来 自:自 来
等 级:黑侠
帖 子:359
专家分:545
注 册:2011-1-9
收藏
得分:0 
回复 3楼 flyue
但键盘按键同时按下的话不用多线程貌似不行啊。。。

事件记录,值得关注! http://bbs.bccn.net/z_court.php?fid=5
2011-04-03 23:39
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:20 
获得键盘按键表。bool keys[256]
收到的鲜花
  • 观弈寒儒2011-04-03 23:43 送鲜花  10朵   附言:高手回帖如此精简,没明白。。。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:41
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:30 
如果楼主开发管理类软件,我强烈建议你使用C#。

但如果想走游戏道路的话,C#没有优势。

就不说很多游戏书籍,开源代码是C/C++写的,C#是靠虚拟机运行 这一项,已经可以把它划出游戏开发的领域,因为游戏对运行效率很敏感。

当然C#开发坦克大战,俄罗斯方块等程序,是完全没问题--反而会更简单的。不过我想楼主不会仅停留在这些小玩意上吧?

XNA之流,在天朝没有市场,但也可以玩玩。

三年游戏研究经验的菜鸟的看法,仅供参考。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:41
观弈寒儒
Rank: 7Rank: 7Rank: 7
来 自:自 来
等 级:黑侠
帖 子:359
专家分:545
注 册:2011-1-9
收藏
得分:0 
回复 6楼 flyue
写个程序综合用一下C#而已,可以不把它看成是游戏。
嗯,说的挺有道理的。

事件记录,值得关注! http://bbs.bccn.net/z_court.php?fid=5
2011-04-03 23:46
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:10 
GetAsyncKeyState这个API函数可以获得当前某个键的状态,最重要的是它为非阻塞函数。

使用一个循环,就能把256个键的状态都弄到手。

手机打字不便。
收到的鲜花
  • 观弈寒儒2011-04-03 23:51 送鲜花  10朵   附言:打字辛苦。。。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:49
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:10 
一般这种方式精读太低,我还是建议使用DirectInput或者XInput

如果想图方便,可以用OIS开源库。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:53
flyue
Rank: 10Rank: 10Rank: 10
来 自:江南西道
等 级:贵宾
威 望:19
帖 子:3465
专家分:1563
注 册:2006-6-20
收藏
得分:0 
一般这种方式精度太低,我还是建议使用DirectInput或者XInput

如果想图方便,可以用OIS开源库。

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
2011-04-03 23:53
快速回复:关于C#多线程程序设计
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032060 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved