Update 2/25/16 - This thread is quite old, but I appreciate how much traction its consistently getting. I improved the formatting. If you're willing to spend $0.99, check out this Smooth Dialogue Engine I released on the YoYoGames' Marketplace.
A game with dialogue can be drastically improved with a "typewriter" effect, in my opinion at least. Not only is it aesthetically pleasing, but can ease the burden of a lot of text on-screen. Though this example is written for Game Maker, it can be adapted to other languages with ease. Absolutely no credit is necessary, as this took only two minutes to write.
Create Event:
//write your messages in an array, starting at 0, like so
message[0] = "Hello there! Welcome to the world of Pokemon!";
message[1] = "My name is Oak! People call me the Pokemon Prof!";
message[2] = "This world is inhabited by creatures called Pokemon!";
message[3] = "For some people, Pokemon are pets.";
message[4] = "Others use them for fights.";
message[5] = "Myself...";
message[6] = "I study Pokemon as a profession.";
message_current = 0; //0 is the first number in our array, and the message we are currently at
message_end = 6; //6 is the last number in our array
message_draw = ""; //this is what we 'write' out. It's blank right now
increase = 0.5; //the speed at which new characters are added
characters = 0; //how many characters have already been drawn
hold = 0; //if we hold 'Z', the text will render faster
message_length = string_length(message[message_current]); //get the number of characters in the first message
Step Event:
if (characters < message_length) { //if current character count is less than the amount in current message*
hold = keyboard_check(ord("Z")); //hold is true or false if we hold 'Z' or not
characters += increase * (1 + hold); //increase speed based on hold
message_draw = string_copy(message[message_current], 0, characters); //copy string to current character
}
else { //if current character is more than the amount in the current message
if (keyboard_check_pressed(ord("Z"))) { //if we press Z...
if (message_current < message_end) { //if there are more messages left to show (0 -> 6, in our case)
message_current += 1; //increase the message by 1
message_length = string_length(message[message_current]); //get the new character length for message
characters = 0; //set the characters back to 0
message_draw = ""; //clear the drawn text
}
else { //if our messages are done (we reach 6, in our case)...
instance_destroy(); //destroy the object
}
}
}
Draw Event:
draw_text(x, y, message_draw); //draw the text at the coordinates