鱼C论坛

 找回密码
 立即注册
查看: 3443|回复: 17

[已解决]震惊!为何这辆坦克......

[复制链接]
发表于 2017-3-27 23:29:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我们老师丧心病狂惨无人道.....
让我们用java写出一个坦克大战游戏
现在做了一共三个函数
主函数中键盘移动有问题



TankGameWindow
Tank
TankWindow(主函数)

import java.awt.Color;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.color.*;
import java.awt.Graphics;
        public class TankGameWindow extends Frame{
                Tank tank;
               
                public void initFrame(){
                        this.setVisible(true);
                        this.setLocation(300,300);//实现坦克大战的窗口,且填充了背景颜色
                        this.setSize(800,500);
                        this.setTitle("CRAZY TANK");
                        this.setResizable(false);
                        this.setBackground(Color.green);
                        this.addWindowListener(new WindowAdapter()
                        {
                                public void windowClosing(WindowEvent e){
                                        System.exit(0);
                                }
                        });
                        tank=new Tank(300,300,Color.red);
                        Thread t;
                        t=new Thread(new PaintThread());
                        t.start();
                }
       
               
                //坦克反复擦掉重画
                private class PaintThread implements Runnable
                {
                        public void run()
                        {
                                while(true)
                                {
                                        repaint();
                                        try{
                                                Thread.sleep(50);//间隔50mm画
                                        }catch(InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        }
                }
                public void paint(Graphics g){
                        tank.draw(g);
                }
        }



import java.awt.Color;
import java.awt.Graphics;
public class Tank {
        int x,y;
        byte state=1;//状态
        public final int WIDTH=20;
        public final int HIGHT=20;
        Color tankColor;
        public Tank(int ax,int ay,Color ac){
                x=ax;
                y=ay;
                tankColor=ac;
        }
       
        //move坦克
        public void move(){
                state--;
                if(state<1)
                        state=3;
        }
        public void draw(Graphics g){
                move();
                Color c=g.getColor();
                drawBody(g,x,y,Color.RED);
                drawTrack(state,g,x,y,Color.RED);
                g.setColor(c);
        }
        public void drawTrack(int a,Graphics g,int x,int y,Color c){
                g.setColor(c);
            for(int i=a;i<=28;i=i+3)
            {
                    g.drawLine(x-13,y-14+i,x-11,y-14+i);//画出履带上的直线
                    g.drawLine(x+11,y-14+i,x+13,y-14+i);
            }  
        }
        public void drawBody(Graphics g,int x,int y,Color c){
                g.setColor(c);
                g.drawRect(x-10,y-10,20,20);
                g.drawOval(x-8,y-8,16,16);
                g.drawRect(x-1,y-24,2,24);//坦克的身体
                g.drawRect(x-14,y-14,4,28);
                g.drawRect(x+10,y-14,4,28);
                }
}






import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TankWindow {
               
                         TankMove Movea = null;
       
        public static void main(String args[]){
                        TankGameWindow window=new TankGameWindow();
                        window.initFrame();
                         Movea = new TankMove();//这里new的时候报错
}
       
        //通过键盘控制坦克移动但无法实现
       
           class TankMove implements KeyListener{
                int x =300;
                int y = 300;
                Tank tank = new Tank(x,y,Color.red);
                @Override
                public void keyPressed(KeyEvent e) {
                       
                        if(e.getKeyCode()==KeyEvent.VK_DOWN){
                                x-=3;
                        }else if(e.getKeyCode()== KeyEvent.VK_UP){
                                y-=3;
                        }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                                x-=3;
                        }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                                x+=3;
                        }
                        //调用repain函数,来重画界面
                        Tank tank = new Tank(x,y,Color.red);
                       
                }
               



                @Override
                public void keyReleased(KeyEvent e) {
                }

                @Override
                public void keyTyped(KeyEvent e) {
                }
           }
}
       






最佳答案
2017-3-29 17:38:57
本帖最后由 zlj19931010 于 2017-3-29 17:45 编辑
十六是只仙 发表于 2017-3-29 16:59
谢谢大佬= =我就想知道我的这个可以改成功不,因为这是老师的作业在他原有基础上改让坦克动起来......


可以的,你把游戏中的tank实例传递到TankMove实例中
比如构造传入:
public TankMove (Tank tank){
    this.tank = tank;
}
然后
public void paint(Graphics g){
                tank.draw(g);
        }
