Quick Links: Download Gideros Studio | Gideros Documentation | Gideros community chat | DONATE
New Game: Lost Caverns on the Play Store (And apple App store) — Gideros Forum

New Game: Lost Caverns on the Play Store (And apple App store)

Tom2012Tom2012 Guru
edited October 2015 in General questions
Hi guys :)

My new game 'Lost Caverns'is up on the Play Store and the iOS App Store

https://play.google.com/store/apps/details?id=com.firecroc.lostcaverns&hl=en_GB

https://itunes.apple.com/us/app/lost-caverns/id1045041311?mt=8&ign-mpt=uo=4

"Prepare yourself and head off in search of adventure and forgotten treasure. Lost Caverns is an exciting 2D platform game that will test both your reflexes and puzzle solving abilities. Reminiscent of old school arcade platformers - but with a twist! Use your claw gadget to grab precious gems, gold and relics from within the Lost Caverns."

Here's the trailer I made for the game:



Thanks to the forum regulars and posters here for the help making the game. I would have been lost without you.

If you give it a download, please let me know any bugs / issues. I only have one Android test device here.

Thanks!

EDIT: It's uploaded again and should be on the Play Store.

Tom
Screenshot_2015-07-11-09-39-10.png
1184 x 720 - 1M
Screenshot_2015-07-12-10-37-36.png
1184 x 720 - 800K
Screenshot_2015-07-12-10-29-20.png
1184 x 720 - 768K
+1 -1 (+10 / -0 )Share on Facebook
«1

