Some help for code structureMonkey Forums/Monkey Beginners/Some help for code structure
As i developp for android target, i use a log text file to trace the loading errors. (it's a nightmare to debug on android without an message box to display an message).
All the loading operations are inside the OnCreate method(). So i've a black screen during this operation as I write a lot of debug text informations.
How to adapt my code to juste write something like 'Please wait loading...' during the OnCreate loading.
At this time, i play a sound 'loading please wait !' i've put it into the Oncreate() !
Many thanks monkey guru !
| If you want something like a loading bar or loading screen then you would need to handle it inside OnUpdate() somehow, something along the lines of this.|
You would need to create the loaded variable, UpdateLoader(), and DrawLoader() functions yourself of course.
While Not loaded
While Not loaded
| This : ?|
| i've always the black screen without anything. As OnCreate is the first code executed... |
| OnLoading ? How to include this... |
always the black screen...
| You do realise you need to put that inside of a class that inherits from Mojo.App?, is that your actual code? |
| Could you post some example code. ? On android target OnLoading do nothing. So have a downloading screen seems to be impossible to code. |
| Bear with me, I'll see what I can do. |
| Here's my quick 'n' dirty solution. Please note that the C_Loader class is fake, it designed just to prove the theory and does not actually load anything. A loader class is quite simple enough to make, but feel free to ask for help if you're not sure how.|
Strict Import mojo Global loader:C_FakeLoader Function Main:Int() Local game:C_Game = New C_Game() Return 0 End Class C_Game extends App Method OnCreate:Int() loader = C_FakeLoader("MyFile.dat") Return 0 End Method OnUpdate:Int() Local currentByte:Int If loader.bytesRemaining > 0 currentByte = loader.ReadByte() EndIf Return 0 End Method OnRender:Int() Cls If loader.bytesRemaining > 0 DrawText("Loading!", DeviceWidth() / 2, (DeviceHeight() / 2) - 20) DrawText(loader.bytesRemaining, DeviceWidth() / 2, DeviceHeight() / 2) EndIf Return 0 End End Class C_FakeLoader Field bytesRemaining:Int Method New(filePath:String) Self.bytesRemaining = 1000 End Method ReadByte:Int() Local currentByte:Int currentByte = Self.bytesRemaining bytesRemaining = (bytesRemaining - 1) Return currentByte End End
| i need to increase my monkey code knowledge to understand your code ! Many thanks for this. |
| I don't mind helping beginners, I've done you a simple program skeleton to help explain it better.|
Strict Import mojo 'Anything global is declared here and can be defined, accessed or changed anywhere in the program. Global i_am_a_global_integer:Int Global i_am_a_global_float:Float Global i_am_a_global_string:String 'All Monkey-X programs need an entry point function named Main, any function that needs to return a value must have its return type declared just before the parentheses(). Function Main:Int() Local game:C_Game = New C_Game() 'Globals can be defined inside functions, like this. i_am_a_global_integer = 123 i_am_a_global_float = 123.45 i_am_a_global_string = "Hello!" Return 0 End 'Mojo programs require a class that inherits from the Mojo App class, then an instance of this class needs to be created inside the Main:Int() function. 'Classes can contain methods, these are similar to functions. 'But, unlike functions and methods, variables are declared inside a class by using the Field keyword and can be defined in any of its methods; I have put an example of a field inside the class below. Class C_Game extends App 'Declaration of variable inside a class. Field classVariable:Int Method OnCreate:Int() 'Initiation stuff goes in here. 'Fields are accessed like this. Self.classVariable = 123 'Globals can also be defined inside methods, like this. i_am_a_global_integer = 123 i_am_a_global_float = 123.45 i_am_a_global_string = "Hello!" Return 0 End Method OnUpdate:Int() 'Update stuff goes in here. 'Globals can also be defined, accessed or changed here. 'This example will increase this variable by 1 every time OnUpdate() is called by the Mojo App. i_am_a_global_integer = (i_am_a_global_integer + 1) Return 0 End Method OnRender:Int() 'Clear the screen each frame. Cls 'Drawing stuff goes in here. 'And finally, this will spam stuff onto the screen. DrawText(i_am_a_global_integer, 0, 0) DrawText(i_am_a_global_float, 0, 20) DrawText(i_am_a_global_string, 0, 40) Return 0 End End
| Hi folks,|
you can actually render images and draw text in the OnLoading event of mojo. This event will be called during OnCreate if a step takes to long. I use it to render a spinning wheel so the user knows thta the app is actually doing something.
| @MikeHart. Have you tested OnLoading with android ? Could you post an example with OnLoading ?|
i use mojo2.
@Steve. Thanks you for all these code explanations !
| Unless you're doing something native, Monkey works pretty much the same on all devices. Why not do most of your debugging on a more suitable target? If you run on desktop with MSVC you get access to a real debugger, but anyway anything is better than Android! Just debug on Android for purely Android-specific stuff.|
Quite possibly you have good reasons, but if it's just a vague mistrust of debug results from a different target (I know I felt that way at first) you will be pleasantly surprised at Monkey's cross-target consistency. Real bugs in Monkey code will generally look the same across all targets.
| there are "async"-commands, which enable you to continue with OnRender() before all loading is completed. See the module mojo.asyncloaders and the command LoadImageAsync and OnloadImageComplete.|
A sample should look like this:
Class Game Extends App Field Check:Image, ExitKnopf:Image,.... Method OnCreate%() SetUpdateRate 60 Loader= New LoaderClass ..... End Method ReceivedImage:Void(bild:Image,FileName$) Print "LOADER received "+ FileName + " " + BilderZahl + " " + Millisecs() Select FileName Case "Check.png" Check=bild Loader.Load("ExitKnopf.png") Case "ExitKnopf.png" .... End BilderZahl=BilderZahl+1 End Method OnUpdate%() If KeyHit(KEY_ESCAPE) Self.OnBack() ..... UpdateAsyncEvents End Method OnRender%() If LadeStufe=0 Loader.Load("Check.png") SplashScreen LadeStufe=1 Return 0 Endif ..... End End Class LoaderClass Implements IOnLoadImageComplete Method Load:Void(FileName$,Frames%=1) If ExtractExt(FileName)="png" LoadImageAsync FileName,Frames,,Self Endif End Method OnLoadImageComplete:Void ( bild:Image, path:String, source:IAsyncEventSource ) MyGame.ReceivedImage bild,path End End
you can actually render images and draw text in the OnLoading event of mojo
I never new that, I never tried. LOL
Thanks for the tip Mike.
| When my app starts a log file is created to trace errors. So it take time to check or write informations. At this step i don't load images or sounds. So onLoading not fired in my case.|
Finally i only use a boolean and put nothing inside the OnCreate(). On android the display message stay on screen while the program perform LoadMyData().
| By the way: appli is not a common abbreviation for application. App or application are the 'correct' terms.|
I just mention this because if other people read your code they might not know what you mean.
PS: Acronyms Seriously Suck
| Yes of course, In fact Appli is the french term. My native language. I use french into my code for this project. |