| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2263 人关注过本帖
标题:韩顺平老师java学习视频过程中关于坦克大战的问题求解!
只看楼主 加入收藏
mukvin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
韩顺平老师java学习视频过程中关于坦克大战的问题求解!
rt,在自学java过程当中跟着是韩老师的视频,也是学习到了现在,不过小白基础略差,不会找出到底是哪里的问题,哪位大神能否帮忙指点一二,谢谢了!学习半途,真是好怕这种的搞不过去的,太心烦了!拜托了,谢谢大家!不是请求大神帮忙完善,只请求大神能指出,我哪里的错误导致了这个坦克动不了,谢谢了!,代码如下
/*
 * 功能:坦克游戏1.0
 * 1.画出坦克
 * 2.我的坦克可以上下左右移动
 *
 */
package com.test01;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class MyTankGame2 extends JFrame {

    Mypanel mp = null;

    public static void main(String[] args) {
        MyTankGame2 mTankGame = new MyTankGame2();
    }
    // 构造函数
    public MyTankGame2() {
        mp = new Mypanel();
        this.add(mp);
        //注册监听
        this.addKeyListener(mp);
        this.setSize(400, 300);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
// 我的panel
class Mypanel extends Panel implements KeyListener {
    // 重写paint函数
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0, 0, 400, 300);      
        this.drawTank(hero.getX(), hero.getY(), g, 0, 1);
    }
    // 定义一个我的坦克
    Hero hero = null;
    // 构造函数
    public Mypanel() {
        hero = new Hero(100, 100);
    }
    // 画出坦克的函数
    public void drawTank(int x, int y, Graphics g, int direct, int type) {
        //判断是什么类型的坦克
        switch (type) {
        case 0:
            g.setColor(Color.cyan);
            break;
        case 1:
            g.setColor(Color.yellow);
            break;
        }
        //判断方向
        switch (direct) {
        //向上
        case 0:
            // 画出我的坦克(到时在封装)
            // 1.画出左边的矩形
            g.fill3DRect(x, y, 5, 30, false);
            // 2.画出右边的矩形
            g.fill3DRect(x + 15, y, 5, 30, false);
            // 3.画出中间的矩形
            g.fill3DRect(x + 5, y + 5, 10, 20, false);
            // 4.画出圆形
            g.fillOval(x + 5, y + 10, 10, 10);
            // 5.画出线
            g.drawLine(x + 10, y + 15, x + 10, y);
            break;
        }
    }   
    public void keyTyped(KeyEvent e) {        
    }
    //键按下处理 a表示向左 s表示向下 d表示向右  w表示向上
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()== KeyEvent.VK_W){
            //设置我的坦克的方向
            //向上
            this.hero.setDirect(0);
            this.hero.moveUp();
        }else if (e.getKeyCode() == KeyEvent.VK_D) {
            //向右
            this.hero.setDirect(1);
            this.hero.moveRight();
        }else if (e.getKeyCode() ==KeyEvent.VK_S) {
            // 向下
            this.hero.setDirect(2);
            this.hero.moveDown();
        }else if (e.getKeyCode()==KeyEvent.VK_A) {
            //向左
            this.hero.setDirect(3);
            this.hero.moveLeft();
        }            
        //必须重新绘制Panel
        this.repaint();
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub      
    }
}
// 定义一个坦克类
class Tank {
    // 表示坦克的横坐标
    int x = 0;
    // 坦克的纵坐标
    int y = 0;
   
    //坦克方向
    // 0 表示上,1表示右,2表示下, 3表示左
    int direct=0;
   
    //设置坦克的速度
    int speed =5;
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public int getDirect() {
        return direct;
    }
    public void setDirect(int direct) {
        this.direct = direct;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
// 我的坦克
class Hero extends Tank {
    public Hero(int x, int y) {
        super(x, y);
    }
    //坦克向上移动
        public void moveUp(){
            y-=speed;
        }      
        //坦克向右移动
        public  void moveRight(){
            x+=speed;
        }        
        //坦克向下移动
        public void moveDown(){
            y+=speed;
        }        
        //坦克向左移动
        public void moveLeft(){
            x-=speed;
        }   
}

搜索更多相关主题的帖子: 坦克 public void this int 
2017-08-06 18:02
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
原因分析为Mypanel 没有添加对键盘监听,可以通过构造器等其他方式在合理时机实现监听
如下:
程序代码:
 // 构造函数
    public Mypanel() {
        hero = new Hero(100, 100);
        this.addKeyListener(this);
    }

建议:
键盘监听的三个方法没有用到可以考虑定义继承适配器的对象进行监听添加。

剑栈风樯各苦辛,别时冰雪到时春
2017-08-06 20:16
mukvin
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2015-9-20
收藏
得分:0 
回复 2楼 林月儿
好厉害,谢谢你的回复!不知道是不是我对于视频观察过程没有仔细的缘故吗,好像那个韩顺平老师设置的监听在MyTankGame2的函数里面,而hero函数里面没有书写监听可以使用,好奇怪啊,能不能告诉我原因,而且使用你的方法,就马上ok了。我好像如果注销了在MyTankGame2的函数里面的那个键盘监听竟然也是可以的,是版本问题吗?
2017-08-06 20:45
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:20 
以下是引用mukvin在2017-8-6 20:45:31的发言:

好厉害,谢谢你的回复!不知道是不是我对于视频观察过程没有仔细的缘故吗,好像那个韩顺平老师设置的监听在MyTankGame2的函数里面,而hero函数里面没有书写监听可以使用,好奇怪啊,能不能告诉我原因,而且使用你的方法,就马上ok了。我好像如果注销了在MyTankGame2的函数里面的那个键盘监听竟然也是可以的,是版本问题吗?


你说的视频没看过,不太了解。你可以试着改成继承JPanel而不是Panel,应该是不用加监听了。
按道理说,你的场地,敌机,换向等等还是要仔细分析逐步优化的。
提个建议,不用拘泥于一种实现方式,灵活应变才算是掌握。

剑栈风樯各苦辛,别时冰雪到时春
2017-08-06 21:38
快速回复:韩顺平老师java学习视频过程中关于坦克大战的问题求解!
数据加载中...
 
   



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

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