Swing动画之敌机工厂

一、游戏效果图:敌军飞机向我方袭来


二、实现原理:在窗体的最上方,沿着X轴按照一定的时间间隔重绘一群敌方飞机,敌方飞机组会沿着Y轴运动,当被我方飞机打中或越界,就定这个敌机已坠毁或与子弹进行了碰撞。代码里创建了一个飞机工厂类与一个飞机管理类,其中飞机管理器中用了Timer ,定时去让飞机工厂去生产飞机,部分代码如下。
三、代码 :

package com.jack;

import com.jack.imp.IPlan;

/**
 * 敌机工厂类: 用泛型时行了两层限制:1.必须是CLASS类型,2.必须是IEnemy实现类
 * 
 * @author laughing
 * @date 2014年11月20日 下午9:46:46
 */
public abstract class AbstractEnemyFactory {
	public abstract <T extends IPlan> T createEnemy(Class<T> c);
}

package com.jack;

import com.jack.imp.IPlan;

/**
 *
 * @author laughing
 * @date 2014年11月20日 下午9:50:22
 */
public class EnemyFactory extends AbstractEnemyFactory {

	@Override
	public <T extends IPlan> T createEnemy(Class<T> c) {
		IPlan enemy = null;
		try {
			enemy = (IPlan) Class.forName(c.getName()).newInstance();
		} catch (Exception e) {
			System.out.println("敌机生产失败.");
		}
		return (T) enemy;
	}

}

package com.jack;

import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;

import com.jack.imp.IPlan;

/**
 *
 * @author laughing
 * @email john.cha@qq.com
 * @date 2014年11月20日 下午10:07:29
 */
public class EnemyManager {
	public static EnemyManager			instance;
	public static Map<Integer, IPlan>	enemyMap	= new HashMap<Integer, IPlan>();
	public static final int				limtNum		= 3;
	private int							enemyID		= 0;
	public EnemyFactory					factory		= new EnemyFactory();

	public EnemyManager() {
		cratePlan();
	}

	/**
	 * @return the enemyMap
	 */
	public static Map<Integer, IPlan> getEnemyMap() {
		return enemyMap;
	}

	public void cratePlan() {
		java.util.Timer timer = new java.util.Timer(true);

		TimerTask task = new TimerTask() {
			public void run() {
				for (int i = 0; i < limtNum; i++) {

					IPlan plan = null;
					if (i == 0) {
						plan = factory.createEnemy(Enemy1.class);
					} else if (i == 1) {
						plan = factory.createEnemy(Enemy2.class);
					} else {
						plan = factory.createEnemy(Enemy3.class);
					}

					enemyMap.put(++enemyID, plan);
				}
			}
		};

		timer.schedule(task, 1000, 2000);

	}

	public void clearEnemy(int key) {
		enemyMap.remove(key);
	}

	/**
	 * @return the instance
	 */
	public static EnemyManager getInstance() {
		if (instance == null) {
			instance = new EnemyManager();
		}
		return instance;
	}

}

四、源码: 点击打开链接

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaSwing提供了多种方式来实现动画过渡效果,以下是其中一种实现方式: 1. 创建一个JFrame窗口并添加一个JPanel面板作为容器。 2. 在JPanel面板上绘制图形或添加组件。 3. 创建一个Timer计时器对象,设置计时器的延迟时间和每次触发后的操作。 4. 在计时器触发的操作中,计算动画的过渡效果,例如改变组件的位置、大小、颜色等。 5. 在计时器触发的操作中,调用JPanel的repaint()方法来触发面板的重绘操作。 以下是一个简单的JavaSwing动画过渡示例代码: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class AnimationDemo extends JFrame implements ActionListener { private JPanel panel; private Timer timer; private int x, y; public AnimationDemo() { panel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.RED); g.fillRect(x, y, 50, 50); } }; getContentPane().add(panel); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 400); setVisible(true); x = 0; y = 0; timer = new Timer(10, this); timer.start(); } @Override public void actionPerformed(ActionEvent e) { x++; y++; panel.repaint(); } public static void main(String[] args) { new AnimationDemo(); } } ``` 在这个示例中,创建了一个JFrame窗口并添加了一个JPanel面板作为容器。在JPanel面板上绘制了一个红色的矩形,并在计时器的触发操作中改变矩形的位置,从而实现了动画过渡效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值