Android: Steuerung und Pause

Previous topic - Next topic

D2O

Mir ist aufgefallen das wenn ich etwas Steuern möchte, z.B. ein Sprite, das hier die Mouse nicht so will wie ich möchte.

Wird per Touch die Linke seite des Screens berührt bewegt sich das Sprite nach links, wird der Screen recht berührt gehts nach rechts.
Soweit funktioniert alles, steuert man nun nach links und berührt nun kurz darauf auch die rechte seite, lässt nun erst die linke
seit los, bewegt sich nichts. Hier muss man den Screen erst komplett loslassen dann erst kann man wieder in die andere Richtung steuern.
Wie kann so etwas gelöst werden?
Beispiel vereinfachter Code und Video:
Code (glbasic) Select
SYSTEMPOINTER TRUE
AUTOPAUSE TRUE
SETSCREEN 800,600,0
LIMITFPS 60

WHILE TRUE
MOUSESTATE x,y,mb1,mb2


IF mb1 = 1 AND x < 400 THEN DEC px,3
IF mb1 = 1 AND x > 400 THEN INC px,3

DRAWRECT px,0,64,64,RGB(0x00, 0x80, 0x00)

PRINT mb1,100,100

SHOWSCREEN
WEND

www.deuteriumoxid.com/glbasic/test.flv

Dann noch, wenn das spiel per HOME button geschlossen wird, ist es ja immer noch im hintergrund aktiv,
möch ich es nun wieder in den Focus setzen, startet es so wie wenn es neu geöffnet wird, AUTOPAUSE ist auf TRUE.
Wie wird so etwas gehandhabt?
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kanonet

1. Multitouch ist die Antwort. Wenn du damit rechnest, dass der Nutzer mehr als einen Finger gleichzeitig auf dem Screen hat, musst du es abfragen. SETACTIVEMOUSE

2. Verwendest du GLB_ON_PAUSE und GLB_ON_RESUME?
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

D2O

Quote from: kanonet on 2014-Aug-12
1. Multitouch ist die Antwort. Wenn du damit rechnest, dass der Nutzer mehr als einen Finger gleichzeitig auf dem Screen hat, musst du es abfragen. SETACTIVEMOUSE
Ja, dazu habe ich in der Hilfe schon was gelesen, nur ist mir die anwendung hier nicht klar.
Wenn ich das so mache, geht gar keine steuerung.

Code (glbasic) Select
SETACTIVEMOUSE 1
MOUSESTATE x,y,mb1,mb2
IF mb1 = 1 AND x < 400 THEN DEC px,3
SETACTIVEMOUSE 2
MOUSESTATE x,y,mb1,mb2
IF mb1 = 1 AND x > 400 THEN INC px,3



Quote from: kanonet on 2014-Aug-12
2. Verwendest du GLB_ON_PAUSE und GLB_ON_RESUME?

???
Finde in der hilfe nur,
GLB_ON_QUIT und GLB_WIN32_MSG.
Ah, habe was unter AUTUOPAUSE in der Hilfe gefunden, ist aber hier für mich nicht verständlich.
Wie wird auch das eingesetzt?



I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kanonet

1. Nee so kann das nicht gehen, du musst schon auch schauen wie viele 'Mäuse' es aktuell überhaupt gibt. GETMOUSECOUNT... Könnte in etwa so aussehen (Code ungetested):
Code (glbasic) Select
   FOR i%=GETMOUSECOUNT()-1 TO 0 STEP -1
      SETACTIVEMOUSE i
      MOUSESTATE mx, my, mb1, mb2
      IF mb1 = 1 AND x < 400 THEN DEC px,3
      IF mb1 = 1 AND x > 400 THEN INC px,3
   NEXT
   DRAWRECT px,0,64,64,RGB(0x00, 0x80, 0x00)


2. Du erstellst zwei SUBs mit den namen GLB_ON_PAUSE und GLB_ON_RESUME. Wenn deine App nun in den Hintergrund gelegt wird (pausiert) wird beim Wechsel die SUB GLB_ON_PAUSE aufgerufen und der drin befindliche Code ausgeführt. Kommt die App dann später wieder in den Vordergrund, wird also wieder ausgeführt, dann wird die SUB GLB_ON_RESUME aufgerufen und der darin befindliche Code ausgeführt. Das beide möglichst schnell auszuführen sein sollten und keine Grafikbefehle beherrschen versteht sich von selbst (gute Idee wäre es z.B. den Spielstand im Hintergrund zu speichern/laden).
So ist die Grundidee, ob das unter Android auch so funktioniert, weiß ich aber nicht. Zumal das sicher auch von den jeweiligen Geräten/Einstellungen etc. abhängt...
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

