Browse Source

fixed different scale used for building TextField and isOn check

dmuratshin 9 năm trước cách đây
mục cha
commit
5c8736a9c9

+ 10 - 2
oxygine/src/Actor.cpp

@@ -418,12 +418,19 @@ namespace oxygine
         }
 
         Vector2 originalLocalPos;
+        float originalLocalScale;
 
         if (touchEvent)
         {
             TouchEvent* me = safeCast<TouchEvent*>(event);
             originalLocalPos = me->localPosition;
+            originalLocalScale = me->__localScale;
             me->localPosition = parent2local(originalLocalPos);
+            me->__localScale *= _transform.a;
+            if (me->__localScale == NAN)
+            {
+                OX_ASSERT(0);
+            }
         }
 
         event->phase = Event::phase_capturing;
@@ -443,7 +450,7 @@ namespace oxygine
             TouchEvent* me = safeCast<TouchEvent*>(event);
             if (!event->target)
             {
-                if ((_flags & flag_touchEnabled) && isOn(me->localPosition))
+                if ((_flags & flag_touchEnabled) && isOn(me->localPosition, me->__localScale))
                 {
                     event->phase = Event::phase_target;
                     event->target = this;
@@ -454,6 +461,7 @@ namespace oxygine
             }
 
             me->localPosition = originalLocalPos;
+            me->__localScale = originalLocalScale;
         }
     }
 
@@ -756,7 +764,7 @@ namespace oxygine
         const_cast<Actor*>(this)->transformUpdated();
     }
 
-    bool Actor::isOn(const Vector2& localPosition)
+    bool Actor::isOn(const Vector2& localPosition, float localScale)
     {
         RectF r = getDestRect();
         r.expand(Vector2(_extendedIsOn, _extendedIsOn), Vector2(_extendedIsOn, _extendedIsOn));

+ 1 - 1
oxygine/src/Actor.h

@@ -184,7 +184,7 @@ namespace oxygine
         /**Sets callback which would be called each Actor::render cycle before doRender. Use it if you don't want inherit from Actor and overload Actor::doRender.*/
         //void setCallbackDoRender(RenderCallback cb){_cbDoRender = cb;}
 
-        virtual bool isOn(const Vector2& localPosition);
+        virtual bool isOn(const Vector2& localPosition, float localScale = 1.0f);
         /**Returns true if actor is child or located deeper in current subtree*/
         bool isDescendant(const spActor& actor) const;
 

+ 0 - 5
oxygine/src/Box9Sprite.cpp

@@ -82,11 +82,6 @@ namespace oxygine
         _prepared = false;
     }
 
-    bool Box9Sprite::isOn(const Vector2& localPosition)
-    {
-        return Actor::isOn(localPosition);
-    }
-
     void Box9Sprite::changeAnimFrame(const AnimationFrame& f)
     {
         Vector2 size = getSize();

+ 0 - 2
oxygine/src/Box9Sprite.h

@@ -22,8 +22,6 @@ namespace oxygine
         StretchMode getVerticalMode() const {return _vertMode;}
         StretchMode getHorizontalMode() const {return _horzMode;}
 
-        bool isOn(const Vector2& localPosition);
-
         void setVerticalMode(StretchMode m);
         void setHorizontalMode(StretchMode m);
 

+ 6 - 5
oxygine/src/TextField.cpp

@@ -54,9 +54,9 @@ namespace oxygine
         _textRect = src._textRect;
     }
 
-    bool TextField::isOn(const Vector2& localPosition)
+    bool TextField::isOn(const Vector2& localPosition, float localScale)
     {
-        Rect r = getTextRect();
+        Rect r = getTextRect(localScale);
         r.expand(Point(_extendedIsOn, _extendedIsOn), Point(_extendedIsOn, _extendedIsOn));
         return r.pointIn(Point((int)localPosition.x, (int)localPosition.y));
     }
@@ -288,9 +288,9 @@ namespace oxygine
         return const_cast<TextField*>(this)->getRootNode(_rtscale)->getSymbol(pos);
     }
 
-    const Rect& TextField::getTextRect() const
+    const Rect& TextField::getTextRect(float localScale) const
     {
-        const_cast<TextField*>(this)->getRootNode(_rtscale);
+        const_cast<TextField*>(this)->getRootNode(localScale);
         return _textRect;
     }
 
@@ -306,10 +306,11 @@ namespace oxygine
         if (!_style.font)
             return _root;
 
+
         float scale = 1.0f;
         const Font* font = _style.font->getClosestFont(globalScale, _style.fontSize, scale);
 
-        if ((_flags & flag_rebuild || _rtscale != scale) && _style.font)
+        if ((_flags & flag_rebuild || _rtscale != scale) && font)
         {
             _rtscale = scale;
             //_realFontSize = fontSize;

+ 2 - 2
oxygine/src/TextField.h

@@ -24,7 +24,7 @@ namespace oxygine
         /**Returns current text style*/
         const TextStyle&            getStyle() const {return _style;}
         /**Returns text bounds*/
-        const Rect&                 getTextRect() const;
+        const Rect&                 getTextRect(float localScale = 1.0f) const;
         /**Returns current text*/
         const std::string&          getText() const { return _text; }
         const ResFont*              getFont() const;
@@ -92,7 +92,7 @@ namespace oxygine
         void setHtmlText(const std::string& str);
         void setHtmlText(const std::wstring& str);
 
-        bool isOn(const Vector2& localPosition);
+        bool isOn(const Vector2& localPosition, float localScale = 1.0f) OVERRIDE;
 
 
         typedef Property<Color, const Color&, TextField, &TextField::getOutlineColor, &TextField::setOutlineColor>  TweenOutlineColor;

+ 3 - 1
oxygine/src/TouchEvent.h

@@ -25,7 +25,7 @@ namespace oxygine
         };
 
 
-        TouchEvent(eventType type, bool Bubbles = true, const Vector2& locPosition = Vector2(0, 0)) : Event(type, Bubbles), localPosition(locPosition), position(locPosition), mouseButton(MouseButton_Touch), pressure(1.0f), index(1), __clickDispatched(false), wheelDirection(0, 0) {}
+        TouchEvent(eventType type, bool Bubbles = true, const Vector2& locPosition = Vector2(0, 0)) : Event(type, Bubbles), localPosition(locPosition), position(locPosition), mouseButton(MouseButton_Touch), pressure(1.0f), index(1), __clickDispatched(false), wheelDirection(0, 0), __localScale(1.0f) {}
 
         /**position in local space for Event::currentTarget Actor*/
         Vector2 localPosition;
@@ -42,6 +42,8 @@ namespace oxygine
         const PointerState* getPointer() const;
 
         static bool isTouchEvent(int eventID) { return eventID > __FIRST && eventID < __LAST; }
+
         bool __clickDispatched;
+        float __localScale;
     };
 }