Simple touchscreen menu in opengl

Problems with Canvas, OpenGL, etc...

Simple touchscreen menu in opengl

Postby JM33 » Thu Aug 25, 2011 11:52 am

I am trying to implement a simple menu in my android opengl game. The basic structure has 5 vertically stacked buttons, menu1 - menu5. I have setup touch controls and each of the menu buttons react properly to a touch in the desired area of each button. For each menu screen I have a boolean which if true will activate a draw sequence in the renderer to show the text/buttons for that screen. For example I start with boolean mainmenu = true. This screen has three buttons- play, options, & exit. When play is pressed, I set the mainmenuscreen boolean to false, and arcadescreen to true.

Where I am having trouble is the button press automatically reacts as the same button on the next screen. For example my play button is in the second position, menu2. As soon as it is pressed, if there is a button in the 2nd slot, menu2, on the next screen it acts as if it has been pressed also. This continues until a screen comes up with no button in that position.

I have tried separating the menu code to only MotionEvent.ACTION_UP, and setting a boolean "anypressed" for a delay of 10 frames before another touch event can occur. I also tried switching the return value true/false. Nothing seems to stop the button from activating through all screens that contain that button.

Here is the code I am using for the touch event:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public boolean onTouchEvent(MotionEvent e) {
  2.                
  3.                         setTouchControlsLayout();  // method sets area for touchscreen buttons
  4.                         gestureDetector.onTouchEvent(e);  // input for fling gestures
  5.                
  6.                         touchx = e.getX();
  7.                         touchy = e.getY();
  8.                                
  9.                                 int eAction = e.getAction();
  10.                                 if(eAction == MotionEvent.ACTION_UP){
  11.                                         Log.i("FGF", "ACTION_UP - HAPPENED");
  12.                                         if(FGFRenderer.mainmenu && !FGFRenderer.anypressed){
  13.                                                 //Play
  14.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  15.                                                         FGFRenderer.anypressed = true;   //any key has been pressed, touches delay 10 frames
  16.                                                         FGFRenderer.mainmenu = false;
  17.                                                         FGFRenderer.arcadescreen = true;
  18.                                                        
  19.                                                         Log.i("FGF", "Play Pressed");
  20.                                                        
  21.                                         }
  22.                                                 //options
  23.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  24.                                                         FGFRenderer.anypressed = true;
  25.                                                         FGFRenderer.mainmenu = false;
  26.                                
  27.                                                         FGFRenderer.optionmenu = true;
  28.                                                         Log.i("FGF", "Options Pressed");
  29.                                                        
  30.                                                        
  31.                                                 }      
  32.                                         //exit
  33.                                                 if (touchx <= menu5R && touchx >= menu5L && touchy >= menu5T && touchy <= menu5B) {
  34.                                                         FGFRenderer.anypressed = true;
  35.                                                         FGFRenderer.mainmenu = false;
  36.                                                        
  37.                                                         FGFRenderer.exitcheckmenu = true;
  38.                                                         FGFRenderer.exitcheckmenu = true;
  39.                                                         Log.i("FGF", "Exit Pressed");
  40.                                                        
  41.                                                 }
  42.                                                
  43.                                         }
  44.                
  45.                                         if(FGFRenderer.arcadescreen && !FGFRenderer.anypressed) {
  46.                                                 //ARCADE SCREEN
  47.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  48.                                                         FGFRenderer.anypressed = true;
  49.                                                         arcade = true;
  50.                                                         oneplayers = true;
  51.                                                         difficulty = 1;
  52.                                                         playto = 0;
  53.                                                         totalmins = 2;
  54.                                                         totalkicks = 0;
  55.                                                         totalpoints = 0;
  56.                                
  57.                                
  58.                                                         FGFRenderer.arcadescreen = false;
  59.                                
  60.                                                         FGFRenderer.startscreen = true;
  61.                                                        
  62.                                                 }
  63.                                                 //CUSTOM
  64.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  65.                                                         FGFRenderer.anypressed = true;
  66.                                                         arcade = false;
  67.                                
  68.                                                         FGFRenderer.arcadescreen = false;
  69.                                
  70.                                                 FGFRenderer.diffscreen = true;
  71.                                                
  72.                                                 }
  73.                                                
  74.                                                 //Back / return
  75.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  76.                                                         FGFRenderer.anypressed = true;
  77.                                                         FGFRenderer.arcadescreen = false;
  78.                                
  79.                                                         FGFRenderer.mainmenu = true;
  80.                                                        
  81.                                                 }
  82.                                                
  83.                                         }
  84.                
  85.                                         if(FGFRenderer.playerscreen && !FGFRenderer.anypressed) {
  86.                                                 //1player
  87.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  88.                                                         FGFRenderer.anypressed = true;
  89.                                                         oneplayers = true;
  90.                                
  91.                                                         FGFRenderer.playerscreen = false;
  92.                                        
  93.                                                         FGFRenderer.diffscreen = true;
  94.                                
  95.                                                 }
  96.                                                 //2player
  97.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  98.                                                         FGFRenderer.anypressed = true;
  99.                                                         oneplayers = false;
  100.                                
  101.                                                         FGFRenderer.playerscreen = false;
  102.                                
  103.                                                         FGFRenderer.diffscreen = true;
  104.                                                 }
  105.                                                 //Back / return
  106.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  107.                                                         FGFRenderer.anypressed = true;
  108.                                
  109.                                
  110.                                                         FGFRenderer.playerscreen = false;
  111.                                
  112.                                                         FGFRenderer.arcadescreen = true;
  113.                                
  114.                                                 }
  115.                                                
  116.                                         }
  117.                
  118.                                         if(FGFRenderer.diffscreen && !FGFRenderer.anypressed) {
  119.                                                 //EASY
  120.                                                 if (touchx <= menu1R && touchx >= menu1L && touchy >= menu1T && touchy <= menu1B) {
  121.                                                         FGFRenderer.anypressed = true;
  122.                                                         difficulty = 0;
  123.                                
  124.                                                         FGFRenderer.diffscreen = false;
  125.                                
  126.                                                         FGFRenderer.playtoscreen = true;
  127.                                                 }
  128.                                                 //MEDIUM
  129.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  130.                                                         FGFRenderer.anypressed = true;
  131.                                                         difficulty = 1;
  132.                                
  133.                                                         FGFRenderer.diffscreen = false;
  134.                                
  135.                                                         FGFRenderer.playtoscreen = true;
  136.                                                 }
  137.                                                 //HARD
  138.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  139.                                                         FGFRenderer.anypressed = true;
  140.                                                         difficulty = 2;
  141.                                
  142.                                                         FGFRenderer.diffscreen = false;
  143.                                
  144.                                                         FGFRenderer.playtoscreen = true;
  145.                                         }
  146.                                         //Back / return
  147.                                         if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  148.                                                 FGFRenderer.anypressed = true;
  149.                                
  150.                                
  151.                                                 FGFRenderer.diffscreen = false;
  152.                                
  153.                                                 FGFRenderer.playerscreen = true;
  154.                                
  155.                                         }
  156.                                         }
  157.                
  158.                                         if(FGFRenderer.playtoscreen && !FGFRenderer.anypressed) {
  159.                                                 //TIME
  160.                                                 if (touchx <= menu1R && touchx >= menu1L && touchy >= menu1T && touchy <= menu1B) {
  161.                                                         FGFRenderer.anypressed = true;
  162.                                                         playto = 0;
  163.                                
  164.                                                         FGFRenderer.playtoscreen = false;
  165.                                
  166.                                                         FGFRenderer.totimescreen = true;
  167.                                                 }
  168.                                                 //KICKS
  169.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  170.                                                         FGFRenderer.anypressed = true;
  171.                                                         playto = 1;
  172.                                
  173.                                                         FGFRenderer.playtoscreen = false;
  174.                                
  175.                                                         FGFRenderer.tokickscreen = true;
  176.                                                 }
  177.                                                 //POINTS
  178.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  179.                                                         FGFRenderer.anypressed = true;
  180.                                                         playto = 2;
  181.                                
  182.                                                         FGFRenderer.playtoscreen = false;
  183.                                
  184.                                                         FGFRenderer.topointsscreen = true;
  185.                                                 }
  186.                                                 //Back / return
  187.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  188.                                                         FGFRenderer.anypressed = true;
  189.                                                 FGFRenderer.playtoscreen = false;
  190.                                
  191.                                                 FGFRenderer.diffscreen = true;
  192.                                
  193.                                                 }
  194.                                         }
  195.                
  196.                                         if(FGFRenderer.totimescreen  && !FGFRenderer.anypressed) {
  197.                                                 //2 min
  198.                                                 if (touchx <= menu1R && touchx >= menu1L && touchy >= menu1T && touchy <= menu1B) {
  199.                                                         FGFRenderer.anypressed = true;
  200.                                        
  201.                                                         totalmins = 2;
  202.                                
  203.                                                         FGFRenderer.totimescreen = false;
  204.                                
  205.                                                         FGFRenderer.startscreen = true;
  206.                                                 }
  207.                                                 //3 Min
  208.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  209.                                                         FGFRenderer.anypressed = true;
  210.                                                         totalmins = 3;
  211.                                
  212.                                                         FGFRenderer.totimescreen = false;
  213.                                
  214.                                                         FGFRenderer.startscreen = true;
  215.                                                 }
  216.                                                 //5 min
  217.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  218.                                                         FGFRenderer.anypressed = true;
  219.                                        
  220.                                                         totalmins = 5;
  221.                                
  222.                                                         FGFRenderer.totimescreen = false;
  223.                                
  224.                                                         FGFRenderer.startscreen = true;
  225.                                                 }
  226.                                 //Back / return
  227.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  228.                                                         FGFRenderer.anypressed = true;
  229.                                
  230.                                
  231.                                                         FGFRenderer.totimescreen = false;
  232.                                
  233.                                                         FGFRenderer.playtoscreen = true;
  234.                                
  235.                                                 }
  236.                                         }
  237.                
  238.                                         if(FGFRenderer.tokickscreen && !FGFRenderer.anypressed) {
  239.                                                 //10kicks
  240.                                                 if (touchx <= menu1R && touchx >= menu1L && touchy >= menu1T && touchy <= menu1B) {
  241.                                                         FGFRenderer.anypressed = true;
  242.                                        
  243.                                                         totalkicks = 10;
  244.                                
  245.                                                         FGFRenderer.tokickscreen = false;
  246.                                
  247.                                                         FGFRenderer.startscreen = true;
  248.                                                 }
  249.                                                 //20 Kicks
  250.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  251.                                                         FGFRenderer.anypressed = true;
  252.                                        
  253.                                                         totalkicks = 20;
  254.                                
  255.                                                         FGFRenderer.tokickscreen = false;
  256.                                
  257.                                                         FGFRenderer.startscreen = true;
  258.                                                 }
  259.                                                 //30 kicks
  260.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  261.                                                         FGFRenderer.anypressed = true;
  262.                                        
  263.                                                         totalkicks = 30;
  264.                                
  265.                                                         FGFRenderer.tokickscreen = false;
  266.                                
  267.                                                         FGFRenderer.startscreen = true;
  268.                                                 }
  269.                                                 //Back / return
  270.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  271.                                                         FGFRenderer.anypressed = true;
  272.                                
  273.                                
  274.                                                         FGFRenderer.tokickscreen = false;
  275.                                
  276.                                                         FGFRenderer.playtoscreen = true;
  277.                                
  278.                                                 }
  279.                                         }
  280.                
  281.                                         if(FGFRenderer.topointsscreen && !FGFRenderer.anypressed) {
  282.                                                 //3000 points
  283.                                                 if (touchx <= menu1R && touchx >= menu1L && touchy >= menu1T && touchy <= menu1B) {
  284.                                                         FGFRenderer.anypressed = true;
  285.                                                         totalpoints = 3000;
  286.                                
  287.                                                         FGFRenderer.topointsscreen = false;
  288.                                
  289.                                                         FGFRenderer.startscreen = true;
  290.                                                 }
  291.                                                 //5000 points
  292.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  293.                                                         FGFRenderer.anypressed = true;
  294.                                        
  295.                                                         totalpoints = 5000;
  296.                                
  297.                                                         FGFRenderer.topointsscreen = false;
  298.                                
  299.                                                         FGFRenderer.startscreen = true;
  300.                                                 }
  301.                                                 //10000 kicks
  302.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  303.                                                         FGFRenderer.anypressed = true;
  304.                                        
  305.                                                         totalpoints = 10000;
  306.                                
  307.                                                         FGFRenderer.topointsscreen = false;
  308.                                
  309.                                                         FGFRenderer.startscreen = true;
  310.                                                 }
  311.                                                 //Back / return
  312.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  313.                                                         FGFRenderer.anypressed = true;
  314.                                
  315.                                
  316.                                                         FGFRenderer.topointsscreen = false;
  317.                                
  318.                                                         FGFRenderer.playtoscreen = true;
  319.                                
  320.                                                 }
  321.                                         }
  322.                
  323.                                         if(FGFRenderer.optionmenu && !FGFRenderer.anypressed) {
  324.                                                 //1player
  325.                                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  326.                        
  327.                                                 }
  328.                                                 //2player
  329.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  330.                        
  331.                                                 }
  332.                                                 //Back / return
  333.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  334.                                                         FGFRenderer.anypressed = true;
  335.                                
  336.                                
  337.                                                         FGFRenderer.optionmenu = false;
  338.                                
  339.                                                         FGFRenderer.mainmenu = true;
  340.                                
  341.                                                 }
  342.                                         }
  343.                
  344.                                         if(FGFRenderer.startscreen && FGFRenderer.anypressed){
  345.                                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  346.                                
  347.                                                         FGFRenderer.GameMode = new GameMode(arcade, oneplayers, difficulty, playto, totalmins, totalkicks, totalpoints);
  348.                                
  349.                                
  350.                                                         FGFRenderer.startscreen = false;
  351.                                                 }
  352.                                                 //Back / return
  353.                                                 if (touchx <= menu5R && touchx >= menu5L && touchy >= menu5T && touchy <= menu5B) {
  354.                                                         FGFRenderer.anypressed = true;
  355.                                
  356.                                
  357.                                                         FGFRenderer.optionmenu = false;
  358.                                
  359.                                                         FGFRenderer.mainmenu = true;
  360.                                
  361.                                                 }
  362.                                         }
  363.                
  364.                                         if(FGFRenderer.gameover && !FGFRenderer.anypressed){
  365.                                                 //BACK
  366.                                                 if (touchx <= menu4R && touchx >= menu4L && touchy >= menu4T && touchy <= menu4B) {
  367.                                                         FGFRenderer.anypressed = true;
  368.                                
  369.                                                         FGFRenderer.gameover = false;
  370.                                
  371.                                                         FGFRenderer.mainmenu = true;
  372.                                                         FGFRenderer.ResetScores();
  373.                                                 }
  374.                         }
  375.                
  376.                
  377.                         if(FGFRenderer.exitcheckmenu && !FGFRenderer.anypressed){
  378.                                 //Yes
  379.                                 if (touchx <= menu2R && touchx >= menu2L && touchy >= menu2T && touchy <= menu2B) {
  380.                                
  381.                                         onDestroy();
  382.                                         finish();
  383.                                 }
  384.                                 //No
  385.                                 if (touchx <= menu3R && touchx >= menu3L && touchy >= menu3T && touchy <= menu3B) {
  386.                                         FGFRenderer.anypressed = true;
  387.                                
  388.                                         FGFRenderer.exitcheckmenu = false;
  389.                                
  390.                                         FGFRenderer.mainmenu = true;
  391.                                 }
  392.                        
  393.                         }
  394.                         return false;
  395.                         }
  396.                                
  397.                         else {
  398.                        
  399.                        
  400.                                 if (eAction == MotionEvent.ACTION_DOWN)
  401.                                         if(!FGFRenderer.mainmenu && !FGFRenderer.optionmenu
  402.                                                         && !FGFRenderer.exitcheckmenu && !FGFRenderer.gameover
  403.                                                         && !FGFRenderer.arcadescreen && !FGFRenderer.diffscreen
  404.                                                         && !FGFRenderer.playerscreen && !FGFRenderer.playtoscreen
  405.                                                         && !FGFRenderer.tokickscreen && !FGFRenderer.topointsscreen
  406.                                                         && !FGFRenderer.totimescreen) {
  407.                        
  408.                                                 if (!FGFRenderer.kickstart){
  409.                                                         if (touchx <= menuR && touchx >= menuL && touchy >= menuT && touchy <= menuB) {
  410.                                                                 FGFRenderer.mainmenu = true;
  411.                                                         }
  412.                                
  413.                                                         if (touchx <= flingR && touchx >= flingL && touchy >= flingT && touchy <= flingB) {
  414.                                                                 fling = true;
  415.                                                         }
  416.                                                 }
  417.                                        
  418.                                         }
  419.                                 return false;
  420.                                         }
  421.                 }