Comments

  • It looks amazing. Did you use box2d for the physics?
    Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!).
    https://deluxepixel.com
  • You should make it work on Nexus TV, etc...
    Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!).
    https://deluxepixel.com
  • Hi SinisterSoft, thank you!

    Yep it's Box2D. It has a few quirks when using it for a platform game but the stuff you can do with it is incredible. Used if for the collision detection too and it didn't seem to cause much of a hit.
  • Neat. I will give it a whirl when I get my Nexus 7 back. Have you tried Hardon collider? It's pretty good for collision detection with different shapes and stuff. I don;t know how it compares to box2D performance wise however.
  • @Tom2012 - Whats the frame rate?
    Coder, video game industry veteran (since the '80s, ❤'s assembler), arrested - never convicted hacker (in the '90s), dad of five, he/him (if that even matters!).
    https://deluxepixel.com
  • Looks great! Never got into the game on my Nexus 6. It crashes just after the loading screen. It happens every time, so should be ok to track down.

    If you haven't already, I recommend integrating Crashlytics. It shows the actual lua error and speeds up debugging things like this a lot.

    My Gideros games: www.totebo.com
  • Thanks for that totebo. Eek! I'll get on this straight away. I'll get Crashlytics on there too.

    @SinisterSoft it's 60fps 99% of the time. Still get an odd dip but they are rare.

    Likes: SinisterSoft

    +1 -1 (+1 / -0 )Share on Facebook
  • Tom this looks amazing. Very nice work. Holy crap i was so surprised that game is just amazing. Very nice work.

    Can you explain more how you create the level. You have written an level designer for yourself or you have coded the level by yourself?

    Sorry at the moment i work on my first / little game with gideros. But the power behind Gideros is so amazing.
  • Tom2012Tom2012 Guru
    edited September 2015
    @GiderosFan

    Hello, yes Gideros is very powerful and stable. It's literally a pleasure to work with!

    As for coding the Levels one of the things that can be tricky with Gideros is laying out large levels. My previous tools (Game Salad and then Stencyl) had a visual level editor. So I went looking for one with Gideros. The software that I've been using is:

    https://www.iforce2d.net/rube/

    This is a brilliant tool because you can have a small set of graphic assets and use them to create pictures (as they show on the website). You can position them, rotate them or scale them to build levels.

    You can add images and also physics bodies to your game and then export the code from RUBE into your game.

    While Gideros can read the JSON files that RUBE creates, I wrote a program in php that converts RUBE data directly into a lua table for your game. This is so your game doesn't have to use processing power to read the json file into a table each time it loads a level. It makes more sense to do it once yourself.

    I wrote a bit about it here...

    http://giderosmobile.com/forum/discussion/2346/rube-and-gideros/p1

    BUT here's the process I used for this game. It's changed a bit since then.

    1) Design the layout in RUBE

    2) Export as 'raw' file format and upload that file into my little tool:

    http://firecroc.com/json-to-lua/

    3) In gideros, create a Level 1 Data.lua file in your game. You paste the output from the php tool into this file. It looks something like this:
    i = {}
    i[1] = {}
    i[1].file = "root4.png"
    i[1].center = {}
    i[1].center.x = 4.8481
    i[1].center.y = -2.0834
    i[1].angle = -0.452865123749
    i[1].renderOrder = -100
    i[1].scale = 0.5350
    i[1].atlas = 'Mud Tileset'
    Basically the table is a list of all sprites and bodies, positions on screen and so forth.

    4) You then need a class called rube.lua that reads this information and puts the sprites on screen in the correct position, scale and rotation.

    This sounds pretty complicated but I'll include the exact source code from my game. It's pretty well commented and my code is really basic anyway. :)

    The files I've included are:

    1) Level 1 Data.lua - contains the code generated by my online tool.

    2) Level 1.lua is a scene and this sets up the classes etc. It sets up Rube like this:
    local rube = Rube.new(self,self.levelData)
    3) Rube.lua - you'll need to customize this. It will add sprites, bodies or classes. If you tell this file that a certain image should trigger a certain class in your game, it will set up the class for you. If not, it will just place the image on the scene.

    For example, rube.lua sees plain fruit.png and sets up the correct class:
    		elseif(i[index].file=="plain fruit.png") then
     
    			self.sprite = Fruit.new(self.scene,self.x,self.y)
    Hope this helps and let me know if I can help you on Rube at all.
    lua
    lua
    Level 1 Data.lua
    61K
    lua
    lua
    Level 1.lua
    11K
    lua
    lua
    Rube.lua
    28K
    +1 -1 (+2 / -0 )Share on Facebook
  • If anyone is interested in poking around in my game's source code, I've uploaded it, minus the graphics etc below.
    zip
    zip
    Archive.zip
    7M
    +1 -1 (+3 / -0 )Share on Facebook
  • Wow Tom Amazing :) Thank you for this nice explain. I will buy me the rube editor. This seems like an very powerful tool. Thank you tom so much and thank you for the game's sources.
  • +1 for Rube. I've been using it for level design in two of my games. I use the JSON files directly. The support for Rube is great and responsive.
    My Gideros games: www.totebo.com
  • hgy29hgy29 Maintainer
    Wow, Thanks @Tom2012 and @totebo for the valuable information. Although I am one of Gideros maintainers, I am still puzzled by the quality of the games people can make with it. I suppose I am more a low level coder than an artist...
  • Tom2012Tom2012 Guru
    edited September 2015
    @totebo Could you do me a huge favor please and re-install my game, if you have time. I think I fixed the bug. Thanks :)

    Also on Crashlytics, I am trying to add that at the moment. Looks very good (it's now part of 'Fabric'). I also noticed you can see the crash, and lua error, in the developer console. Are all crashes reported in the console like this?
  • It works! What was it?

    In crashlytics most crashes are reported; some seem to kill the game beore Crashlytics can kick in, and some happens when you're offline. Not sure about developer console. In comparison they seem to be a lot fewer to Crashlytics, but do let me know of what you see!

    Back to the game! Really smooth gameplay. Impressive! How did you do the character animations? The bitmaps look very smooth. Do you show them 100%, or do you resize them (or the game world)? Also (many questions!), how do you fill in the space between the terrain edges? A shape with a repeated texture?

    Anyway, great work!

    Niclas

    My Gideros games: www.totebo.com
  • Tom2012Tom2012 Guru
    edited September 2015
    Thanks for checking Totebo!

    The crash was down to this line of code:
    local signText = BMTextField.new(self.scene.signTextFont, self.text, 300*self.scene.deviceScale, "center")
    Which I believe was caused by using:
    self.scene.deviceScale = application:getLogicalScaleX()
    For some reason this worked fine on my Moto G, but didn't work on the Nexus. I'll test this later when my new Nexus arrives :)

    For the character animations, I used Spriter - http://www.brashmonkey.com/spriter.htm for many of them. It can be a bit fiddly to get running but it's well worth it as the sprite sheets you need are tiny. (I've attached one below). From that you can have an animation with 100s of frames.

    Probably a bit overkill but I was fascincated with Plants vs zombies and how those animations have so many frames.

    The code I use to get the spriter files into my Gideros game is here:

    http://firecroc.com/spriter-to-lua/

    It converts the scml files into movieclips which can be added to the game. I'll also attach the php code to the bottom of this post. If you have a look into it, you'll see it's pretty basic but gets the job done.

    I just show them low res or @2x depending on the device. Rather than using Gideros scaling, I've left the game at 'pixel perfect', and I'm leaving enough bleed around the edges of each level so that the terrain fills different sized screens

    I'm aligning the navigation and interface elements using code, based on the device scale. I started the game when 480 x 320 was the norm, so using stretch made the already large characters look HUGE. Plus the graphics were stretched and looked a bit blurred. The down side is the game won't work as is on larger screens without some further work.

    As for the large expanses of terrain, I started pasting loads of sprites of mud over and over then realised I could just use a shape texture, with a repeating texture inside (as you guessed!) Surprisingly you can scroll HUGE chunks of terrain around like this and not have any impact on performance (thanks Gideros!) :)
    parts.png
    563 x 398 - 51K
    zip
    zip
    index.php.zip
    6K
  • Fantastic! Thanks for that Tom. Do you have a generic class that takes Spriter data?
    My Gideros games: www.totebo.com
  • Tom2012Tom2012 Guru
    edited September 2015
    Basically I have the online php code that converts the .scml file from spriter into movie clips that can be pasted directly into a monster class, for example, in the game.

    I'll attach my worm monster class, which has the converted data pasted into it towards the bottom. The sprites, rotations and positions are converted into a movieclip mc

    Once it's in there, you can call the animations like this:
    		-- play hit anim
     
    		self.mc:gotoAndPlay(101)
    		self.mc:setStopAction(138)
    lua
    lua
    WormWraith.lua
    36K
  • Tom2012Tom2012 Guru
    edited September 2015
    The zip file below contains the scml file (spriter file) than can be opened in spriter, along with all the graphics and texture packs to see how it works.

    My online converter:

    http://firecroc.com/spriter-to-lua/

    Reads the scml file.

    I should have explained what the fields are:

    - Browse - selects the exported scml file from your hard drive.

    - Scale, this needs to be 4x

    To explain this - create your animation images at 4x scale. Eg a leg, a head, an arm. These sprites are imported and animated in spriter.

    You'll also want to create a 1x, 2x, and 4x texture sheet of the sprites. (like in the zip file) below, for use in your game.

    - Atlas is the name of the texture. In this case it's wormWraithAtlas (this step isn't necessary, it was just to save coding it in the game later)

    - #Frames Animation[0] etc...

    The animation can have between 1 and 5 sub animations. In my example I have walking, hit and die. These are on the right side in Spriter. Put the number of frames you want each sub animation to span. For example 100 for animation one will result in 100 frames animation in your game for the walk animation.

    It's a bit of a clumsy way to do it, and it's a shame there's not a way to do it directly in Gideros, but it does work. Hope this helps. :)

    Basically the scml file is just an xml document.
    http://www.brashmonkey.com/ScmlDocs/ScmlReference.html
    There was another implementation of it for Gideros but I can't find it at the moment.
    zip
    zip
    Archive.zip
    695K

    Likes: pie

    +1 -1 (+1 / -0 )Share on Facebook
  • john26john26 Maintainer
    edited September 2015
    I'm really enjoying this game, very professional (Galaxy Tab 7"). I like the grotesque, bizarre, nightmarish feel to it. And the animations are really smooth. The hook mechanism is cool too. It might be nice to add some sort of story to it. For example, consider this game which has a similar, weird theme

    https://www.kickstarter.com/projects/1219798749/daydreamer-0

    They did a nice video describing the backstory. Such beautiful gfx deserve some story telling element to make it really epic/moving!

    I think this game has enough depth to do well on Steam also. While I was playing I kind of wanted to play it on a bigger screen with physical controls to really appreciate it.

    Some improvements: I did have difficulty at first learning to use the hook, so more tutorial signs would be nice for that. I notice there are two hook control buttons, one a the top left of the screen and one at the bottom right. The latter works but the other seems to do nothing, so suggest removing it. I tried using the top-left one first and couldn't make it work. I also notice the hook doesn't always point where you expect. Eg if the character is pointing right and I touch the hook control it should point right until I rotate the angle, but often the initial angle is elsewhere causing the hook to apparently jump and have to be realigned. Should be just a case of initialising a variable.

    Also, in Witches Lair (I think) the whole level is a circle with stuff inside. But the character can fall right off the sides and then he just stays there and can't be recovered. Better if he dies or put a barrier to prevent this.
  • @john26

    Thank you for trying my app and for the feedback. Very much appreciated. I completely forgot about the left pad. As far as I know it's not possible to disable it (I'm using the superb TNT Vpad - http://www.tntparticlesengine.com/ ) So I moved it 200 pixels off screen. Of course this is no good as it shows on larger displays. I'll fix that now.

    I'm also going to patch the other bugs you found. Thanks again. I'd love to make a game for Steam. I buy a lot of Steam games myself! Too many probably. :)
  • john26john26 Maintainer
    Well you can with the new desktop exports! Please let me know what you think of the new win32 export compared to the regular one. It's a smaller package so might be better for Steam...
  • Thanks Tom, will try out your spriter solution, if it does what I need it to it's gold dust. Thanks so much for posting this, amazing!
    My Gideros games: www.totebo.com
  • @Tom2012
    I never used TNT Vpad, but if the left pad is a Sprite I think that you can use these functions from @ar2sawseen's giderosCodingEasy to hide it
    --[[ hiding/showing visually and from touch/mouse events ]]--
     
    function Sprite:hide()
    	if not self._isHidden then
    		self._xScale, self._yScale = self:getScale()
    		self:setScale(0)
    		self._isHidden = true
    	end
    	return self
    end
     
    function Sprite:isHidden()
    	return self._isHidden
    end
     
    function Sprite:show()
    	if self._isHidden then
    		self:setScale(self._xScale, self._yScale)
    		self._isHidden = false
    	end
    	return self
    end
  • Tom, I keep playing this and I realise it's a massive game! It's rare to get this much content for free in an app. You might want to lock half of the levels and offer them as an IAP. In any case, if I were you I'd get started porting this to every platform Gideros can do to get it out there!

    Likes: john26, hgy29

    My Gideros games: www.totebo.com
    +1 -1 (+2 / -0 )Share on Facebook
  • hgy29hgy29 Maintainer
    Is there an iPad version ?
  • @Pie - aha, that looks like it will work, thank you for posting the code.

    @Totebo - Thats funny because I was worried there wasn't enough content in the game. If I'm being honest there's only 12 stages at the moment, but I tried to add some value by having an impossible mode players can unlock. I guess if I get any downloads I will look into expanding.

    I'm going for iOS next. I've put one game on there before but XCode and apple change so fast I'll have to re-learn a lot of it. Thanks again for testing out the game!

    @hgy29 - I've yet to test on an ipad. It works ok on 7 inch tablets but I'll have to do a separate version to get it working on a 'full' iPad. The sprites are pretty big so I think they might look clunky and too large if I simply scale it up. Ipad mini should work fine once it's on the app store though. :)
  • Hey Tom, what scale are you using in RUBE and Box2D? How many RUBE units, for example, is the main character? And do you use the standard b2.setScale() of 30?

    I'm trying to wrap my head around which units work best in terms of smooth simulations.
    My Gideros games: www.totebo.com
  • Absolute love your game! Everything looks and controls great, and the game is a lot of fun to play :)

    Awesome work!
  • john26john26 Maintainer
    Ha! Completed the game and also got gold achievement on some of the early levels. It's going to be real tough to get gold achievement on every level, as it seems to require collecting every single piece of gold and jewel.
Sign In or Register to comment.