亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? engine.java

?? 在手機環境里運行的J2ME坦克類射擊游戲源代碼
?? JAVA
字號:
/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Copyright(c) 2004 Jordi Martin Perez
*/
package org.piratis.j2me.core.game;

import javax.microedition.lcdui.Graphics;

import org.piratis.j2me.core.BBox2D;

/**
 * Default Engine class. All game engines based on J2MEGL must 
 * override this one because of the tight binding between this class
 * and the Canvas.<br>
 * <br>
 * Once started, the engine enters and endlessly loop which won't
 * stop until nextRunLoop return false (good candidate to be 
 * overwritten, isn't it?).<br>
 * <br>
 * A game might contain more than one engine, depending on the status
 * of the game and if it has playable sections/levels which
 * differ among them in great measure, etc.. It is reponsibility of the
 * programmer to stop one and start the other.
 * 
 * @author		Jordi Mart韓
 * @copyright	Copyright (c) 2004
 * @created 	24-jun-2004
 * @version		$Id: Engine.java,v 1.5 2004/07/22 16:50:39 piratis Exp $
 */
public abstract class Engine 
	implements Runnable
{
    /**
     * Key status constants
     */
    public static final int IS_UP = 1 << Canvas.UP;
	public static final int IS_DOWN = 1 << Canvas.DOWN;
	public static final int IS_LEFT = 1 << Canvas.LEFT;
	public static final int IS_RIGHT = 1 << Canvas.RIGHT;
	public static final int IS_FIRE = 1 << Canvas.FIRE;
	public static final int IS_GAME_A = 1 << Canvas.GAME_A;
	public static final int IS_GAME_B = 1 << Canvas.GAME_B;
	public static final int IS_GAME_C = 1 << Canvas.GAME_C;
	public static final int IS_GAME_D = 1 << Canvas.GAME_D;
	
	/**
	 * Keep stored current key status
	 */
	private int keyState;
	private int keyReleaseState;

	/**
     * Default FPS setting
     */
    public static int DEFAULT_FPS = 10;
    
	/**
	 * Engine and canvas are tightly bound
	 */
	protected Canvas canvas = null;
	
	/**
	 * Where to store all the layers/sprites/tiles
	 */
	protected LayerManager layers = null;
	
	/**
	 * Boolean attribute to see if it is running
	 */
	private boolean running;
	
	/**
	 * Engine/Canvas FPS refresh rate
	 */
	private int fps = Engine.DEFAULT_FPS;
	
	/**
	 * Creates a new Engine. FPS are set to the default value.
	 * @param canvas the canvas of this engine
	 */
	public Engine(Canvas canvas)
	{
	    this(canvas, Engine.DEFAULT_FPS);
	}
	
	/**
	 * Creates a new Engine. FPS is not ensured: the engine/library
	 * will do its best to accomplish it! 
	 * @param canvas the canvas of this engine
	 * @param fps desired frames per second refresh rate
	 */
	public Engine(Canvas canvas, int fps)
	{
		super();

		this.initialize(canvas, fps);
	}

	/**
	 * @see java.lang.Runnable#run()
	 */
	public void run()
	{
		try 
		{
		    // time variables
		    long startTime;
		    int interval = 1000 / this.fps;
		    // initial settings
			setRunningStatus();
			Thread currentThread = Thread.currentThread();
			while (nextRunLoop() &&
			        currentThread == Thread.currentThread())
			{
			    startTime = System.currentTimeMillis();
			    // handle keys pressed
			    this.input();
				// do engine work
				this.work();
				// paint what is needed/required
				this.paint();
				// wait
				this.waitSomething(startTime, interval);
			}
		} 
		catch (Exception e)
		{
			e.printStackTrace();	
		}
	}

	/**
	 * Performs a stop
	 */
	public void stop()
	{
		this.running = false;
	}
	
	
	/**
	 * Wait method to synchronize work & repainting. Subclasses can override
	 * this method to adjust waiting times. It is called at the end of the
	 * engine loop.
	 * @param loopStartTime the start time of the engine loop
	 * @param interval adjusted to the engine/canvas FPS
	 */
	protected void waitSomething(long loopStartTime, long interval)
	{
		// let's see if we have to wait
		long time2 = System.currentTimeMillis() - loopStartTime;
		if (time2 < interval)
		{
			try { Thread.sleep(interval - time2); } 
			catch (InterruptedException e) {}
		}
		else
		    Thread.yield();
	}

	/**
	 * Real engine method that should be implemented in subclasses
	 */
	protected abstract void work();
	
	/**
	 * Engine's key management method. This must be implemented in
	 * subclasses in order to react to user key strokes
	 */
	protected abstract void input();
	
	/**
	 * Default paint method.
	 *
	 */
	protected void paint()
	{
	    Graphics g = this.canvas.getGraphics();
	    this.canvas.paintBackground(g, 
	            new BBox2D(0, 0, this.canvas.getWidth(), this.canvas.getHeight()));
	    // TODO: remove & parametrise this below!
	    this.layers.paint(g, 0, 0);

	    // call repainting request
		this.canvas.getDisplay().callSerially(this.canvas);
	}
	
	/**
	 * Initialize method..
	 */
	protected void initialize(Canvas canvas, int newFps)
	{
	    // store canvas for further use
		this.canvas = canvas;
		
		// new layer manager
		this.layers = new LayerManager();
		
		// store FPS
		this.fps = newFps;
		
		// initial engine status
		setInitialStatus();
		
		// set canvas' engine
		this.canvas.setEngine(this);
	}
	
	/**
	 * Sets the status variables to an initial status 
	 */
	protected void setInitialStatus()
	{
		this.running = false;
		this.keyState = this.keyReleaseState = 0;
	}

	/**
	 * Checks if the run loop needs to continue running (based on engine status)
	 * @return
	 */
	protected boolean nextRunLoop()
	{
		return this.running;
	}

	/**
	 * Engine Status to a running status 
	 */
	protected void setRunningStatus()
	{
		this.running = true;
	}
	
	/**
	 * Canvas calls this method upon a key is pressed. The key pressed
	 * status will be automaticaly updated.
	 * @param keyCode which key has been pressed
	 */
	protected void keyPressed(int keyCode) 
	{
	    // set bit key pressed status -> 1 
		this.keyState = this.keyState |
			(1 << this.canvas.getGameAction(keyCode));
		// key released status -> 0
		keyReleaseState = keyReleaseState & 
			~(1 << this.canvas.getGameAction(keyCode));
	}

	/**
	 * Canvas call this method upon a key is released. The key pressed
	 * status will be automaticaly updated.
	 * @param keyCode which key has been released
	 */
	protected void keyReleased(int keyCode) 
	{
	    // key released status -> 1
		this.keyReleaseState = this.keyReleaseState |
			(1 << this.canvas.getGameAction(keyCode));
	}

	/**
	 * Gets the states of the game keys. The key's status must be checked
	 * bitwise.<br>
	 * <br>
	 * After calling this method, the key status will be cleared.
	 * @return
	 */
	public int getKeyStates() {
	    // store var to be returned
		int result = this.keyState;
		// apply release status
		this.keyState = this.keyState & ~this.keyReleaseState;
		// nullify release status
		this.keyReleaseState = 0;
		// return key status
		return result;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线亚洲一区观看| 国产精品丝袜黑色高跟| 国产精品77777| 日韩国产精品大片| 一区二区三区资源| 国产欧美一区二区精品久导航| 欧美日韩成人一区二区| 日本二三区不卡| 久久精品日产第一区二区三区高清版| 精品国偷自产国产一区| 91精品国产综合久久国产大片| 91高清在线观看| 国产精品视频在线看| 韩国欧美一区二区| 国产高清精品在线| 97精品电影院| 91在线精品秘密一区二区| 日韩欧美国产成人一区二区| 26uuu亚洲婷婷狠狠天堂| 国产精品伦一区二区三级视频| 美女免费视频一区二区| 国产一区二区精品久久| 99精品视频一区二区| 久久这里只精品最新地址| 日韩高清不卡一区二区| 欧美喷水一区二区| 亚洲永久精品大片| 蜜臀精品久久久久久蜜臀| 欧美日韩在线三区| 亚洲精品在线三区| 国产一区二区三区电影在线观看| 欧美一区二区三区小说| 三级久久三级久久久| 国产麻豆精品theporn| 日韩一卡二卡三卡四卡| 中文字幕在线观看不卡| 亚洲一区二区精品视频| 91麻豆成人久久精品二区三区| 日韩一区二区三区视频在线| 日本视频在线一区| 日韩三级.com| 国产乱人伦偷精品视频免下载| 久久在线观看免费| 成人avav在线| 日韩三级伦理片妻子的秘密按摩| 老司机精品视频导航| 在线观看av一区| 中文字幕一区不卡| 91老师片黄在线观看| 伊人婷婷欧美激情| 国产成人精品aa毛片| 亚洲欧洲国产日韩| 欧美在线一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美国产成人在线| 久久疯狂做爰流白浆xx| 国产人成亚洲第一网站在线播放| 99久久婷婷国产综合精品电影| 亚洲成人精品影院| 99国内精品久久| 视频一区中文字幕| 国产午夜一区二区三区| 在线亚洲精品福利网址导航| 日韩精品一二区| 国产精品美女久久久久高潮| 色av一区二区| 久久99国产精品成人| 91精品国产综合久久福利软件 | 亚洲愉拍自拍另类高清精品| 欧美日本在线一区| 国产高清亚洲一区| 亚洲五月六月丁香激情| 91在线观看高清| 免费高清在线视频一区·| 3atv一区二区三区| 日韩va亚洲va欧美va久久| 久久久久久99精品| 成人性视频免费网站| 国产午夜精品福利| 欧美二区三区91| 日韩国产欧美一区二区三区| 国产精品入口麻豆九色| 欧美一区二区精美| 91视频观看免费| 激情久久五月天| 亚洲成人自拍一区| 亚洲视频你懂的| 欧美日韩成人综合天天影院 | 日本一区中文字幕| 成人欧美一区二区三区视频网页| 91精品黄色片免费大全| 91啦中文在线观看| 99精品视频中文字幕| 国产精品一区二区在线观看不卡| 日韩成人一级大片| 亚洲一区二区不卡免费| 中文字幕一区二区不卡 | 亚洲欧美视频一区| 欧美亚洲丝袜传媒另类| 日本伊人色综合网| 亚洲mv大片欧洲mv大片精品| 一区二区三区资源| 最新热久久免费视频| 国产婷婷色一区二区三区| 久久综合九色综合97_久久久| 91精品国产色综合久久ai换脸| 91麻豆免费看| 日本高清无吗v一区| 91黄视频在线| 色狠狠av一区二区三区| 91啪亚洲精品| 在线观看日韩电影| 一本大道久久精品懂色aⅴ| 欧美a级理论片| 成人黄色a**站在线观看| 久久精品理论片| 久久精品久久精品| 精品一区二区免费在线观看| 久久66热re国产| 亚洲在线免费播放| 综合色天天鬼久久鬼色| **性色生活片久久毛片| 亚洲视频电影在线| 亚洲美女淫视频| 亚洲成人精品一区二区| 日韩国产精品久久| 国产一区二区三区在线观看免费| 激情综合色综合久久| 国产寡妇亲子伦一区二区| 波多野结衣中文一区| 亚洲成人黄色小说| 舔着乳尖日韩一区| 亚洲欧美日韩国产手机在线 | 日韩国产一区二| 九九九精品视频| 成人毛片老司机大片| 色综合激情久久| 日韩一区二区三区av| 久久久久久99久久久精品网站| 中文字幕一区二区三区av| 亚洲不卡av一区二区三区| 久久国产精品99精品国产 | 乱中年女人伦av一区二区| 国产乱人伦精品一区二区在线观看| 国产成人精品午夜视频免费| 91女厕偷拍女厕偷拍高清| 欧美一区二区三区视频在线| 欧美高清在线视频| 午夜久久电影网| 国产成人av福利| 国产在线精品国自产拍免费| 成人做爰69片免费看网站| 精品视频全国免费看| 国产日韩欧美精品一区| 午夜视频一区二区三区| 国产一区二区不卡在线| 在线精品视频免费播放| 久久夜色精品一区| 亚洲一区二区在线视频| 国产精品一区二区男女羞羞无遮挡 | 亚洲二区视频在线| 国产成人在线色| 欧美精品乱人伦久久久久久| 亚洲国产成人午夜在线一区| 天堂在线亚洲视频| 91麻豆精东视频| 欧美国产日韩一二三区| 日本sm残虐另类| 欧美三区在线视频| 亚洲欧洲精品一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 欧美日韩免费高清一区色橹橹| 国产欧美一区二区精品久导航| 免费观看在线综合色| 欧美中文字幕一二三区视频| 国产精品丝袜在线| 国模娜娜一区二区三区| 欧美日韩免费电影| 亚洲综合久久久| av在线播放不卡| 久久久精品免费网站| 日本不卡高清视频| 666欧美在线视频| 亚洲国产成人porn| 欧洲av在线精品| 樱花草国产18久久久久| 91在线免费看| 亚洲欧美一区二区不卡| 91小视频免费观看| 国产精品久久久久久久久快鸭| 亚洲综合久久av| 一本久久综合亚洲鲁鲁五月天| 国产精品久久国产精麻豆99网站| 国产一区二区三区观看| 久久久久久久久久看片| 国产美女在线精品| 国产午夜一区二区三区| 成人听书哪个软件好| 国产精品久久久久久久久免费桃花 | 亚洲国产电影在线观看|