root/Alpha/graphics.py @ 141

Revision 141, 5.1 KB (checked in by mmurphy, 2 years ago)

Added fonts & a new "completed puzzle" display

Line 
1"""
2    graphics.py contains the Graphics class. It is responsible for drawing
3    elements at the lowest level.
4"""
5
6import pygame
7from os import path
8from menu import MenuHandler
9from constants import BBUILDER
10import globalVars
11
12class Graphics:
13    """Graphics is a class that draws individual elements. There is a single
14        global Graphics class."""
15    def __init__(self):
16        """initializes Graphics"""
17        self.imageDict = {}
18        pygame.mixer.pre_init(frequency=44100, size=-16,
19                              channels=2, buffer=1024)
20        pygame.init()
21
22    def drawObject(self, obj, text=None, drawpos="left"):
23        """draws either a Button or a Toggle."""
24        if obj.active:
25            image = obj.image[BBUILDER.ACTIVE]
26        else:
27            image = obj.image[BBUILDER.NEUTRAL]
28       
29        if drawpos == "right":
30            x = obj.imageRect.right
31            y = obj.imageRect.top
32        elif drawpos == "center":
33            x = obj.imageRect.centerx
34            y = obj.imageRect.centery
35        else:
36            x = obj.x
37            y = obj.y
38       
39        self.drawImage(image, (x, y))
40        if text:
41            textRect = text.get_rect()
42            globalVars.screen.blit(text, pygame.Rect(
43                x+(obj.size[0]-textRect[2])/2,
44                y+(obj.size[1]-textRect[3])/2,
45                textRect[2], textRect[3]))
46       
47    def drawText(self, text, x, y, textSize, color, drawpos="left"):
48        """parses a string for certain indicators and draws it"""
49        if text != "":
50            textLines = [] #Will contain different lines
51            line = ""
52            while text != "":
53                if text[0] == "\n":
54                    text = text[1:]
55                    textLines.append(line)
56                    line = ""
57                else:
58                    line += text[0]
59                    text = text[1:]
60
61            textLines.append(line)
62            prevLineHeight = 0 #Vertical shift for sequential lines
63            for line in textLines:
64                lineChunks = [] #Will contain "chunks" of individual lines
65                lineChunk = ""
66                textColor = color
67                currentFont = pygame.font.Font(None, textSize)
68                while line != "":
69                    if line[0:5] == "[[r]]":
70                        lineChunks.append(currentFont.render(lineChunk, 1, textColor))
71                        lineChunk = ""
72                        textColor = pygame.Color("red")
73                        line = line[5:]
74                    elif line[0:5] == "[[\r]]":
75                        lineChunks.append(currentFont.render(lineChunk, 1, textColor))
76                        lineChunk = ""
77                        textColor = color
78                        line = line[5:]
79                    elif line[0:5] == "[[f]]":
80                        lineChunks.append(currentFont.render(lineChunk, 1, textColor))
81                        lineChunk = ""
82                        currentFont = pygame.font.Font("fonts\\visitor1.ttf", textSize-25)
83                        line = line[5:]
84                    elif line[0:5] == "[[\f]]":
85                        lineChunks.append(currentFont.render(lineChunk, 1, textColor))
86                        lineChunk = ""
87                        currentFont = pygame.font.Font(None, textSize)
88                        line = line[5:]
89
90                    else:
91                        lineChunk += line[0]
92                        line = line[1:]
93                lineChunks.append(pygame.font.Font(None, textSize).render(lineChunk, 1, textColor))
94                y += prevLineHeight
95                prevLineChunkWidth = 0 #Horizontal shift for individual line chunks
96                originalx = x #Reset x after drawing so that next line is flush
97                for lineChunk in lineChunks:
98                    textRect = lineChunk.get_rect()
99                    x += prevLineChunkWidth
100                    prevLineChunkWidth = textRect.width
101                    prevLineHeight = textRect.height
102                    if drawpos == "right":
103                        x += -textRect.right
104                    elif drawpos == "center":
105                        x += -textRect.centerx
106                        y += -textRect.centery
107                    globalVars.screen.blit(lineChunk, (x,y))
108                x = originalx
109
110    def drawImage(self, imageName, pos):
111        """draws an image based on an identifying string and a pos."""
112        globalVars.screen.blit(self.loadImage(imageName), pos)
113
114    def loadImage(self, imageName):
115        """loads an image either from a file or from the image dictionary"""
116        imageName = path.join('images', imageName)
117        if not (imageName in self.imageDict):
118            try:
119                image = pygame.image.load(imageName)
120                image = image.convert_alpha()
121                self.imageDict[imageName] = image
122            except pygame.error:
123                self.imageDict[imageName] = pygame.image.load(
124                    "images\error.jpg")
125        return self.imageDict[imageName]
Note: See TracBrowser for help on using the browser.