Jump to content


Photo
* * * * * 10 votes

The Complete Beginners Guide To Gml Coding


  • Please log in to reply
88 replies to this topic

#31 Nami

Nami

    GMC Member

  • New Member
  • 1 posts

Posted 22 March 2009 - 01:16 AM

Thanks for this. Very helpful.
  • 0

#32 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 22 March 2009 - 08:47 PM

Thanks for all the comments guys. I hope this guide can make it's way into the hands of a proper beginner at some point, I want to see how easily they take to it.
  • 0

#33 Desert Dog

Desert Dog

    GMC Member

  • GMC Member
  • 6409 posts
  • Version:Unknown

Posted 26 March 2009 - 03:43 AM

Thanks for all the comments guys. I hope this guide can make it's way into the hands of a proper beginner at some point, I want to see how easily they take to it.


Well, I'll be linking beginners to this for sure!
  • 0

#34 asfastasdark

asfastasdark

    GMC Member

  • New Member
  • 55 posts

Posted 26 March 2009 - 04:02 AM

I remember using arguments instead of variables when I didn't use them for scripts because I didn't know how global and local variables worked :)...

Could you explain this to me though: What does the return statement do? Say I put "return x" in a piece of code and x was equal to 5. What would that do?
  • 0

#35 joethedumblr

joethedumblr

    GMC Member

  • New Member
  • 253 posts

Posted 26 March 2009 - 09:01 AM

add a bit about paths and a few examples and it would be almost perfect
  • 0

#36 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 26 March 2009 - 01:14 PM

Could you explain this to me though: What does the return statement do? Say I put "return x" in a piece of code and x was equal to 5. What would that do?

The return statement is covered in the guide under the scripts section:

Instead of values you put into a script this is a actually a value that the script gives out to the instance calling it. For example if you set up a script called multiply:

//multiply() multiplies numbers
var sum;
sum = 4*5;
return sum;

note: I have declared the sum variable using var, this practice should always be made with variables used only in the script.

This will calculate the sum as 20 and then it will return the value, so basically this script is going to return 20. Now if you call this from an object using a variable assignment like so:

value = multiply();

It is going to first execute the script which is going to return 20, this return value will then be assigned to the variable value. So now the variable value will be equal to 20.

For the example of returning x. Say you have a script called get_x and you you used this code:

scr get_x:
x = 5;
return 5;

Then when you call this script it will return (give) you a value of 5 from it. Ie if you use this code:

x_value = get_x();
The variable x_value will now be set to 5 as the script get_x will be returning the value 5. Generally though you only want to be using return values when you have actually calculated something not just a variable you have set yourself.

If you understood this explanation but not the explanation in the guide can please explain what part of the guide was not explained well enough for you to understand it in the first place as I am always looking to improve it. Or if you still don't understand please say also and I will try to explain further be specific about what part you still don't understand though.

add a bit about paths and a few examples and it would be almost perfect

Paths are not really covered in 'gml basics' this is more about teaching the basic framework of coding not specific functionality of GM. There was plans to add a topic on paths to the general FAQ however it has not been done yet, I would probably want Icuurd's involvement in doing so however he is still working on other projects at the moment.

Edited by flexaplex, 26 March 2009 - 01:15 PM.

  • 0

#37 asfastasdark

asfastasdark

    GMC Member

  • New Member
  • 55 posts

Posted 26 March 2009 - 09:22 PM

Could you explain this to me though: What does the return statement do? Say I put "return x" in a piece of code and x was equal to 5. What would that do?

The return statement is covered in the guide under the scripts section:

Instead of values you put into a script this is a actually a value that the script gives out to the instance calling it. For example if you set up a script called multiply:

//multiply() multiplies numbers
var sum;
sum = 4*5;
return sum;

note: I have declared the sum variable using var, this practice should always be made with variables used only in the script.

This will calculate the sum as 20 and then it will return the value, so basically this script is going to return 20. Now if you call this from an object using a variable assignment like so:

value = multiply();

It is going to first execute the script which is going to return 20, this return value will then be assigned to the variable value. So now the variable value will be equal to 20.

For the example of returning x. Say you have a script called get_x and you you used this code:

