Unfortunately
Monkey Targets Forums/Android/Unfortunately
| ||
I am trying to test my app on the Android emulator and I get this error Unfortunately App has Stopped. Some times it runs once then If I try to run it again it gives me this error. By the way this app works fine on HTML5 and iOS! I searched all over the internet but nothing I try works like: - Clearing the App CACHE - Increasing the VM HEAP and Memory on the Emulator AVD Manager Did any of you got this issues? Here is the full log including the error: C:\Program Files (x86)\MonkeyXPro84e\Bin\transcc_winnt.exe -run -config=release -target=Android_Game_(Api_10) -modpath="C:\Program Files (x86)\MonkeyXPro84e\modules;C:\Program Files (x86)\MonkeyXPro84e\modules_ext;C:\Program Files (x86)\MonkeyXPro84e\modules\diddy" "C:/Users/Arolodo Carvalho/Documents/Monkey/Defender1/Defender1.monkey" TRANS monkey compiler V1.85 Parsing... Semanting... Translating... Building... Buildfile: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\build.xml -check-env: [checkenv] Android SDK Tools Revision 24.3.4 [checkenv] Installed at C:\Users\Arolodo Carvalho\Documents\android-sdk -setup: [echo] Project Name: MonkeyGame [gettype] Project Type: Application -pre-clean: clean: [delete] Deleting directory C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin [delete] Deleting directory C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\gen [getlibpath] Library dependencies: [getlibpath] No Libraries [subant] No sub-builds to iterate on BUILD SUCCESSFUL Total time: 0 seconds Buildfile: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\build.xml -set-mode-check: -set-release-mode: -release-obfuscation-check: [echo] proguard.config is ${proguard.config} -pre-build: -check-env: [checkenv] Android SDK Tools Revision 24.3.4 [checkenv] Installed at C:\Users\Arolodo Carvalho\Documents\android-sdk -setup: [echo] Project Name: MonkeyGame [gettype] Project Type: Application -build-setup: [getbuildtools] Using latest Build Tools: 23.0.1 [echo] Resolving Build Target for MonkeyGame... [gettarget] Project Target: Android 4.4.2 [gettarget] API level: 19 [echo] ---------- [echo] Creating output directories if needed... [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\rsObj [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\rsLibs [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\gen [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\classes [mkdir] Created dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\dexedLibs [echo] ---------- [echo] Resolving Dependencies for MonkeyGame... [dependency] Library dependencies: [dependency] No Libraries [dependency] [dependency] ------------------ [echo] ---------- [echo] Building Libraries with 'release'... [subant] No sub-builds to iterate on -code-gen: [mergemanifest] Merging AndroidManifest files into one. [mergemanifest] Manifest merger disabled. Using project manifest only. [echo] Handling aidl files... [aidl] No AIDL files to compile. [echo] ---------- [echo] Handling RenderScript files... [echo] ---------- [echo] Handling Resources... [aapt] Generating resource IDs... [echo] ---------- [echo] Handling BuildConfig class... [buildconfig] Generating BuildConfig class. -pre-compile: -compile: [javac] Compiling 3 source files to C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\classes [javac] warning: [options] source value 1.5 is obsolete and will be removed in a future release [javac] warning: [options] target value 1.5 is obsolete and will be removed in a future release [javac] warning: [options] To suppress warnings about obsolete options, use -Xlint:-options. [javac] Note: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\src\com\apdconsultinginc\defender1\MonkeyGame.java uses or overrides a deprecated API. [javac] Note: Recompile with -Xlint:deprecation for details. [javac] Note: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\src\com\apdconsultinginc\defender1\MonkeyGame.java uses unchecked or unsafe operations. [javac] Note: Recompile with -Xlint:unchecked for details. [javac] 3 warnings -post-compile: -obfuscate: -dex: [dex] input: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\classes [dex] Converting compiled files and external libraries into C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\classes.dex... -crunch: [crunch] Crunching PNG Files in source dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\res [crunch] To destination dir: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res [crunch] Processing image to cache: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\res\drawable-hdpi\icon.png => C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-hdpi\icon.png [crunch] (processed image to cache entry C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-hdpi\icon.png: 69% size of source) [crunch] Processing image to cache: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\res\drawable-ldpi\icon.png => C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-ldpi\icon.png [crunch] (processed image to cache entry C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-ldpi\icon.png: 0% size of source) [crunch] Processing image to cache: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\res\drawable-mdpi\icon.png => C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-mdpi\icon.png [crunch] (processed image to cache entry C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\res\drawable-mdpi\icon.png: 0% size of source) [crunch] Crunched 3 PNG files to update cache -package-resources: [aapt] Creating full resource package... -package: [apkbuilder] Current build type is different than previous build: forced apkbuilder run. [apkbuilder] Creating MonkeyGame-release-unsigned.apk for release... -post-package: -release-prompt-for-password: -release-nosign: -release-sign: [echo] Signing final apk... [zipalign] Running zip align on final apk... [echo] Release Package: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\MonkeyGame-release.apk [propertyfile] Creating new property file: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\build.prop [propertyfile] Updating property file: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\build.prop [propertyfile] Updating property file: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\build.prop [propertyfile] Updating property file: C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\build.prop -post-build: release: install: [echo] Installing C:\Users\Arolodo Carvalho\Documents\Monkey\Defender1\Defender1.buildv84e\android_new\bin\MonkeyGame-release.apk onto default emulator or device... [exec] pkg: /data/local/tmp/MonkeyGame-release.apk [exec] Success [exec] 1325 KB/s (1698022 bytes in 1.250s) BUILD SUCCESSFUL Total time: 9 seconds Starting: Intent { cmp=com.apdconsultinginc.defender1/.MonkeyGame } --------- beginning of system --------- beginning of main 09-21 09:13:14.310 2333 2333 E memtrack: Couldn't load memtrack module (No such file or directory) 09-21 09:13:14.310 2333 2333 E android.os.Debug: failed to load memtrack module: -2 09-21 09:13:14.400 1005 1005 E EGL_emulation: tid 1005: eglCreateSyncKHR(1243): error 0x3004 (EGL_BAD_ATTRIBUTE) 09-21 09:13:14.500 1675 1824 E Surface : getSlotFromBufferLocked: unknown buffer: 0x7f3122db4de0 --------- beginning of crash 09-21 09:13:14.750 2343 2357 E AndroidRuntime: FATAL EXCEPTION: GLThread 131 09-21 09:13:14.750 2343 2357 E AndroidRuntime: Process: com.apdconsultinginc.defender1, PID: 2343 09-21 09:13:14.750 2343 2357 E AndroidRuntime: java.lang.IllegalArgumentException: No config chosen 09-21 09:13:14.750 2343 2357 E AndroidRuntime: at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:870) 09-21 09:13:14.750 2343 2357 E AndroidRuntime: at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1024) 09-21 09:13:14.750 2343 2357 E AndroidRuntime: at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1401) 09-21 09:13:14.750 2343 2357 E AndroidRuntime: at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 09-21 09:13:15.780 1005 1005 E SurfaceFlinger: rejecting buffer: bufWidth=905, bufHeight=400, front.active.{w=129, h=129} 09-21 09:13:15.800 1348 2109 E Surface : getSlotFromBufferLocked: unknown buffer: 0x7f3121d226d0 09-21 09:13:18.350 1348 2109 E Surface : getSlotFromBufferLocked: unknown buffer: 0x7f3121d21b00 |
| ||
That's a bit vague. Does it run without problems on HTML5, Desktop? Could you share your error log? |
| ||
Xaron, I added the entire log.on my original post. I see errors coming from the emulator back to my Jungle IDE. |
| ||
Aroldo, using fantomEngine here? |
| ||
Hi Mark, no I am not. I don't have an Android device yet. Do you have one? Can you test my app? |
| ||
Are you still using Mojo1? If so, in your config.monkey under the Android new target, set this:#OPENGL_GLES20_ENABLED=False |
| ||
Xaron, No I am using Mojo2 , and the latest Monkey Version, MonkeyPro84e I check the CONFIG.MONKEY : #OPENGL_CLES_ENABLED=False #ANDROID_NATIVE_GL_ENABLED=False |
| ||
Right... I haven't used Mojo2 yet so maybe this is really a bug in it. |
| ||
Okay, The first time I am building my apps for ANDROID target , Like I mentioned before this app is working fine on HTML5 (See this game on the Monkey App Defender 1 And it is available at the App Store Apple App Store Did a small application and deployed on the Android Emulator and I works, the diference is that Defender 1 runs the first time, but if I click on the Home button and try to reopen it or close it and try to run it again on the emulator the "Unfortunately, "App" has stopped" error happens. If I clear the cache or delete the App from the Android Emulator and install it again it will work under the same conditions I mentioned above. During the time it works I can play the game, save the high score, change settings and the app behaves as it should. So at this point I still can pin point the issue. Any ideas? |
| ||
Can some one compile and run this on ANDROID Target? I posted this before but I cant find it. This is a Particle System I replicates the problem I am having. Strict #rem Script: Particle Blast Description: Particle Blast has two particles systems. Particle Emitter and Fireworks Particle Emitter Includes the classes Particle Emmiter, Single Particle and PVector, it generates endless particles. Fireworks Simulates fireworks explosion or implosion, it genereates a fixed number of particles. Includes the classes ParticleSystem, Particle . The Game Class is the main program that demonstrate the use of the particles systems and allows the user to control the behavior of the particles systems. Click or touch the screen to launch the fireworks, the emitter launches bubles or sparkles at the top of a tourch! This program works on Desktop computers or Mobile Devices. Particle Systems Controls (clicking on the menu options will cycle through the values) Number Particles..... Change the number of particles in the Fireworks (does not afect the Emitter) Size................. Change the particle size on both systems Life................. Changes the life of the fireworks particles only. (The emiter has a fixed life value) Mode................. Explode or Implode for the fireworks particles only Type................. Draws a Square or Circle and aftects both systems Sound................ Turns the sound on or off and afects both systems and the menu selection. Colors............... Changes the colors of the the fireworks particles only. It has fixed colors, random and confetti. Emitter.............. Turns the particles emmiter on or off. Author: Aroldo Carvalho Company: APD Games Date:Aug 28, 2014 Version: 1.0 #end Import fantomEngine Import pvector Global g:game Class Particle Field x:float Field y:float Field sine:Float Field cosine:Float Field speed:Float Field life:Float Field colors:Float[] 'points To array of colors Method isDead:Bool() If (life < 0.0) Return True Else Return False EndIf End End Class ParticleSystem Field origin:PVector Field particlesList:= New List<Particle> Field m_numparticles:Int Field life:Int Field dot_w:int, dot_h:Int Field et:Float, m_time:Float Field particolor:Float[][] Field colorIdx:Int = 0 Method New() dot_w = 1 dot_h = dot_w End Method SetDotSize:Void(pSize:int) dot_w = pSize dot_h = dot_w End Method SetNumParticles:Void(nParticles:int) m_numparticles = nParticles End Method SetLife:Void(pLife:int) life = pLife End Method Update:Void() Local newtime:float = Millisecs() Local beforeTime:float = newtime et = (newtime - m_time) / 1000 If (et > (1.0 / 15.0)) et = 1.0 / 15.0 EndIf For Local particle:= EachIn particlesList Local p:Particle = particle particle.life = particle.life - et If (particle.life <= 0.0) particlesList.Remove(particle) Else particle.x = particle.x + (particle.sine * particle.speed * et) particle.y = particle.y + (particle.cosine * particle.speed * et) EndIf Next End Method addParticles:Void(num:Int, mode:Int, life:Float, cx:Int, cy:Int, colors:float[], mix:Bool) Local i:int Local angle:Float Local dist:Float Local particle:Particle For Local i:Int = 0 Until num - 1 particle = New Particle() If (mix) CreateMixedColors() particle.colors = particolor[Rnd(particolor.Length - 1)] Else particle.colors = colors EndIf angle = Rnd(90) * (app.PI * 2) particle.sine = Sin(angle) particle.cosine = Cos(angle) dist = Rnd(16) If (mode) '1=Explosion or 0=Implosion ' * Exploding * particle.speed = 1.5 + Rnd(45) particle.life = life particle.x = cx + particle.sine * dist particle.y = cy + particle.cosine * dist Else ' * Imploding * particle.speed = 1.5 + Rnd(90) particle.life = life particle.x = cx - (particle.sine * (dist + particle.speed * particle.life)) particle.y = cy - (particle.cosine * (dist + particle.speed * particle.life)) EndIf particlesList.AddLast(particle) Next colorIdx += 1 ' next confetti set of colors If colorIdx > particolor.Length() -1 Then colorIdx = 0 End Method CreateMixedColors:Void() particolor = particolor.Resize(6) For Local i:Int = 0 Until particolor.Length() particolor[i] = New Float[3] Next Select colorIdx Case 0 particolor[0] =[255.0, 255.0, 255.0] ' White particolor[1] =[255.0, 255.0, 255.0] ' White particolor[2] =[255.0, 0.0, 0.0] ' Red particolor[3] =[255.0, 0.0, 0.0] ' Red particolor[4] =[255.0, 128.0, 0.0] ' Orange particolor[5] =[255.0, 128.0, 0.0] ' Orange Case 1 particolor[0] =[0.0, 255.0, 255.0] ' Aqua particolor[1] =[0.0, 255.0, 255.0] ' Aqua particolor[2] =[0.0, 0.0, 255.0] ' Blue particolor[3] =[0.0, 0.0, 255.0] ' Blue particolor[4] =[0.0, 0.0, 255.0] ' Blue particolor[5] =[0.0, 255.0, 255.0] ' Aqua Case 2 particolor[0] =[255.0, 0.0, 0.0] ' Red particolor[1] =[255.0, 0.0, 0.0] ' Red particolor[2] =[0.0, 0.0, 255.0] ' Blue particolor[3] =[0.0, 0.0, 255.0] ' Blue particolor[4] =[0.0, 0.0, 0.0] ' White particolor[5] =[0.0, 0.0, 0.0] ' White Case 3 particolor[0] =[0.0, 255.0, 0.0] ' Green particolor[1] =[255.0, 0.0, 0.0] ' Red particolor[2] =[0.0, 0.0, 255.0] ' Blue particolor[3] =[0.0, 0.0, 0.0] ' White particolor[4] =[255.0, 0.0, 128.0] ' Pink particolor[5] =[255.0, 255.0, 0.0] ' Yellow Case 4 particolor[0] =[255.0, 0.0, 0.0] ' Red particolor[1] =[255.0, 0.0, 0.0] ' Red particolor[2] =[255.0, 255.0, 0.0] ' Yellow particolor[3] =[255.0, 255.0, 0.0] ' Yellow particolor[4] =[255.0, 0.0, 0.0] ' Red particolor[5] =[255.0, 255.0, 0.0] ' Yellow Case 5 particolor[0] =[0.0, 0.0, 255.0] ' Blue particolor[1] =[0.0, 0.0, 255.0] ' Blue particolor[2] =[0.0, 255.0, 255.0] ' Aqua particolor[3] =[0.0, 255.0, 255.0] ' Aqua particolor[4] =[255.0, 0.0, 128.0] ' Pink particolor[5] =[255.0, 0.0, 128.0] ' Pink End End Method run:Void(pType:Bool) Update() display(pType) End Method display:Void(pType:Bool) Local memAlpha:Float = GetAlpha() Local memColor:Float[] = GetColor() For Local particle:= EachIn particlesList Local p:Particle = particle If (particle.y >= 50) Local c:float[] = particle.colors SetAlpha(0.8) SetColor(c[0], c[1], c[2]) If pType DrawEllipse(particle.x, particle.y, dot_w, dot_h) Else DrawRect(particle.x, particle.y, dot_w, dot_h) EndIf EndIf Next SetAlpha(memAlpha) SetColor(memColor[0], memColor[1], memColor[2]) End Method isDead:Bool() If (life < 0.0) ' Is the Particle alive or dead? Return True Else Return False EndIf End End Class SingleParticle Field location:PVector Field velocity:PVector Field acceleration:PVector Field lifespan:float Field d:Float = 5 ' Diameter Field r:Float = d / 2 ' Radius Field color:Float[3] Field pType:Bool = True Method New(l:PVector, c:Float[], size:Float, type:Bool) acceleration = New PVector(0, 0.05) velocity = New PVector(Rnd(-1, 1), Rnd(-2, 0)) location = l.get() lifespan = 200.0 color = c d = size pType = type End Method New(l:PVector) acceleration = New PVector(0, 0.05) velocity = New PVector(Rnd(-1, 1), Rnd(-2, 0)) location = l.get() lifespan = 200.0 End Method SetDotSize:Void(pSize:int) d = pSize End Method SetLife:Void(pLife:Float) lifespan = pLife End Method SetType:Void(type:Bool) pType = type End Method run:Void() Update() display() End Method Update:Void() velocity.add(acceleration) location.add(velocity) lifespan -= 2.0 End Method display:Void() Local memAlpha:Float = GetAlpha() Local memColor:Float[] = GetColor() SetAlpha(0.9) SetColor(color[0], color[1], color[2]) If pType DrawRect(location.x, location.y, d, d) Else DrawEllipse(location.x, location.y, d, d) EndIf SetAlpha(memAlpha) SetColor(memColor[0], memColor[1], memColor[2]) End Method isDead:Bool() If (lifespan < 0.0) ' Is the Particle alive or dead? Return True Else Return False EndIf End End Class ParticleEmitter Field particlesList:= New List<SingleParticle> Field origin:PVector Field pSize:Int Field pType:Bool Field pLife:Float Method New(location:PVector) origin = location.get(); End Method SetDotSize:Void(Size:int) pSize = Size End Method SetLife:Void(Life:Float) pLife = Life End Method SetType:Void(type:Bool) pType = type End Method addParticle:Void() Local color:Float[] =[Rnd(255), Rnd(255), Rnd(255)] particlesList.AddLast(New SingleParticle(origin, color, pSize, pType)) End Method addParticle:Void(x:Float, y:Float) particlesList.AddLast(New SingleParticle(New PVector(x, y))) End Method run:Void() For Local particle:= EachIn particlesList Local p:SingleParticle = particle p.run() If (p.isDead()) particlesList.Remove(particle) End Next End End Class game Extends App Field eng:engine Field font1:ftFont Field layerBackGround:ftLayer Field layerMenu:ftLayer Field ps:ParticleSystem Field pe:ParticleEmitter Field particolors:Float[][] Field tourch:ftObject Field txtFPS:ftObject Field txtMsg:ftObject Field cw:Float Field ch:Float Field isSuspended:Bool = False 'Define the Particle System variables and set their initial values 'They will index to the corresponding string arrays below Field isSound:Bool = True Field pType:Bool = True Field pSize:int = 0 Field nParticles:Int = 3 Field pLife:Int = 5 Field pMode:Bool = True Field pColor:Int = 10 Field pEmitter:Bool = True Field txtParticles:String[] =["10", "25", "50", "100", "250", "500", "750", "1000"] Field txtSize:String[] =["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "15", "20", "25"] Field txtLife:String[] =["1.0", "1.5", "2.0", "3.0", "3.5", "4.0", "4.5", "5.0", "6.0", "7.0", "8.0"] Field txtMode:String[] =["Implode", "Explode"] Field txtType:String[] =["Square", "Circle"] Field txtSound:String[] =["Off", "On"] Field txtColors:String[] =["White", "Red", "Green", "Blue", "Yellow", "Aqua", "Orange", "Brown", "Pink", "Confetti", "Random"] Field txtEmitter:String[] =["Off", "On"] Field sndSelect:ftSound Field sndFW:ftSound Field sndBubbles:ftSound Field var:Int[4] Const btnParticles:Int = 1 Const btnSound:Int = 2 Const btnSize:Int = 3 Const btnLife:Int = 4 Const btnMode:Int = 5 Const btnType:Int = 6 Const btnColor:Int = 7 Const btnEmitter:Int = 8 Const taMain:Int = 9 Const strTitle:String = "Particle System for FantonGL" Method CreateLayers:Int() layerBackGround = eng.CreateLayer() layerMenu = eng.CreateLayer() Return 0 End Method CreateMenuScreen:Int() eng.SetDefaultLayer(layerMenu) Local t1:= eng.CreateText(font1, strTitle, cw / 2, 30, 1) t1.SetScale(1.0) t1.SetLayer(layerMenu) txtMsg = eng.CreateText(font1, "Click or Touch the Screen", (cw + 160) / 2, ch - 20, 1) txtMsg.SetScale(0.5) txtMsg.SetLayer(layerMenu) Local t1PosY:Int = t1.GetHeight() +t1.GetPosY() +30 Local gap:Int = 50 Local menuPosX:Int = 0 Local bt1:= CreateTextButton(font1, "Particles: " + txtParticles[nParticles], menuPosX, t1PosY, btnParticles, layerMenu) Local bt2:= CreateTextButton(font1, "Color: " + txtColors[pColor], menuPosX, t1PosY + gap, btnColor, layerMenu) Local bt3:= CreateTextButton(font1, "Size: " + txtSize[pSize], menuPosX, t1PosY + gap * 2, btnSize, layerMenu) Local bt4:= CreateTextButton(font1, "Life: " + txtLife[pLife], menuPosX, t1PosY + gap * 3, btnLife, layerMenu) Local bt5:= CreateTextButton(font1, "Mode: " + txtMode[pMode], menuPosX, t1PosY + gap * 4, btnMode, layerMenu) Local bt6:= CreateTextButton(font1, "Type: " + txtType[pType], menuPosX, t1PosY + gap * 5, btnType, layerMenu) Local bt7:= CreateTextButton(font1, "Sound: " + txtSound[isSound], menuPosX, t1PosY + gap * 6, btnSound, layerMenu) Local bt8:= CreateTextButton(font1, "Emitter: " + txtEmitter[pEmitter], menuPosX, t1PosY + gap * 7, btnEmitter, layerMenu) Local b:ftObject = eng.CreateZoneBox(cw - (bt5.GetWidth()), ch - t1PosY, cw / 2 + bt5.GetWidth(), ch / 2) b.SetLayer(layerMenu) Return 0 End Method CreateBackgroundScreen:Void() txtFPS = eng.CreateText(font1, "FPS:", cw - 40, 30, 1) txtFPS.SetScale(0.5) txtFPS.SetLayer(layerBackGround) End Method CreateTouchArea:Void() Local touchArea:ftObject = eng.CreateZoneBox(cw - 160, ch - 50, (cw + 160) / 2, (ch + 50) / 2) ' Local touchArea:ftObject = eng.CreateBox(cw - 180, ch - 50, (cw + 180) / 2, ch / 2 + 50) 'used to debug the touch area touchArea.SetTag(taMain) touchArea.SetTouchMode(2) 'Set the touch mode to 2=boundingBox. (1=circle) touchArea.SetLayer(layerMenu) var[0] = touchArea.GetWidth() var[1] = touchArea.GetHeight() var[2] = touchArea.GetPosX() var[3] = touchArea.GetPosY() End Method CreateTextButton:ftObject(font:ftFont, txt:String, xp:Int, yp:Int, id:Int, layer:ftLayer) Local but:ftObject = eng.CreateText(font, txt, xp, yp, 7) but.SetTag(id) but.SetTouchMode(2) but.SetLayer(layer) but.SetScale(0.8) Return but End Method CreateColors:Void() particolors = particolors.Resize(11) For Local i:Int = 0 Until particolors.Length() particolors[i] = New Float[3] Next particolors[0] =[255.0, 255.0, 255.0] ' White particolors[1] =[255.0, 0.0, 0.0] ' Red particolors[2] =[0.0, 255.0, 0.0] ' Green particolors[3] =[0.0, 0.0, 255.0] ' Blue particolors[4] =[255.0, 255.0, 0.0] ' Yellow particolors[5] =[0.0, 255.0, 255.0] ' Aqua particolors[6] =[255.0, 128.0, 0.0] ' Orange particolors[7] =[128.0, 64.0, 0.0] ' Brown particolors[8] =[255.0, 0.0, 128.0] ' Pink particolors[9] =[255.0, 0.0, 128.0] ' Pink particolors[10] =[255.0, 0.0, 128.0] ' Pink End Method LoadSounds:Int() sndFW = eng.LoadSound("sounds/Fireworks2.mp3") sndSelect = eng.LoadSound("sounds/select.mp3") sndBubbles = eng.LoadMusic("sounds/bubbles.mp3", True) Return 0 End Method LaunchParticles:Void(num:Int, mode:Int, life:Float, cx:Int, cy:Int) Local color:float[] Local mix:Bool = False If txtColors[pColor] = "Random" color = particolors[Rnd(pColor - 2)] ElseIf txtColors[pColor] = "Confetti" mix = True Else color = particolors[pColor] EndIf ps.addParticles(num, mode, life, cx, cy, color, mix) If (isSound) sndFW.Play() EndIf End Method SetScreen:Void() Local Device:String = GetDeviceName() Local Hardware:String = GetDeviceName() If Device = "iPhone" eng.SetCanvasSize(DeviceWidth(), DeviceHeight()) Else eng.SetCanvasSize(640, 480) EndIf cw = eng.canvasWidth ch = eng.canvasHeight ' Print "Screen Size w:" + cw+" h:" + ch End Method CreateTourch:Void() Local img:Image = LoadImage("images/tourch.png") tourch = eng.CreateImage(img, (cw + 160 - img.Width()) / 2, (ch / 2) + img.Height() / 2) tourch.SetLayer(layerBackGround) End Method OnCreate:Int() SetUpdateRate(60) eng = New engine SetScreen() LoadSounds() 'Print "Vol:" + sndBubbles.GetVolume() font1 = eng.LoadFont("fonts/bo_font") CreateLayers() CreateBackgroundScreen() CreateMenuScreen() CreateColors() CreateTouchArea() CreateTourch() 'create the particle blast (Explode/Implode) ps = New ParticleSystem() 'Create the particle emitter system pe = New ParticleEmitter(New PVector(cw / 2, 50)) pe.origin.set(tourch.GetPosX() +tourch.GetWidth() / 2, tourch.GetPosY(), 0) pe.SetDotSize(int(g.txtSize[g.pSize])) sndBubbles.Play() Return 0 End Method OnUpdate:Int() eng.Update() If TouchHit(0) Then eng.TouchCheck(layerMenu) EndIf Return 0 End '------------------------------------------ Method OnRender:Int() Cls(0, 0, 0) txtFPS.SetText("FPS:" + eng.GetFPS()) ps.run(pType) If pEmitter pe.addParticle() EndIf pe.run() SetAlpha(0.2) SetColor(0, 0, 255) DrawRect(160, 50, cw - 160, ch - 50) SetAlpha(1.0) eng.Render() Return 0 End Method OnResume:Int() isSuspended = False SetUpdateRate(60) Return 0 End Method OnSuspend:Int() isSuspended = True SetUpdateRate(5) Return 0 End End Function Main:Int() g = New game Return 0 End Class engine Extends ftEngine Method OnObjectRender:Int(obj:ftObject) Return 0 End Method OnObjectTouch:Int(obj:ftObject, touchId:Int) Select obj.GetTag() Case g.taMain g.LaunchParticles(Int(g.txtParticles[g.nParticles]), g.pMode, int(g.txtLife[g.pLife]), TouchX(), TouchY()) Case g.btnParticles g.nParticles += 1 If g.nParticles > g.txtParticles.Length - 1 Then g.nParticles = 0 g.ps.SetNumParticles(Int(g.txtParticles[g.nParticles])) obj.SetText("Particles: " + g.txtParticles[g.nParticles]) If (g.isSound) g.sndSelect.Play() EndIf Case g.btnColor g.pColor += 1 If g.pColor > g.txtColors.Length - 1 Then g.pColor = 0 obj.SetText("Color: " + g.txtColors[g.pColor]) If (g.isSound) g.sndSelect.Play() EndIf Case g.btnSize g.pSize += 1 If g.pSize > g.txtSize.Length - 1 Then g.pSize = 0 g.ps.SetDotSize(int(g.txtSize[g.pSize])) g.pe.SetDotSize(int(g.txtSize[g.pSize])) obj.SetText("Size: " + g.txtSize[g.pSize]) If (g.isSound) g.sndSelect.Play() EndIf Case g.btnLife g.pLife += 1 If g.pLife > g.txtLife.Length - 1 Then g.pLife = 0 obj.SetText("Life: " + g.txtLife[int(g.pLife)]) If (g.isSound) g.sndSelect.Play() EndIf Case g.btnMode If (g.pMode) g.pMode = False obj.SetText("Mode: " + g.txtMode[0]) 'Implode Else g.pMode = True obj.SetText("Mode: " + g.txtMode[1]) 'Explode EndIf If (g.isSound) g.sndSelect.Play() EndIf Case g.btnType If g.pType g.pType = False g.pe.SetType(True) obj.SetText("Type: " + g.txtType[0]) 'Circle Else g.pType = True g.pe.SetType(False) obj.SetText("Type: " + g.txtType[1]) 'Square EndIf If (g.isSound) g.sndSelect.Play() EndIf Case g.btnSound If (g.isSound) g.isSound = False g.sndBubbles.SetPaused(True) obj.SetText("Sound: " + g.txtSound[0]) Else g.isSound = True g.sndBubbles.SetPaused(False) obj.SetText("Sound: " + g.txtSound[1]) EndIf If (g.isSound) g.sndSelect.Play() EndIf Case g.btnEmitter If (g.pEmitter) g.pEmitter = False g.sndBubbles.SetPaused(True) obj.SetText("Emitter: " + g.txtEmitter[0]) Else g.pEmitter = True g.sndBubbles.SetPaused(False) obj.SetText("Emitter: " + g.txtEmitter[1]) EndIf If (g.isSound) g.sndSelect.Play() EndIf End Return 0 End End |
| ||
I will try it. Probably tomorrow. |
| ||
The (default) Android emulator sucks. Big time. Try on a real device, or if you don't have one - try BlueStacks. |
| ||
Hi Mark, no I am not. I don't have an Android device yet. Do you have one? Can you test my app? Line 35 you are importing fantomEngine. I don't have fantomEngine installed, otherwise I'd test it out for you. |
| ||
If fantomEngine is involved, please grab the current state from the Github page as it had some problems with GLFW and so I think it could effect Android too. https://github.com/mikehart66/fantomengine |
| ||
Ok Guys thank you for your help I tried running the my app on the Windows Emulator and on the Mac Book emulator (On the Mac the emulator performance is much faster) t I had the same issues on both OSs. So I got tired and went to Amazon and bought a Sansung Galaxy S5 and it arrived today, I got my app to run on the device.and it is runing well . There are some other issues with the Android that I am fixing . |
| ||
Generally, the Android emulators are really slow or ineffective for testing with. It is better to test using an actual device. Additionally, you may need to test on several different devices too, since no two devices are the same. For instance, my OUYA (obviously) is different from the Google Nexus 7 (original) and my HTC EVO 3DO. All have their issues and may be different issues on each. Also, watch the version of the OS you are working with. Technically speaking, if you use API13, is *should* work with the newer versions, but there may be something that pops up in a newer API that breaks your code. Just a couple of things I've learned programming for Android devices. Hope this helps :) |
| ||
computercoder, Thank you for the tips, I am used to develop apps for iOS and their environment is very stable including all the simulators, so Android development echo systems is far from what apple offers but the is a problem I have to deal with if I want to to sell my apps on the Google Play. Right now I am dealing with the screen size to automatically re size the sprites, |
| ||
I have found the emulator pretty good for puzzle games, and it does have the advantage that you can try different Android versions and screen sizes at zero cost. But to see how anything animated will play, you do need a real Android. |