Quick Links: Download Gideros Studio | Gideros Documentation | Gideros Development Center | Gideros community chat | DONATE
Released on Android: Fly Fishing Simulator — Gideros Forum

Released on Android: Fly Fishing Simulator

I've got to start with a huge Thank You to ar2rsawseen for responding while on vacation to my pleas for help troubleshooting in the final stretch before release.

I've just released Fly Fishing Simulator. There's history behind this game. Quit reading to avoid yet another long story of somebody trying to get out of a cubical farm and into indie game development. Or put up with me and read on....

In 1999 I was dabbling in game development, focusing on fishing games since I'm a fishing nut. I owned the fishing games of the day and couldn't stop criticizing all the things they'd gotten wrong. I started building a fishing game that created scenes with looped still photos to animate the water and overlaid sprites for other elements.

When it started to look like I might have something worthwhile I began looking for a publisher. I found one that had been quite successful with photographic hunting games but had no fishing games. I pitched my game by email and met the head of the company for a lunch meeting when he was passing through my time zone. He was all for publishing my game, but the condition was that I would first develop a fly fishing game, since they believed that was what the market really needed. I'm a fly fisherman myself, so I was thrilled. We inked a deal, they lined up brand names of fly fishing products to promote in-game, we did a photo shoot on a world class trout river while staying at a classy lodge that they'd also lined up as a sponsor. I was in heaven, combining my love of fishing for getting into the world of game development.

An advance on royalties let me quit the day job to complete development on a really aggressive schedule. The game had about 24 beautiful fishing sites. They sold a decent number when the game released, while I turned my attention to completing the other fishing game I'd originally pitched. I thought I'd really made it when I saw my fly fishing game in a software shop in a mall.

Then reality returned, of course. The publisher had troubles with their distributors, sales of the fly fishing game stalled, and my other fishing game sat out the holiday shopping season while the publisher tried to get their hunting game sponsors to put their name on it, though those brands are associated with hunting and not fishing. 12 other fishing games came out between the time I delivered a release candidate and the time the publisher settled on one sponsorship from a fishing electronics brand and put my game on sale. With a couple thousand hours invested, that game made me a whopping $42.

I returned to the day job in 2000, ended the publishing contract, and left the gaming world. For a while. In my spare time I started rewriting the fly fishing game the way I would have done it if I wasn't taking cues from a publisher with partners products to promote and a release schedule to hit.

The new game developed over several years. Rather than one famous river I wanted variety, so I made a lot of trips to interesting waters to do the photography. I spent more time in waders bracing a camera tripod in trout streams and rivers than I spent fishing. Eventually I self published the game with about 300 fishing sites. I played marketer enough to get it write-ups in the major fly fishing magazines and got the sales started.

By 2007 things were going well enough that I re-quit the day job and went back to game development full time. There were 475 fishing sites in the third edition, and a hundred more as available add-ons. I developed two 3D fishing games, but the fly fishing game was always my best seller. I released a kit to let users add their own content to the game, and set up a forum on my web site. That took off more than I ever expected. A handful of hard-core fans around the world have produced thousands of additional fishing sites and hundreds of fish species. Two people who met on my forum are now married. I wouldn't have believed that was possible.

I'll skip the non-game (but still fishing software) part of the story and finally get to Gideros. A couple years ago I found Gideros and decided to use it to build a mobile version of my 3D ice fishing game. I captured images of the 3D models I'd made for the Windows game to make sprites for a 2D version. I considered the project an experiment and a lesson in mobile game development. I released "Ice Fishing Derby" for Android and iOS last spring. It's no Angry or Flappy Bird, but it's earned good ratings and brought in more money than I'd expected.

