root/traintris/graphics.py @ 299

Revision 299, 11.1 KB (checked in by andefodahl, 2 years ago)

Tutorial done?

Line 
1import pygame
2from constants import *
3import os.path
4import random
5
6class Graphics:
7    def __init__(self, screen):
8        self.screen = screen
9        self.imageDict = {}
10       
11        self.white = (255, 255, 255)
12        self.black = (0, 0, 0)
13        self.yellow = (255, 255, 0)
14        self.textColor = (55, 74, 46)
15        self.mbcolor = (146,209,79)
16        self.red = (255, 0, 0)
17               
18        self.screenheight = self.screen.get_height()
19        self.screenwidth = self.screen.get_width()
20       
21        self.numbers = gameNumbers().numbers
22       
23        #Messageboard drawing presets
24        self.font = pygame.font.Font("gfx\\fonts\JandaManateeSolid.ttf", 25)
25        self.font2 = pygame.font.Font("gfx\\fonts\JandaManateeSolid.ttf", 20)
26        self.font3 = pygame.font.Font("gfx\\fonts\JandaManateeSolid.ttf", 10)
27        self.font4 = pygame.font.Font("gfx\\fonts\JandaManateeBubble.ttf", 20)
28       
29       
30    #------------------------------------------------------------------
31    # load an image with transparency (key #ff00ff)
32    # convert to display surface format
33    # def makeImage(self, filename):
34        # image = pygame.image.load(filename).convert()
35        # image.set_colorkey((255, 0, 255))
36        # image.convert()
37        # return image
38
39    # load a whole set of ground tiles from a manifest file
40    def makeGroundTiles(self, filename):
41        f = open(os.path.join('assets/',filename + '.tiles'))
42        tiles = []
43        for line in f.readlines():
44            line = line.rstrip()
45            if line[0] == '#':
46                continue
47            tiles.append(self.loadImage(line, 'tiles'))
48        f.close()
49        return tiles
50
51    #------------------------------------------------------------------
52    # load a whole object tile set
53    def makeObjectTileSet(self, manifest):
54        tiles = []
55        # read the tile definition file
56        f = open(os.path.join('assets',manifest + '.obj'))
57        for line in f.readlines():
58            line = line.rstrip()
59            if line[0] == '#':
60                continue
61            tiles.append(self.loadImage(line))
62        f.close()
63        return tiles
64
65    #------------------------------------------------------------------
66    # render gameboard
67    def drawBoard(self, level, tileset, screen, season):
68        # offset of *top-left corner* of top left tile
69        # 400 - 19 (half tile width)
70        # 120 - 9 (half height of top face of isometric cube)
71        rowstartx = 646.5
72        rowstarty = 77.75
73        for i in level:
74            xoff = rowstartx
75            yoff = rowstarty
76            rowstartx -= 36.5
77            rowstarty += 18.25
78            for j in i:
79                if season:
80                    screen.blit(tileset[j+3], (xoff, yoff))
81                else:
82                    screen.blit(tileset[j],(xoff,yoff))
83                xoff += 36.5
84                yoff += 18.25
85
86    #------------------------------------------------------------------
87    # render objects & mobs (non-flat tiles; can be any height, but only 1 wide)
88    # objects must be considered in terms of their *bottom-left corner* because of the varying heights
89    # the "hotspot" of a mob - the centre of its bottom face - moves in two steps:
90    #   - from source-tile centre to joining edge of source & dest
91    #   - from joining edge of source & dest to centre of dest
92    def drawObjectsAndMobs(self, level, tileset, mobs, surface, frameno, targets = None):
93        ix = 0
94        iy = 0
95
96        xstart = 646.5
97        ystart = 114.25
98        for i in level:
99            xoff = xstart - (iy * 36.5)
100            yoff = ystart + (iy * 18.25)
101            for j in i:
102                if not j == -1:
103                    surface.blit(tileset[j],(xoff,yoff-tileset[j].get_height()))
104                xoff += 36.5
105                yoff += 18.25
106                for mob in mobs:
107                    if mob.location[0] == ix and mob.location[1] == iy:
108                        mob.draw(surface, frameno, targets)
109                ix += 1
110            ix = 0
111            iy += 1
112           
113           
114    #------------------------------------------------------------------
115    # render background
116    def drawBackground(self, season):
117        #draws summer or winter background accordingly
118        if season == CONSTANTS.SUMMER:
119            self.drawImage("summer.gif", (0,0))
120        else:
121            self.drawImage("winter.png", (0,0))
122
123    def drawInfoBox(self, name=None, description=None, diet=None, rang=None, predators=None, color1 = "black"):
124        boxsize = (self.screenwidth / 5)
125        ystart = self.screenheight - boxsize
126        self.drawImage("infobox.png", (0, ystart))
127        if color1 == (138, 0, 0):
128            color = pygame.Color(138, 0, 0)
129        else:
130            color = pygame.Color(color1)
131        if name:
132            if rang == "" and predators == "":
133                self.drawText(name, (20, ystart + 20), color, 20)
134                self.drawText(description, (20, ystart + 98), color, 20)
135                self.drawText(diet, (20, ystart + 176), color, 20)
136            else:
137                line = pygame.Surface((int(boxsize - 25), 3))
138                self.screen.blit(line, (10, ystart + 53))
139                self.drawText(name, (20, ystart + 20), color, 25)
140                self.drawText(description, (20, ystart + 60), color, 20)
141                self.drawText( diet, (20, ystart + 108), color, 20)
142                self.drawText("Range: " + rang, (20, ystart + 158), color, 20)
143                self.drawText("Predators: " + predators, (20, ystart + 188), color, 20)
144           
145    def drawDialogBox(self, string1, string2, color):
146        self.drawImage("dialogbox.png", ((self.screenwidth / 2) - 375, (self.screenheight / 2) - 300))
147        self.drawText(string1, ((self.screenwidth / 2) - 310, (self.screenheight / 2) - 240), color, 40)
148        self.drawText(string2, ((self.screenwidth / 2) -310, (self.screenheight / 2) - 120), color, 40)
149   
150    def drawMenuBox(self):
151        boxsize = ((self.screenwidth) / 5)
152        xstart = self.screenwidth - boxsize
153        ystart = self.screenheight - boxsize
154        self.drawImage("menubox.png", (xstart, ystart))
155       
156    def drawBottomBar(self, daysRemaining, season, animal=None, diet=None, rang=None):
157        boxsize = (3.0/5)*self.screenwidth
158        xstart = self.screenwidth / 5
159        ystart = self.screenheight - boxsize/3 + 1
160        midbox = 0.5*self.screenwidth
161        self.drawImage("bottomBar.png", (xstart, ystart))
162        if season == CONSTANTS.SUMMER:
163            self.drawImage("summerIcon.png", (xstart, self.screenheight - 80))
164            self.drawText("Days until winter: "+str(daysRemaining), (xstart + 100, self.screenheight - 55), self.black, 20)
165        else:
166            self.drawImage("winterIcon.png", (xstart, self.screenheight - 80))
167            self.drawText("Days until summer: "+str(daysRemaining), (xstart + 100, self.screenheight - 55), self.black, 20)
168        if animal:
169            self.drawImage(animal + ".png", (midbox - 50, self.screenheight - 70))
170            self.drawText(diet, (midbox + 60, self.screenheight - 60), self.black, 20)
171            self.drawText("Range: " + str(rang), (midbox + 300, self.screenheight - 60), self.black, 20)
172   
173    def drawText(self, text, pos, color=pygame.Color("black"), textSize=25, 
174             drawpos="left"):
175        """parses a string for certain indicators and draws it"""
176        currentFont = self.font
177        if textSize == 20:
178            currentFont = self.font2
179        elif textSize == 10:
180            currentFont = self.font3
181        if color == pygame.Color(138, 0, 0):
182            currentFont = self.font4
183
184        x = pos[0]
185        y = pos[1]
186        if text != "":
187            textLines = [] #Will contain different lines
188            line = ""
189            while text != "":
190                if text[0] == "\n":
191                    text = text[1:]
192                    textLines.append(line)
193                    line = ""
194                else:
195                    line += text[0]
196                    text = text[1:]
197
198            textLines.append(line)
199            prevLineHeight = 0 #Vertical shift for sequential lines
200            for line in textLines:
201                lineChunks = [] #Will contain "chunks" of individual lines
202                lineChunk = ""
203                textColor = color
204                while line != "":
205                        lineChunk += line[0]
206                        line = line[1:]
207                lineChunks.append(currentFont.render(lineChunk, 1, textColor))
208                y += prevLineHeight
209                prevLineChunkWidth = 0 #Horizontal shift for individual line chunks
210                originalx = x #Reset x after drawing so that next line is flush
211                for lineChunk in lineChunks:
212                    textRect = lineChunk.get_rect()
213                    x += prevLineChunkWidth
214                    prevLineChunkWidth = textRect.width
215                    prevLineHeight = textRect.height - 10
216                    if drawpos == "right":
217                        x += -textRect.right
218                    elif drawpos == "center":
219                        x += -textRect.centerx
220                        y += -textRect.centery
221                    self.screen.blit(lineChunk, (x,y))
222                x = originalx
223             
224    #-------------------------------------------------------------------------------------------------
225    # draws a button (pos is top-left)
226    def drawButton(self, text, size, images, mode, pos):
227   
228        print "Drawing button"
229   
230        if mode == CONSTANTS.NEUTRAL:
231            image = images[CONSTANTS.NEUTRAL]
232        elif mode == CONSTANTS.HOVER:
233            image = images[CONSTANTS.HOVER]
234        else:
235            image = images[CONSTANTS.DEPRESSED]
236               
237        self.drawImage(image, pos)
238        self.drawText(text, (pos[0] + (size[0]/2), pos[1] + (size[1]/2)), pygame.Color("black"), 20, "center" )
239
240    #-------------------------------------------------------------------------------------------------
241    # draws an image based on an identifying string and a pos
242    def drawImage(self, imageName, pos):
243        self.screen.blit(self.loadImage(imageName), pos)
244
245    #-------------------------------------------------------------------------------------------------
246    # loads an image either from a file or from the image dictionary
247    def loadImage(self, imageName, location='objects'):
248        filename = os.path.join("gfx\\" + location, imageName)
249        if not (imageName in self.imageDict):
250            try:
251                image = pygame.image.load(filename)
252                image = image.convert_alpha()
253                # image.set_colorkey((255,0,255))
254                # image.convert()
255                self.imageDict[imageName] = image
256            except pygame.error:
257                self.imageDict[imageName] = pygame.image.load(
258                    "gfx\objects\error.jpg")
259        return self.imageDict[imageName]
260
261   
Note: See TracBrowser for help on using the browser.