- 博客(117)
- 收藏
- 关注
原创 坦克大战—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
216
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
204
1
原创 坦克大战—day43
游戏实现通关 /** * 进入下一关的方法 */ public static void nextLevel(){ newGame(LevelInof.getInstance().getLevel()+1); }游戏失败或者胜利的处理 //游戏通关的按键处理 private void keyPressedEventWin(int keyCode){ KeyEventOver(keyCode);
2021-02-07 21:18:55
143
原创 坦克大战—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
148
原创 坦克大战—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
135
原创 坦克大战—day 40
设置关卡单例类在game包创建LevelInofpackage map;import util.MyUtil;/** * 用来管理当前关卡信息 * 单例设计模式:如果一个类只需要该类具有唯一的实例,那么可以使用 * 单例设计模式设计该类 */public class LevelInof { //构造方法私有化 private LevelInof(){ } //定义静态的本类类型的变量,来指向唯一的实例 private static Le
2021-02-07 16:17:33
156
原创 坦克大战—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
95
原创 坦克大战—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
129
原创 坦克大战—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
97
原创 坦克大战—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
81
原创 坦克大战—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
100
原创 坦克大战—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
128
原创 坦克大战—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
104
原创 坦克大战—day 32
创建坦克老巢的说明tTankHouse类中,生成了六块地图块,作为老巢。我们可以在GameMap类中调用 //将老巢的所有元素添加到地图的容器中 private void addHouse(){ tiles.addAll(house.getTiles()); }将老巢的地图块放到容器中,这样可以不用写老巢地图块的碰撞和绘制。...
2021-02-06 20:59:10
91
原创 坦克大战—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
95
原创 坦克大战—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
89
原创 坦克大战—day 29
我方坦克与地图块的碰撞处理的调用 //所有的子弹和地图块的碰撞 private void bulletAndTanksCollideMapTile() { //自己的坦克的子弹和地图块的碰撞 myTank.bulletsCollideMapTile(gameMap.getTiles()); //敌人所有的坦克和地图块的碰撞 for (int i = 0; i < enemies.size(); i++) {
2021-02-06 19:39:33
77
原创 坦克大战—day 28
我方坦克与地图块的碰撞处理的调用 //所有的子弹和地图块的碰撞 private void bulletAndTanksCollideMapTile() { //自己的坦克的子弹和地图块的碰撞 myTank.bulletsCollideMapTile(gameMap.getTiles()); //敌人所有的坦克和地图块的碰撞 for (int i = 0; i < enemies.size(); i++) {
2021-02-06 19:33:49
74
原创 坦克大战—day 27
坦克与地图块的碰撞处理判定碰撞在地图块中选取8个点,如果这8个点有一个点与坦克重合,则认定碰撞。 /** * 一个地图块和当前坦克的碰撞的方法, * 从tile中一区八个点,判断是否和其中任意一个点有了碰撞 * 点的顺序从左上角开始,顺时针 */ public boolean isCollideTile(List<MapTile> tiles){ final int len = 2; for (in
2021-02-06 19:31:37
114
原创 坦克大战—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
106
原创 坦克大战—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
155
原创 坦克大战—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
123
原创 坦克大战—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
64
原创 坦克大战—day 22
重置游戏状态,很多东西需要重置。关闭线程 /** * 开始新游戏的方法 */ private void newgame() { gameState = STATE_RUN; //创建坦克对象,敌人的坦克对象 myTank = new MyTank(400, 200, Tank.DIR_DOWN); //使用一个单独的线程用于控制生产敌人的坦克 new Thread(() -> {
2021-02-03 21:48:55
68
原创 坦克大战—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
96
原创 坦克大战—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
119
原创 坦克大战—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
243
1
原创 坦克大战—day 18
给坦克添加名字在MyUtil类中:private static final String[] NAMES = { "行人","乐园","花草","人才","左手","目的","课文","优点","年代","灰尘", "沙子","小说","儿女","难题","明星","本子","彩色","水珠","路灯","把握", "房屋","心愿","左边","新闻","早点","鸭子", "市场","雨点","细雨
2021-02-02 14:53:37
103
原创 坦克大战—day 17
从对象池中获得爆炸效果。因为是无参构造方法,所以要添加参数。收回不可见的爆炸效果。为什么里面有一句i--呢?收回一个爆炸效果,那么这个位置之后的爆炸效果就会前进替补。如果不写这句话,一个for循环下来会有不可见的爆炸效果。但是下一帧会被收回。 //坦克和子弹碰撞的方法 public void collideBullets(List<Bullet> bullets) { for (Bullet bullet:bullets) {
2021-02-02 14:04:56
93
原创 坦克大战—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
53
原创 坦克大战—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
64
原创 坦克大战—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
95
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
71
原创 坦克大战—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
73
原创 坦克大战—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
82
原创 坦克大战—day 10
敌人的坦克创建和随机产生要求随机地在屏幕的左上角和右上角产生敌人的坦克。给Tank类新增一个变量isEnemy,默认为false。创建我方坦克的名字容易区分,为myTank。但是敌人的坦克不可能一个个命名。所以敌方的坦克需要用容器来存储。 //敌人的坦克集合 private static List<Tank> enemies =new ArrayList<>();创建敌人坦克的方法 public static Tank createE
2021-01-27 13:16:28
122
原创 坦克大战—day 9
子弹的效率问题1.问题的引入子弹飞到屏幕外或者击中敌人坦克,应该怎么处理?子弹生成后放在容器中,子弹会不会将容器撑爆?解决方案:使用对象池来解决:提前创建好若干个子弹对象,放到一个容器中。 需要的时候从对象池中拿一个出来使用,当子弹需要被销毁时,放到原来的对象池中。 类似于线程池。2.创建子弹对象池在util包中创建BulletPool类。package util;import game.Bu...
2021-01-26 10:05:28
101
原创 坦克大战—day 8
1.坦克的绘制使用图片。在Tank类定义图片数组,加载每一张图片。使用static关键字声明的代码块叫静态代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。如果有些代码必须在项目启动的时候就执行,那么我们就可以使用静态代码块来实现,这种代码是主动执行的。 //坦克的图片数组 private static Image[] tankImg; private static Image[] enemyImg; //静态代码块中对它进行初始化
2021-01-25 09:10:02
149
原创 坦克大战—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
160
原创 坦克大战—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
121
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人