|
@ -5,10 +5,18 @@ from scroller import char_sheet |
|
|
|
|
|
|
|
|
pygame.init() |
|
|
pygame.init() |
|
|
|
|
|
|
|
|
|
|
|
# For this example, I just wanted to work with a small 320x240 space. |
|
|
|
|
|
# Most of the old scrollers didn't have a lot of pixels to play with, after |
|
|
|
|
|
# all. |
|
|
size = width, height = 320, 240 |
|
|
size = width, height = 320, 240 |
|
|
|
|
|
|
|
|
black = 0, 0, 0 |
|
|
black = 0, 0, 0 |
|
|
red = 255, 0, 0 |
|
|
red = 255, 0, 0 |
|
|
|
|
|
|
|
|
|
|
|
# A character list to match up the available ASCII characters with the |
|
|
|
|
|
# spritesheet. You could probably use ints instead. I used chars because I |
|
|
|
|
|
# forgot Python treat chars like strings. x_X |
|
|
|
|
|
|
|
|
characters = [' ', '!', '\"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', |
|
|
characters = [' ', '!', '\"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', |
|
|
',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', |
|
|
',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', |
|
|
'9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', |
|
|
'9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', |
|
@ -18,56 +26,83 @@ characters = [' ', '!', '\"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', |
|
|
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', |
|
|
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', |
|
|
'z', '{', '|', '}', '~', '©'] |
|
|
'z', '{', '|', '}', '~', '©'] |
|
|
|
|
|
|
|
|
|
|
|
# A CharSheet object holds the spritesheet and the character list, as well as |
|
|
|
|
|
# the dimensions of each sprite. |
|
|
char_sheet = char_sheet.CharSheet("jeromBD-metal-CCBY3.png", |
|
|
char_sheet = char_sheet.CharSheet("jeromBD-metal-CCBY3.png", |
|
|
characters, 16, 16) |
|
|
characters, 16, 16) |
|
|
|
|
|
|
|
|
|
|
|
# Placeholder co-ordinates just to centre the scroller while I built this. |
|
|
x = 320 |
|
|
x = 320 |
|
|
y = 120 |
|
|
y = 120 |
|
|
|
|
|
|
|
|
|
|
|
# We need a clock to restrain the framerate and not simply have the scroller |
|
|
|
|
|
# zipping across before the view even realises the program has started. |
|
|
clock = pygame.time.Clock() |
|
|
clock = pygame.time.Clock() |
|
|
|
|
|
|
|
|
|
|
|
# Creates a new Scroller object, with the text we want to put into it. |
|
|
|
|
|
# Some space added to create a gap between repetitions. |
|
|
scroller = scroller.Scroller("IT'S BEEN... one week since you looked at me, " + |
|
|
scroller = scroller.Scroller("IT'S BEEN... one week since you looked at me, " + |
|
|
"cocked your head to the side and said \"I'm " + |
|
|
"cocked your head to the side and said \"I'm " + |
|
|
"angry\" ") |
|
|
"angry\" ") |
|
|
|
|
|
|
|
|
|
|
|
# Opens a pygame window to the previously-specified dimentions. |
|
|
screen = pygame.display.set_mode(size) |
|
|
screen = pygame.display.set_mode(size) |
|
|
|
|
|
|
|
|
while 1: |
|
|
while 1: |
|
|
|
|
|
|
|
|
|
|
|
# Obtain a time delta that will be used to determine the full extent of the |
|
|
|
|
|
# scroller's movement. |
|
|
dt = clock.tick(60) |
|
|
dt = clock.tick(60) |
|
|
|
|
|
|
|
|
|
|
|
# Blank the screen first. Don't want any trails (At least not in this case. |
|
|
screen.fill(black) |
|
|
screen.fill(black) |
|
|
|
|
|
|
|
|
|
|
|
# Because for loops can't count themselves. |
|
|
i = 0 |
|
|
i = 0 |
|
|
|
|
|
|
|
|
|
|
|
# If a character is not present on the scroller, create one. |
|
|
|
|
|
# Else an exception will happen. |
|
|
if not scroller.sheet_chars: |
|
|
if not scroller.sheet_chars: |
|
|
scroller.get_next_char(320, 120, 0.1, 2, 0, 20) |
|
|
scroller.get_next_char(320, 120, 0.1, 2, 0, 20) |
|
|
|
|
|
|
|
|
for sheet_char in scroller.sheet_chars: |
|
|
for sheet_char in scroller.sheet_chars: |
|
|
|
|
|
# Move each character to the left. |
|
|
sheet_char.x -= sheet_char.x_speed * dt |
|
|
sheet_char.x -= sheet_char.x_speed * dt |
|
|
|
|
|
|
|
|
|
|
|
# Move the character up and down according to a sine wave. |
|
|
sheet_char.angle += sheet_char.y_speed |
|
|
sheet_char.angle += sheet_char.y_speed |
|
|
|
|
|
|
|
|
sheet_char.y = ((sheet_char.radius * |
|
|
sheet_char.y = ((sheet_char.radius * |
|
|
math.sin(sheet_char.angle * math.pi / 180)) + |
|
|
math.sin(sheet_char.angle * math.pi / 180)) + |
|
|
120) |
|
|
120) |
|
|
|
|
|
|
|
|
|
|
|
# Delete the character from memory if has left the visible screen. |
|
|
|
|
|
# i needs to be decreased too, as it has effectively stepped back one. |
|
|
if (sheet_char.x < -(char_sheet.char_width)): |
|
|
if (sheet_char.x < -(char_sheet.char_width)): |
|
|
scroller.delete_first_char() |
|
|
scroller.delete_first_char() |
|
|
i -= 1 |
|
|
i -= 1 |
|
|
else: |
|
|
else: |
|
|
|
|
|
# If the newest character has fully entered the visible screen, |
|
|
|
|
|
# a new one can be introduced. |
|
|
if (i == (len(scroller.sheet_chars) - 1) and |
|
|
if (i == (len(scroller.sheet_chars) - 1) and |
|
|
sheet_char.x <= (width - char_sheet.char_width)): |
|
|
sheet_char.x <= (width - char_sheet.char_width)): |
|
|
scroller.get_next_char(320, 120, 0.1, 2, 0, 20) |
|
|
scroller.get_next_char(320, 120, 0.1, 2, 0, 20) |
|
|
|
|
|
|
|
|
|
|
|
# This was just some debug stuff to figure out an issue. |
|
|
print(str(len(scroller.sheet_chars) - 1) + " | " + str(i) + |
|
|
print(str(len(scroller.sheet_chars) - 1) + " | " + str(i) + |
|
|
" | " + str(scroller.next_char)) |
|
|
" | " + str(scroller.next_char)) |
|
|
|
|
|
|
|
|
|
|
|
# All done, onto the next character, if there is one. |
|
|
i += 1 |
|
|
i += 1 |
|
|
|
|
|
|
|
|
|
|
|
# Create a rect that will serve as a bounding box into which the |
|
|
|
|
|
# character sprite will be drawn. |
|
|
sect = char_sheet.get_sheet(sheet_char) |
|
|
sect = char_sheet.get_sheet(sheet_char) |
|
|
sprite = pygame.Rect((sect[0] * 16), |
|
|
sprite = pygame.Rect((sect[0] * 16), |
|
|
(sect[1] * 16), 16, 16) |
|
|
(sect[1] * 16), 16, 16) |
|
|
|
|
|
|
|
|
|
|
|
# Draw the character to the screen. |
|
|
screen.blit(char_sheet.sheet, (sheet_char.x, |
|
|
screen.blit(char_sheet.sheet, (sheet_char.x, |
|
|
sheet_char.y), sprite) |
|
|
sheet_char.y), sprite) |
|
|
|
|
|
|
|
|
|
|
|
# Bring the finished frame to the foreground. |
|
|
pygame.display.flip() |
|
|
pygame.display.flip() |
|
|