然后监听器里面:
public void keyPressed(KeyEvent e) {
               
                if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        tank.y += 3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        tank.y -= 3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        tank.x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        tank.x+=3;
                }
                //调用repain函数,来重画界面
                this.repaint();
               
        }

逻辑这样是通的,你自己调试下,我就知道以前上学的时候碰到过一个repaint的坑,你已经开了一个线程在一直repaint,这里不知道会不会阻塞,忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-28 09:31:44 | 显示全部楼层
......................我复制了
Movea是TankWindow的实例属性,怎么能访问到,错误提示已经说的很清楚了

还是别的错?你把错误讲清楚

是这个错?

是这个错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-28 15:07:17 | 显示全部楼层
Direction
  1. package tank;

  2. public enum Direction {
  3.         UP(0),
  4.         DOWN(2),
  5.         LEFT(3),
  6.         RIGHT(1);
  7.         private int value;
  8.         private Direction(int value){
  9.                 this.value = value;
  10.         }
  11.        
  12.         public int getValue(){
  13.                 return this.value;
  14.         }
  15. }
复制代码


Point
  1. package tank;

  2. import java.util.Random;

  3. public class Point {
  4.         int x;
  5.         int y;
  6.        
  7.         public Point(int x, int y) {
  8.                 super();
  9.                 this.x = x;
  10.                 this.y = y;
  11.         }
  12.         public int getX() {
  13.                 return x;
  14.         }
  15.         public void setX(int x) {
  16.                 this.x = x;
  17.         }
  18.         public int getY() {
  19.                 return y;
  20.         }
  21.         public void setY(int y) {
  22.                 this.y = y;
  23.         }
  24.        
  25.         public void rotation(Direction direction,Point center){
  26.        
  27.                 int h = center.getY() - y;
  28.                 int w = center.getX() - x;
  29.             switch(direction){
  30.             case UP:
  31.                     //向上不用变化
  32.                     break;
  33.             case RIGHT:
  34.                     //翻转90°
  35.                     x += h + w;
  36.                     y = center.getY() - w;
  37.                     break;
  38.             case DOWN:
  39.                     //翻转180°,x不变,y变化
  40.                     //其实,这边也是不用变的,反正上下都看不出
  41.                     x = center.getX() + w;
  42.                     y = center.getY() + h;
  43.                     break;
  44.             case LEFT:
  45.                     //翻转270°
  46.                     x += h + w;
  47.                     y = center.getY() - w;
  48.                     break;
  49.             }
  50.     }
  51.         @Override
  52.         public String toString() {
  53.                 return "Point [x=" + x + ", y=" + y + "]";
  54.         }
  55.        
  56. }
复制代码


