Help with functions (Tutorial 6)

The Partridge Family were neither partridges nor a family. Discuss.
Post Reply
User avatar
Radical
Posts: 38
Joined: January 15th, 2017, 9:16 pm
Location: Ontario

Help with functions (Tutorial 6)

Post by Radical » August 11th, 2017, 8:38 pm

I have been trying to get some functions working in one of my games, but I just can't. The function works fine for the actual PutPixel commands, but the part with the logic ceases to function.

I have recreated this issue in a minimalist game attached in the zip file.

I realize that if I replace "x" and "y" in the logic with "x1" and "y1", it would successfully move one of the boxes. But I want it to move both of the boxes, and do so without having to create a specific new function for each new box I create.
Attachments
RPG.7z
(52.11 KiB) Downloaded 139 times

albinopapa
Posts: 4373
Joined: February 28th, 2013, 3:23 am
Location: Oklahoma, United States

Re: Help with functions (Tutorial 6)

Post by albinopapa » August 11th, 2017, 9:42 pm

You were close.
Attachments
Edited-RPG.7z
(52.13 KiB) Downloaded 135 times
If you think paging some data from disk into RAM is slow, try paging it into a simian cerebrum over a pair of optical nerves. - gameprogrammingpatterns.com

User avatar
Radical
Posts: 38
Joined: January 15th, 2017, 9:16 pm
Location: Ontario

Re: Help with functions (Tutorial 6)

Post by Radical » August 12th, 2017, 4:54 am

Ah, thank you very much. I don't really understand why your change works the way it does, or wtf the & operator is doing, but now I have a starting direction for my research at least.

(Also, I enjoyed your slight edit to my comments lol)

albinopapa
Posts: 4373
Joined: February 28th, 2013, 3:23 am
Location: Oklahoma, United States

Re: Help with functions (Tutorial 6)

Post by albinopapa » August 12th, 2017, 5:18 am

Yeah, after I posted I realized that you probably haven't made it to references yet, sorry.

The parameters you pass to a function by value ( int x, int y ) makes a copy of the variables you pass in, so in function, x = x+1 has no affect on the x1, y1 you pass in. References allow you to pass in the variable as if you are using those variables, but with a different name. You can consider references to be an alas for the original and not a copy of the original. Chili will cover references in a few episodes from lesson 6 so you'll get it later.

I forgot about the comments, hehe. I like keeping all lines between 80 and 100 characters so it all fits in my window. I'm visually impaired so I have the font kind of big, around 16 pt. This way I only have to scroll vertically and not horizontally as well.
If you think paging some data from disk into RAM is slow, try paging it into a simian cerebrum over a pair of optical nerves. - gameprogrammingpatterns.com

User avatar
Radical
Posts: 38
Joined: January 15th, 2017, 9:16 pm
Location: Ontario

Re: Help with functions (Tutorial 6)

Post by Radical » August 13th, 2017, 1:55 am

Sorry to bother you again papa. I tried to do a bit of research on pointers/references, but I still don't understand why my original code doesn't work.

If you needed to use a pointer to assign the value of the variable "x1" to "x", I would fully understand that. But my issue is that even without a pointer/reference, the PutPixel calls work perfectly fine; the value of x1 is transferred to x, and their position is properly displayed on the screen.

I even put my "x = x + 1" logic inside of the same function as the PutPixel one. So the x already has the value of x1. Why would x lose the value of x1 as soon as it get's to my specific line of code involving "x = x + 1"?

albinopapa
Posts: 4373
Joined: February 28th, 2013, 3:23 am
Location: Oklahoma, United States

Re: Help with functions (Tutorial 6)

Post by albinopapa » August 13th, 2017, 5:21 am

Refer back to passing by value I mentioned in previous post.

Code: Select all

void Game::Dude(int x, int y, int r, int g, int b)
{
	// You draw the object at the old X and Y
	gfx.PutPixel(x, y, r, g, b);
	gfx.PutPixel(x + 1, y, r, g, b);
	gfx.PutPixel(x + 1, y + 1, r, g, b);
	gfx.PutPixel(x, y + 1, r, g, b);
	gfx.PutPixel(x, y + 2, r, g, b);
	gfx.PutPixel(x + 2, y, r, g, b);
	gfx.PutPixel(x + 2, y + 1, r, g, b);
	gfx.PutPixel(x + 1, y + 2, r, g, b);
	gfx.PutPixel(x + 2, y + 2, r, g, b);

	// You update X and Y
	if (wnd.kbd.KeyIsPressed(VK_RIGHT))
	{
		x = x + 5;
	}
	if (wnd.kbd.KeyIsPressed(VK_LEFT))
	{
		x = x - 5;
	}
	if (wnd.kbd.KeyIsPressed(VK_UP))
	{
		y = y - 5;
	}
	if (wnd.kbd.KeyIsPressed(VK_DOWN))
	{
		y = y + 5;
	}

	// When function ends, this x and y are are destroyed and the Game::x1 is not changed,
	// because x and y are copies of x1 and y1.
}

void Game::ComposeFrame()
{
//	Movement1(bx, by);
	//You copy x1 and y1 to the x and y function parameters.
	Dude(x1, y1, r1, g1, b1);
	Dude(x2, y2, r1, g1, b1);
}
The reference or pointer points to the object you want to work with. So it's like Robert going by Rob, it's still Robert, but now you call him Rob.
If you think paging some data from disk into RAM is slow, try paging it into a simian cerebrum over a pair of optical nerves. - gameprogrammingpatterns.com

Post Reply