- Online Community Forums » Programming Questions » Transformations Tutorial

This thread is locked; no one can reply to it. rss feed Print
Transformations Tutorial
Member #6,088
August 2005

Hello all,

I have been working on and off (mostly off due to time restraints) on a game for a long time. I've recently ported it to Allegro 5 from Allegro 4. I'm trying to take as full advantage of Allegro 5's features as I can. One thing I do not seem to understand as well however are transformations.

I've found the Coding Made Easy tutorial on youtube which shows how to use transformations to do camera scrolling. I've been able to implement it somewhat, but I guess my problem is I don't quite understand why it works. Well that, and I have trouble getting it to work while also transformations to scale the graphics to fit the windows. I'm thinking if I understood it better maybe I could get it to work the way I want.

Anyway, long story short, Ive looked around and do not see any tutorials that give a really in depth explanation of how transformations work. Is there one around that I may just be missing?

Thanks in advance

Member #11,410
October 2009

How it works is by multiplying transformation matricies together to obtain the final point

The way it works for scrolling is, imagine the world starts at 0,0,. I draw all my objects relative to 0,0 the world coordinates.

The transformations basically act like a camera and can allow you to look at say 200-800 of the world or something.

Member #358
May 2000

This also has a short explanation:

"Either help out or stop whining" - Evert

Member #6,088
August 2005

So the problem that I am having right now is getting my camera to work when scaling the screen. I originally designed my game with smaller graphics that were scaled up to fix the screen. I have attempted to do that here using transformations, and the scaling works, but the camera scrolls too slow,and the character moves off the screen. Here is some of the code I am using:

1void draw() 2{ 3 al_identity_transform(&camera); 4 5 al_translate_transform(&camera,-cameraPosition[0],-cameraPosition[1]); 6 al_scale_transform(&camera,scaleX,scaleY); 7 al_use_transform(&camera); 8 9 //MapDrawBG(0,0,0,0,al_get_bitmap_width(level),al_get_bitmap_height(level)); 10 //MapDrawFG(0,0,0,0,al_get_bitmap_width(level),al_get_bitmap_height(level),0); 11 //display_player_health(); 12 13 al_draw_bitmap(pinkx,0,0,0); 14 15 16 al_identity_transform(&camera); 17 al_scale_transform(&camera,scaleX,scaleY); 18 al_use_transform(&camera); 19 20 21 Player.draw_actor(level,player); 22 23 24 25 26 al_hold_bitmap_drawing(false); 27 28 al_set_target_bitmap(al_get_backbuffer(display)); 29 30 al_flip_display(); 31} 32void cameraUpdate(float *cameraPosition, float x, float y, int width, int height) 33{ 34 cameraPosition[0] = -((SCREEN_W / 2) / scaleX) + (x + width / 2); 35 cameraPosition[1] = -(SCREEN_H / 2) + (y + height / 2); 36 37 if (cameraPosition[0] < 0) 38 cameraPosition[0] = 0; 39 if (cameraPosition[1] < 0) 40 cameraPosition[1] = 0; 41}

Note that SCREEN_W is set to 800 and I'm not scrolling up and down. (I need to remove the y camera updating as its irrelevant. I'm using mappy but have the drawing function commented out as it doesn't seem to work with transforms either. (or I'm doing it wrong). Anyone have any suggestions? Let me know if you need more info.

Thomas Fjellstrom
Member #476
June 2000

Unless mappy also sets transforms, transforms should be totally invisible to it.

As for the scroll speed, you'll want to scale that too i think.

Thomas Fjellstrom - [website] - [email] - [Allegro Wiki] - [Allegro TODO]
"If you can't think of a better solution, don't try to make a better solution." -- weapon_S
"The less evidence we have for what we believe is certain, the more violently we defend beliefs against those who don't agree" --

Member #6,088
August 2005

How would I go about scaling or slowing down the scroll speed of the camera? I actually realized it doesn't work properly even when its not scaled. The player still moves faster when the camera is being scrolled then he does when the camera is stationary.

Go to: