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;
}
}