Tank
  1. package tank;

  2. import java.awt.Color;
  3. import java.awt.Graphics;

  4. public class Tank {
  5.         int x,y;
  6.     byte state=1;//状态
  7.     Direction direction = Direction.UP;//默认的是向上的方向
  8.     public final int WIDTH=20;
  9.     public final int HIGHT=20;
  10.     Color tankColor;
  11.    
  12.         public Direction getDirection() {
  13.                 return direction;
  14.         }

  15.         public void setDirection(Direction direction) {
  16.                 this.direction = direction;
  17.         }

  18.         public Tank(int ax,int ay,Color ac){
  19.         x=ax;
  20.         y=ay;
  21.         tankColor=ac;
  22.     }
  23.    
  24.     //move坦克
  25.     public void move(){
  26.             state--;
  27.             if(state<1)
  28.                     state=3;
  29.     }
  30.     public void draw(Graphics g){
  31.             move();
  32.             Color c=g.getColor();
  33.             drawBody(g,x,y,Color.RED);
  34.             drawTrack(state,g,x,y,Color.RED);
  35.             g.setColor(c);
  36.     }
  37.     public void drawTrack(int a,Graphics g,int x,int y,Color c){
  38.         g.setColor(c);
  39.         for(int i=a;i<=28;i=i+3)
  40.         {
  41.                 drawLine(g,x-13,y-14+i,x-11,y-14+i);//画出履带上的直线
  42.                 drawLine(g,x+11,y-14+i,x+13,y-14+i);
  43.         }
  44.     }
  45.     public void drawBody(Graphics g,int x,int y,Color c){
  46.             g.setColor(c);
  47.             g.drawRect(x-10,y-10,20,20);
  48.             g.drawOval(x-8,y-8,16,16);
  49.             drawRect_body(g,x-1,y-24,2,24);//坦克的身体
  50.             drawRect_left(g,x-14,y-14,4,28);
  51.             drawRect_right(g,x+10,y-14,4,28);
  52.     }
  53.    
  54.     private void drawLine(Graphics g, int x1, int y1, int x2, int y2){
  55.             //绘制之前首先翻转坐标
  56.             Point p1 = new Point(x1,y1);
  57.             Point p2 = new Point(x2,y2);
  58.             p1.rotation(direction, getCenterPoint());
  59.             p2.rotation(direction, getCenterPoint());
  60.            
  61.             g.drawLine(p1.getX(),p1.getY(), p2.getX(),p2.getY());
  62.     }
  63.    
  64.     private void drawRect_left(Graphics g,int x, int y, int width, int height){
  65.             int temp;
  66.             switch (direction) {
  67.                 case UP:
  68.                        
  69.                         break;
  70.                 case RIGHT:
  71.                         temp = width;
  72.                         width = height;
  73.                         height = temp;
  74.                         break;
  75.                 case DOWN:
  76.                         break;
  77.                 case LEFT:
  78.                         temp = width;
  79.                         width = height;
  80.                         height = temp;
  81.                         break;
  82.                 }
  83.             g.drawRect(x,y,width,height);//坦克的身体
  84.     }
  85.    
  86.     private void drawRect_right(Graphics g,int x, int y, int width, int height){
  87.             int temp;
  88.             switch (direction) {
  89.                 case UP:
  90.                        
  91.                         break;
  92.                 case RIGHT:
  93.                         x -= 24;
  94.                         y += height-width;
  95.                        
  96.                         temp = width;
  97.                         width = height;
  98.                         height = temp;
  99.                         break;
  100.                 case DOWN:
  101.                        
  102.                         break;
  103.                 case LEFT:
  104.                         x -= 24;
  105.                         y += height-width;
  106.                        
  107.                         temp = width;
  108.                         width = height;
  109.                         height = temp;
  110.                         break;
  111.                 }
  112.             g.drawRect(x,y,width,height);//坦克的身体
  113.     }
  114.    
  115.     private void drawRect_body(Graphics g,int x, int y, int width, int height){
  116.             int temp;
  117.             switch (direction) {
  118.                 case UP:
  119.                         break;
  120.                 case RIGHT:
  121.                         y += height;
  122.                         temp = width;
  123.                         width = height;
  124.                         height = temp;
  125.                         break;
  126.                 case DOWN:
  127.                         y += height;
  128.                         break;
  129.                 case LEFT:
  130.                         y += height;
  131.                         x -= height;
  132.                         temp = width;
  133.                         width = height;
  134.                         height = temp;
  135.                         break;
  136.                 }
  137.             g.drawRect(x,y,width,height);//坦克的身体
  138.     }
  139.    
  140.     /**
  141.      * 返回当前tank 的中点坐标
  142.      * @return
  143.      */
  144.     public Point getCenterPoint(){
  145.             return new Point(x, y);
  146.     }

  147.         public int getX() {
  148.                 return x;
  149.         }

  150.         public void setX(int x) {
  151.                 this.x = x;
  152.         }

  153.         public int getY() {
  154.                 return y;
  155.         }

  156.         public void setY(int y) {
  157.                 this.y = y;
  158.         }
  159.    
  160.    
  161. }
复制代码