scr get_x:
x = 5;
return 5;

Then when you call this script it will return (give) you a value of 5 from it. Ie if you use this code:

x_value = get_x();
The variable x_value will now be set to 5 as the script get_x will be returning the value 5. Generally though you only want to be using return values when you have actually calculated something not just a variable you have set yourself.

If you understood this explanation but not the explanation in the guide can please explain what part of the guide was not explained well enough for you to understand it in the first place as I am always looking to improve it. Or if you still don't understand please say also and I will try to explain further be specific about what part you still don't understand though.


Ah, thanks so much. I was already thinking that something like that is what was meant, but I wasn't sure. Thanks :(.
  • 0

#38 crusaderdesignproject

crusaderdesignproject

    GMC Member

  • GMC Member
  • 270 posts
  • Version:GM8.1

Posted 27 March 2009 - 02:55 AM

This is amazing! Thank you!!!! I suck at GML so it helps.
  • 0

#39 Mega_Virus

Mega_Virus

    GMC Member

  • New Member
  • 221 posts

Posted 27 March 2009 - 11:14 AM

I appreciate the effort flexaplex put in to this, there's not many tutorials the come close to teaching GML aswell as this topic.
I have learned a bit more about 2D arrays now, just quite alot to grasp at once especially the array eplanation gave me a little head ache but I am starting to get the idea of 2D arrays only because I practiced with the example provided otherwise I would be stuck still, although it is still a little blury to me on ways to use them besides just drawing the values in them. I think mostly what got me confused with the explanation is that he added dis_list, I thought that shouldn't have been mention together with 2d arrays.
  • 0

#40 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 28 March 2009 - 10:36 AM

I appreciate the effort flexaplex put in to this, there's not many tutorials the come close to teaching GML aswell as this topic.
I have learned a bit more about 2D arrays now, just quite alot to grasp at once especially the array eplanation gave me a little head ache but I am starting to get the idea of 2D arrays only because I practiced with the example provided otherwise I would be stuck still, although it is still a little blury to me on ways to use them besides just drawing the values in them. I think mostly what got me confused with the explanation is that he added dis_list, I thought that shouldn't have been mention together with 2d arrays.

I mentioned a few times when explaining 2D arrays that you may find them complicated and code may prove difficult to understand. I cannot really think of an easier way to explain them, they are likely to be a difficulty concept to fully understand for a beginner, especially when for loops are also involved. I think really they are one of those things that is best learnt more by messing around with code yourself.

As for the ds_list's I had a choice, either make ds_list's follow on by putting them after 1D arrays or make 2D arrays follow on by adding them after 1D arrays. As said several times in the guide ds_list's are just an expansion of a 1D array which is why I wanted them explained straight after, so I had to sacrifice 2D arrays not following so ds_lists could. A ds_list is more similar to a 1D array than a 2D array is similar to a 1D in my opinion.

Edited by flexaplex, 28 March 2009 - 10:37 AM.

  • 0

#41 Mega_Virus

Mega_Virus

    GMC Member

  • New Member
  • 221 posts

Posted 28 March 2009 - 10:49 AM

This is what keeps me wondering what purpose does this bring:

array[0,0]= value;
array[0,1]= value;
array[0,2]= value;
How does the top arrays relate to the bottom arrays? If you would notice 0's are on top and 1's are on the bottom how do they work with
each other besides using for loop?
array[1,0]= value;
array[1,1]= value;
array[1,2]= value;
  • 0

#42 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 28 March 2009 - 11:12 AM

Ah of course I haven't really shown a practical use of 2D arrays in the guide have I.

I think the best way to show a practical use of them is with a weapon system.. I remember now I was original planning on putting it in the guide however I given code for weapon systems several times throughout the guide and also it seemed a bit too much giving 2 examples for using 2D arrays. I am thinking now though that it is necessary really to mention a practical use also.. I will update the guide with a section on it when I get time.
  • 0

#43 Mega_Virus

Mega_Virus

    GMC Member

  • New Member
  • 221 posts

Posted 28 March 2009 - 11:20 AM

Ah of course I haven't really shown a practical use of 2D arrays in the guide have I.

