坦克大战
记录学习写坦克大战这个Java项目的过程
如此生活二十年
这个作者很懒,什么都没留下…
展开
-
坦克大战—day 45
游戏帮助和游戏关于 private Image helpImg; private Image aboutImg; private void drawAbout(Graphics g) { g.setColor(Color.BLACK); g.fillRect(0,0,FRAME_WIDTH,FRAME_HEIGHT); if(aboutImg == null){ aboutImg = MyUtil.createI原创 2021-02-11 10:23:48 · 234 阅读 · 1 评论 -
坦克大战—day 44
游戏过关效果 //开始过关动画 public static int flashTime; public static final int RECT_WIDTH = 40; public static final int RECT_COUNT = FRAME_WIDTH/RECT_WIDTH+1; public static boolean isOpen = false; public static void startCrossLevel(){ ga原创 2021-02-11 10:22:54 · 224 阅读 · 1 评论 -
坦克大战—day43
游戏实现通关 /** * 进入下一关的方法 */ public static void nextLevel(){ newGame(LevelInof.getInstance().getLevel()+1); } 游戏失败或者胜利的处理 //游戏通关的按键处理 private void keyPressedEventWin(int keyCode){ KeyEventOver(keyCode);原创 2021-02-07 21:18:55 · 157 阅读 · 0 评论 -
坦克大战—day 42
1.设置背景音乐 package util; import java.applet.Applet; import java.applet.AudioClip; import java.io.File; import java.io.IOException; public class MusicUtil { private static AudioClip start; private static AudioClip bomb; //装载音乐资源 static {原创 2021-02-07 20:36:54 · 161 阅读 · 0 评论 -
坦克大战—day 41
关卡敌人的类型的创建 //创建敌人的坦克 public static Tank createEnemy(){ //左上角,右上角,中间可以出现坦克 int x = MyUtil.getRandomNumber(0,3) ; if (x == 0){ x = RADIUS; }else if (x == 1){ x = Constant.FRAME_WIDTH - RADIUS; .原创 2021-02-07 17:12:49 · 146 阅读 · 0 评论 -
坦克大战—day 40
设置关卡单例类 在game包创建LevelInof package map; import util.MyUtil; /** * 用来管理当前关卡信息 * 单例设计模式:如果一个类只需要该类具有唯一的实例,那么可以使用 * 单例设计模式设计该类 */ public class LevelInof { //构造方法私有化 private LevelInof(){ } //定义静态的本类类型的变量,来指向唯一的实例 private static Le原创 2021-02-07 16:17:33 · 175 阅读 · 0 评论 -
坦克大战—day 39
关卡解析后的处理 //根据方法的名字和参数调用对应的方法 private void invokeMethod(String name,String[] params){ for (String param : params) { //获得每一行的方法的参数,解析。 String[] split = param.split(","); //使用一个int 数组保存解析后的内容 int[]原创 2021-02-07 15:38:38 · 110 阅读 · 0 评论 -
坦克大战—day 38
关卡的解析 //初始化地图的元素块 level表示第几关 public void initMap(int level) { tiles.clear(); try { loadLeveal(level); } catch (Exception e) { e.printStackTrace(); } //初始化大本营 house = new TankHous原创 2021-02-07 15:19:24 · 149 阅读 · 0 评论 -
坦克大战—day 37
添加关卡 关卡不同,生成的地图不同。 在GameMap类中: /** * 往地图块中快速添加一行指定类型的地图块 * @param type 地图块的类型 * startX 添加地图块的起始的x坐标 * startY 添加地图块的起始的y坐标 * DIS 地图块之间的中心点的间隔,大于块的宽度就是不连续的 */ public void addRow(int startX,int startY,int endX,原创 2021-02-07 15:04:50 · 107 阅读 · 0 评论 -
坦克大战—day 36
private void drawRun(Graphics g) { //绘制黑色的背景 g.setColor(Color.BLACK); g.fillRect(0, 0, FRAME_WIDTH, FRAME_HEIGHT); //绘制地图的碰撞层 gameMap.drawBk(g); drawEnemies(g) ; myTank.draw(g); //绘制地图的遮..原创 2021-02-07 14:32:52 · 86 阅读 · 0 评论 -
坦克大战—day 35
子弹和不同类型的块的碰撞处理 GameMap类中: //绘制没有遮挡效果的块 public void drawBk(Graphics g){ for (MapTile tile : tiles) { if (tile.getType() != MapTile.TYPE_COVER) tile.draw(g); } } //只绘制有遮挡效果的块 public void drawCov原创 2021-02-07 14:28:02 · 110 阅读 · 0 评论 -
坦克大战—day 34
地图的重新生成和敌人坦克的重新生成 1.将老巢的地图块换成图片 MapTile类: package map; import game.Bullet; import util.BulletPool; import util.MyUtil; import java.awt.*; import java.util.List; public class MapTile { //四种不同的元素块 public static final int TYPE_NORMAL = 0; p原创 2021-02-07 13:40:39 · 148 阅读 · 0 评论 -
坦克大战—day 33
老巢被击毁的处理 //坦克的子弹和地图块的碰撞 public void bulletsCollideMapTile(List<MapTile> tiles) { //foreach遍历容器中的元素, //在遍历的过程中只能使用迭代器的删除方式删除元素 for (int i = 0; i < tiles.size(); i++) { MapTile tile = tiles.get(i);原创 2021-02-06 21:39:52 · 117 阅读 · 0 评论 -
坦克大战—day 32
创建坦克老巢的说明 tTankHouse类中,生成了六块地图块,作为老巢。我们可以在GameMap类中调用 //将老巢的所有元素添加到地图的容器中 private void addHouse(){ tiles.addAll(house.getTiles()); } 将老巢的地图块放到容器中,这样可以不用写老巢地图块的碰撞和绘制。 ...原创 2021-02-06 20:59:10 · 101 阅读 · 0 评论 -
坦克大战—day 31
坦克老巢的绘制 在map包中创建TankHouse类 package map; import util.Constant; import java.awt.*; import java.util.ArrayList; import java.util.List; /** * 玩家的大本营 */ public class TankHouse { //老巢的坐标 public static final int HOUSE_X = (Constant.FRAME_WIDTH - 3原创 2021-02-06 20:46:34 · 107 阅读 · 0 评论 -
坦克大战—day 30
碰撞的调用 private void drawRun(Graphics g) { g.setFont(GAME_FONT); //绘制黑色的背景 g.setColor(Color.black); g.fillRect(0, 0, FRAME_WIDTH, FRAME_HEIGHT); gameMap.draw(g); drawEnemies(g); myTank.draw(g);原创 2021-02-06 20:21:13 · 104 阅读 · 0 评论 -
坦克大战—day 29
我方坦克与地图块的碰撞处理的调用 //所有的子弹和地图块的碰撞 private void bulletAndTanksCollideMapTile() { //自己的坦克的子弹和地图块的碰撞 myTank.bulletsCollideMapTile(gameMap.getTiles()); //敌人所有的坦克和地图块的碰撞 for (int i = 0; i < enemies.size(); i++) {原创 2021-02-06 19:39:33 · 86 阅读 · 0 评论 -
坦克大战—day 28
我方坦克与地图块的碰撞处理的调用 //所有的子弹和地图块的碰撞 private void bulletAndTanksCollideMapTile() { //自己的坦克的子弹和地图块的碰撞 myTank.bulletsCollideMapTile(gameMap.getTiles()); //敌人所有的坦克和地图块的碰撞 for (int i = 0; i < enemies.size(); i++) {原创 2021-02-06 19:33:49 · 84 阅读 · 0 评论 -
坦克大战—day 27
坦克与地图块的碰撞处理 判定碰撞 在地图块中选取8个点,如果这8个点有一个点与坦克重合,则认定碰撞。 /** * 一个地图块和当前坦克的碰撞的方法, * 从tile中一区八个点,判断是否和其中任意一个点有了碰撞 * 点的顺序从左上角开始,顺时针 */ public boolean isCollideTile(List<MapTile> tiles){ final int len = 2; for (in原创 2021-02-06 19:31:37 · 127 阅读 · 0 评论 -
坦克大战—day 26
地图块的销毁 在MapTile类中: 子弹与地图块碰撞,子弹销毁。 //地图块是否和子弹有碰撞 public boolean isCollideBullet(List<Bullet> bullets){ if (!visible ) return false; for (Bullet bullet : bullets) { int bulletX = bullet.getX();原创 2021-02-06 19:14:50 · 116 阅读 · 0 评论 -
坦克大战—day 25
1.生成的地图块不能重叠 private void initMap() { final int count =20; for (int i = 0; i < count; i++) { MapTile mapTile = MapTilePool.get(); int x = MyUtil.getRandomNumber(MAP_X,MAP_X+MAP_WIDTH-MapTile.tileW); ..原创 2021-02-06 18:00:30 · 166 阅读 · 0 评论 -
坦克大战—day 24
地图的简单实现 由于在游戏中砖块可以被销毁,所以使用对象池。 package util; import map.MapTile; import java.util.ArrayList; import java.util.List; public class MapTilePool { public static final int DEFAULT_POOL_SIZE=50; public static final int DEFAULT_POOL_MAX_SIZE=70;原创 2021-02-06 15:50:20 · 136 阅读 · 0 评论 -
坦克大战—day 23
设计地图 新建map包创建Maptile类 package map; import util.MyUtil; import java.awt.*; public class MapTile { //地图块的宽度 public static int tileW = 40; private static Image tileImg; static { tileImg = MyUtil.createImage("res/tile.png");原创 2021-02-03 22:01:23 · 78 阅读 · 0 评论 -
坦克大战—day 22
重置游戏状态,很多东西需要重置。 关闭线程 /** * 开始新游戏的方法 */ private void newgame() { gameState = STATE_RUN; //创建坦克对象,敌人的坦克对象 myTank = new MyTank(400, 200, Tank.DIR_DOWN); //使用一个单独的线程用于控制生产敌人的坦克 new Thread(() -> {原创 2021-02-03 21:48:55 · 76 阅读 · 0 评论 -
坦克大战—day 21
对自己坦克死亡的处理 1.改变游戏状态 private void die() { if(isEnemy) { TankPool.theReturn((EnemyTank) this); } else { GameFrame.setGameState(Constant.STATE_OVER); } } public boolean isDie() {原创 2021-02-03 20:13:10 · 108 阅读 · 0 评论 -
坦克大战—day 20
对敌人坦克死亡的处理 1.创建敌人坦克对象池 package util; import tank.EnemyTank; import java.util.ArrayList; import java.util.List; public class TankPool { public static final int DEFAULT_POOL_SIZE=10; public static final int DEFAULT_POOL_MAX_SIZE=20; priv原创 2021-02-03 19:45:09 · 133 阅读 · 0 评论 -
坦克大战—day 19
坦克的血条绘制及减血操作 1.绘制血条 在Tank类中作为内部类。 class BloodBar{ public static final int BAR_LENGTH = 50; public static final int BAR_HEIGHT = 3; public void draw(Graphics g){ //填充底色 g.setColor(Color.YELLOW);原创 2021-02-03 12:50:38 · 264 阅读 · 1 评论 -
坦克大战—day 18
给坦克添加名字 在MyUtil类中: private static final String[] NAMES = { "行人","乐园","花草","人才","左手","目的","课文","优点","年代","灰尘", "沙子","小说","儿女","难题","明星","本子","彩色","水珠","路灯","把握", "房屋","心愿","左边","新闻","早点","鸭子", "市场","雨点","细雨原创 2021-02-02 14:53:37 · 112 阅读 · 0 评论 -
坦克大战—day 17
从对象池中获得爆炸效果。因为是无参构造方法,所以要添加参数。 收回不可见的爆炸效果。 为什么里面有一句i--呢?收回一个爆炸效果,那么这个位置之后的爆炸效果就会前进替补。如果不写这句话,一个for循环下来会有不可见的爆炸效果。但是下一帧会被收回。 //坦克和子弹碰撞的方法 public void collideBullets(List<Bullet> bullets) { for (Bullet bullet:bullets) {原创 2021-02-02 14:04:56 · 103 阅读 · 0 评论 -
坦克大战—day 16
爆炸效果使用对象池。 在util包创建ExplodesPool。 package util; import game.Explode; import java.util.ArrayList; import java.util.List; public class ExplodesPool { public static final int DEFAULT_POOL_SIZE=10; public static final int DEFAULT_POOL_MAX_SIZE=2原创 2021-02-02 13:55:36 · 67 阅读 · 0 评论 -
坦克大战—day 15
爆炸效果的调整 package game; import java.awt.*; public class Explode { public static final int EXPLODE_FRAME_COUNT = 12; //爆炸效果的宽和高 private static int explodeWidth; private static int explodeHeight; private static Image[] img; static原创 2021-02-01 11:16:01 · 73 阅读 · 0 评论 -
坦克大战—day 14
添加爆炸效果 1.在game包里创建Explode类。 package game; import java.awt.*; public class Explode { public static final int EXPLODE_FRAME_COUNT = 12; private static Image[] img; static { img = new Image[EXPLODE_FRAME_COUNT/4]; for (int i原创 2021-02-01 11:01:12 · 104 阅读 · 1 评论 -
坦克大战—day 13
坦克与子弹的碰撞处理 1.判断碰撞的方法 MyUtil类中: /** * 点是否在矩形内部 * * @param rectX 矩形中心的x坐标 * @param rectY 矩形中心的y * @param radius 矩形一条边的一半 * @param pointX 子弹的x坐标 * @param pointY y * @return 是否碰撞 */ public static final b原创 2021-01-31 21:24:14 · 83 阅读 · 0 评论 -
坦克大战—day 12
敌人坦克AI:每隔5秒让敌人坦克随机获得一个状态(站立或行走) public static final int ENEMY_AI_INTERVAL=5000; 敌人发射子弹的AI:游戏的每一帧都随机判断敌人是否发射子弹 public static final double ENEMY_FIRE_PERCENT=0.03; //记录时间 private long aiTime; public EnemyTank(int x, int y, int dir) {原创 2021-01-29 20:33:43 · 83 阅读 · 0 评论 -
坦克大战—day 11
为了使敌方的坦克有简单的AI功能,那么必须将tank类结构进行重构。 父类:Tank,子类:MyTank,EnemyTank. package tank; import java.awt.*; public class MyTank extends Tank{ private static Image[] tankImg; static { tankImg = new Image[4]; tankImg[0]=Toolkit.getDefaultTo原创 2021-01-28 11:00:09 · 95 阅读 · 0 评论 -
坦克大战—day 10
敌人的坦克创建和随机产生 要求随机地在屏幕的左上角和右上角产生敌人的坦克。 给Tank类新增一个变量isEnemy,默认为false。 创建我方坦克的名字容易区分,为myTank。但是敌人的坦克不可能一个个命名。所以敌方的坦克需要用容器来存储。 //敌人的坦克集合 private static List<Tank> enemies =new ArrayList<>(); 创建敌人坦克的方法 public static Tank createE原创 2021-01-27 13:16:28 · 130 阅读 · 0 评论 -
坦克大战—day 9
子弹的效率问题 1.问题的引入 子弹飞到屏幕外或者击中敌人坦克,应该怎么处理? 子弹生成后放在容器中,子弹会不会将容器撑爆? 解决方案:使用对象池来解决:提前创建好若干个子弹对象,放到一个容器中。 需要的时候从对象池中拿一个出来使用,当子弹需要被销毁时,放到原来的对象池中。 类似于线程池。 2.创建子弹对象池 在util包中创建BulletPool类。 package util; import game.Bu...原创 2021-01-26 10:05:28 · 110 阅读 · 0 评论 -
坦克大战—day 8
1.坦克的绘制使用图片。 在Tank类定义图片数组,加载每一张图片。 使用static关键字声明的代码块叫静态代码块。 静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。 如果有些代码必须在项目启动的时候就执行,那么我们就可以使用静态代码块来实现,这种代码是主动执行的。 //坦克的图片数组 private static Image[] tankImg; private static Image[] enemyImg; //静态代码块中对它进行初始化原创 2021-01-25 09:10:02 · 157 阅读 · 0 评论 -
坦克大战—day 7
实现坦克发射子弹的功能。 1.创建子弹对象 public class Bullet { private static final int DEFAULT_SPEED=Tank.DEFAULT_SPEED<<1; private static final int RADIUS=4; private int x,y; private int speed=DEFAULT_SPEED; private int dir; private int atk原创 2021-01-24 13:03:11 · 171 阅读 · 0 评论 -
坦克大战—day 6
完成对坦克的逻辑的处理。 //坦克的逻辑处理 private void logic() { switch (state) { case STATE_STAND: break; case STATE_MOVE: move(); break; case STATE_DIE:原创 2021-01-23 10:04:46 · 138 阅读 · 1 评论