예제 #1
0
class Button(object):
    def __init__(self,
                 main,
                 surface,
                 in_color,
                 bord_color,
                 hover_color,
                 text_color,
                 x,
                 y,
                 sizeX,
                 sizeY,
                 text,
                 textSize,
                 onClick,
                 border=5,
                 onClickIdent=None):
        self.main = main
        self.surface = surface
        self.in_color = in_color
        self.bord_color = bord_color
        self.hover_color = hover_color
        self.text_color = text_color
        self.pos = self.x, self.y = x, y
        self.size = self.sizeX, self.sizeY = sizeX, sizeY
        self.border = border
        self.text = text
        self.textSize = textSize
        self.onClick = onClick
        self.onClickIdent = onClickIdent

        self.Rect = None
        self.InRect = None
        self.HoverSurf = None
        self.BordSurf = None
        self.HoverTexture = None
        self.BordTexture = None

        self.textFont = None
        self.textSurf = None
        self.textRect = None

        self._initRect()
        self._initText()
        self._genTextures()
        self._registerClick()

    def _initRect(self):
        self.Rect = pygame.Rect(0, 0, self.sizeX, self.sizeY)
        self.InRect = pygame.Rect(self.border, self.border,
                                  self.sizeX - self.border * 2,
                                  self.sizeY - self.border * 2)

    def _genTextures(self):
        self.BordSurf = pygame.Surface(self.size)
        self.HoverSurf = pygame.Surface(self.size)

        pygame.draw.rect(self.BordSurf, self.bord_color, self.Rect,
                         self.border)
        pygame.draw.rect(self.BordSurf, self.in_color, self.InRect, 0)
        self.BordSurf.blit(self.textSurf, self.textRect)

        pygame.draw.rect(self.HoverSurf, self.hover_color, self.Rect,
                         self.border)
        pygame.draw.rect(self.HoverSurf, self.in_color, self.InRect, 0)
        self.HoverSurf.blit(self.textSurf, self.textRect)

        self.HoverTexture = Texture(None, self.HoverSurf, self.Rect)
        self.BoardTexture = Texture(None, self.BordSurf, self.Rect)

    def _initText(self):
        self.font = pygame.font.Font(None, self.textSize)
        self.textSurf = self.font.render(self.text, True, self.text_color)
        self.textRect = self.textSurf.get_rect()
        self.textRect.center = self.InRect.center

    def draw(self):
        if self.isHover():
            self.HoverTexture.draw(self.x, self.y)
        else:
            self.BoardTexture.draw(self.x, self.y)

    def isHover(self):
        pos = pygame.mouse.get_pos()
        if self.x < pos[0] < self.sizeX + self.x and self.y < pos[
                1] < self.sizeY + self.y:
            return True
        return False

    def _onClick(self):
        if self.isHover():
            if self.onClickIdent is None:
                self.onClick()
            else:
                self.onClick(self.onClickIdent)

    def _registerClick(self):
        self.main.EventHandler.registerMOUSEBUTTONDOWNevent(1, self._onClick)

    def stop(self):
        try:
            del (self.HoverTexture)
        except:
            pass
        try:
            del (self.BoardTexture)
        except:
            pass
        self.main.EventHandler.unregisterMOUSEBUTTONDOWNevent(1, self._onClick)

    def __del__(self):
        self.stop()