Parsed in 0.083 seconds, using GeSHi 1.0.8.4


Everything works fine on the renderer side, but there seems to be no way to stop the button presses until the next screen has no button in that position.

Is there a better way to go about this? Am I missing something? Any help would be greatly appreciated. :D
JM33
Junior Developer
Junior Developer
 
Posts: 10
Joined: Fri Nov 12, 2010 8:35 pm

Top

Re: Simple touchscreen menu in opengl

Postby millerni456 » Wed Oct 05, 2011 2:04 am

With only skimming the code, I want to suggest a few things.

1. Try putting some sort of animation period when you click a menu button. This animator should be long enough to stall the program flow from initiating the pressed sequence twice.

2. Perhaps when you return false (which doesn't consume the event). The mouse button event is still active, thus pressing until there is no more buttons in that region. Sorry, but I know vaguely of touch input as of now.

3. Without an animator, stall again. Perhaps creating a variable that make sure you cannot proceed until the waiting is done and if another touch happens. This is sorta hackish, but it should work.
Variables like:

boolean hasWaited = false; //sets to true after the stall
int numTouches = 0; //increments per touch and resets at the beginning of the menu. (Or something similar).

I hope this helps.
millerni456
Junior Developer
Junior Developer
 
Posts: 12
Joined: Wed Oct 05, 2011 12:39 am

Top

Return to Android 2D/3D Graphics - OpenGL Problems

Who is online

Users browsing this forum: Google Feedfetcher and 4 guests