PageRenderTime 28ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/engine_java/000_Engine_G2D/g2d/com/g2d/CanvasAdapter.java

http://cellengine.googlecode.com/
Java | 1031 lines | 647 code | 157 blank | 227 comment | 80 complexity | 1a575cc90bfa1e4bd453ba4d03cb015c MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0, BSD-3-Clause, AGPL-3.0, LGPL-2.1, Apache-2.0, MPL-2.0-no-copyleft-exception, CPL-1.0
  1. package com.g2d;
  2. import java.applet.Applet;
  3. import java.awt.Component;
  4. import java.awt.Container;
  5. import java.awt.Cursor;
  6. import java.awt.Dimension;
  7. import java.awt.Font;
  8. import java.awt.Graphics2D;
  9. import java.awt.GraphicsConfiguration;
  10. import java.awt.Image;
  11. import java.awt.KeyboardFocusManager;
  12. import java.awt.Point;
  13. import java.awt.Transparency;
  14. import java.awt.Window;
  15. import java.awt.event.FocusEvent;
  16. import java.awt.event.FocusListener;
  17. import java.awt.event.KeyEvent;
  18. import java.awt.event.KeyListener;
  19. import java.awt.event.MouseEvent;
  20. import java.awt.event.MouseListener;
  21. import java.awt.event.MouseMotionListener;
  22. import java.awt.event.MouseWheelEvent;
  23. import java.awt.event.MouseWheelListener;
  24. import java.awt.image.VolatileImage;
  25. import java.util.Collections;
  26. import java.util.HashMap;
  27. import com.cell.exception.NotImplementedException;
  28. import com.g2d.display.AnimateCursor;
  29. import com.g2d.display.Stage;
  30. import com.g2d.display.event.Event;
  31. import com.g2d.display.event.TextInputer;
  32. import com.g2d.editor.DisplayObjectEditor;
  33. public class CanvasAdapter implements
  34. com.g2d.display.Canvas,
  35. KeyListener,
  36. MouseListener,
  37. MouseMotionListener,
  38. MouseWheelListener,
  39. FocusListener
  40. {
  41. // --------------------------------------------------------------------------------
  42. final private CanvasContainer parent;
  43. final private Component container_;
  44. final private Component component;
  45. private Applet owner_applet;
  46. private boolean game_exit = false;
  47. // java swing/awt refre
  48. private Font defaultFont = new Font("song", Font.PLAIN, 13);
  49. // Container parentFrame;
  50. // private boolean is_root_applet = false;
  51. private AnimateCursor defaultCursor;
  52. private AnimateCursor nextCursor;
  53. // game stage
  54. private int stageWidth = 800;
  55. private int stageHeight = 600;
  56. private Stage currentStage = null;
  57. private Class<?> nextStageClass = null;
  58. private Object[] nextStageArgs;
  59. private Stage nextStage;
  60. // graphics and updating system
  61. transient private VolatileImage vm_buffer;
  62. // transient private Graphics2D vm_buffer_g2d;
  63. transient private long prewUpdateTime = 0;
  64. private int framedelay = 30;
  65. private int framedelay_unactive = 1000;
  66. private double fps;
  67. private float size_rate_x;
  68. private float size_rate_y;
  69. private int mousex;
  70. private int mousey;
  71. private long last_update_time = 0;
  72. private int update_interval = 0;
  73. // append window
  74. private Window append_window;
  75. private Component internal_frame;
  76. // game hook
  77. // transient Vector<Runnable> window_close_hooks = new Vector<Runnable>();
  78. // game event
  79. // private ConcurrentLinkedQueue<Event<?>> event_queue = new ConcurrentLinkedQueue<Event<?>>();
  80. private HashMap<Integer, KeyEvent> keystate = new HashMap<Integer, KeyEvent>(); // hold state
  81. private HashMap<Integer, KeyEvent> keystate_down = new HashMap<Integer, KeyEvent>(); // ????
  82. private HashMap<Integer, KeyEvent> keystate_up = new HashMap<Integer, KeyEvent>(); // ????
  83. private HashMap<Integer, KeyEvent> keystate_query_down = new HashMap<Integer, KeyEvent>(); // ????
  84. private HashMap<Integer, KeyEvent> keystate_query_up = new HashMap<Integer, KeyEvent>(); // ????
  85. private HashMap<Integer, MouseEvent> mousestate = new HashMap<Integer, MouseEvent>();
  86. private HashMap<Integer, MouseEvent> mousestate_down = new HashMap<Integer, MouseEvent>();
  87. private HashMap<Integer, MouseEvent> mousestate_up = new HashMap<Integer, MouseEvent>();
  88. private HashMap<Integer, MouseEvent> mousestate_query_down = new HashMap<Integer, MouseEvent>();
  89. private HashMap<Integer, MouseEvent> mousestate_query_up = new HashMap<Integer, MouseEvent>();
  90. private HashMap<Integer, Long> mousestate_prev_down_time = new HashMap<Integer, Long>();
  91. private HashMap<Integer, MouseEvent> mousestate_prev_down_pos = new HashMap<Integer, MouseEvent>();
  92. private HashMap<Integer, MouseWheelEvent> mousewheel = new HashMap<Integer, MouseWheelEvent>();
  93. private HashMap<Integer, MouseWheelEvent> mousewheel_query = new HashMap<Integer, MouseWheelEvent>();
  94. // --------------------------------------------------------------------------------------------------------------------------
  95. // construction
  96. public CanvasAdapter(CanvasContainer container)
  97. {
  98. this(container,
  99. container.getComponent().getWidth(),
  100. container.getComponent().getHeight());
  101. }
  102. @SuppressWarnings("unchecked")
  103. public CanvasAdapter(CanvasContainer container, int stage_width, int stage_height)
  104. {
  105. // super(null, true);
  106. parent = container;
  107. container_ = container.getContainer();
  108. component = container.getComponent();
  109. stageWidth = stage_width;
  110. stageHeight = stage_height;
  111. component.addKeyListener(this);
  112. component.addMouseListener(this);
  113. component.addMouseMotionListener(this);
  114. component.addMouseWheelListener(this);
  115. component.addFocusListener(this);
  116. //
  117. component.setFocusable(true);
  118. component.setEnabled(true);
  119. component.enableInputMethods(true);
  120. KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
  121. kfm.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.EMPTY_SET);
  122. kfm.setDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, Collections.EMPTY_SET);
  123. component.setSize(stageWidth, stageHeight);
  124. component.setMinimumSize(new Dimension(100,100));
  125. }
  126. public Component getParent(){
  127. return getComponent();
  128. }
  129. public Component getComponent() {
  130. return component;
  131. }
  132. public boolean isExit() {
  133. return game_exit;
  134. }
  135. public void exit() {
  136. game_exit = true;
  137. if (currentStage!=null) {
  138. currentStage.onRemoved(this);
  139. }
  140. destory_vm_buffer();
  141. }
  142. public boolean isFocusOwner() {
  143. return component.isFocusOwner();
  144. }
  145. /**
  146. * ???Applet?????
  147. * @return
  148. */
  149. public boolean isRootApplet() {
  150. return owner_applet != null;
  151. }
  152. public Applet getApplet() {
  153. return owner_applet;
  154. }
  155. public void setApplet(Applet applet) {
  156. this.owner_applet = applet;
  157. }
  158. public Image getVMBuffer() {
  159. return vm_buffer;
  160. }
  161. /**
  162. * ??????????
  163. * @param cursor
  164. */
  165. public void setDefaultCursor(AnimateCursor cursor)
  166. {
  167. defaultCursor = cursor;
  168. }
  169. // /**
  170. // * ??????
  171. // * @param cursor
  172. // */
  173. // public void setCursor(AnimateCursor cursor){
  174. // nextCursor = cursor;
  175. // }
  176. /**
  177. * ????????
  178. * @param font
  179. */
  180. public void setDefaultFont(Font font) {
  181. defaultFont = font;
  182. Tools.setDefaultFont(font);
  183. }
  184. public Font getDefaultFont() {
  185. return defaultFont;
  186. }
  187. // public void setCursor(Cursor cursor) {
  188. // nextCursor = new AnimateCursor(cursor);
  189. // }
  190. //
  191. // /**
  192. // * ??????
  193. // * @param text
  194. // */
  195. // public void setTip(AttributedString text) {
  196. // if (currentStage!=null) {
  197. // currentStage.setTip(text);
  198. // }
  199. // }
  200. //
  201. // /**
  202. // * ??????
  203. // * @param text
  204. // */
  205. // public void setTip(String text) {
  206. // if (currentStage!=null) {
  207. // currentStage.setTip(text);
  208. // }
  209. // }
  210. // --------------------------------------------------------------------------------
  211. // substage manag
  212. // public void addCloseHook(Runnable e) {
  213. // window_close_hooks.add(e);
  214. // }
  215. /**
  216. * ????
  217. * @param stage
  218. * @param args ?????????Stage.inited(Object[] args)??stage
  219. */
  220. public void changeStage(Stage stage, Object ... args) {
  221. nextStage = stage;
  222. nextStageArgs = args;
  223. if (currentStage!=null) {
  224. currentStage.startTransitionOut();
  225. }
  226. }
  227. /**
  228. * ????
  229. * @param stageName
  230. * @param args ?????????Stage.inited(Object[] args)??stage
  231. */
  232. @SuppressWarnings("unchecked")
  233. public void changeStage(String stageName, Object ... args) {
  234. try {
  235. this.changeStage((Class<Stage>) Class.forName(stageName), args);
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. }
  239. }
  240. /**
  241. * ????
  242. * @param stageClass
  243. * @param args ?????????Stage.inited(Object[] args)??stage
  244. */
  245. public void changeStage(Class<?> stageClass, Object ... args){
  246. nextStageClass = stageClass;
  247. nextStageArgs = args;
  248. if (currentStage!=null) {
  249. currentStage.startTransitionOut();
  250. }
  251. }
  252. /***
  253. * ????????
  254. * @param stage
  255. */
  256. public void setStage(Stage stage) {
  257. currentStage = stage;
  258. currentStage.onAdded(this, stageWidth, stageHeight);
  259. currentStage.startTransitionIn();
  260. currentStage.inited(this, nextStageArgs);
  261. }
  262. /**
  263. * ????????
  264. * @param width
  265. * @param height
  266. */
  267. public void setStageSize(int width, int height)
  268. {
  269. synchronized (this)
  270. {
  271. destory_vm_buffer();
  272. stageWidth = width;
  273. stageHeight = height;
  274. }
  275. }
  276. public int getStageWidth() {
  277. return stageWidth;
  278. }
  279. public int getStageHeight() {
  280. return stageHeight;
  281. }
  282. public int getWidth() {
  283. return component.getWidth();
  284. }
  285. public int getHeight() {
  286. return component.getHeight();
  287. }
  288. /**
  289. * ??parentFrame??????stage???stage?????parentFrame?
  290. * @param parentFrame
  291. */
  292. public void fillStageSize(Container parentFrame)
  293. {
  294. synchronized (this)
  295. {
  296. if (parentFrame!=null)
  297. {
  298. destory_vm_buffer();
  299. stageWidth = parentFrame.getWidth() - (parentFrame.getInsets().left+parentFrame.getInsets().right);
  300. stageHeight = parentFrame.getHeight()- (parentFrame.getInsets().left+parentFrame.getInsets().right);
  301. component.setSize(stageWidth, stageHeight);
  302. }
  303. }
  304. }
  305. public Stage getStage() {
  306. return currentStage;
  307. }
  308. // --------------------------------------------------------------------------------
  309. /**
  310. * ????Window???canvas???
  311. * @param append
  312. */
  313. public void setAppendWindow(Window append)
  314. {
  315. if (append!=null) {
  316. Point p = component.getLocationOnScreen();
  317. append.setLocation(p.x + getWidth(), p.y);
  318. append.setVisible(true);
  319. }
  320. if (append_window!=null && append!=append_window) {
  321. if (append_window instanceof DisplayObjectEditor<?>) {
  322. if (((DisplayObjectEditor<?>)append_window).isAutoStick()) {
  323. append_window.setVisible(false);
  324. }
  325. }
  326. }
  327. append_window = append;
  328. }
  329. /**
  330. * ????canvas????Window
  331. */
  332. public Window getAppendWindow()
  333. {
  334. return append_window;
  335. }
  336. /**
  337. * ????Window???canvas???
  338. */
  339. protected void updateAppendWindow()
  340. {
  341. if (append_window!=null) {
  342. if (append_window instanceof DisplayObjectEditor<?>){
  343. if (((DisplayObjectEditor<?>)append_window).isAutoStick()) {
  344. Point p = component.getLocationOnScreen();
  345. append_window.setLocation(p.x + getWidth(), p.y);
  346. }
  347. }
  348. }
  349. }
  350. /**
  351. * ?????stage????ui
  352. * @param frame
  353. */
  354. public void setInternalFrame(Component frame)
  355. {
  356. if (container_ instanceof Container)
  357. {
  358. if (internal_frame!=null) {
  359. ((Container)container_).remove(internal_frame);
  360. }
  361. internal_frame = frame;
  362. if (internal_frame!=null) {
  363. ((Container)container_).add(internal_frame);
  364. // internal_frame.requestFocus();
  365. System.out.println("setInternalFrame : " + internal_frame.getClass().getName());
  366. container_.requestFocus();
  367. }
  368. }
  369. else
  370. {
  371. System.err.println("setInternalFrame : \"" + container_.getClass().getName() + "\" is not a container ! ");
  372. throw new NotImplementedException();
  373. }
  374. }
  375. /**
  376. * ?????stage??????ui
  377. * @return
  378. */
  379. public Component getInternalFrame()
  380. {
  381. return internal_frame;
  382. }
  383. // --------------------------------------------------------------------------------
  384. // update and transition
  385. /**
  386. * ????????
  387. * @param fps
  388. */
  389. public void setFPS(double fps) {
  390. framedelay = (int)(1000 / fps);
  391. }
  392. /**
  393. * ????????ms
  394. * @return
  395. */
  396. public int getFrameDelay() {
  397. return framedelay;
  398. }
  399. public void setUnactiveFPS(double fps) {
  400. framedelay_unactive = (int)(1000 / fps);
  401. }
  402. public int getUnactiveFrameDelay() {
  403. return framedelay_unactive;
  404. }
  405. /**
  406. * ????????
  407. * @return
  408. */
  409. public int getFPS() {
  410. return (int)fps;
  411. }
  412. @Override
  413. public int getUpdateIntervalMS() {
  414. return update_interval;
  415. }
  416. // --------------------------------------------------------------------------------
  417. // game
  418. void destory_vm_buffer() {
  419. if (vm_buffer != null) {
  420. vm_buffer.flush();
  421. vm_buffer = null;
  422. System.out.println("CanvasAdapter : destory_vm_buffer");
  423. }
  424. // if (vm_buffer_g2d!=null) {
  425. // vm_buffer_g2d.dispose();
  426. // vm_buffer_g2d = null;
  427. // }
  428. }
  429. void create_vm_buffer(GraphicsConfiguration gc) {
  430. vm_buffer = gc.createCompatibleVolatileImage(stageWidth, stageHeight, Transparency.OPAQUE);
  431. // vm_buffer_g2d = (Graphics2D)vm_buffer.getGraphics();
  432. System.out.println("CanvasAdapter : create_vm_buffer");
  433. }
  434. @Override
  435. protected void finalize() throws Throwable {
  436. super.finalize();
  437. destory_vm_buffer();
  438. System.out.println("CanvasAdapter : finalize");
  439. }
  440. // public void repaint_game() {
  441. // component.repaint(0, 0, 0, getWidth(), getHeight());
  442. // }
  443. public void update(GraphicsConfiguration gc)
  444. {
  445. // GraphicsConfiguration gc = ((Graphics2D)g).getDeviceConfiguration();
  446. try
  447. {
  448. if (last_update_time == 0) {
  449. update_interval = 0;
  450. } else {
  451. update_interval = (int)(System.currentTimeMillis() - last_update_time);
  452. }
  453. last_update_time = System.currentTimeMillis();
  454. fixMouse() ;
  455. queryKey();
  456. if (vm_buffer == null)
  457. {
  458. create_vm_buffer(gc);
  459. }
  460. else if (vm_buffer.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE)
  461. {
  462. destory_vm_buffer();
  463. create_vm_buffer(gc);
  464. }
  465. size_rate_x = (float)stageWidth / getWidth();
  466. size_rate_y = (float)stageHeight/ getHeight();
  467. nextCursor = null;
  468. synchronized (this)
  469. {
  470. Graphics2D g2d = vm_buffer.createGraphics();
  471. try{
  472. Tools.setDefaultFont(defaultFont);
  473. g2d.setFont(defaultFont);
  474. paint_stage(g2d);
  475. if (internal_frame!=null) {
  476. g2d.scale(size_rate_x, size_rate_y);
  477. g2d.clip(internal_frame.getBounds());
  478. parent.superPaint(g2d);
  479. }
  480. } finally {
  481. g2d.dispose();
  482. }
  483. // g.drawImage(vm_buffer, 0, 0, getWidth(), getHeight(), null);
  484. }
  485. if (nextCursor!=null) {
  486. component.setCursor(nextCursor.getCursor());
  487. nextCursor.update();
  488. }else if (defaultCursor!=null){
  489. component.setCursor(defaultCursor.getCursor());
  490. defaultCursor.update();
  491. }else {
  492. component.setCursor(Cursor.getDefaultCursor());
  493. }
  494. double updatetime = System.currentTimeMillis() - prewUpdateTime;
  495. if (updatetime>0){
  496. fps = (int)(1000.0D / updatetime);
  497. }
  498. prewUpdateTime = System.currentTimeMillis();
  499. } catch (Throwable e) {
  500. e.printStackTrace();
  501. }
  502. }
  503. void paint_stage(Graphics2D g)
  504. {
  505. if (currentStage!=null)
  506. {
  507. currentStage.onUpdate(this, stageWidth, stageHeight);
  508. currentStage.onRender(g);
  509. nextCursor = currentStage.getCursor();
  510. if (!isFocusOwner()) {
  511. currentStage.renderLostFocus(g);
  512. }
  513. }
  514. if (nextStageClass!=null || nextStage!=null)
  515. {
  516. // clear current stage
  517. if(currentStage!=null)
  518. {
  519. if (!currentStage.isTransition())
  520. {
  521. currentStage.onRemoved(this);
  522. currentStage = null;
  523. System.gc();
  524. }
  525. }
  526. else
  527. {
  528. if (nextStageClass != null)
  529. {
  530. try {
  531. currentStage = (Stage) nextStageClass.newInstance();
  532. } catch (Exception e) {
  533. e.printStackTrace();
  534. }
  535. }
  536. else if (nextStage != null)
  537. {
  538. currentStage = nextStage;
  539. }
  540. System.out.println("ChangeStage -> "+ currentStage.getClass().getName());
  541. {
  542. currentStage.inited(this, nextStageArgs);
  543. currentStage.onAdded(this, stageWidth, stageHeight);
  544. currentStage.startTransitionIn();
  545. nextStage = null;
  546. nextStageClass = null;
  547. nextStageArgs = null;
  548. System.gc();
  549. Thread.yield();
  550. }
  551. System.out.println("Memory Status : " + (Runtime.getRuntime().freeMemory()/1024) + "/" + (Runtime.getRuntime().totalMemory()/1024) + "(K byte)");
  552. }
  553. }
  554. }
  555. // --------------------------------------------------------------------------------
  556. // control and input
  557. private boolean isPickedKeyInputer(int[] chars) {
  558. if (getStage()!=null && getStage().getMousePickedObject() instanceof TextInputer) {
  559. TextInputer inputer = (TextInputer)getStage().getMousePickedObject();
  560. return inputer.isInput(chars);
  561. }
  562. return false;
  563. }
  564. synchronized private void queryKey()
  565. {
  566. // ??????????????,?????????,??????????
  567. keystate_query_down.clear();
  568. keystate_query_down.putAll(keystate_down);
  569. keystate_query_up.clear();
  570. keystate_query_up.putAll(keystate_up);
  571. mousestate_query_down.clear();
  572. mousestate_query_down.putAll(mousestate_down);
  573. mousestate_query_up.clear();
  574. mousestate_query_up.putAll(mousestate_up);
  575. mousewheel_query.clear();
  576. mousewheel_query.putAll(mousewheel);
  577. keystate_down.clear();
  578. keystate_up.clear();
  579. mousestate_down.clear();
  580. mousestate_up.clear();
  581. mousewheel.clear();
  582. }
  583. @Override
  584. public boolean isOnTextInput() {
  585. if (getStage()!=null) {
  586. if (getStage().getFocusLeaf() instanceof TextInputer) {
  587. return true;
  588. }
  589. }
  590. return false;
  591. }
  592. /**
  593. * ????????????
  594. * @param keycode
  595. * @return
  596. */
  597. synchronized public boolean isKeyHold(int ... keycode)
  598. {
  599. if (isPickedKeyInputer(keycode)){
  600. return false;
  601. }
  602. for (int k : keycode)
  603. if (keystate.get(k)!=null)
  604. return true;
  605. return false;
  606. }
  607. /**
  608. * ????????????
  609. * @param keycode
  610. * @return
  611. */
  612. synchronized public boolean isKeyDown(int ... keycode)
  613. {
  614. if (isPickedKeyInputer(keycode)){
  615. return false;
  616. }
  617. for (int k : keycode)
  618. if (keystate_query_down.get(k)!=null)
  619. return true;
  620. return false;
  621. }
  622. /**
  623. * ????????????
  624. * @param keycode
  625. * @return
  626. */
  627. synchronized public boolean isKeyUp(int ... keycode)
  628. {
  629. if (isPickedKeyInputer(keycode)){
  630. return false;
  631. }
  632. for (int k : keycode)
  633. if (keystate_query_up.get(k)!=null)
  634. return true;
  635. return false;
  636. }
  637. private static final int[] KEYCODES_4_TEMP = new int[]{};
  638. /**
  639. * ?????????????
  640. * @return
  641. */
  642. synchronized public int getDownKeyCount()
  643. {
  644. if (isPickedKeyInputer(KEYCODES_4_TEMP))
  645. return 0;
  646. int count = keystate.size();
  647. return count;
  648. }
  649. /**
  650. * ?????????????
  651. * @return
  652. */
  653. synchronized public int getUpKeyCount()
  654. {
  655. if (isPickedKeyInputer(KEYCODES_4_TEMP))
  656. return 0;
  657. int count = keystate_query_up.size();
  658. return count;
  659. }
  660. /**
  661. * ?????????????
  662. * @param button
  663. * @return
  664. */
  665. synchronized public boolean isMouseHold(int ... button)
  666. {
  667. for (int b : button)
  668. if (mousestate.get(b)!=null)
  669. return true;
  670. return false;
  671. }
  672. /**
  673. * ?????????????
  674. * @param button
  675. * @return
  676. */
  677. synchronized public boolean isMouseDown(int ... button)
  678. {
  679. for (int b : button)
  680. if (mousestate_query_down.get(b)!=null)
  681. return true;
  682. return false;
  683. }
  684. @Override
  685. synchronized public boolean isMouseContinuous(long freeze_time, int... button) {
  686. for (int b : button) {
  687. if (mousestate.get(b)!=null) {
  688. Long prve_time = mousestate_prev_down_time.get(b);
  689. if (prve_time != null) {
  690. if (System.currentTimeMillis() - prve_time > freeze_time) {
  691. return true;
  692. }
  693. }
  694. }
  695. }
  696. return false;
  697. }
  698. /**
  699. * ?????????????????????
  700. * @param time ??(????-?????? < time)?????
  701. * @param button
  702. * @return
  703. */
  704. synchronized public boolean isMouseDoubleDown(long time, int ... button){
  705. for (int b : button) {
  706. if (mousestate_query_down.get(b)!=null) {
  707. Long prve_time = mousestate_prev_down_time.get(b);
  708. MouseEvent prve_pos = mousestate_prev_down_pos.get(b);
  709. if (prve_time != null && prve_pos!=null) {
  710. if (System.currentTimeMillis() - prve_time < time &&
  711. prve_pos.getX()==mousex &&
  712. prve_pos.getY()==mousey) {
  713. return true;
  714. }
  715. }
  716. }
  717. }
  718. return false;
  719. }
  720. /**
  721. * ?????????????
  722. * @param button
  723. * @return
  724. */
  725. synchronized public boolean isMouseUp(int ... button)
  726. {
  727. for (int b : button)
  728. if (mousestate_query_up.get(b)!=null)
  729. return true;
  730. return false;
  731. }
  732. /**
  733. * ???????????????
  734. * @param button
  735. * @return
  736. */
  737. synchronized public boolean isMouseWheelUP() {
  738. return mousewheel_query.get(-1)!=null;
  739. }
  740. /**
  741. * ???????????????
  742. * @param button
  743. * @return
  744. */
  745. synchronized public boolean isMouseWheelDown() {
  746. return mousewheel_query.get(1)!=null;
  747. }
  748. /**
  749. * ???????stage???
  750. * @param button
  751. * @return
  752. */
  753. synchronized public int getMouseX() {
  754. return mousex;
  755. }
  756. /**
  757. * ???????stage???
  758. * @param button
  759. * @return
  760. */
  761. synchronized public int getMouseY() {
  762. return mousey;
  763. }
  764. void fixMouse()
  765. {
  766. mousex = Math.max(mousex, 0);
  767. mousex = Math.min(mousex, stageWidth-1);
  768. mousey = Math.max(mousey, 0);
  769. mousey = Math.min(mousey, stageHeight-1);
  770. }
  771. void poolEvent(Event<?> event){
  772. if (currentStage!=null) {
  773. currentStage.onPoolEvent(event);
  774. }
  775. }
  776. // key events
  777. synchronized public void keyPressed(KeyEvent e) {
  778. keystate_down.put(e.getKeyCode(), e);
  779. keystate.put(e.getKeyCode(), e);
  780. poolEvent(new com.g2d.display.event.KeyEvent(e, com.g2d.display.event.KeyEvent.EVENT_KEY_DOWN));
  781. }
  782. synchronized public void keyReleased(KeyEvent e) {
  783. keystate_up.put(e.getKeyCode(), e);
  784. keystate.remove(e.getKeyCode());
  785. poolEvent(new com.g2d.display.event.KeyEvent(e, com.g2d.display.event.KeyEvent.EVENT_KEY_UP));
  786. }
  787. synchronized public void keyTyped(KeyEvent e) {
  788. poolEvent(new com.g2d.display.event.KeyEvent(e, com.g2d.display.event.KeyEvent.EVENT_KEY_TYPED));
  789. }
  790. // mouse events
  791. synchronized public void mouseClicked(MouseEvent e) {
  792. mousex = (int)(e.getX() * size_rate_x);
  793. mousey = (int)(e.getY() * size_rate_y);
  794. fixMouse() ;
  795. //poolEvent(new com.cell.g2d.display.event.MouseEvent(e));
  796. }
  797. synchronized public void mouseEntered(MouseEvent e) {
  798. mousex = (int)(e.getX() * size_rate_x);
  799. mousey = (int)(e.getY() * size_rate_y);
  800. fixMouse() ;
  801. //poolEvent(new com.cell.g2d.display.event.MouseEvent(e));
  802. }
  803. synchronized public void mouseExited(MouseEvent e) {
  804. mousex = (int)(e.getX() * size_rate_x);
  805. mousey = (int)(e.getY() * size_rate_y);
  806. fixMouse() ;
  807. //poolEvent(new com.cell.g2d.display.event.MouseEvent(e));
  808. }
  809. synchronized public void mousePressed(MouseEvent e) {
  810. mousex = (int)(e.getX() * size_rate_x);
  811. mousey = (int)(e.getY() * size_rate_y);
  812. fixMouse() ;
  813. mousestate_down.put(e.getButton(), e);
  814. mousestate.put(e.getButton(), e);
  815. mousestate_prev_down_time.put(e.getButton(), System.currentTimeMillis());
  816. mousestate_prev_down_pos.put(e.getButton(), e);
  817. poolEvent(new com.g2d.display.event.MouseEvent(e, com.g2d.display.event.MouseEvent.EVENT_MOUSE_DOWN));
  818. // System.out.println(e);
  819. }
  820. synchronized public void mouseReleased(MouseEvent e) {
  821. mousex = (int)(e.getX() * size_rate_x);
  822. mousey = (int)(e.getY() * size_rate_y);
  823. fixMouse() ;
  824. mousestate_up.put(e.getButton(), e);
  825. mousestate.remove(e.getButton());
  826. poolEvent(new com.g2d.display.event.MouseEvent(e, com.g2d.display.event.MouseEvent.EVENT_MOUSE_UP));
  827. //System.out.println(e);
  828. }
  829. synchronized public void mouseDragged(MouseEvent e) {
  830. mousex = (int)(e.getX() * size_rate_x);
  831. mousey = (int)(e.getY() * size_rate_y);
  832. fixMouse() ;
  833. //poolEvent(new com.cell.g2d.display.event.MouseEvent(e, com.cell.g2d.display.event.MouseEvent.EVENT_MOUSE_DRAGGED));
  834. //System.out.println(e);
  835. }
  836. synchronized public void mouseMoved(MouseEvent e) {
  837. mousex = (int)(e.getX() * size_rate_x);
  838. mousey = (int)(e.getY() * size_rate_y);
  839. fixMouse() ;
  840. //poolEvent(new com.cell.g2d.display.event.MouseEvent(e, com.cell.g2d.display.event.MouseEvent.EVENT_MOUSE_MOVED));
  841. //System.out.println(e);
  842. }
  843. public void mouseWheelMoved(MouseWheelEvent e) {
  844. if (e.getWheelRotation()>0) {
  845. mousewheel.put(1 , e);
  846. }else if (e.getWheelRotation()<0) {
  847. mousewheel.put(-1, e);
  848. }
  849. poolEvent(new com.g2d.display.event.MouseWheelEvent(e));
  850. //System.out.println(e);
  851. }
  852. // --------------------------------------------------------------------------------
  853. // boolean is_focused;
  854. public void focusGained(FocusEvent e) {
  855. // System.out.println(e.paramString());
  856. if (currentStage!=null) {
  857. currentStage.onFocusGained(e);
  858. currentStage.focuseClean(this);
  859. }
  860. }
  861. public void focusLost(FocusEvent e) {
  862. // System.out.println(e.paramString());
  863. if (currentStage!=null) {
  864. currentStage.onFocusLost(e);
  865. currentStage.focuseClean(this);
  866. }
  867. }
  868. // @Override
  869. // public CursorG2D getCursorG2D() {
  870. // // TODO Auto-generated method stub
  871. // return null;
  872. // }
  873. // --------------------------------------------------------------------------------
  874. }