TankGameWindow
  1. package tank;

  2. import java.awt.Color;
  3. import java.awt.Frame;
  4. import java.awt.Graphics;
  5. import java.awt.event.KeyEvent;
  6. import java.awt.event.KeyListener;
  7. import java.awt.event.WindowAdapter;
  8. import java.awt.event.WindowEvent;

  9. @SuppressWarnings("serial")
  10. public class TankGameWindow extends Frame{
  11.         Tank tank;
  12.    
  13.     public void initFrame(){
  14.         this.setVisible(true);
  15.         this.setLocation(300,300);//实现坦克大战的窗口,且填充了背景颜色
  16.         this.setSize(800,500);
  17.         this.setTitle("CRAZY TANK");
  18.         this.setResizable(false);
  19.         this.setBackground(Color.green);
  20.         this.addKeyListener(new KeyListener() {
  21.                        
  22.                         @Override
  23.                         public void keyTyped(KeyEvent e) {
  24.                                
  25.                         }
  26.                        
  27.                         @Override
  28.                         public void keyReleased(KeyEvent e) {
  29.                                
  30.                         }
  31.                        
  32.                         @Override
  33.                         public void keyPressed(KeyEvent e) {
  34.                         if(e.getKeyCode()==KeyEvent.VK_DOWN){
  35.                                 tank.setY(tank.getY() + 3);
  36.                                 tank.setDirection(Direction.DOWN);
  37.                      }else if(e.getKeyCode()== KeyEvent.VK_UP){
  38.                             tank.setY(tank.getY() - 3);
  39.                             tank.setDirection(Direction.UP);
  40.                      }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
  41.                             tank.setX(tank.getX() - 3);
  42.                             tank.setDirection(Direction.LEFT);
  43.                      }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
  44.                             tank.setX(tank.getX() + 3);
  45.                             tank.setDirection(Direction.RIGHT);
  46.                      }
  47.                         }
  48.                 });
  49.         this.addWindowListener(new WindowAdapter()
  50.         {
  51.             public void windowClosing(WindowEvent e){
  52.                 System.exit(0);
  53.             }
  54.         });
  55.         tank=new Tank(300,300,Color.red);
  56.         Thread t;
  57.         t=new Thread(new PaintThread());
  58.         t.start();
  59.     }

  60.    
  61.     //坦克反复擦掉重画
  62.     private class PaintThread implements Runnable
  63.     {
  64.         public void run()
  65.         {
  66.             while(true)
  67.             {
  68.                 repaint();
  69.                 try{
  70.                     Thread.sleep(50);//间隔50mm画
  71.                 }catch(InterruptedException e)
  72.                 {
  73.                     e.printStackTrace();
  74.                 }
  75.             }
  76.         }
  77.     }
  78.     public void paint(Graphics g){
  79.         tank.draw(g);
  80.     }
  81. }
复制代码


TankWindow
  1. package tank;

  2. public class TankWindow {
  3.     public static void main(String args[]){
  4.            
  5.         TankGameWindow window=new TankGameWindow();
  6.         
  7.         window.initFrame();
  8.     }
  9. }
复制代码


稍微修改了下,可以运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 00:45:10 | 显示全部楼层
zlj19931010 发表于 2017-3-28 09:31
......................我复制了
Movea是TankWindow的实例属性,怎么能访问到,错误提示已经说的很清楚了
...

恩.....就是这个问题,我现在修改了下,我把这个函数重新封装了下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 00:51:15 | 显示全部楼层
zlj19931010 发表于 2017-3-28 09:31
......................我复制了
Movea是TankWindow的实例属性,怎么能访问到,错误提示已经说的很清楚了
...

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TankWindow {
               
                         
       
        public static void main(String args[]){
                        TankGameWindow window=new TankGameWindow();
                        window.initFrame();
                  
}
       
}//主函数这样


import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class TankMove implements KeyListener{
        int x =300;
        int y = 300;
        Tank tank = new Tank(x,y,Color.red);
        @Override
        public void keyPressed(KeyEvent e) {
               
                if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        y-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        x+=3;
                }
                //调用repain函数,来重画界面
                Tank tank = new Tank(x,y,Color.red);
               
        }
       



        @Override
        public void keyReleased(KeyEvent e) {
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

       
}//新建的这个Move类


