mirror of https://github.com/axmolengine/axmol.git
337 lines
9.6 KiB
C
337 lines
9.6 KiB
C
|
//
|
||
|
// SWScrollView.h
|
||
|
// SWGameLib
|
||
|
//
|
||
|
// Copyright (c) 2010-2012 cocos2d-x.org
|
||
|
// Copyright (c) 2010 Sangwoo Im
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
// of this software and associated documentation files (the "Software"), to deal
|
||
|
// in the Software without restriction, including without limitation the rights
|
||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
|
// copies of the Software, and to permit persons to whom the Software is
|
||
|
// furnished to do so, subject to the following conditions:
|
||
|
//
|
||
|
// The above copyright notice and this permission notice shall be included in
|
||
|
// all copies or substantial portions of the Software.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||
|
// THE SOFTWARE.
|
||
|
//
|
||
|
//
|
||
|
// Created by Sangwoo Im on 6/3/10.
|
||
|
// Copyright 2010 Sangwoo Im. All rights reserved.
|
||
|
//
|
||
|
|
||
|
#ifndef __CCSCROLLVIEW_H__
|
||
|
#define __CCSCROLLVIEW_H__
|
||
|
|
||
|
#include "CCLayer.h"
|
||
|
|
||
|
NS_CC_EXT_BEGIN
|
||
|
|
||
|
typedef enum {
|
||
|
CCScrollViewDirectionHorizontal = 0,
|
||
|
CCScrollViewDirectionVertical,
|
||
|
CCScrollViewDirectionBoth
|
||
|
} CCScrollViewDirection;
|
||
|
|
||
|
class CCScrollView;
|
||
|
|
||
|
class CC_DLL CCScrollViewDelegate
|
||
|
{
|
||
|
public:
|
||
|
virtual ~CCScrollViewDelegate() {}
|
||
|
virtual void scrollViewDidScroll(CCScrollView* view) = 0;
|
||
|
virtual void scrollViewDidZoom(CCScrollView* view) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* ScrollView support for cocos2d for iphone.
|
||
|
* It provides scroll view functionalities to cocos2d projects natively.
|
||
|
*/
|
||
|
class CC_DLL CCScrollView : public CCLayer
|
||
|
{
|
||
|
public:
|
||
|
CCScrollView();
|
||
|
virtual ~CCScrollView();
|
||
|
|
||
|
bool init();
|
||
|
virtual void registerWithTouchDispatcher();
|
||
|
/**
|
||
|
* Returns an autoreleased scroll view object.
|
||
|
* @warning: This interface will be deprecated in future.
|
||
|
* @param size view size
|
||
|
* @param container parent object
|
||
|
* @return autoreleased scroll view object
|
||
|
*/
|
||
|
static CCScrollView* viewWithViewSize(CCSize size, CCNode* container = NULL);
|
||
|
|
||
|
/**
|
||
|
* Returns an autoreleased scroll view object.
|
||
|
*
|
||
|
* @param size view size
|
||
|
* @param container parent object
|
||
|
* @return autoreleased scroll view object
|
||
|
*/
|
||
|
static CCScrollView* create(CCSize size, CCNode* container = NULL);
|
||
|
|
||
|
/**
|
||
|
* Returns an autoreleased scroll view object.
|
||
|
* @warning: This interface will be deprecated in future.
|
||
|
* @param size view size
|
||
|
* @param container parent object
|
||
|
* @return autoreleased scroll view object
|
||
|
*/
|
||
|
static CCScrollView* node();
|
||
|
|
||
|
/**
|
||
|
* Returns an autoreleased scroll view object.
|
||
|
*
|
||
|
* @param size view size
|
||
|
* @param container parent object
|
||
|
* @return autoreleased scroll view object
|
||
|
*/
|
||
|
static CCScrollView* create();
|
||
|
|
||
|
/**
|
||
|
* Returns a scroll view object
|
||
|
*
|
||
|
* @param size view size
|
||
|
* @param container parent object
|
||
|
* @return scroll view object
|
||
|
*/
|
||
|
bool initWithViewSize(CCSize size, CCNode* container = NULL);
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Sets a new content offset. It ignores max/min offset. It just sets what's given. (just like UIKit's UIScrollView)
|
||
|
*
|
||
|
* @param offset new offset
|
||
|
* @param If YES, the view scrolls to the new offset
|
||
|
*/
|
||
|
void setContentOffset(CCPoint offset, bool animated = false);
|
||
|
CCPoint getContentOffset();
|
||
|
/**
|
||
|
* Sets a new content offset. It ignores max/min offset. It just sets what's given. (just like UIKit's UIScrollView)
|
||
|
* You can override the animation duration with this method.
|
||
|
*
|
||
|
* @param offset new offset
|
||
|
* @param animation duration
|
||
|
*/
|
||
|
void setContentOffsetInDuration(CCPoint offset, float dt);
|
||
|
|
||
|
void setZoomScale(float s);
|
||
|
/**
|
||
|
* Sets a new scale and does that for a predefined duration.
|
||
|
*
|
||
|
* @param s a new scale vale
|
||
|
* @param animated if YES, scaling is animated
|
||
|
*/
|
||
|
void setZoomScale(float s, bool animated);
|
||
|
|
||
|
CCFloat getZoomScale();
|
||
|
|
||
|
/**
|
||
|
* Sets a new scale for container in a given duration.
|
||
|
*
|
||
|
* @param s a new scale value
|
||
|
* @param animation duration
|
||
|
*/
|
||
|
void setZoomScaleInDuration(float s, float dt);
|
||
|
/**
|
||
|
* Returns the current container's minimum offset. You may want this while you animate scrolling by yourself
|
||
|
*/
|
||
|
CCPoint minContainerOffset();
|
||
|
/**
|
||
|
* Returns the current container's maximum offset. You may want this while you animate scrolling by yourself
|
||
|
*/
|
||
|
CCPoint maxContainerOffset();
|
||
|
/**
|
||
|
* Determines if a given node's bounding box is in visible bounds
|
||
|
*
|
||
|
* @return YES if it is in visible bounds
|
||
|
*/
|
||
|
bool isNodeVisible(CCNode * node);
|
||
|
/**
|
||
|
* Provided to make scroll view compatible with SWLayer's pause method
|
||
|
*/
|
||
|
void pause(CCObject* sender);
|
||
|
/**
|
||
|
* Provided to make scroll view compatible with SWLayer's resume method
|
||
|
*/
|
||
|
void resume(CCObject* sender);
|
||
|
|
||
|
|
||
|
bool isDragging() {return m_bDragging;}
|
||
|
bool isTouchMoved() { return m_bTouchMoved; }
|
||
|
bool isBounceable() { return m_bBounceable; }
|
||
|
void setBounceable(bool bBounceable) { m_bBounceable = bBounceable; }
|
||
|
|
||
|
/**
|
||
|
* direction allowed to scroll. CCScrollViewDirectionBoth by default.
|
||
|
*/
|
||
|
CCScrollViewDirection getDirection() { return m_eDirection; }
|
||
|
void setDirection(CCScrollViewDirection eDirection) { m_eDirection = eDirection; }
|
||
|
|
||
|
CCScrollViewDelegate* getDelegate() { return m_pDelegate; }
|
||
|
void setDelegate(CCScrollViewDelegate* pDelegate) { m_pDelegate = pDelegate; }
|
||
|
|
||
|
/** override functions */
|
||
|
// optional
|
||
|
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
|
||
|
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
|
||
|
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
|
||
|
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
|
||
|
|
||
|
virtual void setContentSize(CCSize size);
|
||
|
virtual CCSize getContentSize();
|
||
|
|
||
|
/**
|
||
|
* Determines whether it clips its children or not.
|
||
|
*/
|
||
|
bool isClippingToBounds() { return m_bClippingToBounds; }
|
||
|
void setClippingToBounds(bool bClippingToBounds) { m_bClippingToBounds = bClippingToBounds; }
|
||
|
|
||
|
virtual void visit();
|
||
|
virtual void addChild(CCNode * child, int zOrder, int tag);
|
||
|
virtual void addChild(CCNode * child, int zOrder);
|
||
|
virtual void addChild(CCNode * child);
|
||
|
void setTouchEnabled(bool e);
|
||
|
private:
|
||
|
/**
|
||
|
* Init this object with a given size to clip its content.
|
||
|
*
|
||
|
* @param size view size
|
||
|
* @return initialized scroll view object
|
||
|
*/
|
||
|
bool initWithViewSize(CCSize size);
|
||
|
/**
|
||
|
* Relocates the container at the proper offset, in bounds of max/min offsets.
|
||
|
*
|
||
|
* @param animated If YES, relocation is animated
|
||
|
*/
|
||
|
void relocateContainer(bool animated);
|
||
|
/**
|
||
|
* implements auto-scrolling behavior. change SCROLL_DEACCEL_RATE as needed to choose
|
||
|
* deacceleration speed. it must be less than 1.0f.
|
||
|
*
|
||
|
* @param dt delta
|
||
|
*/
|
||
|
void deaccelerateScrolling(float dt);
|
||
|
/**
|
||
|
* This method makes sure auto scrolling causes delegate to invoke its method
|
||
|
*/
|
||
|
void performedAnimatedScroll(float dt);
|
||
|
/**
|
||
|
* Expire animated scroll delegate calls
|
||
|
*/
|
||
|
void stoppedAnimatedScroll(CCNode* node);
|
||
|
/**
|
||
|
* clip this view so that outside of the visible bounds can be hidden.
|
||
|
*/
|
||
|
void beforeDraw();
|
||
|
/**
|
||
|
* retract what's done in beforeDraw so that there's no side effect to
|
||
|
* other nodes.
|
||
|
*/
|
||
|
void afterDraw();
|
||
|
/**
|
||
|
* Zoom handling
|
||
|
*/
|
||
|
void handleZoom();
|
||
|
|
||
|
protected:
|
||
|
/**
|
||
|
* current zoom scale
|
||
|
*/
|
||
|
CCFloat m_fZoomScale;
|
||
|
/**
|
||
|
* min zoom scale
|
||
|
*/
|
||
|
CCFloat m_fMinZoomScale;
|
||
|
/**
|
||
|
* max zoom scale
|
||
|
*/
|
||
|
CCFloat m_fMaxZoomScale;
|
||
|
/**
|
||
|
* scroll view delegate
|
||
|
*/
|
||
|
CCScrollViewDelegate* m_pDelegate;
|
||
|
|
||
|
CCScrollViewDirection m_eDirection;
|
||
|
/**
|
||
|
* If YES, the view is being dragged.
|
||
|
*/
|
||
|
bool m_bDragging;
|
||
|
|
||
|
/**
|
||
|
* Content offset. Note that left-bottom point is the origin
|
||
|
*/
|
||
|
CCPoint m_tContentOffset;
|
||
|
|
||
|
/**
|
||
|
* Container holds scroll view contents, Sets the scrollable container object of the scroll view
|
||
|
*/
|
||
|
CCNode* m_pContainer;
|
||
|
/**
|
||
|
* Determiens whether user touch is moved after begin phase.
|
||
|
*/
|
||
|
bool m_bTouchMoved;
|
||
|
/**
|
||
|
* max inset point to limit scrolling by touch
|
||
|
*/
|
||
|
CCPoint m_fMaxInset;
|
||
|
/**
|
||
|
* min inset point to limit scrolling by touch
|
||
|
*/
|
||
|
CCPoint m_fMinInset;
|
||
|
/**
|
||
|
* Determines whether the scroll view is allowed to bounce or not.
|
||
|
*/
|
||
|
bool m_bBounceable;
|
||
|
|
||
|
bool m_bClippingToBounds;
|
||
|
|
||
|
/**
|
||
|
* scroll speed
|
||
|
*/
|
||
|
CCPoint m_tScrollDistance;
|
||
|
/**
|
||
|
* Touch point
|
||
|
*/
|
||
|
CCPoint m_tTouchPoint;
|
||
|
/**
|
||
|
* length between two fingers
|
||
|
*/
|
||
|
CCFloat m_fTouchLength;
|
||
|
/**
|
||
|
* UITouch objects to detect multitouch
|
||
|
*/
|
||
|
CCArray* m_pTouches;
|
||
|
/**
|
||
|
* size to clip. CCNode boundingBox uses contentSize directly.
|
||
|
* It's semantically different what it actually means to common scroll views.
|
||
|
* Hence, this scroll view will use a separate size property.
|
||
|
*/
|
||
|
CCSize m_tViewSize;
|
||
|
public:
|
||
|
CCSize getViewSize() { return m_tViewSize; }
|
||
|
void setViewSize(CCSize size);
|
||
|
protected:
|
||
|
/**
|
||
|
* max and min scale
|
||
|
*/
|
||
|
CCFloat m_fMinScale, m_fMaxScale;
|
||
|
};
|
||
|
|
||
|
NS_CC_EXT_END
|
||
|
|
||
|
#endif /* __CCSCROLLVIEW_H__ */
|