"""example of hud over scrolling world
important note: use cocos svn 863+ for this, cocos 0.3.0 release will
malfunction for this (at least in 4:3 screen resolutions)
"""
from cocos.director import director
from cocos.layer import *
from cocos.scene import *
from cocos.sprite import Sprite
import pyglet
from pyglet.gl import *
from pyglet.window import key

view_width = 640
view_height = 480


class HUD(Layer):
    def __init__( self ):
        super( HUD, self).__init__()
        #dummy parts of hud, you probably want Label , etc
        w,h = director.get_window_size()
        e = ColorLayer(0,255,0,128,width=w/4,height=h/24)
        e.position = (w/10,h/24)
        self.add( e )

        e = ColorLayer(255,0,0,128,width=w/4,height=h/24)
        e.position = (w-e.width-w/10,h/24)
        self.add( e )

class WorldView(Layer):
    is_event_handler = True
    def __init__(self):
        super( WorldView, self).__init__()
        print 'x,y:',self.x,self.y

        self.world_width = world_width = 2*view_width
        self.world_height = world_height = 2*view_height

        #dummy objects in the world: a big framed background and squares
        bg = ColorLayer(170,170,0,255,width=world_width, height=world_height)
        self.add(bg)
        margin = int(world_width*0.01); print 'margin',margin
        bg = ColorLayer(0,170,170,255,width=world_width-2*margin,height=world_height-2*margin)
        bg.position = (margin,margin)
        self.add(bg)
        
        aw = world_width/20 #actor width
        for y in xrange(aw,world_height,2*aw):
            for x in xrange(aw,world_width,2*aw):
                red = 55+int(200.0*x/world_width)
                blue = 55+int(200.0*y/world_height)
                actor = ColorLayer( red, 0, blue, 255, width = aw, height = aw)
                actor.position = x,y
                self.add(actor)

        self.player = Sprite( 'grossinis_sister1.png' )
        self.player.position = (200,200)
        self.add(self.player)
        self.update_camera_pos(self.player.position)

        self.bindings = { #key constant : button name
            key.LEFT:'left',
            key.RIGHT:'right',
            key.UP:'up',
            key.DOWN:'down',
            key.PLUS:'zoomin',
            key.MINUS:'zoomout'
            }
        self.buttons = { #button name : current value, 0 not pressed, 1 pressed
            'left':0,
            'right':0,
            'up':0,
            'down':0,
            'zoomin':0,
            'zoomout':0
            }
        self.schedule(self.step)

    def update_camera_pos(self, (center_x,center_y)):
          x, y = director.get_window_size()
          self.x = -center_x + x/2
          self.y = -center_y + y/2
          self.transform_anchor_x = center_x 
          self.transform_anchor_y = center_y

    #tracking of keys : keys updates self.buttons, model uses buttons
    def on_key_press(self, k, m ):
        binds = self.bindings
        if k in binds:
            self.buttons[binds[k]] = 1
            return True
        return False

    def on_key_release(self, k, m ):
        binds = self.bindings
        if k in binds:
            self.buttons[binds[k]] = 0
            return True
        return False

    def step( self, dt ):
        if self.buttons['up']:
            y0 = self.player.y
            y0 = min(y0+10,self.world_height-self.player.height/2)
            self.player.y = y0            
            self.update_camera_pos(self.player.position)
        if self.buttons['down']:
            y0 = self.player.y
            y0 = max(y0-10,self.player.height/2)
            self.player.y = y0
            self.update_camera_pos(self.player.position)
        if self.buttons['left']:
            x0 = self.player.x
            x0 = max(x0-10,self.player.width/2)
            self.player.x = x0
            self.update_camera_pos(self.player.position)
        if self.buttons['right']:
            x0 = self.player.x
            x0 = min(x0+10,self.world_width-self.player.width/2)
            self.player.x = x0
            self.update_camera_pos(self.player.position)
        if self.buttons['zoomin']:
            self.scale = min(self.scale*1.10,2.0)
        if self.buttons['zoomout']:
            self.scale = max(self.scale*0.9,0.5)
        

director.init(view_width, view_height, resizable=False)
scene = Scene()
hud_layer = HUD()
world_layer = WorldView() #this allow to wiew 800 world units
scene.add(hud_layer,z=1)
scene.add(world_layer,z=0)
director.run(scene)


        