I think the best way to show a practical use of them is with a weapon system.. I remember now I was original planning on putting it in the guide however I given code for weapon systems several times throughout the guide and also it seemed a bit too much giving 2 examples for using 2D arrays. I am thinking now though that it is necessary really to mention a practical use also.. I will update the guide with a section on it when I get time.

Okay that would be cool :whistle:
ooh I think this should be my last question for now:
Am I ought to use ds_list aswell as arrays? or use one over the other? seems like your using ds_list alought and thats completely new to me
Im not sure if its something I oughta to know right away, or if I should learn it early to my own benefit, and I haven't read the whole tutorial completely simply because its too much to know right away cause I'll start to forget if I don't practice with the first things so my question is should ds_list should be my first?
Can you give me a list of the priorities to the least prior of knowing about GML scripting for beginners? I would greatly appreciate it.

Edited by Mega_Virus, 28 March 2009 - 11:28 AM.

  • 0

#44 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 28 March 2009 - 12:26 PM

Okay that would be cool :whistle:
ooh I think this should be my last question for now:
Am I ought to use ds_list aswell as arrays? or use one over the other? seems like your using ds_list alought and thats completely new to me
Im not sure if its something I oughta to know right away, or if I should learn it early to my own benefit, and I haven't read the whole tutorial completely simply because its too much to know right away cause I'll start to forget if I don't practice with the first things so my question is should ds_list should be my first?
Can you give me a list of the priorities to the least prior of knowing about GML scripting for beginners? I would greatly appreciate it.

The guide covers when you should be using ds_lists (it mainly depends on whether you want to be doing things like sorting the list or not), but as a basic programming technique I suppose ds_lists aren't actually needed to be known as well as arrays and arrays will be easier for you to deal with so I advise dealing with them first.

Actually coming to think about it I am now wondering if ds_list's should actually be included in this guide or not. I included them because they really go hand in hand with arrays, they are used a lot in other people's code so they are useful to know and they are often functions overlooked be beginners. However upon reflection I can now see they don't actually really 'fit in' to the guide in the same way as a basic programming technique and removing them would also then make the array section flow a lot better (as you mentioned it could then go straight into 2D arrays from 1D arrays). They are the only part of the guide that require the pro version and do not work on GM5 which makes them stick out a bit also. I think it is likely I am going to remove the section on them from the guide completely, they will still be covered in the individual 'what are arrays/ds_lists' topic from the FAQ though if I do so and you wish to read up on them.

As for the priority, it is hard to determine which is more important it depends really what you want to be doing. I advise just learning them in order that I have set them out in the guide. I have ordered the guide intentionally that way as concepts covered first are used in explaining later concepts. For example for statements are explained before arrays as the array section shows examples using for statements. In the end though all the concepts covered in this guide should definitely be learnt as they are all of massive importance in programming. I suppose the order in the guide is more or less the natural order of priority anyway.

Edited by flexaplex, 28 March 2009 - 12:36 PM.

  • 0

#45 Mega_Virus

Mega_Virus

    GMC Member

  • New Member
  • 221 posts

Posted 28 March 2009 - 11:45 PM


yeah but lets say your working on your project and you made a piece of code then later you realize that its junk what you made due to how big the code is when you could've used a different concept to shorten the code.
Thats what I hate I don't want to work on my project and just about when I'm finished look down on my project because it could've been done better if I knew more from the beginning, but I suppose you cant help me with this.
  • 0

#46 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 29 March 2009 - 11:56 AM

but I suppose you cant help me with this.

Not really no. The key is to just watch out for when your code is getting long, slow or you start repeating similar things over (because then loops can often be implemented instead). Rewriting code is something most (good) programmers do though anyway, you often can't anticipate the direction the program is going to go in from the beginning and rewriting code is actually a vital part of programming and a good way to learn also. Remember the forum is always here to help if you wish to post code here and ask if it could be done in a more efficient way.

I have updated the topic now removing ds_lists and showing a quick 2D array example using an inventory set-up, I will probably update the inventory 2D example again at some point I only threw it together quickly.

Edited by flexaplex, 29 March 2009 - 11:29 PM.

  • 0

#47 Mega_Virus

Mega_Virus

    GMC Member

  • New Member
  • 221 posts