I've spent almost all of this year porting my fly fishing game from C to lua and Gideros. I doubted at first if phones and the Gideros framework would have the processing power I needed. All the fish in the scene navigate their environment in 3D, reacting to the food, current and structure of the scene. The fishing rod is internally modeled in segments, each reacting to forces in 3D. And then there's the line, made up of points moving in 3D with each effected by gravity, the pull of points, friction, etc., before being represented in 2D elements on the screen. I was extremely happy to find that Gideros and Lua could handle it easily. I only see a little lag on the 4 year old phone I keep around for testing, but even on that it's still very playable.

I did have issues with the expansion files required for Android apps to exceed 50 MB. When I couldn't get the expansion files working I cut down the content. I took the game from 555 fishing sites to 165 and greatly reduced the collection of fish images, etc. Having done that I've got to say the game is much better for it. I've had to focus on quality over quantity. Even though the 555 sites were selected as the best of the thousands I photographed over the years, cutting that down to 165 meant the app now has the best of the best.

If this game has a competitor that would be "iFishing Fly Fishing Edition". That has 1 site for free and a total of 6 if you buy it. Even cut down to 50 MB my new game has 26 times as many sites as they offer, so while quality has become my focus, I don't think it's lacking on the quantity side.

Now I need to take off the programming hat and dust off the marketing hat to see if I can get this game noticed in the Play Store. But first it's time to get some sleep.

For those who took the time to read this 2 AM rambling, and for those responsible for making Gideros such an incredible game development tool, THANK YOU!!!

PaulH

PS - Here's the game on the Play Store: https://play.google.com/store/apps/details?id=com.pishtech.ffs

+1 -1 (+5 / -0 )Share on Facebook
«1