예제 #2
0
class Game(object):
    def __init__(self, main, ScreenManager, tileSizeX, tileSizeY, map="base"):
        self.main = main
        self.screenManager = ScreenManager
        self.display_surf = ScreenManager.display_surf
        self.middle = ScreenManager.size[0]/2
        self.tileSizeX = tileSizeX  # H
        self.tileSizeY = tileSizeY  # W

        self.IsoMathHelper = None
        self._IsoMathHelperInit()

        self.MapPos = self.MapPosX, self.MapPosY = 0, 0
        self.MapMovConst = 10
        self.RegisterMapMovement()

        self.RecalculateDisplayTiles = True 
        self.RDT_X_S = None
        self.RDT_X_E = None
        self.RDT_Y_S = None
        self.RDT_Y_E = None

        self.Map = Map(map)
        self.Map.loadMap()
        print(self.Map.sizeX)
        self.MapJSON = MapJSON(map)
        self.MapJSON.loadMap()
        print(self.MapJSON.sizeX)
        self.tiles = []
        self.loadTextures()
        self.screenManager.setBackgrounColor(self.screenManager.colors["Black"], 1.0)
        self.MouseSelectedTexture = Texture("resources/graphics/map/select_tile.png")
        self.test = Texture("resources/graphics/map/holzblock.png")
        self.MouseActive = True 
        self.InGameMenuActive = False
        self.button = Button(self.main,
                                        self.display_surf,
                                        self.screenManager.colors["Gray"],
                                        self.screenManager.colors["Blue"],
                                        self.screenManager.colors["Yellow"],
                                        self.screenManager.colors["White"],
                                        self.middle-200,
                                        (self.screenManager.size[1]/10)*2+140,
                                        400, 80,
                                        "Create Level", 60,
                                        self.place)

        self.main.EventHandler.registerKEYDOWNevent(K_ESCAPE, self.KEYDOWNesc)
        self.main.EventHandler.registerMOUSEBUTTONDOWNevent(1, self.place)
        self.button.draw()

    def _IsoMathHelperInit(self):
        self.IsoMathHelper = IsoMathHelper(self.tileSizeY/2, self.tileSizeX/2,
                                           self.screenManager.width/2)

    def draw(self):
        if self.RecalculateDisplayTiles:
            self.RDT()
        for x in range(self.RDT_X_S, self.RDT_X_E):
            for y in range(self.RDT_Y_S, self.RDT_Y_E):
                tile = self.MapJSON.matrix[0][y][x]
                #layer1 = self.MapJSON.matrix[1][y][x]
                tile_x, tile_y = self.IsoMathHelper.Map2ScreenFIN((x, y),
                                                                  self.MapPos)
                self.tiles[tile].draw(tile_x, tile_y)
                #if layer1 = 1:
                #    self.tiles[3].draw(tile_x, tile_y)
        for i in range(len(self.MapJSON.matrix[1])):
            for j in range(len(self.MapJSON.matrix[1][i])):
                layer1 = self.MapJSON.matrix[1][i][j]

                tile_i, tile_j = self.IsoMathHelper.Map2ScreenFIN((j, i),self.MapPos)
                if layer1 == 1:
                    print(tile_i)
                    self.tiles[1].draw(tile_i, tile_j - 50) 

        mouseCoord = self.IsoMathHelper.Screen2MapFIN(pygame.mouse.get_pos(),self.MapPos)

        if -1 < mouseCoord[0] <= self.MapJSON.sizeX and -1 < mouseCoord[1] <= self.MapJSON.sizeY and self.MouseActive:
            select_x, select_y = self.IsoMathHelper.Map2ScreenFIN((int(mouseCoord[0]),int(mouseCoord[1])),self.MapPos)
            self.MouseSelectedTexture.draw(select_x, select_y)
            self.test.draw(select_x, select_y - 50)

    def place(self):
        mouseCoord = self.IsoMathHelper.Screen2MapFIN(pygame.mouse.get_pos(),self.MapPos)
        if -1 < mouseCoord[0] <= self.MapJSON.sizeX and -1 < mouseCoord[1] <= self.MapJSON.sizeY and self.MouseActive:
            select_x, select_y = self.IsoMathHelper.Map2ScreenFIN((int(mouseCoord[0]),int(mouseCoord[1])),self.MapPos)
            self.MapJSON.matrix[1][int(mouseCoord[1]/1)][int(mouseCoord[0]/1)] = 1



    def moveMap(self, dir1, dir2):
        if dir1:
            self.MapPosY += self.MapMovConst
        elif not dir1:
            self.MapPosY -= self.MapMovConst
        if dir2:
            self.MapPosX += self.MapMovConst
        elif not dir2:
            self.MapPosX -= self.MapMovConst

    def moveMapUp(self):
        self.MapPosY += self.MapMovConst
        self.MapPos = self.MapPosX, self.MapPosY
        self.RecalculateDisplayTiles = True

    def moveMapDown(self):
        self.MapPosY -= self.MapMovConst
        self.MapPos = self.MapPosX, self.MapPosY
        self.RecalculateDisplayTiles = True

    def moveMapRight(self):
        self.MapPosX -= self.MapMovConst
        self.MapPos = self.MapPosX, self.MapPosY
        self.RecalculateDisplayTiles = True

    def moveMapLeft(self):
        self.MapPosX += self.MapMovConst
        self.MapPos = self.MapPosX, self.MapPosY
        self.RecalculateDisplayTiles = True

    def RegisterMapMovement(self):
        self.main.EventHandler.registerKEYPRESSEDevent(K_UP, self.moveMapUp)
        self.main.EventHandler.registerKEYPRESSEDevent(K_DOWN, self.moveMapDown)
        self.main.EventHandler.registerKEYPRESSEDevent(K_LEFT, self.moveMapLeft)
        self.main.EventHandler.registerKEYPRESSEDevent(K_RIGHT, self.moveMapRight)

    def loadTextures(self):
        for TextureSrc in self.MapJSON.textures:
            self.tiles.append(Texture("resources/graphics/map/" + TextureSrc + ".png"))

    def checkEdges(self):
        if self.MapPosY < -self.IsoMathHelper.Map2Screen((self.MapJSON.sizeX, self.MapJSON.sizeY-(self.screenManager.width*1.5)/self.tileSizeY))[1]:
            self.MapPosY = -self.IsoMathHelper.Map2Screen((self.MapJSON.sizeX, self.MapJSON.sizeY-(self.screenManager.width*1.5)/self.tileSizeY))[1]
        elif self.MapPosY > self.screenManager.width/4:
            self.MapPosY = int(self.screenManager.width/4)

        if self.MapPosX > self.IsoMathHelper.Map2Screen((int(self.MapJSON.sizeX+(self.screenManager.height*0.25)/self.tileSizeX), self.MapJSON.sizeY))[1]:
            self.MapPosX = self.IsoMathHelper.Map2Screen((int(self.MapJSON.sizeX+(self.screenManager.height*0.25)/self.tileSizeX), self.MapJSON.sizeY))[1]
        elif self.MapPosX < -self.IsoMathHelper.Map2Screen((int(self.MapJSON.sizeX+(self.screenManager.height*0.25)/self.tileSizeX), self.MapJSON.sizeY))[1]:
            self.MapPosX = -self.IsoMathHelper.Map2Screen((int(self.MapJSON.sizeX+(self.screenManager.height*0.25)/self.tileSizeX), self.MapJSON.sizeY))[1]

    def RDT(self):
        self.checkEdges()
        TopLeft = self.IsoMathHelper.Screen2MapFIN((0, 0), self.MapPos)
        TopRight = self.IsoMathHelper.Screen2MapFIN((self.screenManager.width, 0),
                                                    self.MapPos)
        BottomRight = self.IsoMathHelper.Screen2MapFIN((self.screenManager.height,
                                                        self.screenManager.width),
                                                       self.MapPos)
        BottomLeft = self.IsoMathHelper.Screen2MapFIN((0, self.screenManager.height),
                                                      self.MapPos)

        self.RDT_X_S = int(TopLeft[0]) - 2
        self.RDT_X_E = int(BottomRight[0]) + 2

        self.RDT_Y_S = int(TopRight[1]) - 2
        self.RDT_Y_E = int(BottomLeft[1]) + 2

        if self.RDT_X_S < 0:
            self.RDT_X_S = 0
        elif self.RDT_X_S > self.MapJSON.sizeX:
            self.RDT_X_S = self.MapJSON.sizeX

        if self.RDT_X_E < 0:
            self.RDT_X_E = 0
        elif self.RDT_X_E > self.MapJSON.sizeX:
            self.RDT_X_E = self.MapJSON.sizeX

        if self.RDT_Y_S < 0:
            self.RDT_Y_S = 0
        elif self.RDT_Y_S > self.MapJSON.sizeY:
            self.RDT_Y_S = self.MapJSON.sizeY

        if self.RDT_Y_E < 0:
            self.RDT_Y_E = 0
        elif self.RDT_Y_E > self.MapJSON.sizeY:
            self.RDT_Y_E = self.MapJSON.sizeY

        self.RecalculateDisplayTiles = False

    def KEYDOWNesc(self):
        print("Hi")

    def openInGameMenu(self):
        self.MouseActive = False
        self.InGameMenuActive = True

    def closeInGameMenu(self):
        self.MouseActive = True
        self.InGameMenuActive = False

    def stop(self):
        pass