Статья небольшая. Реализация класса GUICheckBox похожа на реализацию кнопки единственная разницей является то, что у чекбокса всего два состояния "выбран" или "не выбран", а так же то что необходимо обеспечить эффект залипания состояния чтобы при зажатой кнопки мыши не происходило очень быстрая смена состояния выбора.
/** * * @author Ruslan Nevedomy */ public class GUICheckBox extends GUIElement{
Texture checked; Texture unchecked; Timer sens;
boolean isChecked;
public GUICheckBox(int x,int y,int heigth,int width){ super(x,y,heigth,width); setVisible(true); sens = new Timer(500); }
public boolean getChecked() { return isChecked; }
public void setChecked(boolean isChecked) { this.isChecked = isChecked; this.sens.start(); }
/** * установка текстур для чекбокса * если в качестве параметра передать null то он не будет установлен * @param checked текстура для состояния "выбран" * @param unchecked текстура для состояния "не выбран" */ public void setTextures(Texture checked,Texture unchecked) { if (checked!=null) { this.checked = checked; } if (unchecked!=null) { this.unchecked = unchecked; } }
@Override public void evaluteInput(InputMap inputMap) { if(getVisible()) { int xpos = inputMap.mouse_x; int ypos = inputMap.mouse_y;
if((xpos>=x)&&(xpos<=x+width)&&(ypos>=y)&&(ypos<=y+heigth)) { if (inputMap.mouse_leftbutton_down) { if (sens.getElapsedTicks()>0) { Action(); } } } } }
@Override public void Action() { setChecked(!isChecked); }
@Override public void Draw(FrameBuffer buffer) { if (getVisible()) { int parent_x=0; int parent_y=0;
//получение координат родительского элемента if (getParent()!=null) { parent_x=getParent().x; parent_y=getParent().y; } //отрисовка if (isChecked) { buffer.blit(checked, parent_x+0, parent_y+0, x, y, width, heigth, true); } else { buffer.blit(unchecked, parent_x+0, parent_y+0, x, y, width, heigth, true); } } } }
Как видно код достаточно прост, эффект залипания реализуется при помощи таймера. В данной реализации я не стал вносить в конструктор обязательными параметрами текстуры т.к. подумал, что кто то захочет не парится с загрузкой текстур, а создаст их в конструкторе на примере того как создается текстура в классе GUIBorder Это все в данной статье.