Comments

  • Hey, that's a really interesting read! Now i'm gonna have to download it...Good luck Paul.
    “ The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time. ” - Tom Cargill
  • eezingeezing Member
    @PaulH

    Well done! Looks like you put a whole heck of a lot of work into this. Congrats on completing it!
  • ar2rsawseenar2rsawseen Maintainer
    @PaulH wow fascinating.
    Wish you all the well with your latest release and more site can be added later as an update once we resolve the issue with expansion packs ;)
  • totebototebo Member
    edited August 2015
    PaulH, I love fly fishing and tried your game. It's a good experience, like the physics of the line. I could never cast this well in real life!

    I spent a good five minutes reeling a fish in, and just as I was getting close to netting the app crashed. Gah!

    :)

    Niclas
    My Gideros games: www.totebo.com
  • PaulHPaulH Member
    Ouch... Any chance you had the in-app volume on but your phone volume muted? That's the only crash scenario I've seen lately.
  • totebototebo Member
    Yes, actually! Obscure but good catch. Let me know if you need help debugging.
    My Gideros games: www.totebo.com
  • PaulHPaulH Member
    Glad it's a case of a known issue! I've seen that on my other Gideros game and have never found a complete solution. It seems to happen only with looping sound effects, or possibly sounds played at a very low volume, and even then only occasionally. I'd be interested to know if the game is stable if you turn off volume with the in-game volume slider, even if the phone is also silenced.
  • @PaulH congrats for your release!

    Wow thats really obscure bug, is other gideros games also suffered from that problem?
    have fun with our games~
    http://www.nightspade.com
  • PaulHPaulH Member
    Good question. The crash report's I get have this stack trace:

    java.lang.NullPointerException
    at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:2218)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

    It's not as simple as just playing a sound from a file that's missing, has a file name case mismatch, etc. My sound playing function starts by doing a file open and close just to test the validity of the file.

    It could have to do with the way I'm looping sound files. I've found that if I use the looping option on the sound player's "play" method I get a slight gap of silence before the sound restarts, which is problematic when the sound is something like a rushing river. So I override the looping directly with this code:

    if (sound_is_playing(cat)) then
    if (sound_player[cat]:getPosition() > sound_length[cat] - 250) then -- start over about .25 seconds before the end, prevents auto looping which has a gap
    sound_player[cat]:setPosition(250) -- restart a quarter second in - avoids a slight gap
    end
    end

    That plays the sound seemlessly, and skips the first and last 250 ms of the track. But perhaps it's unsafe.

    Has anyone else had issues with skipping in the looping sound playing? And maybe found a different solution?

    And thanks for the support!

    Paul
  • ar2rsawseenar2rsawseen Maintainer
    We were get rare occasions of such crash report but could never reproduce it, now thanks to you, we at least know the settings on the phone which cause it.
    Thank you ;)
  • totebototebo Member
    Tried to replicate but wasn't able to consistently. I got a crash when I was adjusting the sound slider to the bottom (in game), but only once.
    My Gideros games: www.totebo.com
  • PaulHPaulH Member
    edited June 2014
    I've found reports of non-Gideros apps with the same occasional crash. This page offers an explanation:

    http://stackoverflow.com/questions/18224097/android-mediaplayer-nullpointerexception/20468129#20468129

    In a nutshell, calling the MediaPlayer's "stop" method then its "release" method is problematic since "stop" uses messaging and it's possible for the media player to be released before the stop method tries to access the object. The fix is to remove the call to "stop".

    I don't know if Gideros does this, but the pattern of crashes and the call stack look very familiar.

    Paul
  • ar2rsawseenar2rsawseen Maintainer
    edited June 2014
    Just checked the code, and yes in Gideros stop method is called.
    So that must be the problem

    Thank you for the info, will be fixed ;)
  • PaulHPaulH Member
    That's great! So far the new app has a 4.3 average rating, but it was around 4.9 before a few people started getting that crash and giving it a 1 star rating. Then of course there's the guy that gives it a 1 star because not all the content is free. There will always be people like that, and people who just aren't fans of the content, so sustaining a 4.9 average isn't realistic. I'll be happy to see it stay at 4.3 or better, and a fix for those crashes will certainly help.

    I noticed "loop" in the call stack when the crash occurs. Is the media player object cleaned up that way only if it's set to loop, or would playing a sound once potentially use the same code? If it really only happens when the loop option is used I could work around the issue until the fix comes out by calling the play function with looping turned off and just jump the position back before it ends. I'm doing that already to avoid slight pauses between plays, but I still have the loop option enabled too, just to be sure the sound doesn't reach the end before my code jumps it back, which is possible if the system is running very slowly.

    Paul
  • OZAppsOZApps Guru
    edited June 2014
    @PaulH, congratulations, however you are bang on the target that if reviews and ratings are something to go by, it is one big distortion. Crappy Apps get 5* ratings because the ONLY people that actually post a review are family and friends where as there are some *interesting* folks that take price in 1 star and nasty reviews for the sake of it.

    I do not use reviews and ratings as a measure when I d/l apps. My measures are the screenshots, the quality, the size and then last but not least, word of mouth or reputation/stories about the app that bring me to it. But that's me....

    For my reviews I never had a score, it is because numeric scores are not a valid way to express, since the scores are tied to certain attributes that can skew the final results. Not all 4.5* apps are the same, not all the top apps are AAA titles, not all popular apps are polished and professional and not all good apps are Top Sellers or Highly Rated.

    Likes: hgvyas123

    twitter: @ozapps | http://www.oz-apps.com | http://howto.oz-apps.com | http://reviewme.oz-apps.com
    Author of Learn Lua for iOS Game Development from Apress ( http://www.apress.com/9781430246626 )
    Cool Vizify Profile at https://www.vizify.com/oz-apps
    +1 -1 (+1 / -0 )Share on Facebook
  • PaulHPaulH Member
    The main reason I'm eager for the fix is to simply keep my customers happy. These inconsistent crashes don't impact many people, but they render the game unplayable for those who encounter it. That said, I do also care about even a tenth of a star change in the average rating.

    I completely agree about the rating being a very distorted view of quality, especially when an app is relatively new. When a new app has only a few ratings the score is virtually meaningless. Once an app has been rated hundreds or thousands of times the ratings become a more accurate but still imperfect measurement of what people think about the app.

    I also agree that a high average review is by no means a ticket to success. A lot of people will avoid a 1 or 2 star app, and not hesitate to try anything with 3 or more, but plenty of people ignore the star ratings altogether. I'm not worried about people would would download an app with 4.5 stars and not one with 4.0 stars as those people are probably quite rare.

    Far more people choose their apps by browsing the top ranked titles. The vast majority of apps in the top 10 for any category will have 4 to 4.5 star ratings, so people browsing that way don't have much incentive to both looking at ratings.

    The tenths of a star mostly matters to me because it's one small factor in the algorithm that app stores use to rank apps, and every little bit can help push an app up another spot. Somewhere on those app rankings, both by category and in search results, there's a tipping point. The vast majority of people stop browsing after viewing the top ten or twenty apps. An app ranked #5 may get 100 times the downloads of the #25 app, which may get 100 times the downloads of the #250 app.

    Obviously the rate of downloads is a huge factor in ranking, and the number 1 app is on top because it's really popular, but it's kind of a catch 22. If you can climb in the rankings, you'll get a lot more downloads by virtue of being seen by a lot more people, but downloads are the main thing that makes you climb in the rankings. Ratings and reviews are a smaller piece of that formula, but they're a piece a developer can influence by doing whatever it takes to prevent crashes and generally making sure the customers will be happy with the app.

    10 days in my app is being run about 1,000 times per day for a total of about 120 hours per day. I'm getting about 4 crash reports per day, which isn't a lot, but for every reported crash there are probably several unreported crashes. If they can be prevented that would boost the average rating a fraction of a star, which could just possibly be what makes the difference between the app eventually being the last app on the first screen for its category and being the first app on the second screen. And that can make a huge difference in revenue.

    Paul
  • PaulHPaulH Member
    Any idea on how soon a fix might be available for the MediaPlayer crash? While it effects a small percentage of users, it's a nasty bug for them. It seems to happen mostly on Nexus devices.

    Paul
  • ar2rsawseenar2rsawseen Maintainer
    @PaulH problem is that even knowing of the issue, I can't reproduce thus can't test if the fix works. Nothing happens with volume down on all 3 my devices + 2 borrowed devices for test.

    If you can reproduce the issue, I can build you a gideros.jar file to replace in your project and try if that fixes the error? :)
  • PaulHPaulH Member
    Sure, that will work. I can't reproduce it on my own devices but it happens on my daughter's phone. We can try an experimental build on that.

    Paul
  • ar2rsawseenar2rsawseen Maintainer
    Ok here is a gideros.jar file with removed stop calls for MediaPlayer channels. Just replace it in your exported project, clean it and build an apk

    zip
    zip
    gideros.zip
    55K
  • PaulHPaulH Member
    That works! My daughter played a few minutes with the current build, got the crash, installed a new build with only this change, and played for much longer without an issue than she could before.

    Is this jar file stable enough to release with, or should I wait for an official release?

    Paul
  • ar2rsawseenar2rsawseen Maintainer
    @PaulH it's stable, the only changes are the removal of stop method call, so you can use it to speed up the update ;)
  • PaulHPaulH Member
    Excellent! I've released an update. Fingers crossed that it fixes it for all devices. =)
  • totebototebo Member
    @paulh, just had an extended session on my Nexus 5, no crashes. I think I emptied all the free locations of fish, though. :) Excellent game, gets the heart pounding when you hook one.

    Niclas
    My Gideros games: www.totebo.com
  • PaulHPaulH Member
    Thanks for the feedback and the testing! I've been getting 4 or 5 crash reports a day, but none so far on the current version. The new build has a couple hundred runs so far without any reported problems.

    Paul

    Likes: ar2rsawseen

    +1 -1 (+1 / -0 )Share on Facebook
  • sqbsqb Member
    edited June 2014
    @PaulH, what are you using for your analytics to know how many times it's been run, get crash reports, etc.?
  • PaulHPaulH Member
    I created a database on my web site and wrote PHP scripts to collect statistics. I have the game use a UrlLoader to talk to the server. Within the game I keep track of the number of times it's been run, how many seconds they played on the previous run, each fish they catch, etc., and then share that with the server. I plan to add in-game competitions and a global leader board in time. I also track the runs per day per version of the game, etc.

    At start up I have the game consult the server to make sure it's OK for that version to run. If I encounter a security issue, like a hack to access paid content, or for some other reason want to make an update mandatory, I can just change the minimum acceptable version in that PHP script, and have it return a message to show to the users explaining the need to update the app.

    I get the crash reports mostly through the Play Store itself. When I get a bad review due to a crash I always reply with a request to contact me at my support address so I can investigate.

    Paul
  • totebototebo Member
    edited June 2014
    The statistics solution seems very good, but may not be within everyone's technical reach.

    A less configurable, but in my opinion very powerful way to collect and collate analytics, is Mixpanel. Used cleverly it's free. Here is my implementation:

    The data I'm tracking with each call:
    local t = { 
    	["event"] = "EventName",
    	["properties"] = {
     
    		-- Mixpanel properties
    		["token"] = self.mixpanel_token,
    		["distinct_id"] = self.player_id,
     
    		-- Generic properties
    		["Application Launches"] = playerData:getApplicationLaunches(),
    		["Session ID"] = playerData:getSessionId(),
    		["Player ID"] = playerData:getPid(),
    		["Seconds since launch"] = math:toint(tostring(os.clock())),
    		["OS"] = application:getDeviceInfo(),
    		["FPS"] = deviceProperties:getFps(),
    		["Memory Used"] = deviceProperties:getMem(),
    		["Language"] = application:getLanguage(),
    		["Locale"] = application:getLocale(),
    		["Orientation"] = application:getOrientation(),
    		["ScreenDensity"] = application:getScreenDensity(),
    		["PixelHeight"] = application:getDeviceHeight(),
    		["PixelWidth"] = application:getDeviceWidth(),
    		["Diagonal Inches"] = deviceProperties:getDiagonalInches(),
    		["API version"] = application:getApiVersion(),
    		["Can open URL"] = application:canOpenUrl('<a href="http://www.google.com'" rel="nofollow">http://www.google.com'</a>)
     
    	}
    }
    Anything can be tracked. It's up to you and what you find useful.

    The code to send the data to Mixpanel:
    local track_json = json.encode(t) -- Convert t (a lua table, see above) to json
    local base64json = string.base64enc( track_json ) -- Encrypt with Base64
    local url = '<a href="http://api.mixpanel.com/track/?data='" rel="nofollow">http://api.mixpanel.com/track/?data='</a> .. base64json -- Create URL
    local url_loader = UrlLoader.new( url ) -- Send to Mixpanel
    This gives access to retention, engagement and other analytically snazzy things.

    :)

    Niclas

    Likes: uzubari

    My Gideros games: www.totebo.com
    +1 -1 (+1 / -0 )Share on Facebook
  • altaialtai Member
    edited June 2014
    @PaulH congrats for your interesting and enjoyable game, gameplay is awesome. Only if the gamer activates saving mode, he/she will encounter early dimming screen problem frequently =) like me.. you may add a line at the main game level
     application:setKeepAwake(true)
    Also if you prettify all buttons a little bit(with googling: online button maker), I think it looks more attractive, really nice game, deserves more credit to try. Good Luck
  • PaulHPaulH Member
    Thanks for the feedback, and the suggestion! I'll definitely add the KeepAwake call, and I agree the buttons could be nicer. I'll add those to the list for the next update. I'm planning to add a leader board, and probably something like a weekly challenge.

    Meanwhile I'm looking into an overhaul of my other Gideros game. It's a $3 title with no free version, but I want to switch to the model with a free app and in-app purchasing. That's working better than expected for the new game, and now that I know how to do it I might as well see if it can boost the revenue for the other one.

    Paul
Sign In or Register to comment.