韩顺平java视频的java系列中的坦克大战部分,怎么实现坦克边走边打子弹

&>&韩顺平JAVA坦克大战源码
韩顺平JAVA坦克大战源码
上传大小:52KB
照着韩顺平JAVA课程-坦克大战敲出来的代码,包含炸弹图片,炸弹音效自己随便下载一个。
说明:JAVA自带的声音播放功能很不完成,音频非原生WAV格式可能无法播放,不要被后缀欺骗。而且JAVA自带声音播放功能在多音效同时生效效果不好。声音功能建议网上其他地方自学JMF。 源码中不包含JMF部分的内容。
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
综合评分:
积分/C币:3
综合评分:
积分/C币:3
综合评分:
积分/C币:4
JavaDynamic
综合评分:
积分/C币:5
综合评分:
积分/C币:3
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
韩顺平JAVA坦克大战源码
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
韩顺平JAVA坦克大战源码我在做韩顺平老师视频教程中的坦克大战,但上面没有详细介绍暂停效果怎么做,有哪位高手会做的指点一下啊~_百度知道
我在做韩顺平老师视频教程中的坦克大战,但上面没有详细介绍暂停效果怎么做,有哪位高手会做的指点一下啊~
我有更好的答案
希望你能找到给你推荐一款在线 金达屏幕录像 专家 (软件请百度搜索),金达是一款完全基于Web浏览器的网页版屏幕录像专家。它能够在线录制你的电脑屏幕操作视频,并可即时发布到金达网分享。你还可以设置预览一段时间后必须支付金币才能继续观看,以获得分成收入。 使用金达屏幕录像专家,你无需下载安装(需要Java虚拟机的支持),便可以很轻松的在线录制视频教程,支持Windows和Mac系统,支持麦克风声音录入、区域录制等,值得一提的是,金达录制的视频质量非常高,并且可以导出到本地保存。金达网目前已经有网友发布了成千上万的各种视频教程,无论是新手上网、办公应用,还是PS图片、网站编程等,很不错哦,你可以试下~·完全免费的·~~·还能赚钱·~~小知识:无可非议;没有什么可以指摘的。【辨:无可厚非】
你可以将坦克类里面的速度和子弹类里面的速度设为静态,然后就可以直接用啦。Tank.speed=0;所有都不能动了,方向也要设置
可以再Record类中定义一个public static 的布尔类型变量(例如sava_flag)初始化为flase
在所有的线程的while(true)后面加上if(!save_flag){}包住里面的方向变化、移动的功能代码在响应暂停键的时候让sava_flag =这样因为线程中使子弹、坦克自动移动的代码块没有得到执行,自然就暂停了
为您推荐:
其他类似问题
韩顺平的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。坦克大战爆炸图片素材_中华文本库
坦克大战爆炸效果图_英语学习_外语学习_教育专区。韩顺平老师坦克大战项目爆炸渐进图 在学习韩顺平老师的 java 视频时,在做到坦克大战项目的时候,会需要三张坦克爆炸...
海量优质文档,通通免费送!韩顺平循序渐进学java坦克大战全过程(2)即第四十讲到四十二讲_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
韩顺平循序渐进学java坦克大战全过程(2)即第四十讲到四十二讲
&&韩顺平循序渐进学java坦克大战全过程(2)即第四十讲到四十二讲
你可能喜欢利用Java语言中的集合、Swing、线程等知识点编写一个坦克大战游戏。(1) 画出敌我坦克的原理:在坦克类里面有一个布尔类型变量good。用于判断坦克的阵营,在创建坦克对象时在Tank类的构造方法中传入good的值。在画坦克的时候判断good的值,区分敌我坦克的颜色;(2) 坦克运动的原理:在坦克类里写入了监听键盘摁键的响应事件,对监听到的上下左右键进行记录,并合成坦克移动的八个方向的变量。之后对应每个方向的不同对坦克坐标x,y的值做响应的更改实现我方坦克的移动。而敌方坦克则自动移动,通过随机数对敌方坦克移动方向的随机,并且随机出每次移动的次数。两个随机值相结合即实现了敌方坦克的移动。(3) 坦克发射子弹的原理:通过键盘监听,检测到发射子弹命令后将主类的子弹类集合中添加一个子弹类。将炮筒的方向以及坦克的位置以及坦克的阵营传入给子弹类,在主类paint画方法中一直循环子弹类集合,如果集合内有子弹,就画出来。这样就实现了发射子弹。(4) 坦克、子弹、墙的碰撞原理:在坦克类子弹类墙类中分别getRect方法获取自身的范围,然后在每次画坦克、子弹时都会进行相应的碰撞检测(在坦克类里有与墙和出自己外的坦克相撞的处理方法、在子弹类里有与墙和坦克相碰撞的处理方法。),如果自身与不该碰撞的物体的范围相重合,则代表两物体相撞。(5)坦克加血的原理:
在血块类中有血块与我方坦克相碰撞的处理方法,如果血块范围与坦克范围重合则血块类死亡,并且坦克类的血量回复置满。(6)坦克复活的原理:通过键盘监听,检测到我方坦克复活命令后,如果我方坦克处于死亡状态,则将我方坦克存货状态改为活着并且将我方坦克血量回置满血。
&编程思想:
坦克大战的编程思想在主类开启一个线程,没50毫秒循环一次画方法(绘制整个界面内的所有东西)。画的东西有敌我坦克(颜色区分)、子弹、墙、血块、爆炸。所以总共写出了几个类:Tank坦克类、Missile子弹类、Wall墙类、Blood血块类、TankClient主类。在每一个类中均写有画方法实现本类属性的绘制功能。在主类中有键盘监听事件调用这Tank类的键盘监听事件。通过键盘监听判断出对Tank做出相应的移动,而敌方Tank则是随机运动。并且每次刷新都有调用各类的碰撞方法,判断一些不该碰撞的对象的情况时做出处理。而每个对象的创建例如子弹这些是在触发产生之后将新建子弹类加入一个子弹类集合之中,在绘制的时候判断集合中的数量进行绘制,出界或者打死坦克则在集合中删除。其他类也均相似,不在细说。
代码中每步都注释有相应的解释。
TankClient.java
1 import java.awt.C
2 import java.awt.F
3 import java.awt.G
4 import java.awt.I
5 import java.awt.event.KeyA
6 import java.awt.event.KeyE
7 import java.awt.event.WindowA
8 import java.awt.event.WindowE
9 import java.util.ArrayL
10 import java.util.L
12 import javax.swing.JF
14 public class TankClient extends JFrame{
* @param args
Image OffScrennImage = null;
//双缓冲内存图片存储
/*游戏大小*/
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGTH = 600;
Tank myTank = new Tank(500,400,true,Color.red,Tank.Direction.STOP, this);//我方坦克类
List&Missile& missiles = new ArrayList&Missile&();//子弹的集合
List&Explode& explode = new ArrayList&Explode&();//爆炸集合
List&Tank& tanks = new ArrayList&Tank&();
//坦克集合
Wall wall1 = new Wall(150,200,20,300,this);
Wall wall2 = new Wall(250,500,300,20,this);
Wall wall3 = new Wall(650,200,20,300,this);
Wall wall4 = new Wall(250,300,300,20,this);
Wall wb = new Wall(750,550,40,40,this);
Blood b = new Blood();
public static void main(String[] args) {
// TODO Auto-generated method stub
TankClient tc=new TankClient();
tc.lauchFrame();
private void lauchFrame() {
// TODO Auto-generated method stub
for (int i = 0; i & 10; i++){
tanks.add(new Tank(50+40*(i+1), 50, false,Color.blue,Tank.Direction.D, this));
this.setLocation(100, 100);
//窗口初始坐标点
this.setSize(GAME_WIDTH, GAME_HEIGTH);
//窗口初始大小
this.setTitle("TankWar");
//窗口名称
/*窗口监听*/
this.addWindowListener(new WindowAdapter() {
/*点退出叉之后运行*/
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
this.addKeyListener(new KeyMoniton());
//设置键盘监听
this.setVisible(true);
//设置窗口显现
this.setResizable(false);
//设置窗口不可改变大小
this.getContentPane().setBackground(Color.green);
//设置窗口前景色为绿色
new Thread(new PaintThread()).start();
//开始运行PaintThread类run
public void paint(Graphics g) {
// TODO Auto-generated method stub
//Graphics为画笔类
super.paint(g);
myTank.draw(g);
wall1.draw(g);
wall2.draw(g);
wall3.draw(g);
wall4.draw(g);
wb.draw(g);
b.draw(g);
myTank.eatBlood(b);
myTank.hitWall(wall1);
myTank.hitWall(wall2);
myTank.hitWall(wall3);
myTank.hitWall(wall4);
/*循环子弹集合*/
for (int i = 0; i & missiles.size(); i++){
Missile m = missiles.get(i);
//获取当前子弹
m.hitTanks(tanks);
//自己子弹打死敌方坦克
m.hitWall(wall1);
//子弹与墙
m.hitWall(wall2);
m.hitWall(wall3);
m.hitWall(wall4);
m.hitTank(myTank);//敌人子弹打击自己的坦克
m.draw(g);
(int i = 0; i & explode.size(); i++){
explode.get(i).draw(g);
for (int i = 0; i & tanks.size(); i++){
Tank t = tanks.get(i);
t.draw(g);
//画敌方坦克
t.hitTanks(tanks);
t.hitWall(wall1);
//坦克与墙
t.hitWall(wall2);
t.hitWall(wall3);
t.hitWall(wall4);
//g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString("missiles
count:"+missiles.size(), 10, 50);//显示
g.drawString("explode
count:"+explode.size(), 10, 80);//显示
g.drawString("tanks count:"+tanks.size(),10, 110);
g.drawString("myTank Life:"+myTank.getLife(), 10, 130);
g.drawString("回血:", 750, 540);
g.drawString("方向键移动方向;E:释放移动血快", 10, 590);
g.drawString("z:发射东风-31;a:发射东风-41;", 10, 570);
g.drawString("F2:复活;F3:敌方复活(对多20)", 10, 550);
g.drawString("R:位置还原;Q:血量加满", 10, 530);
/*repaint-〉update-&paint*/
public void update(Graphics g) {
// TODO Auto-generated method stub
super.update(g);
if(OffScrennImage == null)
OffScrennImage = this.createImage(GAME_WIDTH, GAME_HEIGTH);
Graphics goffscrenn = OffScrennImage.getGraphics();
//设置一个内存画笔颜色为前景图片颜色
Color c = goffscrenn.getColor();
//还是先保存前景颜色
goffscrenn.setColor(Color.green);
//设置内存画笔颜色为绿色
goffscrenn.fillRect(0, 0, GAME_WIDTH, GAME_HEIGTH);
//画成图片,大小为游戏大小
goffscrenn.setColor(c);
//还原颜色
g.drawImage(OffScrennImage, 0, 0, null);
//在界面画出保存的图片
paint(goffscrenn);
//把内存画笔调用给paint
private class PaintThread implements Runnable{
public void run() {
// TODO Auto-generated method stub
while(true){
repaint();
//运行顺序repaint-&update-&paint
Thread.sleep(50);
//每隔50毫秒刷新画面一次
}catch(Exception e){
e.printStackTrace();
/*键盘响应*/
private class KeyMoniton extends KeyAdapter{
/*摁下键盘响应*/
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
super.keyPressed(e);
myTank.KeyPressed(e);
/*抬起键盘响应*/
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
super.keyReleased(e);
myTank.keyReleased(e);
1 import java.awt.C
2 import java.awt.G
3 import java.awt.I
4 import java.awt.R
5 import java.awt.event.KeyE
6 import java.util.L
7 import java.util.R
9 import javax.swing.ImageI
12 public class Tank {
/*坦克本身数据*/
int x,//坦克坐标
private int oldX, oldY;
//坦克上一步坐标
public static final int Whith = 30;
public static final int Higth = 30;
public static final int XSPEED = 5;
//横向移动速度
public static final int YSPEED = 5;
//纵向移动速度
//坦克颜色
private boolean bL=false, bU=false, bR=false, bD=false;
//四个方向控制值
enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};
//由四个方向值合成八个方向的移动
private Direction dir = Direction.STOP;
//出场方向
private Direction ptDir = Direction.D;
//炮筒初始方向
private boolean
//判断坦克的阵营
private boolean live = true;
//判断坦克是否存活
private static Random r = new Random();//设置一个随机值变量
private static int step = r.nextInt(12)+3;
//敌方坦克随机移动步骤3-14步
private int Life = 100;
private BloodBar bb = new BloodBar();
ImageIcon icon = new ImageIcon("res\\myTank.jpg");
ImageIcon icon2 = new ImageIcon("res\\enemyTank.jpg");
Image image = icon.getImage();
Image image2 = icon2.getImage();
private TankC
//主类权限
public Tank(int x, int y, boolean good, Color color) {
this.color =
this.good =
public Tank(int x, int y, boolean good,Color color,Direction dir,TankClient tc){
this(x,y,good,color);
this.dir =
/*获取坦克生命值*/
public int getLife() {
/*设置坦克生命值*/
public void setLife(int Life) {
this.Life = L
/*获取坦克阵营*/
public boolean isGood() {
/*设置坦克阵营*/
public void setGood(boolean good) {
this.good =
/*获取坦克存活状态*/
public boolean isLive() {
/*设置坦克存活状态*/
public void setLive(boolean live) {
this.live =
/*画坦克*/
public void draw(Graphics g){
if(!live){
if(!good){
tc.tanks.remove(this);
//敌方坦克死亡时在集合中删除
//tc.tanks.add(new Tank(r.nextInt(700),r.nextInt(500),false,Color.blue,Direction.D,this.tc));
/*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
Color c = g.getColor();
//获取当前画笔颜色
g.setColor(color);
//设置画笔颜色为红色
/*画坦克*/
g.fillOval(x, y, Whith, Higth);
/*两种方法绘制敌我坦克,运用之前加入的图片或者颜色区分*/
g.drawImage(image, x, y,Whith,Higth,null);
g.drawImage(image2, x, y, Whith, Higth, null);
bb.draw(g);
//我方坦克画血条
g.setColor(Color.black);
/*通过炮筒方向画出炮筒*/
switch(ptDir){
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth/2);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth/2);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith, y+Tank.Higth);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x+Tank.Whith/2, y+Tank.Higth);
g.drawLine(x+Tank.Whith/2, y+Tank.Higth/2, x, y+Tank.Higth);
g.setColor(c);
//还原画笔颜色
move();//移动
/*键盘监听;摁键*/
public void KeyPressed(KeyEvent e){
int key = e.getKeyCode();
//将键盘监听到的摁键以整数保存
/*键盘移动坦克*/
switch(key){
/*移动摁键*/
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_LEFT:
locateDirection();
/*键盘监听;抬起键*/
public void keyReleased(KeyEvent e){
int key = e.getKeyCode();
//将键盘监听到的摁键以整数保存
/*键盘移动坦克*/
switch(key){
case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN:
case KeyEvent.VK_RIGHT:
case KeyEvent.VK_LEFT:
case KeyEvent.VK_Z:
//单发子弹
case KeyEvent.VK_F2:
//我方复活
if(!this.live){
this.live=true;
this.setLife(100);
case KeyEvent.VK_F3:
//敌方复活
case KeyEvent.VK_A:
//无敌导弹
superFire();
case KeyEvent.VK_Q:
if(this.live)
this.Life = 100;
case KeyEvent.VK_E:
//释放血块
tc.b.fh();
/*还原位置键*/
case KeyEvent.VK_R:
locateDirection();
//合成方向
/*合成移动方向*/
void locateDirection(){
if(bL&&!bU&&!bR&&!bD) dir=Direction.L;
else if(bL&&bU&&!bR&&!bD) dir=Direction.LU;
else if(!bL&&bU&&!bR&&!bD) dir=Direction.U;
else if(!bL&&bU&&bR&&!bD) dir=Direction.RU;
else if(!bL&&!bU&&bR&&!bD) dir=Direction.R;
else if(!bL&&!bU&&bR&&bD) dir=Direction.RD;
else if(!bL&&!bU&&!bR&&bD) dir=Direction.D;
else if(bL&&!bU&&!bR&&bD) dir=Direction.LD;
else if(!bL&&!bU&&!bR&&!bD) dir=Direction.STOP;
void move(){ //移动
/*记录上一步的位置*/
switch(dir){
x-=XSPEED;
x-=XSPEED;
y-=YSPEED;
y-=YSPEED;
x+=XSPEED;
y-=YSPEED;
x+=XSPEED;
x+=XSPEED;
y+=YSPEED;
y+=YSPEED;
x-=XSPEED;
y+=YSPEED;
case STOP:
/*判断坦克移动越界情况(游戏边界)*/
if(y & 25)
if(x+Whith & tc.GAME_WIDTH-5)
x = tc.GAME_WIDTH-Whith-5;
if(y+Higth & tc.GAME_HEIGTH-5) y = tc.GAME_HEIGTH-Higth-5;
if(dir != Direction.STOP)
//如果坦克不静止就改变炮筒方向
/*敌方坦克自动移动*/
if(!good){
Direction[] dirs = Direction.values();
//将方向变量设为数组
if(step == 0){
step = r.nextInt(12)+3;
//随机移动步骤
int randomNumber = r.nextInt(dirs.length);
//随机移动方向
dir = dirs[randomNumber];
if(r.nextInt(40)&30) this.fire();
//随机是否发射炮弹
/*敌方坦克复活*/
public void fuhuo(){
if(tc.tanks.size() & 20)
while(true){
int x = r.nextInt(700);
int y = r.nextInt(500);
Tank t = new Tank(x,y,false,Color.blue,Direction.D,tc);
/*如果坦克与墙重合则重新随机位置直到不重合为止才将新坦克加入集合*/
if(t.getRect().intersects(tc.wall1.getRect())||t.getRect().intersects(tc.wall2.getRect())
||t.getRect().intersects(tc.wall3.getRect())
||t.getRect().intersects(tc.wall4.getRect())){
tc.tanks.add(t);
/*子弹发射*/
public void fire(){
int x = this.x + Whith/2 - Missile.Whith/2;
//控制子弹方向为坦克中间
int y = this.y + Higth/2 - Missile.Higth/2;
tc.missiles.add(new Missile(ptDir,color,x,y,good,tc)); //创建新的子弹类加入到子弹集合中
/*碰撞;获取坦克的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,Whith,Higth);
/*回执上一步位置*/
private void stay(){
/*如果撞墙,调用stay方法,返回上一步位置*/
public boolean hitWall(Wall w){
if(this.live&&this.getRect().intersects(w.getRect())){
this.stay();
return true;
return false;
/*坦克互相撞击事件*/
public boolean hitTanks(List&Tank& tanks){
for(int i=0;i&tanks.size();i++){
Tank t=tanks.get(i);
if(this!=t){//自己与自己不可相撞
/*如果相撞返回上一步位置*/
if(this.live&&t.isLive()&&this.getRect().intersects(t.getRect())){
this.stay();
return true;
return false;
/*带开火方向的发射函数*/
public Missile fire(Direction dir){
if(!live) return null;
int x=this.x+Whith/2-Missile.Whith/2;
int y=this.y+Higth/2-Missile.Higth/2;
Missile m=new Missile(dir,color,x, y,good, this.tc);
tc.missiles.add(m);
/*超级射击导弹*/
private void superFire(){
Direction[] dirs=Direction.values();
for(int i=0;i&8;i++){
fire(dirs[i]);//循环调用八个方向
/*新增血块类*/
private class BloodBar{
/*画血条*/
public void draw(Graphics g){
Color c=g.getColor();
g.setColor(Color.red);
g.drawRect(x, y-10, Whith, 10);
int w=Whith*Life/100;
g.fillRect(x, y-10, w, 10);
g.setColor(c);
/*吃血方法*/
public boolean eatBlood(Blood b){
if(this.live&&b.isLive()&&this.isGood()&&this.getRect().intersects(b.getRect())){
this.setLife(100);
b.setLive(false);
return true;
if(this.getRect().intersects(tc.wb.getRect()))
this.Life = 100;
return false;
Missile.java
1 import java.awt.C
2 import java.awt.G
3 import java.awt.R
4 import java.util.L
6 public class Missile {
/*子弹本身数据*/
//子弹方向
//子弹颜色
//子弹位置
public static final int XSPEED = 15;
//横向移动速度
public static final int YSPEED = 15;
//纵向移动速度
public static final int Whith = 10;
public static final int Higth = 10;
private boolean live = true;
//判断子弹的存活
private boolean
//判断子弹和阵营
private TankC//主类权限
public Missile(Tank.Direction dir,Color c, int x, int y) {
this.dir =
public Missile(Tank.Direction dir,Color c, int x, int y,boolean good,TankClient tc){
this(dir,c,x,y);
this.good =
/*获取子弹的存活*/
public boolean isLive() {
/*设置子弹的存活*/
public void setLive(boolean live) {
this.live =
public void draw(Graphics g){
/*如果子弹死亡状态将这个子弹在子弹集合中删除*/
if(!live){
tc.missiles.remove(this);
//集合中删除
/*先保存之前的画笔颜色,画完之后再还原画笔颜色*/
Color d = g.getColor();
//获取当前画笔颜色
g.setColor(c);
//设置画笔颜色为红色
/*画子弹*/
g.fillOval(x, y, Whith, Higth);
g.setColor(d);
//还原画笔颜色
public void move(){
/*判断移动方向移动坦克位置*/
switch(dir){
x-=XSPEED;
x-=XSPEED;
y-=YSPEED;
y-=YSPEED;
x+=XSPEED;
y-=YSPEED;
x+=XSPEED;
x+=XSPEED;
y+=YSPEED;
y+=YSPEED;
x-=XSPEED;
y+=YSPEED;
case STOP:
/*判断子弹的越界情况;出界则子弹死亡,在子弹集合中删去*/
if(x&0||y&0||x&TankClient.GAME_WIDTH||y&TankClient.GAME_HEIGTH)
live = false;
/*碰撞;获取子弹的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,Whith,Higth);
/*子弹与坦克碰撞过程*/
public boolean hitTank(Tank t){
/*如果子弹与坦克在同一范围则子弹和坦克同时死亡;且子弹只能杀死对方坦克*/
if(this.live&&this.getRect().intersects(t.getRect())&&t.isLive()&&this.good!=t.isGood()){
if(t.isGood()){ //好坦克
/*我方坦克子弹射中会减少生命值,生命值0的时候会死亡*/
t.setLife(t.getLife()-20);
if(t.getLife()&=0)
t.setLive(false);
}else{ //坏坦克
t.setLive(false);//死亡
this.live=false;//子弹死亡
tc.explode.add(new Explode(x, y, tc));//新建爆炸加入集合
return true;
return false;
/*循环坦克集合分别进行判断子弹碰撞*/
public boolean hitTanks(List&Tank& tanks){
(int i = 0; i & tanks.size(); i++){
if(hitTank(tanks.get(i)))
return true;
return false;
/*子弹与墙的碰撞过程*/
public boolean hitWall(Wall w){
/*如果子弹与墙的范围重合子弹死亡*/
if(this.live&&this.getRect().intersects(w.getRect())){
this.live=false;
//子弹死亡
return true;
return false;
1 import java.awt.G
2 import java.awt.R
5 public class Wall {
/*墙数据*/
int x,y,w,h;
//位置和宽高
private TankC
//主类权限
public Wall(int x, int y, int w, int h, TankClient tc) {
/*获取墙的范围*/
public Rectangle getRect(){
return new Rectangle(x,y,w,h);
public void draw(Graphics
g.fillRect(x, y, w, h);
Explode.java
import java.awt.C
import java.awt.G
public class Explode {
/*坦克爆炸属性*/
//爆炸位置
private boolean live = true;
//爆炸是否存在
int step = 0;
//爆炸时间控制
int [] diameter = new int[] {4, 7, 12, 18, 26, 32, 49, 56, 65, 77, 80, 50, 40, 30, 14, 6};//爆炸范围
private TankC
//主类权限
public Explode(int x, int y, TankClient tc) {
/*画爆炸*/
public void draw(Graphics g){
if(!live) return;
//如果爆炸死亡状态不画结束
/*如果爆炸时间结束爆炸不存在并在集合中删除*/
if(step == diameter.length){
live = false;
//爆炸死亡
//步骤时间归0
tc.explode.remove(this);
//集合中删除
/*画爆炸*/
Color c = g.getColor();
g.setColor(Color.orange);
g.fillOval(x, y, diameter[step], diameter[step]);
g.setColor(c);
Blood.java
1 import java.awt.C
2 import java.awt.G
3 import java.awt.R
4 import java.util.R
7 public class Blood {
/*血块数据*/
int x, y, w,//血块位置和大小
private TankC
//主类权限
private boolean live=true;//血块的存活
private static Random r = new Random();//设置一个随机值变量
/*获取血块的存活状态*/
public boolean isLive() {
/*设置血块的存活状态*/
public void setLive(boolean live) {
this.live =
/*血块位置初值随机一个数值*/
public Blood(){
x=r.nextInt(600)+100;
y=r.nextInt(400)+100;
/*画血块*/
public void draw(Graphics g){
if(!live) return;
Color c=g.getColor();
g.setColor(Color.magenta);
g.fillRect(x, y, w, h);
g.setColor(c);
/*释放血块*/
public void fh(){
if(!live){
x = r.nextInt(600)+100;
y = r.nextInt(400)+100;
live = true;
/*获取血块范围*/
public Rectangle getRect(){
return new Rectangle(x, y, w, h);
阅读(...) 评论()

我要回帖

更多关于 韩顺平java笔记 的文章

 

随机推荐