root/traintris/graphics.py @ 197

Revision 197, 7.8 KB (checked in by andefodahl, 2 years ago)

Completed (tentatively) most of the graphics methods

Line 
1import pygame
2import os.path
3
4class Graphics:
5    def __init__(self, screen):
6        self.screen = screen
7        self.imageDict = {}
8       
9        self.white = (255, 255, 255)
10        self.black = (0, 0, 0)
11        self.yellow = (255, 255, 0)
12        self.textColor = (55, 74, 46)
13        self.mbcolor = (146,209,79)
14        self.red = (255, 0, 0)
15       
16        self.screenheight = self.screen.get_height()
17        self.screenwidth = self.screen.get_width()
18       
19        #Messageboard drawing presets
20        self.font = pygame.font.SysFont(None, 30)
21        self.font2 = pygame.font.SysFont(None, 20)
22        self.font3 = pygame.font.SysFont(None, 10)
23       
24    #------------------------------------------------------------------
25    # load an image with transparency (key #ff00ff)
26    # convert to display surface format
27    def makeImage(self, filename):
28        image = pygame.image.load(filename).convert()
29        image.set_colorkey((255,0,255))
30        image.convert()
31        return image
32
33    # load a whole set of ground tiles from a manifest file
34    def makeGroundTiles(self, filename):
35        f = open(os.path.join('assets/',filename + '.tiles'))
36        tiles = []
37        for line in f.readlines():
38            line = line.rstrip()
39            if line[0] == '#':
40                continue
41            tiles.append(self.makeImage(os.path.join('gfx','tiles',line)))
42        f.close()
43        return tiles
44
45    #------------------------------------------------------------------
46    # load a whole object tile set
47    def makeObjectTileSet(self, manifest):
48        tiles = []
49        # read the tile definition file
50        f = open(os.path.join('assets',manifest + '.obj'))
51        for line in f.readlines():
52            line = line.rstrip()
53            if line[0] == '#':
54                continue
55            tiles.append(self.makeImage(os.path.join('gfx','objects',line)))
56        f.close()
57        return tiles
58
59    #------------------------------------------------------------------
60    # render gameboard
61    def drawBoard(self, level, tileset, screen):
62        # offset of *top-left corner* of top left tile
63        # 400 - 19 (half tile width)
64        # 120 - 9 (half height of top face of isometric cube)
65        rowstartx = 381
66        rowstarty = 111
67        for i in level:
68            xoff = rowstartx
69            yoff = rowstarty
70            rowstartx -= 18
71            rowstarty += 9
72            for j in i:
73                screen.blit(tileset[j],(xoff,yoff))
74                xoff += 18
75                yoff += 9
76
77    #------------------------------------------------------------------
78    # render objects & mobs (non-flat tiles; can be any height, but only 1 wide)
79    # objects must be considered in terms of their *bottom-left corner* because of the varying heights
80    # the "hotspot" of a mob - the centre of its bottom face - moves in two steps:
81    #   - from source-tile centre to joining edge of source & dest
82    #   - from joining edge of source & dest to centre of dest
83    def drawObjectsAndMobs(self, level, tileset, mobs, surface, frameno, targets = None):
84        ix = 0
85        iy = 0
86
87        xstart = 381
88        ystart = 129
89        for i in level:
90            xoff = xstart - (iy * 18)
91            yoff = ystart + (iy * 9)
92            for j in i:
93                if not j == -1:
94                    surface.blit(tileset[j],(xoff,yoff-tileset[j].get_height()))
95                xoff += 18
96                yoff += 9
97                for mob in mobs:
98                    if mob.location[0] == ix and mob.location[1] == iy:
99                        mob.draw(surface, frameno, targets)
100                ix += 1
101            ix = 0
102            iy += 1
103           
104           
105    #------------------------------------------------------------------
106    # render background
107    def drawBackground(self, dark):
108        #draws summer or winter background accordingly
109        return
110
111    def drawInfoBox(self, name, description, diet, rang, predators, color):
112        boxsize = (self.screenwidth / 5)
113        ystart = self.screenheight - boxsize
114        self.drawImage("infobox", (0, ystart))
115        if rang == "" and predators == "":
116            self.drawText(name, (20, ystart + 20), (boxsize - 40), color, 10)
117            self.drawText(description, (20, ystart + 98), (boxsize - 40), color, 10)
118            self.drawText(diet, (20, ystart + 176), (boxsize - 40), color, 10)
119        else:
120            self.drawText(name, (20, ystart + 20), (boxsize - 40), color, 10)
121            self.drawText(description, (20, ystart + 67), (boxsize - 40), color, 10)
122            self.drawText(diet, (20, ystart + 114), (boxsize - 40), color, 10)
123            self.drawText(rang, (20, ystart + 161), (boxsize - 40), color, 10)
124            self.drawText(predators, (20, ystart + 208), (boxsize - 40), color, 10)
125           
126    def drawDialogBox(self, string1, string2, color):
127        self.drawImage("dialogbox", ((self.screenwidth / 2) - 150, (self.screenheight / 2) - 100))
128        self.drawText(string1, ((self.screenwidth / 2) - 130, (self.screenheight / 2) - 80), 260, color, 40)
129        self.drawText(string2, ((self.screenwidth / 2) -130, (self.screenheight / 2) + 20), 260, color, 40)
130   
131    def drawMenuBox(self,
132        boxsize = (self.screenwidth) / 5)
133        xstart = self.screenwidth - boxsize
134        ystart = self.screenheight - boxsize
135        self.drawImage("menubox", (xstart, ystart))
136        #self.drawButton(r
137       
138    def drawBottomBar(self, daysRemaining, season, animal, diet, rang):
139        boxsize = (3/5)*self.screenwidth
140        xstart = self.screenwidth / 5
141        ystart = self.screenheight - 90
142        midbox = (1/2)*self.screenwidth
143        self.drawImage("bottomBar", (xstart, ystart))
144        self.drawImage(season, (xstart, ystart))
145        self.drawImage(animal, (midbox, ystart)
146        self.drawText(daysRemaining, (xstart + 100, ystart + 20), (mixbox - 110), self.black, 20)
147        self.drawText(diet, (midbox + 100, ystart + 20), 190, self.black, 20)
148        self.drawText(rang, (mixbox + 300, ystart + 20), 90, self.black, 20)
149   
150    def drawCategoryBar(self):
151       
152   
153    # def drawOrganismBar(self,
154   
155    # def drawText(self, text, pos, width, color, size)
156   
157    #-------------------------------------------------------------------------------------------------
158    # draws a button (pos is top-left)
159    def drawButton(self, images, mode, pos):
160   
161        if mode == GraphicsConstants.NEUTRAL:
162            image = images[GraphicsConstants.NEUTRAL]
163        elif mode == GraphicsConstants.HOVER:
164            image = images[GraphicsConstants.HOVER]
165        else:
166            image = images[GraphicsConstants.DEPRESSED]
167               
168        self.drawImage(image, (x,y))
169
170    #-------------------------------------------------------------------------------------------------
171    # draws an image based on an identifying string and a pos
172    def drawImage(self, imageName, pos):
173        globalVars.screen.blit(self.loadImage(imageName), pos)
174
175    #-------------------------------------------------------------------------------------------------
176    # loads an image either from a file or from the image dictionary
177    def loadImage(self, imageName):
178        imageName = path.join('gfx\objects', imageName)
179        if not (imageName in self.imageDict):
180            try:
181                image = pygame.image.load(filename).convert()
182                image.set_colorkey((255,0,255))
183                image.convert()
184                self.imageDict[imageName] = image
185            except pygame.error:
186                self.imageDict[imageName] = pygame.image.load(
187                    "images\error.jpg")
188        return self.imageDict[imageName]
189
190   
Note: See TracBrowser for help on using the browser.