void LHParallax::visit(Renderer *renderer, const Mat4& parentTransform, bool parentTransformUpdated)
#endif
{
    visitActiveAnimation();
    transformLayerPositions();

    if(renderer)
    {
#if COCOS2D_VERSION >= 0x00030200
        Node::visit(renderer, parentTransform, parentFlags);
#else
        Node::visit(renderer, parentTransform, parentTransformUpdated);
#endif
    }
}
예제 #2
0
void LHShape::visit(Renderer *renderer, const Mat4& parentTransform, bool parentTransformUpdated)
#endif
{
    visitPhysicsProtocol();
    visitActiveAnimation();
    
    if(renderer)
    {
#if COCOS2D_VERSION >= 0x00030200
        Node::visit(renderer, parentTransform, parentFlags);
#else
        Node::visit(renderer, parentTransform, parentTransformUpdated);
#endif
    }
}
예제 #3
0
void LHCamera::performVisit()
{
    if(!isActive())return;
    
    
    Node* followed = this->followedNode();
    if(followed){
        
        LHScene* scene = (LHScene*)this->getScene();
        Size winSize = scene->getContentSize();
        
        Point curPosition = followed->getPosition();
        
        if(previousFollowedPosition.equals(Point())){
            previousFollowedPosition = curPosition;
            
            directionalOffset.x = -importantArea.width * winSize.width * 0.5;
            directionalOffset.y = importantArea.height * winSize.height * 0.5;
        }
        
        if(!curPosition.equals(previousFollowedPosition))
        {
            Point direction = curPosition - previousFollowedPosition;// ccpSub(curPosition,previousFollowedPosition);
            
            if(previousFollowedPosition.equals(Point())){
                previousDirectionVector = direction;
            }
            
            float followedDeltaX = curPosition.x - previousFollowedPosition.x;
            float followedDeltaY = curPosition.y - previousFollowedPosition.y;
            
            float filteringFactor = 0.50;
            
            
            if(reachingOffsetX)
            {
                float lastOffset = directionalOffset.x;
                
                directionalOffset.x += followedDeltaX;
                
                if(smoothMovement)
                    directionalOffset.x = directionalOffset.x * filteringFactor + lastOffset * (1.0 - filteringFactor);
                
                if(directionMultiplierX > 0)
                {
                    if(directionalOffset.x  < directionalOffsetToReach.x)
                    {
                        directionalOffset.x = directionalOffsetToReach.x;
                        reachingOffsetX = false;
                    }
                }
                else
                {
                    if(directionalOffset.x > directionalOffsetToReach.x)
                    {
                        directionalOffset.x = directionalOffsetToReach.x;
                        reachingOffsetX = false;
                    }
                }
            }
            
            if(direction.x/previousDirectionVector.x <= 0 || (direction.x == 0 && previousDirectionVector.x == 0))
            {
                if(direction.x >= 0){
                    directionMultiplierX = -1.0f;
                }
                else{
                    directionMultiplierX = 1.0f;
                }
                
                directionalOffsetToReach.x = -importantArea.width * winSize.width * 0.5 * directionMultiplierX;
                reachingOffsetX = true;
            }
            
            
            if(reachingOffsetY)
            {
                float lastOffset = directionalOffset.y;
                directionalOffset.y += followedDeltaY;
                
                if(smoothMovement)
                    directionalOffset.y = directionalOffset.y * filteringFactor + lastOffset * (1.0 - filteringFactor);
                
                if(directionMultiplierY > 0)
                {
                    if(directionalOffset.y  > directionalOffsetToReach.y)
                    {
                        directionalOffset.y = directionalOffsetToReach.y;
                        reachingOffsetY = false;
                    }
                }
                else
                {
                    if(directionalOffset.y < directionalOffsetToReach.y)
                    {
                        directionalOffset.y = directionalOffsetToReach.y;
                        reachingOffsetY = false;
                    }
                }
            }
            
            
            if(direction.y/previousDirectionVector.y <= 0 || (direction.y == 0 && previousDirectionVector.y == 0))
            {
                if(direction.y >= 0){
                    directionMultiplierY = 1.0f;
                }
                else{
                    directionMultiplierY = -1.0f;
                }
                
                directionalOffsetToReach.y = importantArea.height * winSize.height * 0.5 * directionMultiplierY;
                
                reachingOffsetY = true;
            }
            
            previousDirectionVector = direction;
        }
        
        
        previousFollowedPosition = curPosition;
    }
    
    
    visitActiveAnimation();
    
    if(followedNode()){
        Point pt = transformToRestrictivePosition(followedNode()->getPosition());
        setPosition(pt);
    }
    setSceneView();
}