【0基础学java】教学日志:项目实战-坦克大战-3
本章概述:本章主要讲了
1、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移。
2、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用。
3、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的。
4、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来。
5、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
目录
本章概述:
一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移
1、TankFrame
2、Dir
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
2、Tank
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
2、Tank
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
2、Tank
3、Bullet
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
2、Tank
运行效果
本章概述:
一、定义坦克方向的enum,根据按键状态确定坦克方向,根据坦克方向确定坦克位移
1、TankFrame
package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {int x = 200,y=200;Dir dir = Dir.DOWN;static final int SPEED = 10;public TankFrame(){
@ -33,10 +35,25 @@ public class TankFrame extends Frame {@Overridepublic void paint(Graphics g) {
// System.out.println("paint");g.fillRect(x,y,50,50);
// x += 10;
// y += 50;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}class MyListener extends KeyAdapter{
@ -47,7 +64,6 @@ public class TankFrame extends Frame {boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {
// System.out.println("pressed");int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -65,11 +81,40 @@ public class TankFrame extends Frame {default:break;}setMainTankDir();}@Overridepublic void keyReleased(KeyEvent e) {
// System.out.println("released");int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;default:break;}setMainTankDir();}private void setMainTankDir() {if(bL) dir = Dir.LEFT;if(bU) dir = Dir.UP;if(bR) dir = Dir.RIGHT;if(bD) dir = Dir.DOWN;}}}
2、Dir
public enum Dir {LEFT,UP,RIGHT,DOWN
}
二、抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用
1、TankFrame
package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {int x = 200,y=200;Dir dir = Dir.DOWN;static final int SPEED = 10;Tank myTank = new Tank(200,200,Dir.DOWN);public TankFrame(){setTitle("tank war");
@ -35,24 +32,8 @@ public class TankFrame extends Frame {@Overridepublic void paint(Graphics g) {g.fillRect(x,y,50,50);switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}myTank.paint(g);}@ -109,13 +90,13 @@}private void setMainTankDir() {if(bL) dir = Dir.LEFT;if(bU) dir = Dir.UP;if(bR) dir = Dir.RIGHT;if(bD) dir = Dir.DOWN;if(bL) myTank.setDir(Dir.LEFT);if(bU) myTank.setDir(Dir.UP);if(bR) myTank.setDir(Dir.RIGHT);if(bD) myTank.setDir(Dir.DOWN);}}}
2、Tank
package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){g.fillRect(x,y,50,50);move();}public void move(){switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}
三、添加坦克静止的处理,只要四个键都没有按下去,坦克就是静止的
1、TankFrame
package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);public TankFrame(){setTitle("tank war");setSize(800,600);setResizable(false);setVisible(true);this.addKeyListener(new MyListener());addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}@Overridepublic void paint(Graphics g) {myTank.paint(g);}class MyListener extends KeyAdapter{boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {myTank.setMoving(true);int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -68,6 +70,7 @@ public class TankFrame extends Frame {@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -94,9 +97,11 @@if(bU) myTank.setDir(Dir.UP);if(bR) myTank.setDir(Dir.RIGHT);if(bD) myTank.setDir(Dir.DOWN);if(!bL && !bU && !bR && !bD) myTank.setMoving(false);}}}
2、Tank
package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;private boolean moving = false;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}
@ -29,24 +39,26 @@}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}
四、定义子弹类,设定属性和方法,new出一颗新的子弹,在屏幕上画出来
1、TankFrame
package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);Bullet b = new Bullet(300,300,Dir.DOWN);public TankFrame(){setTitle("tank war");
@ -20,7 +21,7 @@ public class TankFrame extends Frame {setResizable(false);setVisible(true);this.addKeyListener(new MyListener());this.addKeyListener(new MyKeyListener());addWindowListener(new WindowAdapter() {@Override
@ -34,10 +35,11 @@ public class TankFrame extends Frame {public void paint(Graphics g) {myTank.paint(g);b.paint(g);}class MyListener extends KeyAdapter{class MyKeyListener extends KeyAdapter{boolean bL = false;boolean bU = false;
@ -45,8 +47,6 @@ public class TankFrame extends Frame {boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {myTank.setMoving(true);int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:
@ -93,14 +93,20 @@ public class TankFrame extends Frame {}private void setMainTankDir() {if(bL) myTank.setDir(Dir.LEFT);if(bU) myTank.setDir(Dir.UP);if(bR) myTank.setDir(Dir.RIGHT);if(bD) myTank.setDir(Dir.DOWN);if(!bL && !bU && !bR && !bD) myTank.setMoving(false);else {myTank.setMoving(true);if (bL) myTank.setDir(Dir.LEFT);if (bU) myTank.setDir(Dir.UP);if (bR) myTank.setDir(Dir.RIGHT);if (bD) myTank.setDir(Dir.DOWN);}}}}
2、Tank
package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 10;private static final int SPEED = 5;private boolean moving = false;public Tank(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){g.fillRect(x,y,50,50);move();}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}}
3、Bullet
package com.tencent.tank;import java.awt.*;public class Bullet {private int x,y;private static final int SPEED = 1;private Dir dir;static final int WIDTH = 30,HEIGHT = 30;public Bullet(int x,int y,Dir dir){this.x = x;this.y = y;this.dir = dir;}public void paint(Graphics g){Color c = g.getColor();g.setColor(Color.RED);g.fillOval(x,y,WIDTH,HEIGHT);g.setColor(c);move();}public void move(){switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}
五、按下space键,tank会火出一颗子弹,必须持有tankFrame的引用,把子弹传递给窗口,画出来
1、TankFrame
package com.tencent.tank;import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** @author YuPanpan* @version 1.0*/
public class TankFrame extends Frame {Tank myTank = new Tank(200,200,Dir.DOWN);Tank myTank = new Tank(200,200,Dir.DOWN,this);Bullet b = new Bullet(300,300,Dir.DOWN);static final int GAME_WIDTH = 800,GAME_HEIGHT = 600;public TankFrame(){setTitle("tank war");setSize(GAME_WIDTH,GAME_HEIGHT);setResizable(false);setVisible(true);this.addKeyListener(new MyKeyListener());addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}Image offScreenImage = null;@Overridepublic void update(Graphics g) {if (offScreenImage == null) {offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);}Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.BLACK);gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);}@Overridepublic void paint(Graphics g) {myTank.paint(g);b.paint(g);}class MyKeyListener extends KeyAdapter{boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;case KeyEvent.VK_SPACE:myTank.fire();break;default:break;}setMainTankDir();}@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch(key){case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;default:break;}setMainTankDir();}private void setMainTankDir() {if(!bL && !bU && !bR && !bD) myTank.setMoving(false);else {myTank.setMoving(true);if (bL) myTank.setDir(Dir.LEFT);if (bU) myTank.setDir(Dir.UP);if (bR) myTank.setDir(Dir.RIGHT);if (bD) myTank.setDir(Dir.DOWN);}}}}
2、Tank
package com.tencent.tank;import java.awt.*;public class Tank {private int x,y;private Dir dir;private static final int SPEED = 5;private boolean moving = false;public Tank(int x,int y,Dir dir){TankFrame tf = null;public Tank(int x,int y,Dir dir,TankFrame tf){this.x = x;this.y = y;this.dir = dir;this.tf = tf;}public boolean isMoving() {return moving;}public void setMoving(boolean moving) {this.moving = moving;}public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}public void paint(Graphics g){Color c = g.getColor();g.setColor(Color.BLUE);g.fillRect(x,y,50,50);g.setColor(c);move();}public void move(){if(!moving) return;switch(dir){case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;default:break;}}public void fire() {tf.b = new Bullet(this.x,this.y,this.dir);}
}
运行效果
【0基础学java】教学日志:项目实战-坦克大战-3相关推荐
- 【0基础学java】教学日志:javaSE-面向对象6-面向对象前4章上机作业点评,主要涉及继承、封装、多态三个章节的内容
目录 一.面向对象第一章上机作业参考答案(略) 二.面向对象第二章上机作业参考答案: 三.面向对象第三章上机作业参考答案: 1.上机练习1已在第三章博客中编写,请参考: 2.上机练习2 四.面向对象第 ...
- 0基础学Java需要多久?
0基础学Java需要多久?黑马程序员零基础系统学习的Java课程课时348小时,至少要学习5-6个月的时间,不同的课程大纲课时也不一样,具体课看课程的详情:Java基础课程课时在5-20小时不等,根据 ...
- 0基础学java有多难?自学Java和参加培训学Java的难易度对比分析!
在一些知识问答平台上,我看到有很多在问"0基础学java有多难",如果你想0基础自学Java那可能会比较困难,但是如果选择报培训班进行学习,即便是0基础,学Java其实也并不难.所 ...
- 0基础学java可行吗_零基础可以学习JAVA吗?
肯定是可以学的,每一个人做每一件事都是从0基础开始的,他们并不是生下来就会Java,会编程,都是通过后天的努力说得到的技能 你只需要找对方法,找对带你的人,你就可以学好 学习Java的方式有这几种: ...
- java用drawline画血条,Java小项目之坦克大战单机1.0版
单机1.0版包括6个class文件: TankClient.java : 主要执行部分,项目的大管家 Tank.java : 实现Tank类,模拟坦克的运动 Missile.java : 实现Miss ...
- 0基础学web----小鲜项目搭建(拓展)
01-CSS精灵-作用 02-CSS精灵-使用 <!DOCTYPE html> <html lang="en"> <head><meta ...
- 【0基础学java】教学日志:javaSE-面向对象6-接口、面向接口编程、内部类
目录 本章概述: 一.为什么使用接口 1.Door.java 2.DoorBell.java 3.Lock.ja 二.接口的基本使用 1.Lock.java 2.LockDoor.java 3.Tes ...
- Java 项目实战 坦克大战 (0)--前言
做了有一个星期了,java语言太强大了,也算是学得最认真的一门语言了,本次课设花的心思也就比较多了.关键总是追求完美总是想原创,最终做出来效果不错,但感觉代码逻辑很乱,今天开始就好好整理一番,以教程形 ...
- 【0基础学java】教学日志:javaSE--Stream API
本章概述:本章主要讲了Stream特性,Stream运行机制,Stream的创建,Stream常用API,以及Stream API在实际应用开发中的作用 目录 本章概述: 一.annotation 1 ...
最新文章
- BZOJ 1433 Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
- Django从理论到实战(part2)--virtualenvwrapper
- Java多线程编程递增_java多线程编程之简介
- iOS开发多线程-RunLoop
- 学java什么书好?推荐几本Java开发的书
- C/C++[1782 codeup] 谁是你的潜在朋友
- MongoDB以Windows服务安装
- html5期末大作业:基于HTML+CSS技术实现——传统手工艺术雕刻网站(3页)
- 软件测试人员能力模型
- ajax带token获得返回数据,jquery带token访问接口ajax
- android系统应用更改内存,安卓root后必备神器:修改系统/清理内存神器
- Missing parentheses in call to 'print'
- 数独算法c语言,数独求解算法C.
- # 公有云?私有云?混合云?多云?行业云?傻傻分不清楚(下篇)
- 170虚拟号码的正则表达式
- 电子商务系统的测试(十四)
- 台式计算机系统重新安装软件,教你台式机如何重装系统
- AcWing 913. 排队打水 (排序不等式)
- 苹果疯了,现在又开始坑支付宝!
- 结合实际聊聊防反接电路(防反接电路总结)
热门文章
- 安卓控件 - 列表视图
- [词语辨析] Try, Attempt, Endeavour “尝试” 的用法
- 从阿里 Weex 一窥移动技术发展之路
- 基于PHP排课系统设计与实现 开题报告
- gm 1 n 模型matlab,灰色预测模型GM1,n模型的matlab源...
- STRM--解决因配置Streams而在alert中出现的 ORA-02068错误
- 神威太湖之光超级计算机的运算速度是,“神威·太湖之光”运算速度到底有多快?...
- 什么才是好的手持产品?
- 2020 最好的Linux网络监控工具
- 生产计划自动排程目标是什么?