Beispiel #1
0
class Game(DirectObject):
    def __init__(self, background, cursor, pointer):
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        #---------------------------------------------------VARIABLE DECLARATION------------------------------------------------------------------------
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        # Timers
        self.jumpTiming = 0
        self.jumpTime = 0
        self.lastTimeEnergy = 0
        self.energyTimer = None

        # Booleans
        self.jumping = False
        self.drawing = False
        self.attacking = False
        self.busy = False  #true if there are some image on screen making note something
        self.isGameOver = False

        # Auxiliar calculations
        self.vecX = 0
        self.vecY = 0

        # Graphic components
        #Blackboard
        self.blackboard = OnscreenImage(image="./tex/blackboard.png",
                                        pos=(0, 0, 0),
                                        hpr=None,
                                        scale=(1.25, 1.0, 0.90),
                                        color=None,
                                        parent=None,
                                        sort=0)
        self.blackboard.setTransparency(TransparencyAttrib.MAlpha)
        self.blackboard.hide()
        self.distXPointDraw = 0.0
        self.distYPointDraw = 0.0
        #Level
        self.level = Level_1(background)
        #Main Character
        self.char = CMain(-18, -5, 59)
        #Energy Bar
        self.energyBar = BEnergy()
        self.energyBar.increase(50)
        #Life Bar
        self.lifes = BLifes()
        self.lifes.increase(1)
        self.lifes.increase(1)
        self.lifes.increase(1)
        #Special Items Bar
        self.specialItems = BSpecial()
        #Abilies Bar
        self.grainAbility = BAbility("GRAIN")
        self.fruitAbility = BAbility("FRUIT")
        self.milkAbility = BAbility("MILK")
        self.vegetableAbility = BAbility("VEGETABLE")
        self.fishAbility = BAbility("FISH")
        #Info
        self.infError = OnscreenImage(image="./tex/wrong_attack.png",
                                      pos=(0.4, 0, 0),
                                      hpr=None,
                                      scale=(0.47, 1.0, 0.55),
                                      color=None,
                                      parent=None,
                                      sort=5)
        self.infError.setTransparency(TransparencyAttrib.MAlpha)
        self.infError.hide()
        self.infCereal = OnscreenImage(image="./tex/cereal_attack.png",
                                       pos=(0.4, 0, 0),
                                       hpr=None,
                                       scale=0.45,
                                       color=None,
                                       parent=None,
                                       sort=5)
        self.infCereal.setTransparency(TransparencyAttrib.MAlpha)
        self.infCereal.hide()
        self.infCerealError = OnscreenImage(
            image="./tex/cereal_not_attack.png",
            pos=(0.4, 0, 0),
            hpr=None,
            scale=0.45,
            color=None,
            parent=None,
            sort=5)
        self.infCerealError.setTransparency(TransparencyAttrib.MAlpha)
        self.infCerealError.hide()
        self.infFish = OnscreenImage(image="./tex/fish_attack.png",
                                     pos=(0.4, 0, 0),
                                     hpr=None,
                                     scale=0.5,
                                     color=None,
                                     parent=None,
                                     sort=5)
        self.infFish.setTransparency(TransparencyAttrib.MAlpha)
        self.infFish.hide()
        self.infFishError = OnscreenImage(image="./tex/fish_not_attack.png",
                                          pos=(0.4, 0, 0),
                                          hpr=None,
                                          scale=0.5,
                                          color=None,
                                          parent=None,
                                          sort=5)
        self.infFishError.setTransparency(TransparencyAttrib.MAlpha)
        self.infFishError.hide()
        self.infMilk = OnscreenImage(image="./tex/milk_attack.png",
                                     pos=(0.4, 0, 0),
                                     hpr=None,
                                     scale=0.5,
                                     color=None,
                                     parent=None,
                                     sort=5)
        self.infMilk.setTransparency(TransparencyAttrib.MAlpha)
        self.infMilk.hide()
        self.infMilkError = OnscreenImage(image="./tex/milk_not_attack.png",
                                          pos=(0.4, 0, 0),
                                          hpr=None,
                                          scale=0.5,
                                          color=None,
                                          parent=None,
                                          sort=5)
        self.infMilkError.setTransparency(TransparencyAttrib.MAlpha)
        self.infMilkError.hide()
        self.infVege = OnscreenImage(image="./tex/vege_attack.png",
                                     pos=(0.4, 0, 0),
                                     hpr=None,
                                     scale=0.4,
                                     color=None,
                                     parent=None,
                                     sort=5)
        self.infVege.setTransparency(TransparencyAttrib.MAlpha)
        self.infVege.hide()
        self.infVegeError = OnscreenImage(image="./tex/vege_not_attack.png",
                                          pos=(0.4, 0, 0),
                                          hpr=None,
                                          scale=0.4,
                                          color=None,
                                          parent=None,
                                          sort=5)
        self.infVegeError.setTransparency(TransparencyAttrib.MAlpha)
        self.infVegeError.hide()
        self.infFruit = OnscreenImage(image="./tex/fruit_attack.png",
                                      pos=(0.4, 0, 0),
                                      hpr=None,
                                      scale=0.4,
                                      color=None,
                                      parent=None,
                                      sort=5)
        self.infFruit.setTransparency(TransparencyAttrib.MAlpha)
        self.infFruit.hide()
        self.infFruitError = OnscreenImage(image="./tex/fruit_not_attack.png",
                                           pos=(0.4, 0, 0),
                                           hpr=None,
                                           scale=0.4,
                                           color=None,
                                           parent=None,
                                           sort=5)
        self.infFruitError.setTransparency(TransparencyAttrib.MAlpha)
        self.infFruitError.hide()
        #Logo
        self.logo = OnscreenImage(image="./tex/laSalleAlpha.png",
                                  pos=(1.05, 0, -0.85),
                                  hpr=None,
                                  scale=(0.22, 1.0, 0.075),
                                  color=None,
                                  parent=None,
                                  sort=5)
        self.logo.setTransparency(TransparencyAttrib.MAlpha)

        # Sounds
        self.winMusic = base.loadMusic('./sound/win.wav')
        self.winMusic.setVolume(.5)
        self.winMusic.setLoopCount(1)
        self.gameOverMusic = base.loadMusic('./sound/lose.wav')
        self.gameOverMusic.setVolume(.5)
        self.gameOverMusic.setLoopCount(1)
        self.allSpecial = base.loadSfx('./sound/win_mysterious.wav')
        self.allSpecial.setVolume(.7)
        self.allSpecialPlayed = False

        # Others
        self.type = "NONE"
        self.gameover = None
        self.gameActive = True

        #-----------------------------------------------------------------------------------------------------------------------------------------------
        #----------------------------------------------------------------GAME INIT----------------------------------------------------------------------
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        # Glove gestures configuration
        self.cursor = cursor
        self.gestureHandler = GestureRecognition(
            "Gesture_Handler",
            [
                ("1", 0),
                ("2", 0),
                ("3", 0),
                ("4", 0),
                ("6", 0),
                ("7", 0),
                ("8", 0),
                ("9", 0),  #NONE
                ("12", 0),
                ("13", 0),
                ("16", 0),
                ("18", 0),
                ("17", 0),
                ("14", 0),  #NONE
                ("23", 0),
                ("26", 0),
                ("29", 0),
                ("27", 0),
                ("24", 0),
                ("21", 0),  #NONE
                ("36", 0),
                ("39", 0),
                ("38", 0),
                ("34", 0),
                ("31", 0),
                ("32", 0),  #NONE
                ("41", 0),
                ("42", 0),
                ("43", 0),
                ("49", 0),
                ("48", 0),
                ("47", 0),  #NONE
                ("69", 0),
                ("68", 0),
                ("67", 0),
                ("61", 0),
                ("62", 0),
                ("63", 0),  #NONE
                ("74", 0),
                ("71", 0),
                ("72", 0),
                ("76", 0),
                ("79", 0),
                ("78", 0),  #NONE
                ("87", 0),
                ("84", 0),
                ("81", 0),
                ("83", 0),
                ("86", 0),
                ("89", 0),  #NONE
                ("98", 0),
                ("97", 0),
                ("94", 0),
                ("92", 0),
                ("93", 0),
                ("96", 0),  #NONE
                ("93934", 1),  #FRUIT
                ("7624", 2),  #MILK
                ("67616", 3),  #VEGETABLE
                ("183", 4),  #FISH
                ("3434", 5)
            ],  #CEREAL
            self.cursor,
            True,
            1,
            0,
            0)

        self.accept("Gesture_Handler", self.gestureProcessing)

        # Cursor init
        self.pointer = pointer

        # Start tasks
        taskMgr.add(self.taskMove, 'taskMove')
        taskMgr.add(self.taskCollision, 'taskCollision')
        taskMgr.add(self.taskEnergy, 'taskEnergy')
        taskMgr.add(self.taskLevels, 'taskLevels')

        # Events declaration
        self.accept("WM_BUTTON_PRESSED", self.handleBtnPress)
        self.accept("WM_BUTTON_RELEASED", self.handleBtnRelease)

    #end __init__

    #-----------------------------------------------------------------------------------------------------------------------------------------------
    #----------------------------------------------------------------FUNCTIONS----------------------------------------------------------------------
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    # Called when we start drawing, set ready the drawing interface
    def showBlackboard(self):
        if self.char.attacking == False:
            # There isn't another character attack on course
            if self.busy == False:
                # The screen is empty of sprites information, like abilty attacks
                self.drawing = True

                self.blackboard.show()
                self.specialItems.hide()
                self.char.walking = False
                self.energyBar.hide()
                self.lifes.hide()

                taskMgr.remove('taskMove')

                # Stop the enemies
                for x in self.level.enemies:
                    x.stopEnemy(True)

    #end showBlackboard

    # It hides the blackboard and makes appear the disappeared elements
    def hideBlackboard(self):
        self.drawing = False
        self.blackboard.hide()
        self.specialItems.show()
        self.char.walking = True
        self.energyBar.show()
        self.lifes.show()
        self.infError.hide()
        self.infCereal.hide()
        self.infCerealError.hide()
        self.infFish.hide()
        self.infFishError.hide()
        self.infMilk.hide()
        self.infMilkError.hide()
        self.infVege.hide()
        self.infVegeError.hide()
        self.infFruit.hide()
        self.infFruitError.hide()

    #end hideBlackboard

    # It stops drawing
    def stopAttack(self):
        if self.char.attacking == False:
            if self.busy == False:
                self.gestureHandler.endGesture()

    #end stopAttack

    # WiiMote button pressed handler
    def handleBtnPress(self, btn, dev, index):
        if (index == 1):
            if (btn == wiiuse.BUTTON_A):
                if (self.gameActive == True):
                    if self.drawing == True:
                        if self.busy == False:
                            self.gestureHandler.beginGesture()

    #end handleBrnPress

    # WiiMote button released handler
    def handleBtnRelease(self, btn, dev, index):
        if (index == 1):
            if (btn == wiiuse.BUTTON_A):
                if (self.gameActive == True):
                    if self.drawing == True: self.stopAttack()
                    else: self.showBlackboard()

    #end handleBtnRelease

    # Identify the information drawed on drawing process and if this is well drawed and we have enough ability power prepare's the attack.
    def gestureProcessing(self, id, x, y):
        if (self.gameActive == True):
            #------------------------------------------------------------------FRUIT---------------------------------------------------------------------
            if id == 1:
                if self.char.power[1] < 1:
                    self.infFruitError.show()
                else:
                    self.infFruit.show()
                    self.char.power[1] = self.char.power[1] - 1
                    self.fruitAbility.powerUsed(1)
                    self.attacking = True
                    self.type = "FRUIT"

            #------------------------------------------------------------------MILK----------------------------------------------------------------------
            elif id == 2:
                if self.char.power[2] < 1:
                    self.infMilkError.show()
                else:
                    self.infMilk.show()
                    self.char.power[2] = self.char.power[2] - 1
                    self.milkAbility.powerUsed(1)
                    self.attacking = True
                    self.type = "MILK"

            #---------------------------------------------------------------VEGETABLE-------------------------------------------------------------------
            elif id == 3:
                if self.char.power[3] < 1:
                    self.infVegeError.show()
                else:
                    self.infVege.show()
                    self.char.power[3] = self.char.power[3] - 1
                    self.vegetableAbility.powerUsed(1)
                    self.attacking = True
                    self.type = "VEGETABLE"

            #------------------------------------------------------------------FISH---------------------------------------------------------------------
            elif id == 4:
                if self.char.power[4] < 1:
                    self.infFishError.show()
                else:
                    self.infFish.show()
                    self.char.power[4] = self.char.power[4] - 1
                    self.fishAbility.powerUsed(1)
                    self.attacking = True
                    self.type = "FISH"

            #----------------------------------------------------------------CEREAL--------------------------------------------------------------------
            elif id == 5:
                if self.char.power[0] < 1:
                    self.infCerealError.show()
                else:
                    self.infCereal.show()
                    self.char.power[0] = self.char.power[0] - 1
                    self.grainAbility.powerUsed(1)
                    self.attacking = True
                    self.type = "GRAIN"

            #------------------------------------------------------------------NONE-------------------------------------------------------------------
            else:
                self.infError.show()

            #Shows on the screen the result of the drawing process
            taskMgr.add(self.taskSpriteAttack, 'taskSpriteAttack')
            self.busy = True
            self.gestureHandler.clearGestures()

    #end gestureProcessing

    # Process the damage for the character
    def damage(self):
        self.char.life = self.char.life - 1
        if self.char.life >= 0:
            self.char.soundDamage.play()
            self.lifes.decrease(1)
            self.char.setInvincible(True)
            if self.char.life <= 0:
                self.setGameOver()

    #end damage

    # Configures the game for Game Over process
    def setGameOver(self):
        self.gameover = OnscreenImage(image="./tex/gameover.png",
                                      pos=(0, 0, 0),
                                      hpr=None,
                                      scale=(1.4, 1.0, 1.0),
                                      color=None,
                                      parent=None,
                                      sort=30)
        self.isGameOver = True
        self.gameOverMusic.play()
        self.level.state = 2
        self.level.removeAll()
        taskMgr.remove('taskLevel')
        taskMgr.remove('taskLevels')
        taskMgr.remove('taskMove')
        taskMgr.add(self.taskChangeLevel, 'taskChangeLevel')
        self.energyBar.hide()
        self.specialItems.hide()
        self.grainAbility.hide()
        self.fruitAbility.hide()
        self.milkAbility.hide()
        self.vegetableAbility.hide()
        self.fishAbility.hide()
        self.lifes.hide()

    #end setGameOver

    #-----------------------------------------------------------------------------------------------------------------------------------------------
    #----------------------------------------------------------------TASKS,THREADS------------------------------------------------------------------
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    # It moves the main character to the sun pointer point.
    def taskMove(self, task):
        mpos = self.cursor.getCursorPos()
        if (self.drawing == False):
            # We're not drawing.
            if (self.level.movingBackground != False):
                # We're on a transition sequence
                self.level.moveBackground(mpos.getX(), mpos.getY())

            # Moving the main character
            self.char.movement(mpos.getX(), mpos.getY())

        # We have all special items
        if ((self.specialItems.hasAllSpecial() == True)
                and (self.allSpecialPlayed == False)):
            self.allSpecial.play()
            self.allSpecialPlayed = True
            self.lifes.increase(1)
            self.char.life = self.char.life + 1

        # We're run out of energy
        if self.energyBar.amount <= 0:
            self.setGameOver()

        return task.cont

    #end taskCursor

    # It holds ability's information on screen for 1 second and then throws the attack to the enemy.
    def taskSpriteAttack(self, task):
        if task.time > 1:
            # Making disappear the sprite information attack
            self.hideBlackboard()

            if self.attacking == True:
                # If we draw correctly and we have the correct power item
                self.att = Attack(self.type, "-", self.level.enemies,
                                  self.char)
                self.attacking = False
                self.char.attacking = True

            self.busy = False

            # Making move the enemies again
            for x in self.level.enemies:
                x.stopEnemy(False)

            # Making move the character again
            taskMgr.add(self.taskMove, 'taskMove')
            return task.done
        else:
            return task.cont

    #end taskAttack

    # It checks Character-Item, Character-Enemy, Character-Enemy Attack and Enemy-Character Attack collision every frame.
    def taskCollision(self, task):
        if self.isGameOver == True: return task.done
        else:
            #Character-Item collision
            for x in self.level.items:
                if x.collide(self.char):
                    self.char.itemCollect(x)
                    self.level.items.remove(x)
                    x.posX = -100
                    x.model.setX(x.posX)
                    x.posY = -100
                    x.model.setZ(x.posY)
                    x.collectIt = True

                    self.energyBar.increase(x.energy)

                    if x.specialItem == True:
                        self.specialItems.itemCollected(x.type)

                    #Abilites bar
                    if x.type == "GRAIN":
                        self.grainAbility.itemCollected(1)
                    if x.type == "FRUIT":
                        self.fruitAbility.itemCollected(1)
                    if x.type == "MILK":
                        self.milkAbility.itemCollected(1)
                    if x.type == "VEGETABLE":
                        self.vegetableAbility.itemCollected(1)
                    if x.type == "FISH":
                        self.fishAbility.itemCollected(1)

            #Character-Enemy collision, Character-Enemy Attack collision
            for x in self.level.enemies:
                if x.collide(self.char):
                    if self.char.isInvincible == False:
                        self.damage()

                if x.attacking == True:
                    if x.att.char_enAttCollide(self.char):
                        if self.char.isInvincible == True:
                            if x.att.isexploding == False:
                                x.att.destroyAttack()
                        else:
                            if (x.att != None):
                                x.att.explode()
                            self.damage()

            #Enemy-Character Attack collision
            if self.char.attacking == True:
                for x in self.level.enemies:
                    if self.att.en_charAttCollide(x) == True:
                        x.life = x.life - 1
                        self.level.enemies.remove(x)
                        self.att.destroyAttack()

            return task.cont

    #end taskCollision

    # It decreases character energy every frame, only when he's moving over the screen.
    def taskEnergy(self, task):
        if self.isGameOver == True:
            return task.done
        else:
            if self.char.walking:
                if (task.time - self.lastTimeEnergy) > 1:
                    self.lastTimeEnergy = task.time
                    self.energyBar.decrease(3)
            else:
                if (task.time - self.lastTimeEnergy) > 1:
                    self.lastTimeEnergy = task.time
                    self.energyBar.decrease(1)
            return task.cont

    #end taskEnergy

    # It waits for a level finalization (YOU WIN) and prepares the application for the next level
    def taskLevels(self, task):
        if self.level.state == 1:
            taskMgr.add(self.taskChangeLevel, 'taskChangeLevel')
            self.winMusic.play()
            self.level.state = 2
        return task.cont

    #end taskLevels

    # It change the level.
    # The next level if the user has won the game or a reinit if it is a game over.
    def taskChangeLevel(self, task):
        if (task.time > 4.0):
            if (self.isGameOver == True): self.gameover.hide()
            else: self.level.hideLevel()

            back = self.level.back

            if (self.isGameOver == True): num_level = 0
            else: num_level = self.level.num_level

            self.level = None

            self.grainAbility.setEmpty()
            self.fruitAbility.setEmpty()
            self.milkAbility.setEmpty()
            self.vegetableAbility.setEmpty()
            self.fishAbility.setEmpty()

            self.char.power[0] = 0
            self.char.power[1] = 0
            self.char.power[2] = 0
            self.char.power[3] = 0
            self.char.power[4] = 0

            if (self.isGameOver == False): self.specialItems.reInit()
            self.allSpecialPlayed = False

            if (num_level == 0):
                self.char.model.hide()
                self.gameActive = False
                Game(back, self.cursor, self.pointer)
            if (num_level == 1): self.level = Level_2(back)
            if (num_level == 2): self.level = Level_3(back)
            if (num_level == 3): self.level = Level_4(back)
            if (num_level == 4): self.level = Level_5(back)
            if (num_level == 5): self.level = Level_6(back)

            return task.done
        else:
            return task.cont
