Swing动画之子弹

一、游戏效果图: 飞机发射的子弹

二、实现原理:重写paintComponet方法,按照一定的时间间隔,让子弹的坐标一直向Y轴递减,这样这实现了子弹的运动效果,子弹重画的开始位置就是飞机的坐标。

三、代码:在前两次的基础,把代码进行一些简单优化,如下:

package com.jack;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;

import javax.swing.JPanel;

import com.jack.imp.IProcess;

/**
 * 游戏背景
 *
 * @author laughing
 * @date 2014年11月20日 下午8:12:25
 */
public class BackGround implements IProcess {
	private static final Image[]	BG_IMAGES	= ImageManager.getInstance()
																.getImagesByType("background");
	private static final int		SPEED		= 20;
	private int						topX		= 0;
	private int						topY		= -480;
	private int						belowX		= 0;
	private int						belowY		= 0;

	@Override
	public void drawMyself(Graphics g, JPanel p) {
		g.drawImage(BG_IMAGES[1], topX, topY, (ImageObserver) p);
		g.drawImage(BG_IMAGES[0], belowX, belowY, (ImageObserver) p);
	}

	@Override
	public void move() {
		if (topY >= 0) {
			topY = -480;
		} else {
			topY += SPEED;
		}

		if (belowY >= 480) {
			belowY = 0;
		} else {
			belowY += SPEED;
		}
	}

	@Override
	public boolean collison() {
		// TODO Auto-generated method stub
		return false;
	}

}
package com.jack;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;

import javax.swing.JPanel;

import com.jack.imp.IProcess;

/**
 * 游戏子弹
 *
 * @author laughing
 * @date 2014年11月20日 上午10:27:12
 */
public class Bullet implements IProcess {
	public static final Image[]	BULLET_IMAGES	= ImageManager.getInstance()
																.getImagesByType("bullet");
	public static final int		FLY_SPEED		= 20;
	private boolean				dead			= false;
	public int					x;
	public int					y;

	public Bullet(int x, int y) {
		this.x = x - 50;
		this.y = y;
	}

	public boolean outOfBounds() {
		if (this.y == 0) {
			this.dead = true;
			return false;
		}
		return true;
	}

	/**
	 * @return the y
	 */
	public int getY() {
		return y;
	}