D2O

Ah, Ok.
GETMOUSECOUNT() hatte ich auchschon mal aufgerufen, hier wird mir 16 angezeigt, in dem fall wären 16 Mäuse möglich ;)
Nur zum verständnis:
Hier werden also die möglichen Mäuse nach einander aufgerufen, jede Maus hat dann eigentlich eigene mb1, x... usw.
die werden hier auch MOUSESTATE abgefragt was gerade deren Status und Position ist.
Ok, soweit für mich erst einmal verständlich und werde ich testen.

Das mit den SUB's:
GLB_ON_PAUSE wird Automatisch aufgerufen sobald die App den Focus verliert.
(Gute Idee hier solche sachen abzuspeichern)
Dann am besten ein Menü laden das in einer Schleife läuft.
Ist der Focus wieder auf der App müsste mir hier das Menü angezeigt werden.
Von dort aus kann ich z.B. mit dem eintrag "Weiterspielen"  GLB_ON_RESUME aufrufen in dem eigentlich die
Mainschleife läuft.

Na dann hab ich ja was zum testen :)

Danke Dir erstmal für die schnelle Hilfe.

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kanonet

Ja, wobei mich die 16 Mäuse etwas überraschen.

Bin mir nicht sicher, ob es eine so gut Idee ist, eine Schleife und Grafik in GLB_ON_RESUME zu packen, ändere besser nur eine GLOBAL und mach den Rest dann im Hauptprogramm. Aber wie gesagt, wie das ganze unter Android funktioniert muss du eh testen.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

D2O

So, Steuerung klappt prima.
Das mit GLB_ON_RESUME geht so nicht wie ich geschrieben habe, werde es mal mit einem Global testen.

Gesendet von meinem GT-I9300 mit Tapatalk

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

erico

Hello D20,

I´m not sure I understood what google translated on this thread.
But, if I understood the least, you want to have a left/right control similar to my game?

I had a problem where using only one touch, things didn´t work as smooth, so I implemented something like 2 touches where the one that counts is always the last one on hold.

For example:
you touch and hold left...things move left, then, without releasing left, you touch and hold right, things move right, then you release right, things get back to moving left (because it is still pressed).

So far it seems to me the best way to implement touch controls for an arcade game.
If that is what you need, I can slice a part of my code and put it on snippets as I planned to that at some time in future.

D2O

Hi Erico,
Thanks for the help.
She is always welcome :)

The control works with the upper code well.
I now just have not understood how to GLB_ON_PAUSE
and GLB_ON_RESUME works.

When I test the code on Windows, it works the way I think,
I test the whole Android, running the app as if it were restarted.

The problem seems to be GLB_ON_RESUME for me.
How do I make it back to the main loop jumps?

Code (glbasic) Select

SYSTEMPOINTER TRUE
AUTOPAUSE TRUE
SETSCREEN 800,600,0
LIMITFPS 60

GLOBAL wait%
wait = TRUE

PRINT "Restart: Please wait 3 Sec.", 100,100
SHOWSCREEN
SLEEP 3000

WHILE TRUE

   FOR i%=GETMOUSECOUNT()-1 TO 0 STEP -1
      SETACTIVEMOUSE i
      MOUSESTATE x, y, mb1, mb2
      IF mb1 = 1 AND x < 400 THEN DEC px,3
      IF mb1 = 1 AND x > 400 THEN INC px,3
   NEXT
DRAWRECT px,0,64,64,RGB(0x00, 0x80, 0x00)

PRINT mb1,100,100

SHOWSCREEN
WEND


SUB GLB_ON_PAUSE:
     CLEARSCREEN RGB(0xff, 0x00, 0x00)

ENDSUB



SUB GLB_ON_RESUME:
     wait = TRUE
     CLEARSCREEN RGB(0xc0, 0xc0, 0xc0)
     SHOWSCREEN

  WHILE wait = TRUE
   
    MOUSESTATE mx, my, mb1, mb2
      PRINT "Pause",100,100,TRUE

IF mb1 = 1 then  wait = FALSE
 
       SHOWSCREEN
   WEND
        CLEARSCREEN RGB(0x00, 0x00, 0x00)

ENDSUB
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

erico

