first commit
12
Xm.iml
Normal file
@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<output url="file://$MODULE_DIR$/bin" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="jdk" jdkName="JavaSE-1.8" jdkType="JavaSDK" />
|
||||
</component>
|
||||
</module>
|
BIN
bin/pnf/Bullet.class
Normal file
BIN
bin/pnf/Fight.class
Normal file
BIN
bin/pnf/Plants.class
Normal file
BIN
bin/pnf/PlantsAndFight.class
Normal file
BIN
bin/pnf/StartPanel$1.class
Normal file
BIN
bin/pnf/StartPanel$2.class
Normal file
BIN
bin/pnf/StartPanel$3.class
Normal file
BIN
bin/pnf/StartPanel$4.class
Normal file
BIN
bin/pnf/StartPanel.class
Normal file
BIN
bin/pnf/Zombles.class
Normal file
BIN
dz/dz1_1.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
dz/dz1_10.png
Normal file
After Width: | Height: | Size: 210 KiB |
BIN
dz/dz1_11.png
Normal file
After Width: | Height: | Size: 199 KiB |
BIN
dz/dz1_12.png
Normal file
After Width: | Height: | Size: 207 KiB |
BIN
dz/dz1_13.png
Normal file
After Width: | Height: | Size: 190 KiB |
BIN
dz/dz1_14.png
Normal file
After Width: | Height: | Size: 182 KiB |
BIN
dz/dz1_15.png
Normal file
After Width: | Height: | Size: 164 KiB |
BIN
dz/dz1_16.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
dz/dz1_2.png
Normal file
After Width: | Height: | Size: 146 KiB |
BIN
dz/dz1_3.png
Normal file
After Width: | Height: | Size: 176 KiB |
BIN
dz/dz1_4.png
Normal file
After Width: | Height: | Size: 178 KiB |
BIN
dz/dz1_5.png
Normal file
After Width: | Height: | Size: 189 KiB |
BIN
dz/dz1_6.png
Normal file
After Width: | Height: | Size: 203 KiB |
BIN
dz/dz1_7.png
Normal file
After Width: | Height: | Size: 211 KiB |
BIN
dz/dz1_8.png
Normal file
After Width: | Height: | Size: 186 KiB |
BIN
dz/dz1_9.png
Normal file
After Width: | Height: | Size: 211 KiB |
BIN
dz/dz2_1.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
dz/dz2_10.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
dz/dz2_11.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
dz/dz2_12.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
dz/dz2_2.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
dz/dz2_3.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
dz/dz2_4.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
dz/dz2_5.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
dz/dz2_6.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
dz/dz2_7.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
dz/dz2_8.png
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
dz/dz2_9.png
Normal file
After Width: | Height: | Size: 48 KiB |
BIN
lib/Win.png
Normal file
After Width: | Height: | Size: 438 KiB |
BIN
lib/bg.jpg
Normal file
After Width: | Height: | Size: 225 KiB |
BIN
lib/bp_1.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
lib/bp_2.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/bp_3.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/bp_4.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/bp_5.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/bp_6.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/bp_7.png
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
lib/bp_8.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/gameover.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
lib/js1.gif
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
lib/js2.gif
Normal file
After Width: | Height: | Size: 80 KiB |
BIN
lib/js3.gif
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
lib/js4.gif
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
lib/js5.gif
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
lib/js6.gif
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
lib/nextLevel.gif
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
lib/pause.gif
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
lib/start_1.png
Normal file
After Width: | Height: | Size: 2.2 MiB |
BIN
lib/start_2.png
Normal file
After Width: | Height: | Size: 744 KiB |
BIN
lib/statusBar.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
lib/xz_1.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_2.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_3.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_4.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_5.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_6.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/xz_7.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/xz_8.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zd_1.gif
Normal file
After Width: | Height: | Size: 569 B |
BIN
lib/zd_1.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
lib/zd_2.gif
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
lib/zd_2.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
lib/zl_1.gif
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
lib/zl_1.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zl_2.gif
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
lib/zl_2.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zl_3.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zl_4.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zl_5.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zl_6.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
lib/zw1.gif
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
lib/zw2.gif
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
lib/zw3.gif
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
lib/zw4.gif
Normal file
After Width: | Height: | Size: 22 KiB |
33
src/pnf/Bullet.java
Normal file
@ -0,0 +1,33 @@
|
||||
package pnf;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
public class Bullet {
|
||||
int x,y,h,w;
|
||||
int speed;
|
||||
ImageIcon image;
|
||||
ImageIcon[] images = new ImageIcon[]{new ImageIcon("lib/zd_1.gif"),new ImageIcon("lib/zd_2.gif")};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param k 子弹类型
|
||||
* @throws IOException
|
||||
*/
|
||||
public Bullet(int k, int x, int y) {
|
||||
// TODO Auto-generated constructor stub
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
if(k == 0){
|
||||
image = images[0];
|
||||
}else{
|
||||
image = images[1];
|
||||
}
|
||||
w = image.getIconWidth();
|
||||
h = image.getIconHeight();
|
||||
speed = 5;
|
||||
}
|
||||
/**子弹走一步*/
|
||||
public void step() {
|
||||
x += speed;
|
||||
}
|
||||
}
|
110
src/pnf/Fight.java
Normal file
@ -0,0 +1,110 @@
|
||||
package pnf;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
public class Fight {
|
||||
BufferedImage[] hoof = new BufferedImage[8];
|
||||
BufferedImage[] rush = new BufferedImage[8];
|
||||
BufferedImage[] stop = new BufferedImage[6];
|
||||
|
||||
BufferedImage[] attack1 = new BufferedImage[10];
|
||||
BufferedImage[] attack2 = new BufferedImage[11];
|
||||
BufferedImage[] attack3 = new BufferedImage[9];
|
||||
BufferedImage image;
|
||||
/**人物宽高*/
|
||||
int w,h;
|
||||
/**人物位置*/
|
||||
int x,y;
|
||||
/**速度*/
|
||||
int[] speed = new int[2];
|
||||
/**人物状态*/
|
||||
int state;
|
||||
/**行走*/
|
||||
public static final int HOOF = 0;
|
||||
/**奔跑*/
|
||||
public static final int RUSH = 1;
|
||||
/**站立*/
|
||||
public static final int STOP = 2;
|
||||
/**攻击*/
|
||||
public static final int ATTACK = 3;
|
||||
|
||||
public Fight() throws IOException {
|
||||
//人物三次攻击
|
||||
for (int i = 0; i < attack1.length; i++) {
|
||||
attack1[i] = ImageIO.read(new File("素材/pg1_"+(i+1)+".png"));
|
||||
}
|
||||
for (int i = 0; i < attack2.length; i++) {
|
||||
attack2[i] = ImageIO.read(new File("素材/pg2_"+(i+1)+".png"));
|
||||
}
|
||||
for (int i = 0; i < attack3.length; i++) {
|
||||
attack3[i] = ImageIO.read(new File("素材/pg3_"+(i+1)+".png"));
|
||||
}
|
||||
//人物行进状态
|
||||
for (int i = 0; i < hoof.length; i++) {
|
||||
hoof[i] = ImageIO.read(new File("lib/xz_"+(i+1)+".png"));
|
||||
}
|
||||
for (int i = 0; i < rush.length; i++) {
|
||||
rush[i] = ImageIO.read(new File("lib/bp_"+(i+1)+".png"));
|
||||
}
|
||||
for (int i = 0; i < stop.length; i++) {
|
||||
stop[i] = ImageIO.read(new File("lib/zl_"+(i+1)+".png"));
|
||||
}
|
||||
state = STOP;
|
||||
w = attack1[0].getWidth();
|
||||
h = attack1[0].getHeight();
|
||||
x = 100;
|
||||
y = 100;
|
||||
speed[0] = 7;
|
||||
speed[1] = 10;
|
||||
image = stop[0];
|
||||
}
|
||||
void rightMove(){
|
||||
x += speed[state];
|
||||
if(x >= 1200-w) {
|
||||
x -= speed[state];
|
||||
}
|
||||
}
|
||||
void leftMove(){
|
||||
x -= speed[state];
|
||||
if(x<=-116) {
|
||||
x += speed[state];
|
||||
}
|
||||
}
|
||||
void upMove(){
|
||||
y -= speed[0];
|
||||
if(y<=-30) {
|
||||
y += speed[0];
|
||||
}
|
||||
}
|
||||
void downMove(){
|
||||
y += speed[0];
|
||||
if(y>=660-h) {
|
||||
y -= speed[0];
|
||||
}
|
||||
}
|
||||
protected static int index = 0;
|
||||
/**人物图片切换*/
|
||||
void step(){
|
||||
BufferedImage[] fight = null;
|
||||
switch (state) {
|
||||
case STOP:
|
||||
fight = stop;
|
||||
break;
|
||||
case HOOF:
|
||||
fight = hoof;
|
||||
break;
|
||||
case RUSH:
|
||||
fight = rush;
|
||||
break;
|
||||
}
|
||||
if (fight != null) {
|
||||
this.image = fight[index++/2%fight.length];
|
||||
w = image.getWidth();
|
||||
h = image.getHeight();
|
||||
}
|
||||
}
|
||||
}
|
69
src/pnf/Plants.java
Normal file
@ -0,0 +1,69 @@
|
||||
package pnf;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
public class Plants {
|
||||
/**植物数组*/
|
||||
static ImageIcon[] zw = new ImageIcon[4];
|
||||
ImageIcon rzw;
|
||||
int iz,w,h;
|
||||
//种植格子
|
||||
static int[] y = new int[5];
|
||||
static int[] x = new int[10];
|
||||
static boolean[][] t = new boolean[5][10];
|
||||
int ix,iy,rx,ry;
|
||||
/**植物血量*/
|
||||
int blood;
|
||||
|
||||
static {
|
||||
for (int i = 0; i < zw.length; i++) {
|
||||
zw[i] = new ImageIcon("lib/zw"+(i+1)+".gif");
|
||||
}
|
||||
for (int i = 0; i < x.length; i++) {
|
||||
x[i] = 110+i*80;
|
||||
}
|
||||
for (int i = 0; i < y.length; i++) {
|
||||
y[i] = 191+i*100;
|
||||
}
|
||||
}
|
||||
public Plants() {//随机植物种类,位置
|
||||
Random r = new Random();
|
||||
iz = r.nextInt(zw.length);
|
||||
switch (iz) {
|
||||
case 0:
|
||||
blood = 10;
|
||||
break;
|
||||
case 1:
|
||||
blood = 10;
|
||||
break;
|
||||
case 2:
|
||||
blood = 12;
|
||||
break;
|
||||
case 3:
|
||||
blood = 68;
|
||||
break;
|
||||
}
|
||||
rzw = zw[iz];
|
||||
w = rzw.getIconWidth();
|
||||
h = rzw.getIconHeight();
|
||||
ix = r.nextInt(x.length);
|
||||
iy = r.nextInt(y.length);
|
||||
while (t[iy][ix]) {//检查是否重复使用格子
|
||||
ix = r.nextInt(x.length);
|
||||
iy = r.nextInt(y.length);
|
||||
}
|
||||
rx = x[ix];
|
||||
ry = y[iy];
|
||||
t[iy][ix] = true;
|
||||
}
|
||||
/**发射子弹*/
|
||||
public Bullet shoot(){
|
||||
if(iz == 0){
|
||||
return new Bullet(iz, rx+60,ry-68);
|
||||
}else{
|
||||
return new Bullet(iz, rx+50,ry-60);
|
||||
}
|
||||
}
|
||||
}
|
18
src/pnf/PlantsAndFight.java
Normal file
@ -0,0 +1,18 @@
|
||||
package pnf;
|
||||
|
||||
import java.io.IOException;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
public class PlantsAndFight extends JFrame {
|
||||
public static void main(String[] args) throws IOException, InterruptedException {
|
||||
JFrame jf = new JFrame("Plants And Fight");
|
||||
StartPanel sp = new StartPanel();
|
||||
jf.add(sp);
|
||||
jf.setSize(1214, 674);
|
||||
jf.setLocationRelativeTo(jf);
|
||||
jf.setResizable(false); //不许改变窗口大小
|
||||
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
jf.setVisible(true);
|
||||
sp.action();
|
||||
}
|
||||
}
|
962
src/pnf/StartPanel.java
Normal file
@ -0,0 +1,962 @@
|
||||
package pnf;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class StartPanel extends JPanel{
|
||||
/** 游戏的当前状态: START PAUSE RUNNING NEXT_LEVEL GAME_OVER GAME_WIN */
|
||||
private int state;
|
||||
public static final int START = 0;
|
||||
public static final int RUNNING = 1;
|
||||
public static final int PAUSE = 2;
|
||||
public static final int NEXT_LEVEL = 3;
|
||||
public static final int GAME_OVER = 4;
|
||||
public static final int GAME_WIN = 5;
|
||||
/**技能*/
|
||||
public static final int DZ = 6;
|
||||
|
||||
/**记录技能CD*/
|
||||
long timeDz;
|
||||
int cd = 10;
|
||||
/**大招CD*/
|
||||
int dzcd;
|
||||
|
||||
/** 难度级别 */
|
||||
private int level;
|
||||
|
||||
/**分数*/
|
||||
int score = 0;
|
||||
|
||||
/**生命*/
|
||||
int life;
|
||||
|
||||
/**人物方向 初始为右*/
|
||||
boolean direction = RIGHT;
|
||||
/**人物方向 左*/
|
||||
public static final boolean LEFT = false;
|
||||
/**人物方向 右*/
|
||||
public static final boolean RIGHT = true;
|
||||
|
||||
/**人物攻击状态*/
|
||||
long time3;
|
||||
int attack = 1;
|
||||
|
||||
/**人物状态判断*/
|
||||
long time;
|
||||
long time1;
|
||||
long time2;
|
||||
|
||||
/**植物数组*/
|
||||
Plants[] plants = {};
|
||||
int[] indexs = {};
|
||||
|
||||
/**僵尸数组*/
|
||||
Zombles[] zombles = {};
|
||||
|
||||
/**子弹数组*/
|
||||
Bullet[] bullets = {};
|
||||
|
||||
/**勇者*/
|
||||
Fight fight;
|
||||
|
||||
public static BufferedImage background;
|
||||
public static BufferedImage[] starts = new BufferedImage[2];
|
||||
public static BufferedImage gameWin;
|
||||
public static BufferedImage gameOver;
|
||||
public static ImageIcon pause;
|
||||
public static ImageIcon nextLevel;
|
||||
public static BufferedImage statusBar;
|
||||
public static BufferedImage[] jiNengs_1 = new BufferedImage[16];
|
||||
public static BufferedImage[] jiNengs_2 = new BufferedImage[12];
|
||||
public static BufferedImage jiNeng;
|
||||
|
||||
|
||||
static{
|
||||
/** 在StratPanel类中添加 图片引用 */
|
||||
try {
|
||||
background = ImageIO.read(new File("lib/bg.jpg"));
|
||||
starts[0] = ImageIO.read(new File("lib/start_1.png"));
|
||||
starts[1] = ImageIO.read(new File("lib/start_2.png"));
|
||||
pause = new ImageIcon("lib/pause.gif");
|
||||
nextLevel = new ImageIcon("lib/nextLevel.gif");
|
||||
gameOver = ImageIO.read(new File("lib/gameover.png"));
|
||||
gameWin = ImageIO.read(new File("lib/Win.png"));
|
||||
statusBar = ImageIO.read(new File("lib/statusBar.png"));
|
||||
for (int i = 0; i < jiNengs_1.length; i++) {
|
||||
jiNengs_1[i] = ImageIO.read(new File("dz/dz1_"+(i+1)+".png"));
|
||||
}
|
||||
for (int i = 0; i < jiNengs_2.length; i++) {
|
||||
jiNengs_2[i] = ImageIO.read(new File("dz/dz2_"+(i+1)+".png"));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public StartPanel() throws IOException {
|
||||
level = 1;//初始关卡级别
|
||||
plants = new Plants[level*3];
|
||||
indexs = new int[plants.length];
|
||||
zombles = new Zombles[level*5];
|
||||
life = zombles.length/5;
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
fight = new Fight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paint(Graphics g) {
|
||||
g.drawImage(background, -150, 0, background.getWidth(), background.getHeight(), null);
|
||||
paintPlants(g); //画植物
|
||||
paintBullets(g); //画子弹
|
||||
paintFight(g); //画人物
|
||||
paintZmb(g); //画僵尸
|
||||
paintScoreAndLife(g); //画生命和分数
|
||||
paintState(g); //画状态
|
||||
}
|
||||
/**技能属性*/
|
||||
int dzindex, dzi;
|
||||
int dzx = 0, dzy = 80, dzw = 1100, dzh = 491;
|
||||
int index;
|
||||
int dztime = 50;
|
||||
/**画状态*/
|
||||
public void paintState(Graphics g) {
|
||||
switch (state) {
|
||||
case START:
|
||||
g.drawImage(starts[index++/2000%2], 0, 0, this.getWidth(), this.getHeight(), null);
|
||||
g.drawString("单击任意位置或者按“ENTER”开始游戏", 300, 630);
|
||||
break;
|
||||
case PAUSE:
|
||||
g.drawImage(pause.getImage(), 300, 50, null);
|
||||
g.drawString("单击任意位置或者按“C”继续游戏", 350, 460);
|
||||
break;
|
||||
case NEXT_LEVEL:
|
||||
g.drawImage(nextLevel.getImage(), 300, 50, null);
|
||||
g.drawString("单击任意位置或者按“N”开始下一关", 300, 630);
|
||||
break;
|
||||
case GAME_OVER:
|
||||
g.drawImage(gameOver, 230, 100, (int)(425*1.5), (int)(269*1.5), null);
|
||||
break;
|
||||
case GAME_WIN:
|
||||
g.drawImage(gameWin, -15, -15, null);
|
||||
g.drawString("单击任意位置或者按“ENTER”重新开始游戏", 300, 650);
|
||||
break;
|
||||
case DZ:
|
||||
if (dzindex++ %dztime == 0) {//切换技能图片
|
||||
if (dzi > 15) {
|
||||
if (dzi == 16) {
|
||||
dztime = 100;
|
||||
dzw = 272*2;
|
||||
dzh = 220*2;
|
||||
dzy = fight.y+fight.h/2-220;
|
||||
if (direction == RIGHT) {
|
||||
dzx = fight.x;
|
||||
}else{
|
||||
dzx = fight.x - 250;
|
||||
}
|
||||
}else if(dzi-15 < 6){
|
||||
if (direction == RIGHT) {
|
||||
dzx += 60;
|
||||
}else{
|
||||
dzx -= 60;
|
||||
}
|
||||
}
|
||||
if (dzi-16 == 12) {
|
||||
daZhao();
|
||||
dzi = dzindex = index = 0;
|
||||
dzx = 0; dzy = 80; dzw = 1100; dzh = 491;
|
||||
dztime = 25;
|
||||
state = RUNNING;
|
||||
}else{
|
||||
jiNeng = jiNengs_2[dzi++-16];
|
||||
}
|
||||
}else{
|
||||
jiNeng = jiNengs_1[dzi++];
|
||||
}
|
||||
}
|
||||
g.drawImage(jiNeng, dzx, dzy, dzw, dzh, null);
|
||||
break;
|
||||
default:
|
||||
index = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**画系统信息*/
|
||||
public void paintScoreAndLife(Graphics g) {
|
||||
int x = 1010;
|
||||
int y = 55;
|
||||
Font font = new Font("华文楷体", Font.BOLD, 25);
|
||||
g.setFont(font);
|
||||
g.setColor(Color.WHITE);
|
||||
g.drawImage(statusBar, 1000, 0, null);
|
||||
g.drawString("当前关卡:"+level, x, y);
|
||||
y += 30;
|
||||
g.drawString("分数:"+score, x, y);
|
||||
y += 30;
|
||||
g.drawString("生命:"+life, x, y);
|
||||
y += 30;
|
||||
g.drawString("僵尸数量:", x, y);
|
||||
y += 30;
|
||||
g.drawString(zombles.length+"/"+level*5, x, y);
|
||||
y += 30;
|
||||
g.drawString("植物数量:"+plants.length, x, y);
|
||||
if (state != PAUSE) {
|
||||
//计算技能CD时间
|
||||
long t = System.currentTimeMillis();
|
||||
if (cd - (int)(t - timeDz)/1000 < 0||cd - (int)(t - timeDz)/1000 > 120) {
|
||||
dzcd = 0;
|
||||
}else{
|
||||
dzcd = cd - (int)(t - timeDz)/1000;
|
||||
}
|
||||
}
|
||||
y += 30;
|
||||
g.drawString("技能CD:"+dzcd, x, y);
|
||||
y += 80;
|
||||
g.drawString("\"ENTER\":", x, y);
|
||||
y += 25;
|
||||
g.drawString("开始游戏", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"X\":", x, y);
|
||||
y += 25;
|
||||
g.drawString("普通攻击/复活", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"D\":技能", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"P\":暂停", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"C\":继续", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"N\":下一关", x, y);
|
||||
y += 35;
|
||||
g.drawString("\"ESC/Q\":", x, y);
|
||||
y += 25;
|
||||
g.drawString("离开游戏", x, y);
|
||||
}
|
||||
|
||||
/**画人物*/
|
||||
public void paintFight(Graphics g) {
|
||||
g.drawImage(fight.image, fight.x, fight.y, fight.w, fight.h, null);
|
||||
}
|
||||
/**画植物*/
|
||||
public void paintPlants(Graphics g) {
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
g.drawImage(plants[i].rzw.getImage(), plants[i].rx, plants[i].ry-plants[i].h, plants[i].w, plants[i].h, null);
|
||||
}
|
||||
}
|
||||
/**画僵尸*/
|
||||
public void paintZmb(Graphics g) {
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
g.drawImage(zombles[i].rjs.getImage(), zombles[i].x, zombles[i].ry-zombles[i].h, zombles[i].w, zombles[i].h, null);
|
||||
}
|
||||
}
|
||||
/**画子弹*/
|
||||
public void paintBullets(Graphics g) {
|
||||
for (int i = 0; i < bullets.length; i++) {
|
||||
g.drawImage(bullets[i].image.getImage(), bullets[i].x, bullets[i].y, bullets[i].w, bullets[i].h, null);
|
||||
}
|
||||
}
|
||||
/**启动方法*/
|
||||
public void action(){
|
||||
//添加鼠标监听器
|
||||
this.addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
switch (state) {
|
||||
case START:
|
||||
state = RUNNING;
|
||||
break;
|
||||
case RUNNING:
|
||||
state = PAUSE;
|
||||
break;
|
||||
case PAUSE:
|
||||
timeDz = System.currentTimeMillis() - (10-dzcd)*1000;
|
||||
state = RUNNING;
|
||||
break;
|
||||
case GAME_OVER:
|
||||
life = level;
|
||||
bullets = new Bullet[] {};
|
||||
plants = new Plants[level*3];
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = RUNNING;
|
||||
break;
|
||||
case NEXT_LEVEL:
|
||||
level += 1;
|
||||
life += 1;
|
||||
bullets = new Bullet[0];
|
||||
if (level*3 > 50) { //最多只能放50个植物
|
||||
plants = new Plants[50];
|
||||
}else{
|
||||
plants = new Plants[level*3];
|
||||
}
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = RUNNING;
|
||||
break;
|
||||
case GAME_WIN:
|
||||
score = 0;
|
||||
level = 1;
|
||||
life = 1;
|
||||
bullets = new Bullet[0];
|
||||
plants = new Plants[level*3];
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = START;
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
//添加键盘监听器
|
||||
this.addKeyListener(new KeyAdapter() {
|
||||
@Override
|
||||
public void keyPressed(KeyEvent e) {
|
||||
int key = e.getKeyCode();
|
||||
switch (state) {
|
||||
case START:
|
||||
processGameStartKey(key);
|
||||
break;
|
||||
case RUNNING:
|
||||
processRunningKey(key);
|
||||
break;
|
||||
case PAUSE:
|
||||
processPauseKey(key);
|
||||
break;
|
||||
case NEXT_LEVEL:
|
||||
processNextLevelKey(key);
|
||||
break;
|
||||
case GAME_OVER:
|
||||
processGameoverKey(key);
|
||||
break;
|
||||
case GAME_WIN:
|
||||
processGameWinKey(key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void keyReleased(KeyEvent e) {
|
||||
// TODO Auto-generated method stub
|
||||
if (e.getKeyCode() != KeyEvent.VK_X) {
|
||||
ir();
|
||||
}
|
||||
}
|
||||
});
|
||||
this.requestFocus();//设置焦点
|
||||
Timer t = new Timer();
|
||||
t.schedule(new TimerTask() {
|
||||
public void run() {
|
||||
// TODO Auto-generated method stub
|
||||
switch (state) {
|
||||
case RUNNING:
|
||||
//动起来
|
||||
stepAction();
|
||||
//发射子弹
|
||||
shootAction();
|
||||
//检测碰撞
|
||||
pengAction();
|
||||
//检查血量
|
||||
checkBlood();
|
||||
//检查越界
|
||||
outOfBoundAction();
|
||||
//检测是否进入下一关
|
||||
isNextLevel();
|
||||
break;
|
||||
}
|
||||
fight.step();
|
||||
}
|
||||
} , 0, 50);
|
||||
while(true){
|
||||
repaint();//调用repaint()方法重绘画面
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**游戏结束时键盘事件*/
|
||||
void processGameoverKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
|
||||
case KeyEvent.VK_X:
|
||||
score -= 10;
|
||||
life = level;
|
||||
bullets = new Bullet[0];
|
||||
plants = new Plants[level*3];
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = RUNNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**游戏胜利时键盘事件*/
|
||||
void processGameWinKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
|
||||
case KeyEvent.VK_Q:
|
||||
System.exit(0);
|
||||
break;
|
||||
|
||||
case KeyEvent.VK_ENTER:
|
||||
score = 0;
|
||||
level = 1;
|
||||
life = 1;
|
||||
bullets = new Bullet[0];
|
||||
plants = new Plants[level*3];
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = START;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**游戏进入下一关时键盘事件*/
|
||||
void processNextLevelKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_Q:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_N:
|
||||
level += 1;
|
||||
life += 1;
|
||||
bullets = new Bullet[0];
|
||||
plants = new Plants[level*3];
|
||||
if (level*3 > 50) {
|
||||
plants = new Plants[50];
|
||||
}
|
||||
indexs = new int[plants.length];
|
||||
Plants.t = new boolean[5][10];
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
plants[i] = new Plants();
|
||||
}
|
||||
zombles = new Zombles[level*5];
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
zombles[i] = new Zombles();
|
||||
}
|
||||
indexZ = 0;
|
||||
zomblexs = 0;
|
||||
state = RUNNING;
|
||||
break;
|
||||
}
|
||||
System.gc();
|
||||
}
|
||||
|
||||
/**游戏暂停时键盘事件*/
|
||||
void processPauseKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_Q:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_C:
|
||||
timeDz = System.currentTimeMillis() - (10-dzcd)*1000;
|
||||
state = RUNNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**游戏初始时键盘事件*/
|
||||
void processGameStartKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_Q:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_ENTER:
|
||||
state = RUNNING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**游戏运行时键盘事件*/
|
||||
void processRunningKey(int key){
|
||||
switch (key) {
|
||||
case KeyEvent.VK_ESCAPE:
|
||||
System.exit(0);
|
||||
break;
|
||||
case KeyEvent.VK_RIGHT:
|
||||
if(direction!=RIGHT) {//判断人物方向,调用图片左右翻转方法
|
||||
fis();
|
||||
direction = RIGHT;
|
||||
fight.x += 50;
|
||||
fi();
|
||||
}
|
||||
long t = System.currentTimeMillis();//记录上一次击键时间
|
||||
if (fight.state != Fight.RUSH) {
|
||||
if(t-time<200&&t-time>110) {//根据两次击键时间间隔判断是否进入奔跑状态
|
||||
fight.state = Fight.RUSH;
|
||||
rightMove();
|
||||
}else {
|
||||
fight.state = Fight.HOOF;
|
||||
time = t;
|
||||
rightMove();
|
||||
}
|
||||
}else {
|
||||
rightMove();
|
||||
}
|
||||
break;
|
||||
case KeyEvent.VK_LEFT:
|
||||
if(direction!=LEFT) {
|
||||
fis();
|
||||
direction = LEFT;
|
||||
fight.x -= 50;
|
||||
fi();
|
||||
}
|
||||
long t1 = System.currentTimeMillis();
|
||||
if (fight.state != Fight.RUSH) {
|
||||
if(t1-time1<200&&t1-time1>110) {
|
||||
fight.state = Fight.RUSH;
|
||||
leftMove();
|
||||
}else {
|
||||
fight.state = Fight.HOOF;
|
||||
time1 = t1;
|
||||
leftMove();
|
||||
}
|
||||
}else {
|
||||
leftMove();
|
||||
}
|
||||
break;
|
||||
case KeyEvent.VK_DOWN:
|
||||
fight.state = Fight.HOOF;
|
||||
downMove();
|
||||
break;
|
||||
case KeyEvent.VK_UP:
|
||||
fight.state = Fight.HOOF;
|
||||
upMove();
|
||||
break;
|
||||
case KeyEvent.VK_P:
|
||||
state = PAUSE;
|
||||
break;
|
||||
case KeyEvent.VK_X:
|
||||
long t2 = System.currentTimeMillis();
|
||||
if(t2-time3<500&&t2-time3>250){
|
||||
attack++;
|
||||
if(attack==4){
|
||||
attack = 1;
|
||||
}
|
||||
attack(attack);//调用攻击方法
|
||||
}else if(t2-time3>500){
|
||||
attack = 1;
|
||||
attack(attack);
|
||||
}
|
||||
time3 = t2;
|
||||
break;
|
||||
case KeyEvent.VK_D:
|
||||
if (dzcd == 0) {
|
||||
state = DZ;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
int indexZ;
|
||||
int zomblexs;
|
||||
/**走一步*/
|
||||
public void stepAction(){
|
||||
if (zomblexs < zombles.length&&indexZ++ % 50 == 0) {
|
||||
zomblexs += zombles.length/level;
|
||||
} //僵尸分批出动
|
||||
if (zomblexs > zombles.length) {
|
||||
zomblexs = zombles.length;
|
||||
}
|
||||
for (int i = 0; i < zomblexs; i++) {
|
||||
zombles[i].step();
|
||||
}
|
||||
for (int i = 0; i < bullets.length; i++) {
|
||||
Bullet bullet = bullets[i];
|
||||
bullet.step();
|
||||
}
|
||||
}
|
||||
|
||||
/**发射子弹*/
|
||||
int shootIndex = 0;
|
||||
public void shootAction(){
|
||||
if (shootIndex++%27==0) {
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
if (plants[i].iz==0||plants[i].iz==1) {//只有两种植物能发射子弹
|
||||
for (int j = 0; j < zombles.length; j++) {
|
||||
if (plants[i].ry == zombles[j].ry&&zombles[j].x<1000) {//如果出现僵尸
|
||||
Bullet bs = plants[i].shoot();
|
||||
bullets = Arrays.copyOf(bullets, bullets.length+1);
|
||||
bullets[bullets.length-1] = bs;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**向右移动*/
|
||||
void rightMove() {
|
||||
fight.rightMove();
|
||||
}
|
||||
/**向左移动*/
|
||||
void leftMove() {
|
||||
fight.leftMove();
|
||||
}
|
||||
/**向上移动*/
|
||||
void upMove() {
|
||||
fight.upMove();
|
||||
}
|
||||
/**向下移动*/
|
||||
void downMove() {
|
||||
fight.downMove();
|
||||
}
|
||||
|
||||
/**攻击*/
|
||||
void attack(int a){
|
||||
Timer t = new Timer();
|
||||
t.schedule(new TimerTask() {
|
||||
int index=0;
|
||||
@Override
|
||||
public void run() {
|
||||
// TODO Auto-generated method stub
|
||||
switch (a) {//根据参数更换攻击图片
|
||||
case 1:
|
||||
fight.state = Fight.ATTACK;
|
||||
fight.image = fight.attack1[index++];
|
||||
if (index == 5) {//优化打击画面
|
||||
pengFinghtAndZomble();
|
||||
}
|
||||
if(index==fight.attack1.length){
|
||||
t.cancel();//关闭计时器
|
||||
fight.state = Fight.STOP;
|
||||
}
|
||||
break;
|
||||
|
||||
case 2:
|
||||
fight.state = Fight.ATTACK;
|
||||
fight.image = fight.attack2[index++];
|
||||
if (index == 5) {
|
||||
pengFinghtAndZomble();
|
||||
}
|
||||
if(index==fight.attack2.length){
|
||||
t.cancel();
|
||||
fight.state = Fight.STOP;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
fight.state = Fight.ATTACK;
|
||||
fight.image = fight.attack3[index++];
|
||||
if (index == 5) {
|
||||
pengFinghtAndZomble();
|
||||
}
|
||||
if(index==fight.attack3.length){
|
||||
t.cancel();
|
||||
fight.state = Fight.STOP;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}, 0,40);
|
||||
System.gc();
|
||||
}
|
||||
|
||||
/**检测碰撞方法*/
|
||||
public void pengAction(){
|
||||
pengBulletsAndZomble();
|
||||
pengPlantsAndZomble();
|
||||
}
|
||||
|
||||
/**检测人物攻击僵尸*/
|
||||
public void pengFinghtAndZomble(){
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
if (isRectangle(fight, zombles[i])) {
|
||||
zombles[i].x += zombles[i].speed*5;
|
||||
zombles[i].blood -= 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**释放技能*/
|
||||
public void daZhao(){
|
||||
timeDz = System.currentTimeMillis();
|
||||
int dzx = this.dzx+jiNeng.getWidth();
|
||||
int dzy = this.dzy+jiNeng.getHeight();
|
||||
int dzw = jiNeng.getWidth();
|
||||
int dzh = jiNeng.getHeight();
|
||||
Rectangle r1 = new Rectangle( dzx, dzy, dzw, dzh);
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
if (zombles[i].x <= 1100) {
|
||||
Rectangle r2 = new Rectangle( zombles[i].x, zombles[i].ry,
|
||||
zombles[i].w, zombles[i].h);
|
||||
if (r1.intersects(r2)) {
|
||||
zombles[i].x += zombles[i].speed*5;
|
||||
zombles[i].blood = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**检测子弹与僵尸碰撞*/
|
||||
public void pengBulletsAndZomble(){
|
||||
for (int i = 0; i < bullets.length; i++) {
|
||||
for (int j = 0; j < zombles.length; j++) {
|
||||
if (i<bullets.length&&isRectangle(bullets[i], zombles[j])) {
|
||||
bulletDie(i);
|
||||
zombles[j].x += zombles[j].speed*2;
|
||||
zombles[j].blood -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**检测植物与僵尸碰撞*/
|
||||
public void pengPlantsAndZomble(){
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
for (int j = 0; j < zombles.length; j++) {
|
||||
if (isRectangle(plants[i], zombles[j])) {
|
||||
plantKx(i,j);
|
||||
zombles[j].x += zombles[j].speed;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**植物扣血*/
|
||||
public void plantKx(int i, int j){
|
||||
if (indexs[i]++%30 == 0) {
|
||||
plants[i].blood -= zombles[j].ij+2;
|
||||
}
|
||||
}
|
||||
|
||||
/**检查血量*/
|
||||
public void checkBlood(){
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
if (zombles[i].blood <= 0) {
|
||||
zombleDie(i);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < plants.length; i++) {
|
||||
if (plants[i].blood <= 0) {
|
||||
plantDie(i);
|
||||
}
|
||||
}
|
||||
if (life <= 0) {
|
||||
state = GAME_OVER;
|
||||
}
|
||||
}
|
||||
|
||||
/**检测过关条件*/
|
||||
public void isNextLevel() {
|
||||
if (zombles.length == 0) {
|
||||
state = NEXT_LEVEL;
|
||||
}
|
||||
}
|
||||
|
||||
/**检查僵尸和子弹出界*/
|
||||
public void outOfBoundAction() {
|
||||
//检查子弹越界
|
||||
for (int i = 0; i < bullets.length; i++) {
|
||||
if (bullets[i].x>1100) {
|
||||
bulletDie(i);
|
||||
}
|
||||
}
|
||||
//检查僵尸越界
|
||||
for (int i = 0; i < zombles.length; i++) {
|
||||
if (zombles[i].x+zombles[i].w <= 0) {
|
||||
zombleDie(i);
|
||||
life -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**僵尸消失*/
|
||||
public void zombleDie(int i) {
|
||||
score += 1;
|
||||
Zombles zs = zombles[i];
|
||||
zombles[i] = zombles[zombles.length-1];
|
||||
zombles[zombles.length-1] = zs;
|
||||
zombles = Arrays.copyOf(zombles, zombles.length-1);
|
||||
}
|
||||
|
||||
/**子弹消失*/
|
||||
public void bulletDie(int i) {
|
||||
Bullet b = bullets[i];
|
||||
bullets[i] = bullets[bullets.length-1];
|
||||
bullets[bullets.length-1] = b;
|
||||
bullets = Arrays.copyOf(bullets, bullets.length-1);
|
||||
}
|
||||
|
||||
/**植物消失*/
|
||||
public void plantDie(int i){
|
||||
Plants p = plants[i];
|
||||
plants[i] = plants[plants.length-1];
|
||||
plants[plants.length-1] = p;
|
||||
plants = Arrays.copyOf(plants, plants.length-1);
|
||||
|
||||
int index = indexs[i];
|
||||
indexs[i] = indexs[indexs.length-1];
|
||||
indexs[indexs.length-1] = index;
|
||||
indexs = Arrays.copyOf(indexs, indexs.length-1);
|
||||
}
|
||||
|
||||
/**立即恢复站立姿态*/
|
||||
void ir() {
|
||||
fight.state = Fight.STOP;
|
||||
repaint();
|
||||
}
|
||||
|
||||
/**人物行进图片翻转*/
|
||||
void fis(){
|
||||
for (int i = 0; i < fight.hoof.length; i++) {
|
||||
fight.hoof[i] = flipImage(fight.hoof[i]);
|
||||
}
|
||||
for (int i = 0; i < fight.rush.length; i++) {
|
||||
fight.rush[i] = flipImage(fight.rush[i]);
|
||||
}
|
||||
for (int i = 0; i < fight.stop.length; i++) {
|
||||
fight.stop[i] = flipImage(fight.stop[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**攻击动作图片翻转*/
|
||||
void fi(){
|
||||
for (int i = 0; i < fight.attack1.length; i++) {
|
||||
fight.attack1[i] = flipImage(fight.attack1[i]);
|
||||
}
|
||||
for (int i = 0; i < fight.attack2.length; i++) {
|
||||
fight.attack2[i] = flipImage(fight.attack2[i]);
|
||||
}
|
||||
for (int i = 0; i < fight.attack3.length; i++) {
|
||||
fight.attack3[i] = flipImage(fight.attack3[i]);
|
||||
}
|
||||
for (int i = 0; i < jiNengs_2.length; i++) {
|
||||
jiNengs_2[i] = flipImage(jiNengs_2[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测碰撞
|
||||
* @param b 僵尸对象
|
||||
*/
|
||||
boolean isRectangle(Fight a,Zombles b){//Java基本矩形碰撞检测类
|
||||
if (a.y+a.h-19>b.ry+35||a.y+a.h-19<b.ry-35) {
|
||||
return false;
|
||||
}else{
|
||||
Rectangle a1;
|
||||
if(direction){
|
||||
a1 = new Rectangle(a.x+a.w/2,a.y,a.w/2,a.h);
|
||||
}else{
|
||||
a1 = new Rectangle(a.x,a.y,a.w/2,a.h);
|
||||
}
|
||||
Rectangle b1 = new Rectangle(b.x,b.ry-b.h, b.w, b.h);
|
||||
return a1.intersects(b1);//检测是否碰撞,是返回true
|
||||
}
|
||||
}
|
||||
boolean isRectangle(Bullet a,Zombles b){
|
||||
if (a.y+68 == b.ry||a.y+60 == b.ry) {
|
||||
Rectangle a1 = new Rectangle(a.x,a.y,a.w,a.h);
|
||||
Rectangle b1 = new Rectangle(b.x,b.ry-b.h, b.w, b.h);
|
||||
return a1.intersects(b1);
|
||||
}else{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
boolean isRectangle(Plants a,Zombles b){
|
||||
if (a.ry!=b.ry||b == null) {
|
||||
return false;
|
||||
}else{
|
||||
Rectangle a1 = new Rectangle(a.rx,a.ry-a.h,a.w,a.h);
|
||||
Rectangle b1 = new Rectangle(b.x,b.ry-b.h, b.w, b.h);
|
||||
return a1.intersects(b1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 图片水平翻转
|
||||
* @param bufferedImage 目标图像
|
||||
* @return
|
||||
*/
|
||||
public static BufferedImage flipImage(final BufferedImage bufferedImage){
|
||||
int w = bufferedImage.getWidth();
|
||||
int h = bufferedImage.getHeight();
|
||||
BufferedImage img;
|
||||
Graphics2D graphics2;
|
||||
(graphics2 = (img = new BufferedImage(w,h,bufferedImage
|
||||
.getColorModel().getTransparency())).createGraphics())
|
||||
.drawImage(bufferedImage,0,0,w,h,w,0,0,h,null);
|
||||
graphics2.dispose();
|
||||
return img;
|
||||
}
|
||||
}
|
53
src/pnf/Zombles.java
Normal file
@ -0,0 +1,53 @@
|
||||
package pnf;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
|
||||
public class Zombles {
|
||||
/**僵尸数组*/
|
||||
static ImageIcon[] js = new ImageIcon[6];
|
||||
static ImageIcon[] js_1 = new ImageIcon[6];
|
||||
ImageIcon rjs;
|
||||
int ij;
|
||||
/**属性*/
|
||||
int w,h;
|
||||
/**血量*/
|
||||
int blood;
|
||||
static int bx;
|
||||
/**坐标*/
|
||||
int x;
|
||||
static int[] y = new int[5];
|
||||
int iy,ry;
|
||||
/**僵尸速度*/
|
||||
int speed,s;
|
||||
static {
|
||||
for (int i = 0; i < y.length; i++) {
|
||||
y[i] = 191+i*100;
|
||||
}
|
||||
for (int i = 0; i < js.length; i++) {
|
||||
js[i] = new ImageIcon("lib/js"+(i+1)+".gif");
|
||||
}
|
||||
// for (int i = 0; i < js.length; i++) {
|
||||
// js_1[i] = new ImageIcon("lib/js"+(i+1)+"_1.gif");
|
||||
// }
|
||||
}
|
||||
|
||||
public Zombles() {//随机僵尸种类,位置
|
||||
Random r = new Random();
|
||||
ij = r.nextInt(js.length);
|
||||
rjs = js[ij];
|
||||
blood = (ij+1)*10;
|
||||
w = rjs.getIconWidth();
|
||||
h = rjs.getIconHeight();
|
||||
iy = r.nextInt(y.length);
|
||||
ry = y[iy];
|
||||
speed = r.nextInt(4)+1;
|
||||
s = speed;
|
||||
x = 1200;
|
||||
}
|
||||
/**僵尸行走*/
|
||||
public void step(){
|
||||
x -= speed;
|
||||
}
|
||||
}
|
BIN
素材/pg111.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
素材/pg1110.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
素材/pg112.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
素材/pg113.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
素材/pg114.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
素材/pg115.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
素材/pg116.png
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
素材/pg117.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
素材/pg118.png
Normal file
After Width: | Height: | Size: 26 KiB |