import java.awt.Color;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.color.*;
import java.awt.Graphics;
        public class TankGameWindow extends Frame{
                Tank tank;
                TankMove area;
                public void initFrame(){
                        this.setVisible(true);
                        this.setLocation(300,300);//实现坦克大战的窗口,且填充了背景颜色
                        this.setSize(800,500);
                        this.setTitle("CRAZY TANK");
                        this.setResizable(false);
                        this.setBackground(Color.green);
                        this.addWindowListener(new WindowAdapter()
                        {
                                public void windowClosing(WindowEvent e){
                                        System.exit(0);
                                }
                        });
                        tank=new Tank(300,300,Color.red);
                        Thread t;
                        t=new Thread(new PaintThread());
                        t.start();
                    area = new TankMove();//将move在这里调用
                }
       
               
                //坦克反复擦掉重画
                private class PaintThread implements Runnable
                {
                        public void run()
                        {
                                while(true)
                                {
                                        repaint();
                                        try{
                                                Thread.sleep(50);//间隔50mm画
                                        }catch(InterruptedException e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                        }
                }
                public void paint(Graphics g){
                        tank.draw(g);



       
          
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 00:51:47 | 显示全部楼层
zlj19931010 发表于 2017-3-28 09:31
......................我复制了
Movea是TankWindow的实例属性,怎么能访问到,错误提示已经说的很清楚了
...

我想知道,可以按我这个思路修改吗.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 10:11:43 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-3-29 10:17 编辑

求解在监听里面每次new个tank实例是为了什么

这两个是干什么用的

这两个是干什么用的

这键盘监听要放到frame上

这键盘监听要放到frame上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 13:25:41 | 显示全部楼层
zlj19931010 发表于 2017-3-29 10:11
求解在监听里面每次new个tank实例是为了什么

public class TankGameWindow extends Frame{
                Tank tank;
                TankMove area;
                public void initFrame(){
                        this.setVisible(true);
                        this.setLocation(300,300);//实现坦克大战的窗口,且填充了背景颜色
                        this.setSize(800,500);
                        this.setTitle("CRAZY TANK");
                        this.setResizable(false);
                        this.setBackground(Color.green);
                        this.addWindowListener(new WindowAdapter()
                        {
                                public void windowClosing(WindowEvent e){
                                        System.exit(0);
                                }
                        });
                        tank=new Tank(300,300,Color.red);
                        Thread t;
                        t=new Thread(new PaintThread());
                        t.start();
                        area = new TankMove();
                        this.addKeyListener(area);
                 
                }
        我把监听放到下面了......




public class TankMove extends JPanel implements KeyListener{
        Tank tank;
       
        int x =300;
        int y = 300;
//        Tank tank = new Tank(x,y,Color.red);
       
//        public void paint(Graphics g){
//                tank.draw(g);
//        }
        @Override
        public void keyPressed(KeyEvent e) {
               
                if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        y-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        x+=3;
                }
                //调用repain函数,来重画界面
//                Tank tank = new Tank(x,y,Color.red);
                this.repaint();
               
        }
       



        @Override
        public void keyReleased(KeyEvent e) {
        }

        @Override
        public void keyTyped(KeyEvent e) {
        }

       
}
move函数也改了下, 继承了Jpanel,但还是移动不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 13:27:05 | 显示全部楼层
zlj19931010 发表于 2017-3-29 10:11
求解在监听里面每次new个tank实例是为了什么

package cn.Make;

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

/*
* 功能:加深对事件机制理解
* 1.通过上下左右键来控制小球移动
* 2.
*/
public class MakeBallMove extends JFrame{
                Mypanel mp = null;
       
                public static void main(String[] args) {
                        MakeBallMove me = new MakeBallMove();
                }
               
                //构造函数
                public MakeBallMove(){
                       
                        mp = new Mypanel();
                       
                        //MP加入到JFram中
                        this.add(mp);
                        this.setSize(400,300);
                        this.setVisible(true);
                       
                        this.addKeyListener(mp);
                }
}


//定义自己的面板

class Mypanel extends JPanel implements KeyListener{
       
       
        int x = 10;
        int y = 10;
        public void paint(Graphics g){
               
               
                super.paint(g);
               
                g.fillOval(x, y, 10, 10);
        }

       
        //仅仅被压下去
        @Override
        public void keyPressed(KeyEvent e) {
//                System.out.println("啦啦啦阿拉"+(char)e.getKeyCode());
                if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        y+=3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        y-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        x+=3;
                }
                //调用repain函数,来重画界面
                this.repaint();
        }

       
        //被松开
        @Override
        public void keyReleased(KeyEvent e) {
        }

        //输入具体信息
        @Override
        public void keyTyped(KeyEvent e) {
        }
}

我是模仿这个写的让他动起来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 14:38:52 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-3-29 14:40 编辑

...........你这个监听的 this.repaint();是重新绘制的panel,不是你tank,你要重写Jpanel里面的paint函数,然后在paint函数里绘制tank实例
1、这段放开:
//        public void paint(Graphics g){
//                tank.draw(g);
//        }

2、下面的x,y改成tank.x,tank.y(当然要在x,y是public属性),这里是要修改游戏中tank 的位置,不是panel的位置:
if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        y-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        x+=3;
                }

你可以看我给你的代码,可以运行的,而且坦克的朝向也会根据方向变化。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 16:59:41 | 显示全部楼层
zlj19931010 发表于 2017-3-29 14:38
...........你这个监听的 this.repaint();是重新绘制的panel,不是你tank,你要重写Jpanel里面的paint函数 ...

谢谢大佬= =我就想知道我的这个可以改成功不,因为这是老师的作业在他原有基础上改让坦克动起来......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-29 17:38:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zlj19931010 于 2017-3-29 17:45 编辑
十六是只仙 发表于 2017-3-29 16:59
谢谢大佬= =我就想知道我的这个可以改成功不,因为这是老师的作业在他原有基础上改让坦克动起来......


可以的,你把游戏中的tank实例传递到TankMove实例中
比如构造传入:
public TankMove (Tank tank){
    this.tank = tank;
}
然后
public void paint(Graphics g){
                tank.draw(g);
        }
然后监听器里面:
public void keyPressed(KeyEvent e) {
               
                if(e.getKeyCode()==KeyEvent.VK_DOWN){
                        tank.y += 3;
                }else if(e.getKeyCode()== KeyEvent.VK_UP){
                        tank.y -= 3;
                }else if(e.getKeyCode()== KeyEvent.VK_LEFT){
                        tank.x-=3;
                }else if(e.getKeyCode()== KeyEvent.VK_RIGHT){
                        tank.x+=3;
                }
                //调用repain函数,来重画界面
                this.repaint();
               
        }

逻辑这样是通的,你自己调试下,我就知道以前上学的时候碰到过一个repaint的坑,你已经开了一个线程在一直repaint,这里不知道会不会阻塞,忘记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-29 18:10:05 | 显示全部楼层
zlj19931010 发表于 2017-3-29 17:38
可以的,你把游戏中的tank实例传递到TankMove实例中
比如构造传入:
public TankMove (Tank tank){

感动世界!!!谢谢我总算弄出来了.....但是,想再请教一个小问题,我想加一个按钮....
public class TankGameWindow extends Frame implements ActionListener{
                Tank tank;
                TankMove area;
               
                public void initFrame(){
                        this.setVisible(true);
                        this.setLocation(300,300);//实现坦克大战的窗口,且填充了背景颜色
                        this.setSize(800,500);
                        this.setTitle("CRAZY TANK");
                        this.setResizable(false);
                        this.setBackground(Color.green);
               
                        this.addWindowListener(new WindowAdapter()
                        {
                                public void windowClosing(WindowEvent e){
                                        System.exit(0);
                                }
                        });
                        tank=new Tank(300,300,Color.red);
                        Thread t;
                        t=new Thread(new PaintThread());
                        t.start();
                        area = new TankMove(tank);
                        this.addKeyListener(area);
               
                JButton jb = new JButton("变色");
                        jb =new JButton("变色");
                        jb.add(jb, BorderLayout.NORTH);

                }方法应该没有弄错.....但是为什么运行出来没有按钮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 09:41:54 | 显示全部楼层
十六是只仙 发表于 2017-3-29 18:10
感动世界!!!谢谢我总算弄出来了.....但是,想再请教一个小问题,我想加一个按钮....
public class Ta ...

你把 jb.add(jb, BorderLayout.NORTH);
改成
this.add(jb, BorderLayout.NORTH);
this:指的是当前Frame
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 20:21:39 | 显示全部楼层
zlj19931010 发表于 2017-3-30 09:41
你把 jb.add(jb, BorderLayout.NORTH);
改成
this.add(jb, BorderLayout.NORTH);

JButton jb = new JButton("变色");
                        jb =new JButton("变色");
                        this.add(jb, BorderLayout.NORTH);


这样改了,还是没有变化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 09:54:29 | 显示全部楼层
本帖最后由 zlj19931010 于 2017-3-31 13:36 编辑
十六是只仙 发表于 2017-3-30 20:21
JButton jb = new JButton("变色");
                        jb =new JButton("变色");
                        this.add(jb, BorderLayout.NORT ...


因为你开了个绘画线程,你这个按钮一直在被覆盖绘制,你把鼠标移动到最上面会闪出来button按钮

我想想怎么解决,最近开发中有点忙......

我中午研究下,有问题。。。。

你把继承的Frame改成JFrame,你需要自定义面板,应该用JFrame
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 13:35:17 | 显示全部楼层
我现在改了下,一个frame,上面放操作按钮toppanel
下面是游戏界面 gamepanel
QQ截图20170331133241.png

点击之后变色

点击之后变色
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-7 20:13:46 | 显示全部楼层
过来膜拜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表