www.pudn.com > MobiCraft_src.rar > Keys.java


// style: tabs, tabsize=4, style=ANSI 
//+----------------------------------------------------------------------+ 
// Copyright (c) 2006 Company Name 
// Made by Andrew and Zahar 
//+----------------------------------------------------------------------+ 
// Filename: Keys.java 
//+----------------------------------------------------------------------+ 
// Comment: Хранит какие кнопки нажаты и когда ( время между сменой состояния ) 
//+----------------------------------------------------------------------+ 
 
package app; 
 
//import battle.Battle; 
//import menu.Menu; 
//import menu.Panel; 
//import world.Map; 
 
import java.io.*; 
import javax.microedition.lcdui.*; 
import javax.microedition.lcdui.game.*; 
 
public class Keys 
{ 
    // Кнопки 0-9 задаются элементами 0-9. 
    public static final int STAR =	10; 
    public static final int POUND =	11; 
    public static final int FIRE =	12; 
    public static final int LEFT =	13; 
    public static final int RIGHT =	14; 
    public static final int UP =	15; 
    public static final int DOWN =	16; 
    public static final int LSOFT =	17; 
    public static final int RSOFT =	18; 
    public static final int MENU =	19; 
    public static final int CALL =	20; 
    public static final int TOTAL_KEYS =21; 
 
	// Это для софт клавиш. Их нет в j2me. Мудаки. 
    public static final int CANVAS_LSOFT =	-21; 
    public static final int CANVAS_RSOFT =	-22; 
    public static final int CANVAS_MENU =	-23; 
    public static final int CANVAS_CALL =	-10; 
	 
    public MainCanvas mMainCanvas;  // Link to shared MainCanvas 
 
    // Текущие состояния 
    // 0 (00) - не нажата. 
    // 1 (01) - была не нажата, сейчас нажали. 
    // 2 (10) - отпустили. 
    // 3 (11) - До сих пор не отпускали. 
    public int[] pRealStates; 
    public int[] pShowStates; 
    // Как давно было пред. состояние. 
    public long[] pTime; 
	// Состояние кнопок спрашивали. Это для того, чтобы заставить прочитать кнопку, чтобы небыло пропускания кнопок при тормозах. 
    public boolean[] pShown; 
     
    // Кол-во милисекунд, чтобы считать, что кнопку зажали. 
    public static final int HOLD_TIME = 300; 
    // Кол-во милисекунд, при повторении при зажатой кнопке. 
    public static final int REPEAT_TIME = 100; 
 
     
    public Keys(MainCanvas m) 
    { 
		mMainCanvas = m; 
    } 
    public void Init() 
    { 
		pRealStates = new int[TOTAL_KEYS]; 
		pShowStates = new int[TOTAL_KEYS]; 
		pTime = new long[TOTAL_KEYS]; 
		pShown = new boolean[TOTAL_KEYS]; 
    } 
    public void Destroy() 
    { 
		pRealStates = null; 
		pShowStates = null; 
		pTime = null; 
		pShown = null; 
    } 
     
    public boolean Pressed( int n ) 
    { 
		return ( pShowStates[n]==1 || pShowStates[n]==3 ); 
    } 
    public boolean Released( int n ) 
    { 
		return ( pShowStates[n]==0 || pShowStates[n]==2 ); 
    } 
 
    public boolean PressEvent( int n ) 
    { 
		return ( pShowStates[n]==1 ); 
    } 
    public boolean AnyKeyPressEvent() 
    { 
		for (int i=0; iHOLD_TIME) ) 
		{ 
			// Это трюк. отнимаем REPEAT_TIME, чтобы через прохождения его ответить что зкнопка снова зажата. 
			pTime[n] -= REPEAT_TIME; 
			return true; 
		} 
		return false; 
    } 
     
    public void keyPressed(int code) 
    { 
		switch (code) 
		{ 
			// Here are menu hotkeys 
			case Canvas.KEY_NUM0: Press(0); break; 
			case Canvas.KEY_NUM1: Press(1); break; 
			case Canvas.KEY_NUM2: Press(2); break; 
			case Canvas.KEY_NUM3: Press(3); break; 
			case Canvas.KEY_NUM4: Press(4); break; 
			case Canvas.KEY_NUM5: Press(5); break; 
			case Canvas.KEY_NUM6: Press(6); break;                         
			case Canvas.KEY_NUM7: Press(7); break; 
			case Canvas.KEY_NUM8: Press(8); break; 
			case Canvas.KEY_NUM9: Press(9); break; 
			case Canvas.KEY_STAR: Press(STAR); break; 
			case Canvas.KEY_POUND: Press(POUND); break; 
			case CANVAS_LSOFT:	   Press(LSOFT); break; 
			case CANVAS_RSOFT:	   Press(RSOFT); break; 
			case CANVAS_MENU: 	   Press(MENU); break; 
			case CANVAS_CALL:	   Press(CALL); break; 
			default: // Here other codes supported by GameAction 
			int key = mMainCanvas.getGameAction(code); 
			switch (key) 
			{ 
				case Canvas.FIRE:   Press(FIRE); break; 
				case Canvas.UP:		Press(UP); break;                      
				case Canvas.DOWN:   Press(DOWN); break; 
				case Canvas.RIGHT:  Press(RIGHT); break; 
				case Canvas.LEFT:   Press(LEFT); break;    
				default: break; //ignore 
			} 
			break; 
		} 
    } 
    public void keyReleased(int code) 
    { 
		switch (code) 
		{ 
			// Here are menu hotkeys 
			case Canvas.KEY_NUM0: Release(0); break; 
			case Canvas.KEY_NUM1: Release(1); break; 
			case Canvas.KEY_NUM2: Release(2); break; 
			case Canvas.KEY_NUM3: Release(3); break; 
			case Canvas.KEY_NUM4: Release(4); break; 
			case Canvas.KEY_NUM5: Release(5); break; 
			case Canvas.KEY_NUM6: Release(6); break;                         
			case Canvas.KEY_NUM7: Release(7); break; 
			case Canvas.KEY_NUM8: Release(8); break; 
			case Canvas.KEY_NUM9: Release(9); break; 
			case Canvas.KEY_STAR: Release(STAR); break; 
			case Canvas.KEY_POUND: Release(POUND); break; 
			case CANVAS_LSOFT:	   Release(LSOFT); break; 
			case CANVAS_RSOFT:	   Release(RSOFT); break; 
			case CANVAS_MENU: 	   Release(MENU); break; 
			case CANVAS_CALL:	   Release(CALL); break; 
			default: // Here other codes supported by GameAction 
			int key = mMainCanvas.getGameAction(code); 
			switch (key) 
			{ 
				case Canvas.FIRE:   Release(FIRE); break; 
				case Canvas.UP:		Release(UP); break;                      
				case Canvas.DOWN:   Release(DOWN); break;  
				case Canvas.RIGHT:  Release(RIGHT); break; 
				case Canvas.LEFT:   Release(LEFT); break;    
				default: break; //ignore 
			} 
			break; 
		} 
    } 
     
    private void Press(int n) 
    { 
		if ( pShown[n] ) 
		{ 
			pShowStates[n] = 1; 
			pShown[n] = false; 
		} 
		pRealStates[n] = 1; 
    	pTime[n] = 0; 
	} 
    private void Release(int n) 
    { 
		if ( pShown[n] ) 
		{ 
			pShowStates[n] = 2; 
			pShown[n] = false; 
		} 
		pRealStates[n] = 2; 
    	pTime[n] = 0; 
	} 
}