这是源代码地址:
http://pan.baidu.com/s/19WhyL
22 个解决方案
#1
坦克的速度值是不是静态的。
#2
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
#3
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
#4
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
坦克上的速度属性肯定是静态的了,新游戏中,敌方的坦克是新的没问题,
而你自己的坦克是不是重用了,或者没有清除某些静态属性。
#5
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些吧。
没有对坦克速度的操作,而且我把这个静态值实时输出也没有变,一楼有源代码。
#6
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
#7
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
#8
补充一下,速度的赋值是在类里面默认的,初始化的时候不用给它赋值
#9
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
正在帮你调,
你程序做的不错,想法也挺好,只不过BUG太多。。
刚进去一启动就是一个空指针
#10
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
正在帮你调,
你程序做的不错,想法也挺好,只不过BUG太多。。
刚进去一启动就是一个空指针
是没有找到文件的空指针吧?要把地图文件放在e盘,不然是没有地图的,这是个问题,先将就着,等速度这个大问题解决了再慢慢解决其他小问题。
#11
在你的tank类中这一段你添加如下代码:
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
/**
* 向上移动
*/
public void moveUp() {
System.out.println("-----------"+this.getName()+","+this.speed);
if (this.y > 3 * this.size + this.speed)
this.y -= this.speed;
System.out.println("-----------"+this.getName()+","+this.y);
}
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
#12
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
#13
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
做了下面处理,问题解决了。
/**
* 设置游戏面版
*/
public void setGamePanel(int flag){
this.battlePanel = new BattleCityPanel(flag);// 实例化一个JPanel对象
Thread t = new Thread(this.battlePanel);
this.t=t; //初始pannel上加入游戏线程引用
/**
* 进入游戏界面,加载游戏面版和状态栏
*/
public void enterGameInterface(int flag){
this.startPanel.setWaitFlag(true);// 让开始面版等待
this.gItem_W.setEnabled(true);// 【暂停】设置为可用
// 判断游戏面版是否已经有了
if(this.battlePanel != null){
// 如果是,先删除掉状态栏和游戏面版
Thread.currentThread().interrupt();
this.t.stop(); //第二次近年来直接干掉第一次的线程。stop方法不是很好。
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//BattleCityPanel run方法中每次whle循环判断是否中断。
#14
谢谢,麻烦你了。你分析的都对,但是根本上为什么时间间隔会有问题呢?进入下一关的时候并不会这样啊。
进入下一关和【新游戏】都是调用this.enterGameInterface(1);好奇怪
1.main()函数确实要放在外面好点。
2.习惯性这样调试,我会改的。
3.我想做一个和win7扫雷一样的东西。
4.程序还有很多小问题,可是目前这个问题卡得我很郁闷。
5.你做得也很不错。
进入下一关和【新游戏】都是调用this.enterGameInterface(1);好奇怪
1.main()函数确实要放在外面好点。
2.习惯性这样调试,我会改的。
3.我想做一个和win7扫雷一样的东西。
4.程序还有很多小问题,可是目前这个问题卡得我很郁闷。
5.你做得也很不错。
#15
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
做了下面处理,问题解决了。
/**
* 设置游戏面版
*/
public void setGamePanel(int flag){
this.battlePanel = new BattleCityPanel(flag);// 实例化一个JPanel对象
Thread t = new Thread(this.battlePanel);
this.t=t; //初始pannel上加入游戏线程引用
/**
* 进入游戏界面,加载游戏面版和状态栏
*/
public void enterGameInterface(int flag){
this.startPanel.setWaitFlag(true);// 让开始面版等待
this.gItem_W.setEnabled(true);// 【暂停】设置为可用
// 判断游戏面版是否已经有了
if(this.battlePanel != null){
// 如果是,先删除掉状态栏和游戏面版
Thread.currentThread().interrupt();
this.t.stop(); //第二次近年来直接干掉第一次的线程。stop方法不是很好。
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//BattleCityPanel run方法中每次whle循环判断是否中断。
非常感谢,确实解决了我的问题,我再问一个问题,如果我不想用stop,我设置了一个变量去控制让Jpanel的线程break掉,这样为什么不行,有没有其他解决方法?
#16
在你的tank类中这一段你添加如下代码:
/**
* 向上移动
*/
public void moveUp() {
System.out.println("-----------"+this.getName()+","+this.speed);
if (this.y > 3 * this.size + this.speed)
this.y -= this.speed;
System.out.println("-----------"+this.getName()+","+this.y);
}
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
14楼是回答你的,现在13楼已经解决了我的问题,不过还是很感谢你的帮助!
#17
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
#18
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
#19
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
#20
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
求结贴给点分哈
#21
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
求结贴给点分哈
#22
恩。。。。。。。。。。。
#1
坦克的速度值是不是静态的。
#2
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
#3
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
#4
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
坦克上的速度属性肯定是静态的了,新游戏中,敌方的坦克是新的没问题,
而你自己的坦克是不是重用了,或者没有清除某些静态属性。
#5
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些静态有操作吧。
坦克的速度值是不是静态的。
坦克有个速度属性,我给它赋静态值。
还要说明一点,如果过了一关,进入下一关,坦克的速度并没有变快。
而且变快的是我控制的坦克,敌方坦克没有变快。
我觉得跟你的静态是有关的,当你销毁pannel的时候,把所有用到的静态都恢复回初始值。
你的pannel初始化的时候应该会对这些吧。
没有对坦克速度的操作,而且我把这个静态值实时输出也没有变,一楼有源代码。
#6
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
#7
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
#8
补充一下,速度的赋值是在类里面默认的,初始化的时候不用给它赋值
#9
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
正在帮你调,
你程序做的不错,想法也挺好,只不过BUG太多。。
刚进去一启动就是一个空指针
#10
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
正在帮你调,
你程序做的不错,想法也挺好,只不过BUG太多。。
刚进去一启动就是一个空指针
是没有找到文件的空指针吧?要把地图文件放在e盘,不然是没有地图的,这是个问题,先将就着,等速度这个大问题解决了再慢慢解决其他小问题。
#11
在你的tank类中这一段你添加如下代码:
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
/**
* 向上移动
*/
public void moveUp() {
System.out.println("-----------"+this.getName()+","+this.speed);
if (this.y > 3 * this.size + this.speed)
this.y -= this.speed;
System.out.println("-----------"+this.getName()+","+this.y);
}
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
#12
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
#13
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
做了下面处理,问题解决了。
/**
* 设置游戏面版
*/
public void setGamePanel(int flag){
this.battlePanel = new BattleCityPanel(flag);// 实例化一个JPanel对象
Thread t = new Thread(this.battlePanel);
this.t=t; //初始pannel上加入游戏线程引用
/**
* 进入游戏界面,加载游戏面版和状态栏
*/
public void enterGameInterface(int flag){
this.startPanel.setWaitFlag(true);// 让开始面版等待
this.gItem_W.setEnabled(true);// 【暂停】设置为可用
// 判断游戏面版是否已经有了
if(this.battlePanel != null){
// 如果是,先删除掉状态栏和游戏面版
Thread.currentThread().interrupt();
this.t.stop(); //第二次近年来直接干掉第一次的线程。stop方法不是很好。
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//BattleCityPanel run方法中每次whle循环判断是否中断。
#14
谢谢,麻烦你了。你分析的都对,但是根本上为什么时间间隔会有问题呢?进入下一关的时候并不会这样啊。
进入下一关和【新游戏】都是调用this.enterGameInterface(1);好奇怪
1.main()函数确实要放在外面好点。
2.习惯性这样调试,我会改的。
3.我想做一个和win7扫雷一样的东西。
4.程序还有很多小问题,可是目前这个问题卡得我很郁闷。
5.你做得也很不错。
进入下一关和【新游戏】都是调用this.enterGameInterface(1);好奇怪
1.main()函数确实要放在外面好点。
2.习惯性这样调试,我会改的。
3.我想做一个和win7扫雷一样的东西。
4.程序还有很多小问题,可是目前这个问题卡得我很郁闷。
5.你做得也很不错。
#15
你控制的坦克速度变快,敌对坦克速度未变快。那不就是你调速度那里赋值错了对象了么。。
只是建议,一般把这东西可以写到一个类里面。Constant,里面存放各种数据。
坦克是一个父类,它有方法moveup,movedown,moveleft,moveright;我方坦克和敌方坦克继承父类,都有一个move函数,根据方向调用父类的移动方法;我还有一个常量类,就有存放坦克的速度,两方坦克的速度都一样,程序中没有改变它们的速度大小。我怀疑跟线程有很大的关系。
大概知道原因了。我在你的BattleCityPanel线程里面打印,发现你的线程是死的
每次重新开始就会有新的线程进来,这个时候就有多个pannel线程在跑,应该第二次开始的时候你要想办法中断之前在跑得线程。
我在while最下面的打印,发现每次开始就会多一个线程。
System.out.println(Thread.currentThread().getName()+"coust:"+(end-begn));
@Override
public void run() {
while (true) {
做了下面处理,问题解决了。
/**
* 设置游戏面版
*/
public void setGamePanel(int flag){
this.battlePanel = new BattleCityPanel(flag);// 实例化一个JPanel对象
Thread t = new Thread(this.battlePanel);
this.t=t; //初始pannel上加入游戏线程引用
/**
* 进入游戏界面,加载游戏面版和状态栏
*/
public void enterGameInterface(int flag){
this.startPanel.setWaitFlag(true);// 让开始面版等待
this.gItem_W.setEnabled(true);// 【暂停】设置为可用
// 判断游戏面版是否已经有了
if(this.battlePanel != null){
// 如果是,先删除掉状态栏和游戏面版
Thread.currentThread().interrupt();
this.t.stop(); //第二次近年来直接干掉第一次的线程。stop方法不是很好。
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//BattleCityPanel run方法中每次whle循环判断是否中断。
非常感谢,确实解决了我的问题,我再问一个问题,如果我不想用stop,我设置了一个变量去控制让Jpanel的线程break掉,这样为什么不行,有没有其他解决方法?
#16
在你的tank类中这一段你添加如下代码:
/**
* 向上移动
*/
public void moveUp() {
System.out.println("-----------"+this.getName()+","+this.speed);
if (this.y > 3 * this.size + this.speed)
this.y -= this.speed;
System.out.println("-----------"+this.getName()+","+this.y);
}
来监控每一次移动的距离,你会发现不论是快走还是慢走,貌似移动的距离都是10.
这个name是我给你tank类加的一个成员变量,便于区分hero还是enemy。
也就是说你speed其实是没错的,设置正确。
那如果这个没错的话,那就是你的间隔时间改变了,我一直按着up的话,每隔多少毫秒触发一次这个时间变了。这个时间变短了,自然速度也就相对算是加速了。
我测试了很多遍,只是偶尔速度会增加,并不是逐渐上涨的。。。。。
另外,给几个建议吧。
Main函数可以单独写到test包里面的test类中。
虽然可以通过这样找main函数,但是还是蛮麻烦的
第二,看你很多System.out.println。但是光一直输出10没什么意义。加上对象名等等信息才合适,这样其实也就是等于log信息了。
第三,是不是加一个用户登录界面呢?保存每一位玩家的信息,而不是第一的信息。
第四,中间看到子弹线程偶尔会报空指针,建议检查一下
这东西做的不错,比我以前做的那个好多了。。
14楼是回答你的,现在13楼已经解决了我的问题,不过还是很感谢你的帮助!
#17
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
#18
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
#19
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
#20
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
求结贴给点分哈
#21
这里涉及到一个变量的可见性问题,如果你要用变量控制,申明下volatile。这样可以让线程可见。
public volatile static boolean stopFlag = false;//这样子吗?失败了~
应该是可以的,不申明static试试看,查下相关的资料吧。
求结贴给点分哈
#22
恩。。。。。。。。。。。