	/**
	 * @return the x
	 */
	public int getX() {
		return x;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IProcess#drawMyself(java.awt.Graphics,
	 * javax.swing.JPanel)
	 */
	@Override
	public void drawMyself(Graphics g, JPanel p) {
		// TODO Auto-generated method stub
		g.drawImage(BULLET_IMAGES[0],
					x,
					y - BULLET_IMAGES[0].getHeight(null),
					(ImageObserver) p);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IProcess#move()
	 */
	@Override
	public void move() {
		if (outOfBounds())
			this.y -= FLY_SPEED;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see com.jack.imp.IProcess#collison()
	 */
	@Override
	public boolean collison() {
		// TODO Auto-generated method stub
		return false;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Bullet [dead=" + dead + ", x=" + x + ", y=" + y + "]";
	}

	/**
	 * @return the dead
	 */
	public boolean isDead() {
		return dead;
	}

}
package com.jack;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JPanel;

import com.jack.imp.IProcess;

/**
 * 战斗机
 *
 * @author laughing
 * @date 2014年11月20日 下午2:16:21
 */
public class Plan implements IProcess, KeyListener {
	private static final Image[]		PLAN_IMAGES		= ImageManager.getInstance()
																		.getImagesByType("plan");
	public static Map<Integer, Bullet>	bulletMap		= new HashMap<Integer, Bullet>();
	private static final int			PLAN_MOVE_SPEED	= 10;
	private static int					bulletID		= 0;
	public static int					imageIndex		= 0;
	private int							x;
	private int							y;

	public Plan(int x, int y) {
		this.x = x;
		this.y = y;

	}

	public void shut() {
		Bullet b = new Bullet(x, y);
		bulletMap.put(++bulletID, b);
		System.out.println("crate " + bulletMap);
	}

	@Override
	public void drawMyself(Graphics g, JPanel p) {
		g.drawImage(PLAN_IMAGES[imageIndex], x, y, (ImageObserver) p);
	}

	public void updatePlan() {

		if (imageIndex == 5)
			imageIndex = 0;
		imageIndex++;
	}

	@Override
	public void move() {

	}

	@Override
	public boolean collison() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent e) {
		int key = e.getKeyCode();
		if (key == KeyEvent.VK_UP) {
			if (y - PLAN_MOVE_SPEED >= 0) {
				y -= PLAN_MOVE_SPEED;
			}
		}
		if (key == KeyEvent.VK_DOWN) {

			if (y + PLAN_MOVE_SPEED <= GamePanel.HEIGHT - PLAN_IMAGES[0].getHeight(null) * 2) {
				y += PLAN_MOVE_SPEED;
			}
		}
		if (key == KeyEvent.VK_LEFT) {
			if (x - PLAN_MOVE_SPEED >= 0)
				x -= PLAN_MOVE_SPEED;
		}
		if (key == KeyEvent.VK_RIGHT) {

			if (x + PLAN_MOVE_SPEED < GamePanel.WEIGHT - PLAN_IMAGES[0].getWidth(null))
				x += PLAN_MOVE_SPEED;
		}
		if (key == KeyEvent.VK_SPACE) {
			shut();
		}

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
package com.jack;

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;
import javax.swing.border.SoftBevelBorder;

/**
 * 游戏容器
 *
 * @author laughing
 * @date 2014年11月16日 下午7:58:11
 */
public class GamePanel extends JPanel implements Runnable {
	public static final int		HEIGHT	= 480;
	public static final int		WEIGHT	= 320;
	public static Plan			plan	= new Plan(160, 400);
	public static BackGround	ground	= new BackGround();

	public GamePanel() {
		setSize(WEIGHT, HEIGHT);
		setBorder(new SoftBevelBorder(1, Color.white, Color.white));
		// Sets the focusable state of this Component to the specified value.
		// This value overrides the Component's default focusability.
		setFocusable(true);
		// 监听事件
		addKeyListener(plan);
		new Thread(this).start();
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
	 */
	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);
		ground.drawMyself(g, this);
		plan.drawMyself(g, this);
		for (int key : plan.bulletMap.keySet()) {
			Bullet b = plan.bulletMap.get(key);
			if (!b.isDead()) {

				b.drawMyself(g, this);
			}
		}
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			plan.updatePlan();
			ground.move();
			for (int key : plan.bulletMap.keySet()) {
				Bullet b = plan.bulletMap.get(key);
				if (!b.isDead()) {
					b.move();
				}
			}
			repaint();
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
package com.jack;

import javax.swing.JFrame;

/**
 *
 * @author laughing
 * @date 2014年11月16日 下午8:11:39
 */
public class Main extends JFrame {
	GamePanel	panel	= new GamePanel();

	public Main() {
		setSize(panel.getWidth(), panel.getHeight());
		getContentPane().add(panel);
		setVisible(true);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
	}

	public static void main(String args[]) {
		new Main();
	}

}

四、源码:点击打开链接

时间: 2024-08-24 10:08:37

Swing动画之子弹的相关文章

用Quick3.3简单开发微信打飞机 (三)----------------------------- 添加爆炸动画和子弹与敌机的碰撞

用Quick3.3简单开发微信打飞机03 添加爆炸动画和子弹与敌机的碰撞 这个就作为最后一篇吧,当然,可以扩展的方面还有很多,比如分数的记录,结算界面还有一些小道具等,就不添加了.这只是当作一个简单的入门,而在这个入门中确实学到了不少东西.而那些没添加的东西呢,其实,就没那么重要了.没有太难的知识点.所以,就没必要纠结太长时间了. 碰撞检测: 碰撞检测重新写了一个计时器,这个计时器是每帧调用的,也就是每秒调用60次.但是,没有用updata. 检测碰撞的函数如下: [plain] view pl

Java Swing 动画(二)

一.动画效果:实现了飞机飞行的动画效果,也实现了飞机的移动. 二.实现原理: 1.飞机飞行 的效果:其实也还是重写paintComponent,按照一定的时间间隔更换图片就有了飞行的效果,动画就是更换图片. 2.移动飞机:实现KeyListener这个接口,这个接口可以接收键盘的事件.用这个面板容器去监听些事件. 三.代码: package com.jack; import java.awt.GridLayout; import java.awt.List; import javax.swing

用Quick3.3简单开发微信打飞机03 添加爆炸动画和子弹与敌机的碰撞

这个就作为最后一篇吧,当然,可以扩展的方面还有很多,比如分数的记录,结算界面还有一些小道具等,就不添加了.这只是当作一个简单的入门,而在这个入门中确实学到了不少东西.而那些没添加的东西呢,其实,就没那么重要了.没有太难的知识点.所以,就没必要纠结太长时间了. 碰撞检测: 碰撞检测重新写了一个计时器,这个计时器是每帧调用的,也就是每秒调用60次.但是,没有用updata. 检测碰撞的函数如下: function GameScene:checkCollision() --这个方法处理碰撞检测,子弹和

Swing动画之敌机工厂

一.游戏效果图:敌军飞机向我方袭来 二.实现原理:在窗体的最上方,沿着X轴按照一定的时间间隔重绘一群敌方飞机,敌方飞机组会沿着Y轴运动,当被我方飞机打中或越界,就定这个敌机已坠毁或与子弹进行了碰撞.代码里创建了一个飞机工厂类与一个飞机管理类,其中飞机管理器中用了Timer ,定时去让飞机工厂去生产飞机,部分代码如下. 三.代码 : package com.jack; import com.jack.imp.IPlan; /** * 敌机工厂类: 用泛型时行了两层限制:1.必须是CLASS类型,2

UE4的编程C++创建一个FPSproject(两)角色网格、动画、HUD、子弹类

立即归还,本文将总结所有这些整理UE4有关角色的网络格.动画.子弹类HUD一个简单的实现. (五)角色加入网格 Character类为我们默认创建了一个SkeletaMeshComponent组件,所以我们只须要做的就是使用哪一个静态网格模型.接下来我们为我们的FPSCharacter类创建一个蓝图,这样我们能够简单的把资源指定给静态网格模型这里,而且方便以后操作加入的组件. 作为開始,我们首先要导入一个第三人称的静态网格模型.最后我们设置成两个网格,一个是我们自己看的,另外一个是其它人看到的.

jq动画分析1

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

jq动画分析

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

一款简洁而强大的前端框架JQUery—动画效果及剪刀石头布小游戏

jQuery是什么? jQuery是一个快速.简洁的JavaScript框架,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和Ajax交互.它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和Ajax交互. JQuery效果-隐藏和显示 .show()让隐藏的元素显示.效果为:同时修改元素的高度.宽度.opacity属性 .hide()让显示

jq时间戳动画

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