Hmmm, to tell you the truth, I have never used GLB_on pause or on resume.
I don´t know how to actually work with them yet. :-[

D2O

No problem.
Thank God I'm not alone. :)
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

spacefractal

GLB_ON_PAUSE and GLB_ON_RESUME is often used to stop media players as well eventuelly save the game automatic and/or setting a pause state (so the game dosent countinue in the background, example from a phone call).

On Android the app might have been closed down the system in meantime (etc SLEEP 3000 etc is not recommered which might trick Android to things the app hanging and then close the app).

There is three sub rutines for glbasic: GLB_ON_RESUME, GLB_ON_PAUSE and GLB_ON_QUIT.

Howover they might act diffirent on some systems (etc on iOS, GLB_ON_QUIT might never been called after a GLB_ON_PAUSE).
Genius.Greedy Mouse - Karma Miwa - Spot Race - CatchOut - PowerUp Elevation - The beagle Jam - Cave Heroes 2023 - https://spacefractal.itch.io/

D2O

If I have now translated correctly, then the app will always start from the beginning.
So do I have to save the current game state, graphics, sound be ...
reloaded and then I have to load the last Score and so make yourself a game entry point?

well, if there is no other :(
Then I have to do it yourself.

German:
Wenn ich das jetzt richtig übersetzt habe,  die App startet dann immer von anfang an.
Also muss ich denn Aktuellen Spielstand speichern, Grafik, Sound... werden
neu geladen und dann muss ich den letzten Spielstand laden und so selber einen Spiel einsprung machen?

Naja, wenns es nicht anders geht :(
Dann muss ich das selber machen.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

D2O

So, ich glaube das ich nun auf dem richtigen weg bin :)
Wenn nicht, bitte sagen.
_________________
Im Media Ordner habe ich eine save.txt ( kann später ein *.ini oder was auch immer datei sein)
Hier sind ein paar grunddaten rein geschrieben.

Beim starten der App werden diese daten geladen, was vorerst nicht so wichtig ist,
die App läuft nun regulär,
beim drücken der Home oder zurück Taste verliert die App den Focus, Andoid möchte eigentlich diese App beenden,
bleibt aber in den Anwendungen noch enthalten.
Hier wird GLB_ON_PAUSE aufgerufen, ind dieser Sub werden nun die Positionsdaten und eine Text
in die save.txt geschrieben. (Man könnte hier nun auch werte reinschreiben die für ein Menü... nötig wären)

Nun wird beim zurückholen der App GLB_ON_RESUME ausgelöst und Android startet die App neu und ladet alles wieder in den Speicher, Grafik, Sound, Sfx...
Somit liest es aber die "neuen" werte aus der save.txt aus und startet das spiel so wie es beendet wurde :)

Soweit bin ich eigentlich zufrieden.

Nur, gibts nicht noch die möglichkeit diesen "Ladeprozess" zu umgehen, so das die Grafiken und co. noch vorhanden bleiben?
Bei vielen Dateien wird ja das Laden immer wieder dementsprechend lange dauern.

Hier noch mal der vereinfachte Code :
Code (glbasic) Select
SYSTEMPOINTER TRUE
AUTOPAUSE TRUE
SETSCREEN 800,600,0
LIMITFPS 60

GLOBAL savex%
GLOBAL restart% = FALSE
GLOBAL test$

GLOBAL wait%
wait = TRUE


OPENFILE(1,"Media/save.txt",TRUE)
READLINE 1, px
READLINE 1,text$
CLOSEFILE 1
restart = FALSE


WHILE TRUE

   FOR i%=GETMOUSECOUNT()-1 TO 0 STEP -1
      SETACTIVEMOUSE i
      MOUSESTATE x, y, mb1, mb2
      IF mb1 = 1 AND x < 400 THEN DEC px,3
      IF mb1 = 1 AND x > 400 THEN INC px,3
   NEXT



DRAWRECT px,0,64,64,RGB(0x00, 0x80, 0x00)

PRINT text$,100,100

SHOWSCREEN
WEND


SUB GLB_ON_PAUSE:
savex = px
restart = TRUE
OPENFILE(1,"Media/save.txt",FALSE)
WRITELINE 1,px
WRITELINE 1,"Hallo Du Nasenbear 2"
CLOSEFILE 1


CLEARSCREEN RGB(0x00, 0x00, 0x00)

ENDSUB

SUB GLB_ON_RESUME:

ENDSUB
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

kanonet

Für den Fall der Fälle würde ich noch das hinzufügen:
Code (glbasic) Select
SUB GLB_ON_QUIT:
   GOSUB GLB_ON_PAUSE
ENDSUB
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64