Posted 30 March 2009 - 04:43 AM

Okay thanks I see more on how 2d arrays are useful. :D

Can you explain how this works? I couldn't understand it on your tutorial:

inv_num = 0;
inv_item[inv_num] = "item 1"; inv_num += 1;
inv_item[inv_num] = "item 2"; inv_num += 1;

Edited by Mega_Virus, 30 March 2009 - 07:21 AM.

  • 0

#48 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 30 March 2009 - 06:04 PM

Can you explain how this works? I couldn't understand it on your tutorial:

inv_num = 0;
inv_item[inv_num] = "item 1"; inv_num += 1;
inv_item[inv_num] = "item 2"; inv_num += 1;

All you are doing is using a variable to cycle through the array index. inv_num starts at 0 so the first array you will be setting is inv_item[0] then inv_num increases by 1 so you will be setting inv_item[1] then inv_num keeps increasing by 1 every time before you set the next array. The advantages of setting up an array like this are mentioned in the guide.
  • 0

#49 Desert Dog

Desert Dog

    GMC Member

  • GMC Member
  • 6409 posts
  • Version:Unknown

Posted 12 May 2009 - 08:25 PM

Let's put this topic up the top, shall we? That way some beginners can find it. :blink:

*A well-deserved bump*
  • 0

#50 RpGJuNki3

RpGJuNki3

    A Fallen Artist

  • GMC Member
  • 902 posts
  • Version:GM8

Posted 27 May 2009 - 07:45 AM

TOoo much!!....so confused....xD


go back to music...and art :lol:

-JuNki3 :rolleyes:
  • 0

#51 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 29 May 2009 - 07:34 PM

TOoo much!!....so confused....xD


go back to music...and art :P

-JuNki3 ^_^

I bet you have taken in some of it. Try a bit of programming and see how you get on, if you get stuck then refer back to the guide.

Programming isn't for everyone though.
  • 0

#52 nickydude

nickydude

    MadLad Designs

  • GMC Member
  • 599 posts

Posted 27 July 2009 - 12:13 AM

I'm just getting back into GameMaker after a long spell away and I've forgotten most of it! Your tutorial is just what I needed to get me back into the swing of things. Excellent!
  • 0

#53 Alexitrón

Alexitrón

    GMC Member

  • New Member
  • 114 posts

Posted 01 August 2009 - 01:31 AM

I have just decided recently to make the transition to GML after 3 or so years of D&D only . The documentation that comes with GM had me frustrated , this tutorials are the best . This combined with the ' Drag and Drop icons and their GML equivalents ' should be more than enough to get a D&D user out of there and into coding in no time . really well made , I appreciate it a lot . THANK YOU ! :lol:

BTW :Is this topic sticky ? If not , why not ? It really should be .
  • 0

#54 TSB

TSB

    GMC Member

  • New Member
  • 16 posts

Posted 08 December 2009 - 04:52 AM

You guys should all get together and make a book!
  • 0

#55 Kapser

Kapser

    GMC Member

  • GMC Member
  • 1640 posts

Posted 09 December 2009 - 08:28 PM

I've been using GM for years, and I still don't know all the basics because I actually learned a couple stuff. Thanks a lot, very well written tutorial.
  • 0

#56 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 10 December 2009 - 08:44 AM

For anyone who's interested Destron has made a pdf version of this guide which he has hosted at his website:
http://gm.destronmed...e_id=104&did=39

Some may prefer to read this instead of the guide posted here as it has been edited it a little and some helpful snippets for the very beginners have been added. You may also find the layout more appealing, especially since this is a long guide and more colour/images has been placed throughout making it easier on the eye.

Edited by flexaplex, 10 December 2009 - 09:15 AM.

  • 0

#57 TerraFriedSheep

TerraFriedSheep

    GMC Member

  • GMC Member
  • 3138 posts
  • Version:GM:Studio

Posted 29 December 2009 - 11:32 PM

Great tutorial here, I've never seen it before but it's really nicely written :whistle:
  • 0

#58 Pesmerga

Pesmerga

    GMC Member

  • New Member
  • 152 posts

Posted 05 January 2010 - 11:55 AM

