GameMaker Studio 2: Action RPG Tutorial (Part 15: Entity "On Hit" Response)

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
hello everybody and welcome to episode 15 in this episode having just rounded off our player attacks and our player attack hit detection we are going to now add the ability for our entities to react to being hit at the moment we just color them red and we don't want to leave that in for too long we're going to change it up obviously there's more types of reactions that when I'm going to get to today because we're gonna have enemies in the game eventually and they're not in the game currently so we can't write how they react to being hit yet but we do have entities in the game that should react differently or we're about to have entities in the game that will react differently because I'm going to add plants to the game so we have some like tall grass type stuff that you can walk around and chop up the player character so we'll have entities that can be destroyed by our attacks and the other type of entity is just going to be something that well we'll also have entities that don't react at all to being attacked possibly like you know our NPCs or whatever and but we will have things like our signpost that I want to sort of signal to the player that we just as a sort of game field thing that they hit the object but it you know it had no effect so we're just gonna make them like flash white nor whatever you know it's like a solid object being hit by an attack before we get started I just want to say off camera I made a few adjustments just to our resource tree where I've just organized a few things into groups and so just in case you're a little bit confused by that in the current version I'll go make a two point two point five you can add groups just by right-clicking in here and going the add group meaning it whatever you want and then you can put things in it okay the way you actually put things in group is can be a little bit a little bit sneaky and hard to notice immediately or do intuitively so when you click and drag something in the resource tree you know if you get these kind of gradients going off whenever you hold a one object over another so if I hold it over the top we get this ray a great gradient and the brighter color is on top if I hold it beneath the F Stiles text here you can see the bright part the gradient is on the bottom and that's going to tell me where which side I'm gonna put this item in the tree all right so if I want to be above those tiles I do it on the top I'm goin't to be below do it on the bottom and the way that works with groups is there's actually a third one which you can see as I'm hovering here so if I go over the top I can place this above group zero low bottom I can do it below group zero and if I hold to the side you can see this sort of horizontal gradient happens and if I let go there it'll put it in the group okay and just can be a little non-obvious how that works I just wanted to go over that real quick okay so you haven't mentioned some plants the second ago we're gonna go ahead and add those first so I'm gonna right-click and sprites and create two new sprites and the first one we're gonna hit import and find s plant in my AARP G assets and I'm gonna set the origin to be middle Center and don't really have to worry about anything else and we'll call it exactly what it was called s plant alright for those making your own assets I just made a 16 by 16 sprite again with the origin in the center and you know it's a plan not much more to say about that and on the second sprite s plant B it's just another plant just just to have some variation okay we've got a big plan and a small plan that's really that's really it so I'm just gonna call this s Plan B I suppose I could have called this one s plan a and B but I'll just leave my company leave my naming conventions how how they were in my pre-production now I'm gonna add a couple of new functions before we go ahead and start placing these plans around the room so I'm gonna right click and scripts Hickory script and I call this first function entity hit destroy so this is gonna be the function will call whenever we hit something with an attack that we want to just destroy and for now that is gonna be as simple as calling instance destroy okay with whatever calls test that's good all right it'll get more complicated later as we probably want a fancier effect on the plant than just having it vanish from the room we wanted to all sort of scatter some some leaves and stuff like that some fragments as we destroy but we'll come to that later on so if no entity had destroyers just instance destroy and then make another function called entity hit solid that as I described before it's just gonna make something flash and the way we do that is I'm going to set flash to equal nor point five okay so the way flash is gonna work is you may have seen me do this in a similar way in different tutorials and you think I probably did it like this in the platformer series as well I remember but we'll just have a variable called flash and when we set it to any positive positive value it's going to make its way to zero over time and whatever value it is between naught and one shows the percentage of like solid white to draw over the top of that sprite so if it's one we just draw the you know the sprite will be completely white complete opaque white and if it's point five you'll have like a 50% opacity white flash on top and so on right by setting it to null point five so we get like a 50% opacity white flash on top and it will fade slowly to zero over time okay we'll write the actual code for that in a little bit later but for now we just need to set flash to equal null point five so it becomes a positive value and that's all this function actually needs to do and so we can close both of them now and then I'm gonna come to our roots entity object RP entity parent object and in variable definitions down here we're going to add a new entity variable called entity hit script okay and it's default value is going to be minus one all right and I'll just drag that above the Z here just so we can pair all those together and this is gonna work the exact same way as entity activate script works ok so it's minus 1 when nothing has been assigned to it and we are able to assign functions that we've declared to this variable and then when the entity is hit by an attack we just look to see what is in this variable if it's minus 1 we don't do anything and if it's a script then or our function name we call that function right simple as that with that setup and done in our little entities group I'm gonna create a new object called Oh plant and assigns fright to be s plants unsurprisingly and go to parent and make it a child of P entity so it inherits all of our basic entity stuff and then in variable definitions I'm gonna disable entity shadow and I'm gonna change entity hit script to be entity it destroy okay don't put Open bracket close bracket on the end or a semicolon or anything like that just the name of the function okay then I'm gonna duplicate this object right click and duplicate or control D apparently Oh planet of D and just change this it's exactly the same object exactly the same variable definitions but I'm gonna change the sprite a to s Plan B and that's it alright just so we can place these around our room then if I come into our village and I still don't understand why the room at our defaults the super wide here I don't know if it's a fork in what other thing or what but it does it just does that to me I'm not sure why I'm gonna go to our tiles upper layer and zoom in here you'll notice I have this weird sprite and it's just for a chopped plum essentially I'm just gonna scatter a few of these around basically the way these work is they are going to be what gets left behind when we cut a plan okay and specific the bigger of the two plants I found that the smaller ones look weird with these and these these are really kind of really designed for the bigger ones you don't have to do this it depends what kind of a stake you're going for but I've just decided that it so those are just tiles they're not interactive in any way it's just some artwork over the top of our tiles all right and then by placing these over the top now on our instances layer that's how our plants are going to work so there's plants here and then when it chops and gets destroyed it leaves this behind okay so it kind of it just feels right to you I have so that you chopped the the plan beat doesn't just remove the entire plant right it just leaves a little bit of chopped chopped plant behind there just the roots of it and so we'll place those now over the top of all those that we've just placed in the room and then grab our smaller plant and just sort of place them scattered around the small plants I feel look a bit better when just chopped and removed entirely it's nice just to have a little bit of variance the length oh okay um that's just uh disable that see all that looks like that looks pretty good yeah pretty happy with that so now we just need to make it so these objects actually call the appropriate script when they are hit by our player so where do we handle things being hit by our player we do that in calc attack okay this is where we worst you're setting image blend to BC red you know when we do with hit ID that's you know we're applying code to whatever instance we found in our collision our hit detection for the attack and that can be many things at once because we're using instance place list so whatever we want to happen will happen here and all I'm going to write is if 10:30 hit script does not equal minus one script executes entity hit script exactly the same way our entity activate scripts system works okay so that's it so I'm going to press f5 now come into the game you'll notice if I hear these objects they still don't do anything they're just gaining a variable called flash they don't even have by default that needs setting up and obviously just you know gaining a variable doesn't do anything so they were just don't seem to have any response about hit the grass it gets destroyed it's not the prettiest effect at the moment because you know it's literally just vanishing but we'll improve that this time goes on with the project because it works right the the right entities are calling the correct scripts okay the signs aren't disappearing but the plants are that's what we wanted to happen so now I'm going to add some feedback to our solid entities so that they can they can be hit now some game designers might feel that you don't want to do this that you don't want to have feedback on hitting something if if it doesn't if it can't be destroyed right so you might maybe not mislead the player I don't buy into that I I think it's always good to have feedback on entities that you can hear even if they can't be destroyed it helps indicate to the player that they are an entity you know that they're a game object and have some sort of meaningful role like if I can't destroy it but maybe I can do something else with it so I'll try activating it and so on and also it's just it just feels nice to have the game react to your input you know it's kind of what people call game feel you know it's a way you press buttons and things happen on the screen and sort of respond to what you did right the more of that you can put on your game the more meaningful response things give the better your game feels that'sthat's the whole idea behind game feel right and like you know the whole thing behind putting screen shake and flashes and things like that into your game is entirely down to things just responding in a satisfying way to whatever buttons the player is pressing or whatever the player is one thing to do so that's what we're gonna do and we're gonna do it via a shader so this isn't going to be exactly the same as how we did it for the platform a series I think I actually prefer what we do in the platformer series to what I'm gonna do here but let me explain so in the platformer series what we do is we write a shader that just draws white okay basically just changes our drawing so there anything we draw a while that shader is active drawers completely solid one and then we draw a sprite of a certain opacity sorry whenever we want to draw a sprite with a flash we draw that sprite again using the shader over the top of it and just vary the opacity of this you know that the flash sprite right so we draw a like a solid white version of the sprite over the top of it and then just fade its opacity and that gives us a kind of a flash effect that's one of my favorite ways of doing it honestly but yeah it has a few weaknesses here there but it's one that it's a really cheap way of doing it there's really not much code involved and not a whole lot you have to track with it well I'm gonna do differently this time mostly for the sake of showing you an alternative is we're gonna write a shader that also that actually does all the work that's going to so we don't have to draw a sprite twice we're just going to write a shader that we send a flash value into and it will basically mix the color of the sprite with white you know to a certain degree depending on how how high that Flash variable is it takes a little bit more work to set this up but it does eventually mean you're only drawing the sprite once and doing all the work there which can be handy i I personally I think I prefer the deep slightly simpler solution from platformer series because by drawing multiple sprites you can actually apply different shaders the different sprites and sort of stack them up and or in a way that maybe you can't by doing this but there's advantages to doing it this way as well I don't want to go into too much detail about it you'll you'll discover as you use these things I think it's worth if you're following this tutorial please please do you know follow the tutorial and do it the way I'm showing here just cuz it will teach you something and you can then decide for yourself and either needs of your game and what the best way of doing this is for you going forwards I think it's better if you just sort of learn these tools and learn by experience where they best fit and don't best fit rather than me just sitting here telling you it's good for there's some good for that because there's so many different different permutations depending what game you're making and so on alright anyway that's enough pathan ring about it that's actually show you how to do this okay so I'm gonna make a shader now I'm gonna call Sh white flash I don't want to sound like I was talking down this approach by the way I think it's a very good way of doing it as well it's the most normal way of doing it I guess and I think some people might consider the way I do it in the platform would it be a bit hacky you know drawing a second copy of the sprite or the top of it but it's my personal favorite it's all I was getting at and I wasn't trying to say one was objectively better than the other I couldn't really judge that if I'm honest anyway I just said I'd bladdered about it enough and then I've continued to blather about it so we make a shader do not worry about the vertex shader for those of you new to shaders you haven't seen it in other episodes a shader is composed of two components as you can see when I made the shader that I've called SH white flash it's come up with two tabs on top here a V SH and an FSH one is the vertex shader and one is the fragment shader if you don't know anything about shaders just ignore the vertex shader alright is all you need to know okay we're not going to do anything in there just come straight to the FSH fragment shader and it says at the top simple pass-through fragment shader if you want to learn more about shaders I have sort of an intro to shaders video that you go on watch that it just explains them in principle um I do recommend it cuz I'm not really gonna go over a lot less stuff here but an ultra oversimplify crash course for anyone here who just can't be bothered to go and look about here please do just go and look at a video but if you really can't be bothered the very bare bones of what you need to know shada is like kind of mini program that runs on your graphics card and therefore allows you to do cool stuff with the way you draw stuff that is potentially a lot faster and more effective than doing those things through code okay we directly we are directly manipulating how we are drawing to the screen when we work with a shader okay and how that works with game maker as we write a shader that fundamentally changes how we draw and then we enable that shader for a period of time draw stuff using it and then disable that shader again okay so we might write a shader that just changes all our drawing to draw everything in red and then everything we turn that shader on and anytime we draw anything it just draws it in red and then we can turn that shader off and go back to doing other things loads and different cool things you can do with shaders feel free to look at my other videos I'll look at other people's videos the loads of other people are doing really cool videos on shaders as well not gonna go into it too much but that's that's what she that is and and how we use them in game maker the other key thing to be aware of is that when you're writing shaders you absolutely need to make sure you've got a semicolon on the end of your lines and shaders the way they compile they compile a slightly different language they use a different language we're not writing GML I'm writing a shader we're writing GLSL and it's a lot more strict okay so if you get anything wrong or an out of place you will get an error and that error will not be helpful okay I can see it so when you're following what your tours if you don't know much about shaders then you want to remember one thing just be precise okay just make sure you get every you're paying attention and you're copying things down precisely okay and that's the most important thing because I'm not gonna be able to help you with your errors and you're just gonna have to work it out the hard way if he if you screw something up so just try and be precise with this stuff anyway in a void main' which is kind of the the main bulk of our shader fragment code what this line here does this general Frank color thing and this is basically telling us again I'm over simplifying it but the simplest way to think of this is this is determining the final color of the pixel I say oh that we are currently drawing all right which it gets from the sprite that we've passed through to it all or whatever we've passed through to the graphics card to be drawn to the screen it gets the appropriate colors and alpha and transparency from that and this is the final resulting color okay and we can manipulate that to draw things a bit differently so this line is fine because that's gonna you know be essentially drawing normally and get the pixel how we want to but then we're going to manipulate this color by adding the flash value that we talked about earlier that not 0.5 that we set in our entity to the red value to the green value and to the blue value if I come into the sprite editor quickly just anything then just bring up the color picker those you don't know much about RGB if I like just this random sort of not just or just any random color here if I increase the red all the way to the top and the green all the way to the top and the blue all the way to the top what we end up with is white okay 2.5 of everything is white so the closer you get to that from where ever color you are the closer you are getting to white okay so that's what we're gonna do we're just gonna add a percentage if you will of 255 to our RGB depending on flash so when it's one we're adding 255 and when at zero we're adding zero obviously I went it's 0.5 or I didn't like 1 to 8 right so back in that shader now oh that's the other thing I need to actually we need to bring that flash value across into our shader we do this by establishing a float at the top of here I can't don't worry if you don't know if you don't we're writing in a slightly different language here and I don't really have time in this episode to explain to all of shaders we're just going to do this quickly so just follow along we define a variable that we want to bring across to the shader by writing uniform float Flemish okay so we've created if you will a float variable in our shader called flash a float being any number of flow being a number that can have decimal places right it's the easiest way to think about it so like an integer would be like a 50 and a float would be like 50 point zero zero right obviously flashes a number between Noor and one so it needs to be a float right between on 1 and after we finished the shader we'll go into how we get a variable from just one of our GML objects across to the shader code okay because that's the necessary thing this flash variable is different to the variables that we have in the objects we need to actually get the that value that point five value across to this but we'll come to that after we finish writing the shader in the shader code itself as I said we're going to manipulate our final color to add 2d RGB value depending on Flash is so what I'm gonna write is GL underscore frag color I remember be precise with this please try and be this exact as possible I'll make this big you know it will zoom in yeah just to make sure we get everything exactly right equals Veck for Open bracket Veck for a short for vector for like and you don't order vector s or whatever don't worry too much about I think of it I'm oversimplifying what today but think of it as a variable that contains four variables for now right so I think of it like a for entry array all right that's the simplest way I think about it bigos gol fry Colo it contains four variables it contains a red value the blue value or green value and an alpha value it is a vector for right let's in that's in Franco and we're sending it to a new vector for that is basically composed of itself plus the flash component right so you've seen me do this before but just to explain again I'm gonna essentially write over multiple lines here just so that we don't end up with this line being super super long and hard to read but it is essentially one line of code so G off right color equals back for GL underscore flag color dot aa lowercase R there plus flash comment GL underscore Frank color dot g plus flash comma GL and just got frag color dot B plus flash comma and then lastly GL underscore flag color dot a okay that's the alpha or the transparency of the sprite which we just want to be whatever it should be all right whatever it should be from the original I'm not changing that we're just changing how white the sprite is so one advantage of doing it this way is we can actually draw a sprite like a transparent sprite like oh I know add a pasty or whatever to the thing we're drawing using draw sprite ext or whatever and the the flash will still work appropriately right so that is that's one advantage of doing it this way and then we'll put that close bracket on the end here and semicolon okay so it should look like that make sure then I close bracket semicolon it's there make sure that open break is those commas are in place make sure it looks like this okay the spaces aren't that important but just you know to avoid all doubt just make it look exactly that way okay and that's it there's no more to the shader than that thankfully episode it yeah as I say we're just taking our red green and blue and adding flash you might wonder some of you might wonder well you know isn't red green blue a valley between naught and 255 you know a flash is just a number between naught and 1 right and I thought don't we need like multiply that by 255 or something know these values all actually contain normalized floats between Noir and 1 yes it will come out as like a number between like our value between 1 to 5 5 equivalency right by the way shade of vectors with colors and stuff each one of these red green blue values and even the Alpha is actually a number between north and one all right for maximum red or zero red you know half red or whatever right that's how it works a value over 1 will just come out as 1 so don't worry about that as well so if they've read is 0.5 and we add one point over to it and we end up with 1.5 it's the same as having read 1.0 okay don't worry about that okay that's our whole shader so I'll just leave this on screen for a few more seconds pause the video if you need to get all this down precisely and then I'm gonna zoom back out just a little bit okay so now I'm gonna come back to P entity our parent object for our entities and I'm gonna do something I should have done when we first made these really and I'm gonna add the create event to the parent entity okay I think I'm I said at a time like I would already to do that yeah or whatever or maybe I don't need to I will just put Z equals zero in here and the variable definitions that'll be fine but there's other stuff we want to do in here and so we should have really just established this early on the reason we should have established it early on is because now we have a quest NPC here that has it on create event and so isn't inheriting from P entity anymore so what I'm gonna do in fact before we even write anything in this P entity create event is in Oak West NPC open that up you know have it already I'm I'm gonna copy this one line of code here this image B equals zero and then just delete that event you can see it gets replaced with the grey event here that it's just inheriting from P entities oh she's got nothing in it but I'm gonna right click that and hit inherit event okay and so it does it have event inherited which means it will just call that event but then I can also write my own code in here for this specific MVC and then I'm just going to paste that back into place so this is you know having to do this now is why we should have just established a create event in here and then we could have just been doing event inherited as we create our child objects whereas you know it's one of the few problems with doing like a really a parent-child heavy structure is like if you do like change or add something under here you've got to be aware of the knock-on effect that's gonna have on things and some things that maybe not inheriting that code because you didn't have it at the time and so on so if you've made a lot of if you've gone you know off the the tutorial path and you've made a lot of other objects that have their own create event you'll have to go through them now if you want them to inherit the stuff from P entity and you probably do and do that okay just get rid of the event and just right-click and hit in inherit event on it okay or just or just go into whatever create event you haven't just type event inherited in there just to make sure you don't have done that as well do it either way don't eat that up there and so whenever you want to do that say if I wanted to do something a plan or a like safe want to do my own end step or whatever I can right click hit inherit event and it'll just do that for me okay so it's doing all the stuff from the original and step and in my own code on top obviously don't want our no plants up camera okay uh-huh so back MP entity in its create event I'm also I'm gonna delete in variable definitions this Z 0 from P entity and just gonna write it in here instead c equals 0 because that's never gonna change or well I don't know I suppose on some instances maybe but on any instance where we're gonna want to see to be different at the start we can do that in its own create its own create event rather than in variable definitions down here I don't think there's anything we're going to want to define on our object basis and certainly not on a per like room instance basis for for Z so any instant any variables like that it makes more sense to have in the create event than it does to have in variable definitions in repose equals 0 there and actually no I actually will have that comment at the top there I like desk comment and I'll just call it a central entity setup all right which is how it's described there putting essential will hopefully remind me in any other objects cuz we'll see it inheriting there too if I want to put my own curry event to inherit it to make sure because it's essential okay I'll remind me but is just name so we know what's going on and the other things we want to do in here is we're going to set flash to equal zero and start because you know that's a variable we can apply via those hit scripts but that we don't naturally define yet so I'm going to get that defined in there and then I'm gonna write you flash okay you capital F flash equals shader get uniform Sh white flash is the name of the shader and the uniform name in quotation marks as a string is flash um I just pick this up so um what this does is it gets a number that it puts into you flash that represents the internal ID of this variable that we established okay this uniform float in this specific shader and this is what's going to allow us to actually send a value from our regular GML code through to our shader okay and so back and entity set up you flash because that yeah that is actually all everything we needed in here I thought it was another line but no we don't need anything else in here so now that we have that I'm going to go to the draw event for our bought P entity just by right-clicking going to add open event and draw or you can reopen it go to draw however you want either way the draw event for P entity where we currently draw another shadow for the entity of aztlán and then we just manually draw the whole entity down here so that we can round the Hank and Y position what we're going to do above and below this is enable the flash shader if we want to draw it with a flash so if flash does not equal zero shader set Sh white flash now the reason I'm only setting that shader if flash is not zero because even if even if we did set it if flash was zero we wouldn't have a flash the reason being of course that if we're adding zero to all of our RGB it's just gonna it's gonna stay the same right so why are we bothering to check if flash is not zero well it turns out that shader set this function here is actually quite expensive alright you over use this function it will start to slow your game down so you generally only want to use it where necessary and anything you can do to kind of optimize that and reduce the number of time you're calling shade a set is generally a good idea I found again you're on a half-dozen I've said before I only worry about optimization when it starts slowing you down but it's a free thing to be able to you know do a check like this doesn't really take a lot of code or effort and just anything you can think of as you go on I'm like oh I don't need to be calling shaders that so many times here it's a good idea to do all right so now that we've set that shader we need to set that value in the shade of that flash value to be what we need it to be so I'm gonna write shader set uniform f f standing for float open bracket and then uniform ie D is you flash that value we go on a creative N and the value want to pass across is flash okay so that's the value we're going to put in the float and that's the ID of the float within that show yeah okay simple as that so now if flash is not zero we have that shader set and so when we draw this we'll draw it with that shader on and we'll do our flash effect and then after we've done that we don't want to draw everything in our game with that shader so we'll need to disable it now I could just write shader reset and that's fine but we can just do a quick check to see whether or not we actually need to call that function I don't know that shader reset is necessarily I don't think it's anywhere near as expensive a shader set is but it seems like a no-brainer to me to check to see whether or not we actually need to do this before bothering to call the function for no reason so I'm gonna write if own bracket shader and the scope current open bracket close bracket does not equal minus one shader current as a function will return the ID of the shader that's set so at the moment if flash was above zero it would be Sh white flash if it comes back with minus one it means we are we don't have any shader sir and we're just drawing things normally so if it's not minus one it means we've got a shader set so if that's true do shader reset put it for normal simple now I actually think that should work the only thing we've not done is make it so flash decays to zero over time but we should still be able to see if I hit things oh no we haven't actually assigned that script so that's a sign that scripts I've got a signpost in variable definitions in entity hit script hit edit and right entity hit solid ok no brackets or anything and as you remember from that function it's just saying flash to equal 0.5 so we should just see things get take on like a white glow now when I hit these signposts as they start being drawn with that shader pretty cool right and the NPC doesn't have us hit script so he doesn't do anything those no I'm doing here cool so the last thing we need to do is just make that flash value decay that's super easy got a P entity we already have an end step startup and our entity that everything else is inheriting and just at the bottom of it we'll do flash equals max so whichever is bigger flash - Northpoint not 4 or 0 so it will reduce by not point for not point not for every single frame until it hits zero run that and then when I hit these you can see they get a little flash goes quite well the sort of speed of the slash itself that's quite good just gives off a little little indicator to show it's a thing that has been hit by our attack which again I think just helps your game feel a little and helps us stand out as sort of a useable or interactive entity in some way like sure we can't destroy it but it's reacting to being hit so it is something right there is something in our game that's meaningful it isn't just background decoration a helpful thing in my opinion and also our thanks destroy it's grass that we wrote in oh yeah so they have it that's how we get some simple reactions going to things being hit with our attacks next week we're going to continue developing our entity system and we're going to put in entity collisions ok so we've had this entity collision flying for a really long time we're gonna make it so you can turn that on and you can actually walk in you can't walk through these signposts anymore right or this this this NPC okay so look forward to that and thanks for watching now on to the credits hello everybody I hope you're doing well I hope you are safe in these bizarro times that we're currently in I I am I'm doing very well and a lot of you have asked which is very nice of you I'm doing great and really I'm just seeing now as a time where I need to be doing the same thing I've always been doing I need to be putting out videos like these and creating stuff for you guys to to make use of while like a horror you know a lot of you are currently housebound and then you know a work like mine is particularly important in times like these so um thank you very very much to these people who are helping me to keep making this stuff for you an extra special shout-out as always in no particular order to the following bounce of the dog zenon a Robert church's Rove and Island Safia flame daca dawned ago max M Bertie T relentless Rex do want do be Jason James Higgens dark ride of zero three one eight James L Andersen hair high engine roopinder Reni Dan Scott Matthews leo Tyler Hubble maria celeste oliveira frailing cabbage pants Gilberto Susan Ross Figgy Marc Burgas John Harwood Zac Colette goose Khalid Franklin Troy naira Alec Schenkel Wilfried o land era Carter green Justin adiga Julian Paul and Kaiser ho thank you all ever so much for your support and thank you very much for watching catch you all next time
Info
Channel: Shaun Spalding
Views: 13,808
Rating: undefined out of 5
Keywords: Game Maker (Video Game Engine), Tutorial, GameMaker Tutorial, GameMaker, Game Development, Indie Games, Tutorial Series, Game Maker Studio, Making Games, How to make games, GameMaker Studio 2, GMS, GMS2
Id: 0agN_qOtF6I
Channel Id: undefined
Length: 41min 39sec (2499 seconds)
Published: Fri Apr 17 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.