Beispiel #2
0
class Game(DirectObject):
    def __init__(self, background, cursor, pointer):
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        #---------------------------------------------------VARIABLE DECLARATION------------------------------------------------------------------------
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        # Timers
        self.jumpTiming = 0
        self.jumpTime = 0
        self.lastTimeEnergy = 0
        self.energyTimer = None
        
        # Booleans
        self.jumping = False
        self.drawing = False
        self.attacking = False
        self.busy = False       #true if there are some image on screen making note something
        self.isGameOver = False
        
        # Auxiliar calculations
        self.vecX = 0
        self.vecY = 0
        
        # Graphic components
        #Blackboard
        self.blackboard = OnscreenImage(image="./tex/blackboard.png", pos = (0, 0, 0),hpr=None, scale = (1.25,1.0,0.90), color=None, parent=None, sort=0)
        self.blackboard.setTransparency(TransparencyAttrib.MAlpha)
        self.blackboard.hide()
        self.distXPointDraw = 0.0
        self.distYPointDraw = 0.0
        #Level
        self.level = Level_1(background)
        #Main Character
        self.char = CMain(-18,-5,59)
        #Energy Bar
        self.energyBar = BEnergy()
        self.energyBar.increase(50);
        #Life Bar
        self.lifes = BLifes()
        self.lifes.increase(1)
        self.lifes.increase(1)
        self.lifes.increase(1)
        #Special Items Bar
        self.specialItems = BSpecial()
        #Abilies Bar
        self.grainAbility = BAbility("GRAIN")
        self.fruitAbility = BAbility("FRUIT")
        self.milkAbility = BAbility("MILK")
        self.vegetableAbility = BAbility("VEGETABLE")
        self.fishAbility = BAbility("FISH")
        #Info
        self.infError = OnscreenImage(image="./tex/wrong_attack.png", pos = (0.4, 0, 0),hpr=None, scale=(0.47,1.0,0.55), color=None, parent=None, sort=5)
        self.infError.setTransparency(TransparencyAttrib.MAlpha)
        self.infError.hide()
        self.infCereal = OnscreenImage(image="./tex/cereal_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.45, color=None, parent=None, sort=5)
        self.infCereal.setTransparency(TransparencyAttrib.MAlpha)
        self.infCereal.hide()
        self.infCerealError = OnscreenImage(image="./tex/cereal_not_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.45, color=None, parent=None, sort=5)
        self.infCerealError.setTransparency(TransparencyAttrib.MAlpha)
        self.infCerealError.hide()
        self.infFish = OnscreenImage(image="./tex/fish_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.5, color=None, parent=None, sort=5)
        self.infFish.setTransparency(TransparencyAttrib.MAlpha)
        self.infFish.hide()
        self.infFishError = OnscreenImage(image="./tex/fish_not_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.5, color=None, parent=None, sort=5)
        self.infFishError.setTransparency(TransparencyAttrib.MAlpha)
        self.infFishError.hide()
        self.infMilk = OnscreenImage(image="./tex/milk_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.5, color=None, parent=None, sort=5)
        self.infMilk.setTransparency(TransparencyAttrib.MAlpha)
        self.infMilk.hide()
        self.infMilkError = OnscreenImage(image="./tex/milk_not_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.5, color=None, parent=None, sort=5)
        self.infMilkError.setTransparency(TransparencyAttrib.MAlpha)
        self.infMilkError.hide()
        self.infVege = OnscreenImage(image="./tex/vege_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.4, color=None, parent=None, sort=5)
        self.infVege.setTransparency(TransparencyAttrib.MAlpha)
        self.infVege.hide()
        self.infVegeError = OnscreenImage(image="./tex/vege_not_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.4, color=None, parent=None, sort=5)
        self.infVegeError.setTransparency(TransparencyAttrib.MAlpha)
        self.infVegeError.hide()
        self.infFruit = OnscreenImage(image="./tex/fruit_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.4, color=None, parent=None, sort=5)
        self.infFruit.setTransparency(TransparencyAttrib.MAlpha)
        self.infFruit.hide()
        self.infFruitError = OnscreenImage(image="./tex/fruit_not_attack.png", pos = (0.4, 0, 0),hpr=None, scale=0.4, color=None, parent=None, sort=5)
        self.infFruitError.setTransparency(TransparencyAttrib.MAlpha)
        self.infFruitError.hide()
        #Logo
        self.logo = OnscreenImage(image="./tex/laSalleAlpha.png", pos = (1.05, 0, -0.85),hpr=None, scale=(0.22,1.0,0.075), color=None, parent=None, sort=5)
        self.logo.setTransparency(TransparencyAttrib.MAlpha)
        
        # Sounds
        self.winMusic = base.loadMusic('./sound/win.wav')
        self.winMusic.setVolume(.5)
        self.winMusic.setLoopCount(1)
        self.gameOverMusic = base.loadMusic('./sound/lose.wav')
        self.gameOverMusic.setVolume(.5)
        self.gameOverMusic.setLoopCount(1)
        self.allSpecial = base.loadSfx('./sound/win_mysterious.wav')
        self.allSpecial.setVolume(.7)
        self.allSpecialPlayed = False
                        
        # Others
        self.type = "NONE"
        self.gameover = None
        self.gameActive = True
        
        #-----------------------------------------------------------------------------------------------------------------------------------------------
        #----------------------------------------------------------------GAME INIT----------------------------------------------------------------------
        #-----------------------------------------------------------------------------------------------------------------------------------------------        
        # Glove gestures configuration
        self.cursor = cursor
        self.gestureHandler = GestureRecognition("Gesture_Handler", 
                                                 [("1",0), ("2",0), ("3",0), ("4",0), ("6",0), ("7",0), ("8",0), ("9",0),                               #NONE
                                                  ("12",0), ("13",0), ("16",0), ("18",0), ("17",0), ("14",0),                                           #NONE
                                                  ("23",0), ("26",0), ("29",0), ("27",0), ("24",0), ("21",0),                                           #NONE
                                                  ("36",0), ("39",0), ("38",0), ("34",0), ("31",0), ("32",0),                                           #NONE
                                                  ("41",0), ("42",0), ("43",0), ("49",0), ("48",0), ("47",0),                                           #NONE
                                                  ("69",0), ("68",0), ("67",0), ("61",0), ("62",0), ("63",0),                                           #NONE
                                                  ("74",0), ("71",0), ("72",0), ("76",0), ("79",0), ("78",0),                                           #NONE
                                                  ("87",0), ("84",0), ("81",0), ("83",0), ("86",0), ("89",0),                                           #NONE
                                                  ("98",0), ("97",0), ("94",0), ("92",0), ("93",0), ("96",0),                                           #NONE
                                                  ("93934",1),                                                                                          #FRUIT
                                                  ("7624",2),                                                                                           #MILK
                                                  ("67616",3),                                                                                          #VEGETABLE
                                                  ("183",4),                                                                                            #FISH
                                                  ("3434",5)],                                                                                          #CEREAL
                                                 self.cursor, True, 1, 0, 0)
                                                 
        self.accept("Gesture_Handler", self.gestureProcessing)
        
        # Cursor init
        self.pointer = pointer
        
        # Start tasks
        taskMgr.add(self.taskMove, 'taskMove')
        taskMgr.add(self.taskCollision, 'taskCollision' )
        taskMgr.add(self.taskEnergy, 'taskEnergy' )
        taskMgr.add(self.taskLevels, 'taskLevels')
    
        # Events declaration
        self.accept("WM_BUTTON_PRESSED", self.handleBtnPress)
        self.accept("WM_BUTTON_RELEASED", self.handleBtnRelease)
        
    #end __init__
        
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    #----------------------------------------------------------------FUNCTIONS----------------------------------------------------------------------
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    # Called when we start drawing, set ready the drawing interface  
    def showBlackboard(self):
        if self.char.attacking == False:
            # There isn't another character attack on course        
            if self.busy == False:
                # The screen is empty of sprites information, like abilty attacks
                self.drawing = True
                
                self.blackboard.show()
                self.specialItems.hide()
                self.char.walking = False
                self.energyBar.hide()
                self.lifes.hide()
                
                taskMgr.remove('taskMove')
                
                # Stop the enemies
                for x in self.level.enemies:
                    x.stopEnemy(True)
    #end showBlackboard
    
    # It hides the blackboard and makes appear the disappeared elements
    def hideBlackboard(self):
        self.drawing = False
        self.blackboard.hide()
        self.specialItems.show()
        self.char.walking = True
        self.energyBar.show()
        self.lifes.show()
        self.infError.hide()
        self.infCereal.hide()
        self.infCerealError.hide()
        self.infFish.hide()
        self.infFishError.hide()
        self.infMilk.hide()
        self.infMilkError.hide()
        self.infVege.hide()
        self.infVegeError.hide()
        self.infFruit.hide()
        self.infFruitError.hide()
    #end hideBlackboard
    
    # It stops drawing
    def stopAttack(self):
        if self.char.attacking == False:
            if self.busy == False:
                self.gestureHandler.endGesture()
    #end stopAttack
    
    # WiiMote button pressed handler
    def handleBtnPress(self, btn, dev, index):
        if(index == 1):
            if(btn == wiiuse.BUTTON_A):
                if(self.gameActive == True):
                    if self.drawing == True:        
                        if self.busy == False:  self.gestureHandler.beginGesture()
    #end handleBrnPress
    
    # WiiMote button released handler
    def handleBtnRelease(self, btn, dev, index):
        if(index == 1):
            if(btn == wiiuse.BUTTON_A):
                if(self.gameActive == True):
                    if self.drawing == True:        self.stopAttack()
                    else:                           self.showBlackboard()
    #end handleBtnRelease
    
    # Identify the information drawed on drawing process and if this is well drawed and we have enough ability power prepare's the attack.
    def gestureProcessing(self, id, x, y):
        if(self.gameActive == True):  
            #------------------------------------------------------------------FRUIT---------------------------------------------------------------------
            if id==1:
                if self.char.power[1] < 1:
                    self.infFruitError.show()
                else:
                    self.infFruit.show()
                    self.char.power[1] = self.char.power[1] - 1
                    self.fruitAbility.powerUsed(1);
                    self.attacking = True
                    self.type="FRUIT"
                    
            #------------------------------------------------------------------MILK----------------------------------------------------------------------
            elif id==2:
                if self.char.power[2] < 1:
                    self.infMilkError.show()
                else:
                    self.infMilk.show()
                    self.char.power[2] = self.char.power[2] - 1
                    self.milkAbility.powerUsed(1);
                    self.attacking = True
                    self.type="MILK"
            
            #---------------------------------------------------------------VEGETABLE-------------------------------------------------------------------
            elif id==3:
                if self.char.power[3] < 1:
                    self.infVegeError.show()
                else:
                    self.infVege.show()
                    self.char.power[3] = self.char.power[3] - 1
                    self.vegetableAbility.powerUsed(1);
                    self.attacking = True
                    self.type="VEGETABLE"
                    
            #------------------------------------------------------------------FISH---------------------------------------------------------------------
            elif id==4:
                if self.char.power[4] < 1:
                    self.infFishError.show()
                else:
                    self.infFish.show()
                    self.char.power[4] = self.char.power[4] - 1
                    self.fishAbility.powerUsed(1);
                    self.attacking = True
                    self.type="FISH"
                    
            #----------------------------------------------------------------CEREAL--------------------------------------------------------------------
            elif id==5:
                if self.char.power[0] < 1:
                   self.infCerealError.show() 
                else:
                    self.infCereal.show()
                    self.char.power[0] = self.char.power[0] - 1
                    self.grainAbility.powerUsed(1);
                    self.attacking = True
                    self.type="GRAIN"
                    
            #------------------------------------------------------------------NONE-------------------------------------------------------------------
            else:
                self.infError.show()
            
            #Shows on the screen the result of the drawing process
            taskMgr.add(self.taskSpriteAttack, 'taskSpriteAttack' )
            self.busy = True
            self.gestureHandler.clearGestures();
    #end gestureProcessing
    
    # Process the damage for the character
    def damage(self):
            self.char.life = self.char.life - 1
            if self.char.life >= 0:
                    self.char.soundDamage.play()
                    self.lifes.decrease(1)
                    self.char.setInvincible(True)
                    if self.char.life <= 0:
                            self.setGameOver()
    #end damage
    
    # Configures the game for Game Over process
    def setGameOver(self):
        self.gameover = OnscreenImage(image="./tex/gameover.png", pos = (0, 0, 0),hpr=None, scale = (1.4,1.0,1.0), color=None, parent=None, sort=30)
        self.isGameOver = True
        self.gameOverMusic.play()
        self.level.state = 2
        self.level.removeAll()
        taskMgr.remove('taskLevel')
        taskMgr.remove('taskLevels')
        taskMgr.remove('taskMove')
        taskMgr.add(self.taskChangeLevel, 'taskChangeLevel')
        self.energyBar.hide()
        self.specialItems.hide()
        self.grainAbility.hide()
        self.fruitAbility.hide()
        self.milkAbility.hide()
        self.vegetableAbility.hide()
        self.fishAbility.hide()
        self.lifes.hide()
    #end setGameOver
    
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    #----------------------------------------------------------------TASKS,THREADS------------------------------------------------------------------
    #-----------------------------------------------------------------------------------------------------------------------------------------------
    # It moves the main character to the sun pointer point.
    def taskMove(self, task):
        mpos = self.cursor.getCursorPos()
        if(self.drawing == False):
            # We're not drawing.
            if(self.level.movingBackground != False):
                # We're on a transition sequence
                self.level.moveBackground(mpos.getX(),mpos.getY())
        
            # Moving the main character
            self.char.movement(mpos.getX(),mpos.getY())
        
        # We have all special items
        if( (self.specialItems.hasAllSpecial() == True) and (self.allSpecialPlayed == False) ):
            self.allSpecial.play()
            self.allSpecialPlayed = True
            self.lifes.increase(1)
            self.char.life = self.char.life + 1
        
        # We're run out of energy
        if self.energyBar.amount <= 0:
            self.setGameOver()
            
        return task.cont
    #end taskCursor
    
    # It holds ability's information on screen for 1 second and then throws the attack to the enemy.
    def taskSpriteAttack(self, task):
        if task.time>1:            
            # Making disappear the sprite information attack
            self.hideBlackboard()
            
            if self.attacking == True:
                # If we draw correctly and we have the correct power item
                self.att = Attack(self.type,"-",self.level.enemies,self.char)
                self.attacking = False
                self.char.attacking = True
                
            self.busy = False
            
            # Making move the enemies again
            for x in self.level.enemies:
                x.stopEnemy(False)
            
            # Making move the character again
            taskMgr.add(self.taskMove, 'taskMove')
            return task.done
        else:
            return task.cont
    #end taskAttack
    
    # It checks Character-Item, Character-Enemy, Character-Enemy Attack and Enemy-Character Attack collision every frame.
    def taskCollision(self, task):
        if self.isGameOver == True: return task.done
        else:
            #Character-Item collision
            for x in self.level.items:
                if x.collide(self.char):
                    self.char.itemCollect(x)
                    self.level.items.remove(x)
                    x.posX = -100
                    x.model.setX(x.posX)
                    x.posY = -100
                    x.model.setZ(x.posY)
                    x.collectIt = True
                    
                    self.energyBar.increase(x.energy)
                    
                    if x.specialItem==True: self.specialItems.itemCollected(x.type)
                    
                    #Abilites bar
                    if x.type == "GRAIN":
                        self.grainAbility.itemCollected(1)
                    if x.type == "FRUIT":
                        self.fruitAbility.itemCollected(1)
                    if x.type == "MILK":
                        self.milkAbility.itemCollected(1)
                    if x.type == "VEGETABLE":
                        self.vegetableAbility.itemCollected(1)
                    if x.type == "FISH":
                        self.fishAbility.itemCollected(1)
            
            #Character-Enemy collision, Character-Enemy Attack collision
            for x in self.level.enemies:
                if x.collide(self.char):
                    if self.char.isInvincible == False:
                        self.damage()
                                
                if x.attacking == True:
                    if x.att.char_enAttCollide(self.char):
                        if self.char.isInvincible == True:
                            if x.att.isexploding == False:
                                x.att.destroyAttack()
                        else:
                            if( x.att != None ):
                                x.att.explode()
                            self.damage()
                                
            #Enemy-Character Attack collision
            if self.char.attacking == True:
                for x in self.level.enemies:
                    if self.att.en_charAttCollide(x)==True:
                        x.life = x.life - 1
                        self.level.enemies.remove(x)
                        self.att.destroyAttack()
           
            return task.cont
    #end taskCollision
    
    # It decreases character energy every frame, only when he's moving over the screen.
    def taskEnergy(self, task):
        if self.isGameOver == True: 
            return task.done
        else:
            if self.char.walking:
                if (task.time-self.lastTimeEnergy) > 1: 
                    self.lastTimeEnergy = task.time
                    self.energyBar.decrease(3)
            else:
                if (task.time-self.lastTimeEnergy) > 1: 
                    self.lastTimeEnergy = task.time
                    self.energyBar.decrease(1)
            return task.cont
    #end taskEnergy
    
    # It waits for a level finalization (YOU WIN) and prepares the application for the next level
    def taskLevels(self, task):
        if self.level.state == 1:
            taskMgr.add(self.taskChangeLevel, 'taskChangeLevel')
            self.winMusic.play()
            self.level.state = 2
        return task.cont
    #end taskLevels
    
    # It change the level.
    # The next level if the user has won the game or a reinit if it is a game over.
    def taskChangeLevel(self, task):
        if(task.time > 4.0):
            if( self.isGameOver == True ):      self.gameover.hide()
            else:                               self.level.hideLevel()
            
            back = self.level.back
            
            if( self.isGameOver == True ):      num_level = 0
            else:                               num_level = self.level.num_level
            
            self.level = None
            
            self.grainAbility.setEmpty()
            self.fruitAbility.setEmpty()
            self.milkAbility.setEmpty()
            self.vegetableAbility.setEmpty()
            self.fishAbility.setEmpty()
            
            self.char.power[0] = 0
            self.char.power[1] = 0
            self.char.power[2] = 0
            self.char.power[3] = 0
            self.char.power[4] = 0
            
            if( self.isGameOver == False ): self.specialItems.reInit()
            self.allSpecialPlayed = False
            
            if(num_level == 0):
                self.char.model.hide()
                self.gameActive = False
                Game(back,self.cursor,self.pointer)
            if(num_level == 1): self.level = Level_2(back)
            if(num_level == 2): self.level = Level_3(back)
            if(num_level == 3): self.level = Level_4(back)
            if(num_level == 4): self.level = Level_5(back)
            if(num_level == 5): self.level = Level_6(back)

            return task.done
        else:
            return task.cont
    #end taskChangeLevel