Very nice tutorial. I learned a lot reading this.

I only got a little problem with it.

You can now also draw the board using a double for loop like so:

CODE
var i,j;
for (i = 0; i < 3; i += 1)
{
for (j = 0; j < 3; j += 1)
{
draw_text(10+j*10,10+i*10,square[i,j]);
}
}

This may prove difficult for you to understand, if it does I advise messing around with the code a bit and seeing what happens hopefully by doing this you should what the code is doing.

Here you could have at least explained the code instead of asking us to mess around with it (it is a tutorial after all). The fact that it's not commented and that you do not even try to explain the coding leaved me pretty much clueless. I'm just saying. I understood the concept of double looping but this line confused me more than anything: draw_text(10+j*10,10+i*10,square[i,j]); What I'm saying is that you could have explained why you added and multiplied by 10 and what that number represents (ok, I know it's the x,y position of the text, still. I didn't get what you where trying to achieve)

But everything else was very clearly explained. Thanks. :whistle:


edit: oh yeah, why are you not pinning this? ok nvm. I see there is a topic pinned linking to this one.

Edited by Pesmerga, 05 January 2010 - 12:18 PM.

  • 0

#59 flexaplex

flexaplex

    GMC Member

  • Global Moderators
  • 4814 posts
  • Version:GM8

Posted 05 January 2010 - 12:46 PM

Very nice tutorial. I learned a lot reading this.

I only got a little problem with it.

You can now also draw the board using a double for loop like so:

CODE
var i,j;
for (i = 0; i < 3; i += 1)
{
for (j = 0; j < 3; j += 1)
{
draw_text(10+j*10,10+i*10,square[i,j]);
}
}

This may prove difficult for you to understand, if it does I advise messing around with the code a bit and seeing what happens hopefully by doing this you should what the code is doing.

Here you could have at least explained the code instead of asking us to mess around with it (it is a tutorial after all). The fact that it's not commented and that you do not even try to explain the coding leaved me pretty much clueless. I'm just saying. I understood the concept of double looping but this line confused me more than anything: draw_text(10+j*10,10+i*10,square[i,j]); What I'm saying is that you could have explained why you added and multiplied by 10 and what that number represents (ok, I know it's the x,y position of the text, still. I didn't get what you where trying to achieve)

But everything else was very clearly explained. Thanks. :whistle:


edit: oh yeah, why are you not pinning this? ok nvm. I see there is a topic pinned linking to this one.

