package com.test;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
new GameFrame();
}
}
class GameFrame extends JFrame{
public GameFrame(){
this.setSize(800,600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
MyGamePanel myPanel = new MyGamePanel();
this.addKeyListener(myPanel);
this.add(myPanel);
Thread t = new Thread(myPanel);
t.start();
}
}
class MyGamePanel extends JPanel implements Runnable,KeyListener{
private static final String TITLE = "植物大战僵尸";
private BufferedImage bufferedImage1 = null;
private BufferedImage bufferedImage2 = null;
private List<Plant> plants = null;
private List<Zombies> zombiesList = null;
private boolean stop;
public MyGamePanel(){
this.setBackground(Color.BLACK);
this.setFont(new Font("微软雅黑",Font.PLAIN,36));
plants = this.initPlants(5);
zombiesList = this.initZombies(5);
File file1 = new File(plants.get(0).PLANT_URL);
File file2 = new File(zombiesList.get(0).ZOMBIES_URL);
try {
bufferedImage1 = ImageIO.read(file1);
bufferedImage2 = ImageIO.read(file2);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 初始化植物列表
* @param size
* @return
*/
private List<Plant> initPlants(int size){
List<Plant> plants = new LinkedList<>();
for (int i = 0; i <size ; i++) {
Plant plant = new Plant();
Bullet bullet = new Bullet(100,100*i+45,10,true);
plant.setBullet(bullet);
plant.setLive(true);
plant.setSpeed(0);
plant.setX(0);
plant.setY(100*i+20);
plants.add(plant);
}
return plants;
}
/**
* 初始化僵尸列表
* @param size
* @return
*/
private List<Zombies> initZombies(int size){
List<Zombies> zombiesList = new LinkedList<>();
for (int i = 0; i <size ; i++) {
Zombies zombies = new Zombies();
zombies.setLive(true);
zombies.setLifeValue(8);
zombies.setSpeed(1);
zombies.setX(600);
zombies.setY(100*i+20);
zombiesList.add(zombies);
}
return zombiesList;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawString(TITLE,250,50);
g.setColor(Color.GREEN);
for (int i = 0; i <5 ; i++) {
// g.drawLine(0,100*i-20,800,100*i-20);
g.drawImage(bufferedImage1,plants.get(i).getX(),plants.get(i).getY(),null);
if(zombiesList.get(i).isLive()){
g.drawImage(bufferedImage2,zombiesList.get(i).getX(),zombiesList.get(i).getY(),null);
}
//画子弹
Bullet bullet = plants.get(i).getBullet();
if(bullet.isLive()){
g.fillOval(bullet.getX(),bullet.getY(),20,20);
}
if(stop){
g.drawString("暂停游戏!",300,300);
}
}
}
@Override
public void run() {
while (true){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.updateZombies();
this.updateBullet();
this.repaint();
if(this.stop){
break;
}
}
}
public void updateZombies(){
for(Zombies zombies:zombiesList){
zombies.setX(zombies.getX()-zombies.getSpeed());
if(zombies.getLifeValue()==0){
// zombies.setLive(false);
zombies.setX(600);
zombies.setLifeValue(8);
}
}
}
public void updateBullet(){
for (int i = 0; i <plants.size() ; i++) {
Zombies zombies = zombiesList.get(i);
Bullet bullet = plants.get(i).getBullet();
bullet.setX(bullet.getX()+bullet.getSpeed());
if(bullet.getX()> zombies.getX()){
bullet.setX(100);
zombies.setLifeValue(zombies.getLifeValue()-1);
}
if(bullet.getX()>800){
bullet.setLive(false);
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("监听到按下键盘事件!");
if(e.getKeyCode()==KeyEvent.VK_ENTER){
this.stop = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
}
class Plant{
final String PLANT_URL = "C:\\Users\\Administrator\\Desktop\\peanut2.png";
private int x;
private int y;
private int speed;
private boolean isLive;
private Bullet bullet;
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public Bullet getBullet() {
return bullet;
}
public void setBullet(Bullet bullet) {
this.bullet = bullet;
}
}
class Zombies{
public final String ZOMBIES_URL = "C:\\Users\\Administrator\\Desktop\\zombies2.png";
private boolean isLive;
private int x;
private int y;
private int speed;
private int lifeValue;
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getLifeValue() {
return lifeValue;
}
public void setLifeValue(int lifeValue) {
this.lifeValue = lifeValue;
}
}
class Bullet{
private int x;
private int y;
private int speed;
private boolean isLive;
public Bullet(){}
public Bullet(int x,int y,int speed,boolean isLive){
this.x = x;
this.y = y;
this.speed = speed;
this.isLive = isLive;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
}
效果演示:
这里似乎涉及到缓存渲染的问题,导致绘图失败。因为这个程序是在显卡配置比较高的电脑上写的,放到其他电脑上就画不出来了,需要研究下render问题。