I may revise that part of the guide, I agree looking at it that it is not the best. The number 10 is just arbitrary (you could use anything), it is simply for the positioning of the text. You only really need to multiply by the 10 to get the desired placement, the addition of the 10 is just an offset (to move the text away from the edge, since if you don't add anything to it the first text drawn will be at 0,0 which will leave some of the text out of view).
  • 0

#60 ParodyKnaveBob

ParodyKnaveBob

    theUndiscovered

  • GMC Member
  • 1391 posts
  • Version:GM:Studio

Posted 23 January 2010 - 01:18 AM

flexaplex, first let me say, excellent job. Others have given enough reason why, thus I won't explain. Just good stuff.

Five things I noticed (outside of trivial typos and whatnot) that you might want to fix, however:

First, Variables
num = 1;
item = potion;
draw_text(x,y,item+string(num));
I wasn't sure what you were doing until I read your paragraph on it. Did you mean to write
num = 1;
item = "potion";
draw_text(x,y,item+string(num));
? Because otherwise, I don't see the variable potion containing the string "potion"... $:^ ]

Second, If/else statements
Since you cover switch statements here, it might be good to rename this section, If/Else Statements, Switch Statements. Up to you of course. (When trying to find switch in your tutorial again, my initial instinct to glance at headlines didn't work.) But the thing that really got me when I read through was this:

switch (x)
{
  case < 40: {}
  case > 40: {}
}
As things like this do not work you will need to use a normal if statement instead.

When actually, you can make it work. I suggest either saying you can do things like this once you get more advanced (and leaving out the explanation), or perhaps bring back this example after explaining expressions. How it can work:
switch (n < 40) {
  case true:
	// what to do when n < 40
	break;
  case false:
	// what to do when n >= 40
}
Chances are, you want to test n<40 vs. n>=40, or n<=40 vs. n>40, but if you really truly are avoiding n==40, then the regular if..else statements
if (n != 40) {
  if (n < 40) {
	// what to do when n < 40
  } else {
	// what to do when n > 40
  }
}
can be switched like so:
if (n != 40) {
  switch (n < 40) {
	case true:
	  // what to do when n < 40
	  break;
	case false:
	  // what to do when n > 40
  }
}
or
switch (n < 40) {
  case true:
	// what to do when n < 40
	break;
  case false:
	if (n > 40) {
	  // what to do when n > 40
	}
}
or even
switch (n < 40) {
  case true:
	// what to do when n < 40
	break;
  case false:
	switch (n > 40) {
	  case true:
		// what to do when n > 40
	}
}
...and of course you can substitute 1 and 0 for true and false, respectively.

EDIT: I realized after I got home (no Internet) that I forgot the easiest way to switch between the two, which actually works better than nested if's (since it also avoids nested switch's):
switch (true) {
  case (n < 40):
	// what to do when n < 40
	break;
  case (n > 40):
	// what to do when n > 40
}
I'll just leave the previous (less efficient) examples so that anyone can compare/contrast the different methods and learn from them.

Third, If/else statements

It is technically bad notation to drop the > 0 comparison and exploit how GM handles non Boolean expressions to make the code shorter,

Really? I've never heard of this before, that if(!x){} is bad notation. I even tried Googling for awhile and couldn't find anything on it. Could you show a source that says this is bad notation? I'd hardly say things like that "exploit how GM handles Boolean expressions" because every English-based programming language I've ever seen uses Booleans like that. I'm just curious to see where you learned this, thanks. $:^ ]

Fourth, Registered Functions

Registered: Nothing requires pro/registered version

Perhaps you've forgotten that all the data structure (ds) functions are Registered/Pro only. Fortunately, you have written very well on the topic of arrays, in my opinion. And, fortunately, if you removed 1D ds code, you could move straight from 1D Arrays to 2D Arrays. (You could, however, mention that the Pro version allows use of "data structures" which in many cases work a lot more efficiently than arrays.) And, like you said, ds's are much like paths in that they're not basic, general coding skills.

Fifth, 2D Arrays
I agree with the others, the double-for-loop
var i,j;
for (i = 0; i < 3; i += 1)
{
  for (j = 0; j < 3; j += 1)
  {
	draw_text(10+j*10,10+i*10,square[i,j]);
  }
}
made perfect sense to me, but a beginner might stare and drool for a little bit. $:^ b The main suggestion I'd make is showing all nine values as you go, and why. (A slopped-together explanation example: i = 0, and i < 3, thus we start the first iteration of the first for (i) loop ... j = 0, and j < 3, thus we start the first iteration of the *second* for (j) loop ... it draws text (with an explanation), then finishes this iteration and comes back to the for (j) loop that's already running ... add 1 to j which now = 1, which is < 3, thus draw_text() again, (repeat explanation until..).. add 1 to j which now = 3, and j is *not* less than 3 now, thus this entire for (j) loop has ended ... and we hit the end of the *first* iteration of the *first* for (i) loop ... add 1 to i, i now = 1, which is < 3, now do the *second* iteration of the first for (i) loop ... this time, it goes through the second for (j) loop adding 1 to j with each iteration, and i=1 the whole time ... when the second for (j) loop is finished, we come to the end of the second iteration of the first for (i) loop ... i+=1 thus i=2 (thus i<3) and we go through the second for (j) loop with i=2 this time ... when the for (j) loop ends this time, i+=1 thus i=3 thus i is *not* less than 3, and the first for (i) loop finally ends.) It might be nice to create an example on how to use nested for loops while you're still explaining for loops -- and then bring the nested for loop back for the 2D array. For one thing, repetition is a good way to learn, and therefore reading about the nested for loop once, and then getting it reinforced soon after, should go well.

Allllllrighty, like I said, you've written an excellent tutorial in my opinion. Thanks for all the work you put into it.

Edited by ParodyKnaveBob, 24 January 2010 - 12:53 AM.

  • 0




0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users