mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-02-03 18:14:01 +00:00
fix broken scrolling in mod selector in vertical mode
This commit is contained in:
parent
8d1a0a1a8a
commit
0326800940
7 changed files with 72 additions and 37 deletions
|
@ -100,6 +100,13 @@ void ModSelectorScreen::move(int ud, bool instant /* = false */)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ModSelectorScreen::isMoving() const
|
||||||
|
{
|
||||||
|
const IconGridPanel *grid = panels[currentPanel];
|
||||||
|
const InterpolatedVector& v = grid->position;
|
||||||
|
return v.isInterpolating();
|
||||||
|
}
|
||||||
|
|
||||||
void ModSelectorScreen::onUpdate(float dt)
|
void ModSelectorScreen::onUpdate(float dt)
|
||||||
{
|
{
|
||||||
Quad::onUpdate(dt);
|
Quad::onUpdate(dt);
|
||||||
|
@ -431,23 +438,6 @@ void BasicIcon::onUpdate(float dt)
|
||||||
{
|
{
|
||||||
AquariaMenuItem::onUpdate(dt);
|
AquariaMenuItem::onUpdate(dt);
|
||||||
|
|
||||||
// Autoscroll if selecting icon outside of screen
|
|
||||||
if(hasFocus() && dsq->modSelectorScr && !_isRecCall)
|
|
||||||
{
|
|
||||||
Vector pos = getRealPosition();
|
|
||||||
if(pos.y < 20 || pos.y > 580)
|
|
||||||
{
|
|
||||||
if(pos.y < 300)
|
|
||||||
dsq->modSelectorScr->move(5, true);
|
|
||||||
else
|
|
||||||
dsq->modSelectorScr->move(-5, true);
|
|
||||||
_isRecCall = true;
|
|
||||||
core->run(FRAME_TIME); // HACK: this is necessary to correctly position the mouse on the object after moving the panel
|
|
||||||
_isRecCall = false;
|
|
||||||
setFocus(true); // re-position mouse
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!quad)
|
if(!quad)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -506,6 +496,25 @@ ModIcon::ModIcon(): SubtitleIcon(), modId(-1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModIcon::onUpdate(float dt)
|
||||||
|
{
|
||||||
|
SubtitleIcon::onUpdate(dt);
|
||||||
|
|
||||||
|
// Autoscroll if selecting icon outside of screen
|
||||||
|
if(hasFocus() && dsq->modSelectorScr && !_isRecCall && !dsq->modSelectorScr->isMoving() && !isCenterOnScreenWithMargin(Vector(0, 200)))
|
||||||
|
{
|
||||||
|
const Vector pos = getRealPosition();
|
||||||
|
if(pos.y < 300)
|
||||||
|
dsq->modSelectorScr->move(5);
|
||||||
|
else
|
||||||
|
dsq->modSelectorScr->move(-5);
|
||||||
|
_isRecCall = true;
|
||||||
|
core->run(FRAME_TIME); // HACK: this is necessary to correctly position the mouse on the object after moving the panel
|
||||||
|
_isRecCall = false;
|
||||||
|
setFocus(true); // re-position mouse
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ModIcon::onClick()
|
void ModIcon::onClick()
|
||||||
{
|
{
|
||||||
dsq->sound->playSfx("click");
|
dsq->sound->playSfx("click");
|
||||||
|
|
|
@ -62,6 +62,7 @@ public:
|
||||||
ModType modType;
|
ModType modType;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void onUpdate(float dt);
|
||||||
virtual void onClick();
|
virtual void onClick();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -158,6 +159,7 @@ public:
|
||||||
void moveUp();
|
void moveUp();
|
||||||
void moveDown();
|
void moveDown();
|
||||||
void move(int ud, bool instant = false);
|
void move(int ud, bool instant = false);
|
||||||
|
bool isMoving() const;
|
||||||
|
|
||||||
std::vector<IconGridPanel*> panels;
|
std::vector<IconGridPanel*> panels;
|
||||||
MenuIcon *globeIcon, *modsIcon;
|
MenuIcon *globeIcon, *modsIcon;
|
||||||
|
|
|
@ -647,26 +647,22 @@ Vector Core::getWindowPosition(const Vector &worldpos) const
|
||||||
|
|
||||||
bool Core::isRectInWindowCoordsPartiallyOnScreen(const Vector& center, const Vector& wh) const
|
bool Core::isRectInWindowCoordsPartiallyOnScreen(const Vector& center, const Vector& wh) const
|
||||||
{
|
{
|
||||||
const float xo = getVirtualOffX();
|
return isPointInWindowCoordsOnScreenWithMargin(center, wh * -0.5f);
|
||||||
const float yo = getVirtualOffY();
|
|
||||||
const Vector topleft(-xo, -yo);
|
|
||||||
const Vector bottomright(800 + xo, 600 + yo);
|
|
||||||
const Vector half = wh * 0.5f;
|
|
||||||
const Vector a = topleft - half;
|
|
||||||
const Vector b = bottomright + half;
|
|
||||||
return center.x >= a.x && center.x <= b.x
|
|
||||||
&& center.y >= a.y && center.y <= b.y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Core::isRectInWindowCoordsFullyOnScreen(const Vector& center, const Vector& wh) const
|
bool Core::isRectInWindowCoordsFullyOnScreen(const Vector& center, const Vector& wh) const
|
||||||
|
{
|
||||||
|
return isPointInWindowCoordsOnScreenWithMargin(center, wh * 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Core::isPointInWindowCoordsOnScreenWithMargin(const Vector& center, const Vector& margin) const
|
||||||
{
|
{
|
||||||
const float xo = getVirtualOffX();
|
const float xo = getVirtualOffX();
|
||||||
const float yo = getVirtualOffY();
|
const float yo = getVirtualOffY();
|
||||||
const Vector topleft(-xo, -yo);
|
const Vector topleft(-xo, -yo);
|
||||||
const Vector bottomright(800 + xo, 600 + yo);
|
const Vector bottomright(800 + xo, 600 + yo);
|
||||||
const Vector half = wh * 0.5f;
|
const Vector a = topleft + margin;
|
||||||
const Vector a = topleft + half;
|
const Vector b = bottomright - margin;
|
||||||
const Vector b = bottomright - half;
|
|
||||||
return center.x >= a.x && center.x <= b.x
|
return center.x >= a.x && center.x <= b.x
|
||||||
&& center.y >= a.y && center.y <= b.y;
|
&& center.y >= a.y && center.y <= b.y;
|
||||||
}
|
}
|
||||||
|
|
|
@ -282,6 +282,9 @@ public:
|
||||||
bool isRectInWindowCoordsPartiallyOnScreen(const Vector& center, const Vector& wh) const;
|
bool isRectInWindowCoordsPartiallyOnScreen(const Vector& center, const Vector& wh) const;
|
||||||
bool isRectInWindowCoordsFullyOnScreen(const Vector& center, const Vector& wh) const;
|
bool isRectInWindowCoordsFullyOnScreen(const Vector& center, const Vector& wh) const;
|
||||||
|
|
||||||
|
// positive margin makes the screen area narrower, negative margin makes it wider (accept slightly outside)
|
||||||
|
bool isPointInWindowCoordsOnScreenWithMargin(const Vector& center, const Vector& margin) const;
|
||||||
|
|
||||||
|
|
||||||
Vector screenCenter;
|
Vector screenCenter;
|
||||||
|
|
||||||
|
|
|
@ -117,15 +117,29 @@ Vector RenderObject::getWorldPosition() const
|
||||||
return getWorldCollidePosition();
|
return getWorldCollidePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderObject* RenderObject::getTopParent() const
|
RenderObject* RenderObject::getTopParent()
|
||||||
{
|
{
|
||||||
RenderObject *p = parent;
|
RenderObject *p = this;
|
||||||
RenderObject *lastp=0;
|
RenderObject *lastp;
|
||||||
while (p)
|
do
|
||||||
{
|
{
|
||||||
lastp = p;
|
lastp = p;
|
||||||
p = p->parent;
|
p = p->parent;
|
||||||
}
|
}
|
||||||
|
while(p);
|
||||||
|
return lastp;
|
||||||
|
}
|
||||||
|
|
||||||
|
const RenderObject* RenderObject::getTopParent() const
|
||||||
|
{
|
||||||
|
const RenderObject *p = this;
|
||||||
|
const RenderObject *lastp;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
lastp = p;
|
||||||
|
p = p->parent;
|
||||||
|
}
|
||||||
|
while(p);
|
||||||
return lastp;
|
return lastp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -942,14 +956,23 @@ Vector RenderObject::getFollowCameraPosition(const Vector& v) const
|
||||||
|
|
||||||
bool RenderObject::isRectPartiallyOnScreen() const
|
bool RenderObject::isRectPartiallyOnScreen() const
|
||||||
{
|
{
|
||||||
Vector p = core->getWindowPosition(getFollowCameraPosition(position + offset));
|
Vector p = getTopParent()->getFollowCameraPosition(getWorldPosition());
|
||||||
|
p = core->getWindowPosition(p);
|
||||||
Vector sz = Vector(width, height) * getRealScale();
|
Vector sz = Vector(width, height) * getRealScale();
|
||||||
return core->isRectInWindowCoordsPartiallyOnScreen(p, sz);
|
return core->isRectInWindowCoordsPartiallyOnScreen(p, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderObject::isRectFullyOnScreen() const
|
bool RenderObject::isRectFullyOnScreen() const
|
||||||
{
|
{
|
||||||
Vector p = core->getWindowPosition(getFollowCameraPosition(position + offset));
|
Vector p = getTopParent()->getFollowCameraPosition(getWorldPosition());
|
||||||
|
p = core->getWindowPosition(p);
|
||||||
Vector sz = Vector(width, height) * getRealScale();
|
Vector sz = Vector(width, height) * getRealScale();
|
||||||
return core->isRectInWindowCoordsFullyOnScreen(p, sz);
|
return core->isRectInWindowCoordsFullyOnScreen(p, sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RenderObject::isCenterOnScreenWithMargin(const Vector& margin) const
|
||||||
|
{
|
||||||
|
Vector p = getTopParent()->getFollowCameraPosition(getWorldPosition());
|
||||||
|
p = core->getWindowPosition(p);
|
||||||
|
return core->isPointInWindowCoordsOnScreenWithMargin(p, margin);
|
||||||
|
}
|
||||||
|
|
|
@ -179,6 +179,7 @@ public:
|
||||||
inline bool isOnScreen() const;
|
inline bool isOnScreen() const;
|
||||||
bool isRectPartiallyOnScreen() const;
|
bool isRectPartiallyOnScreen() const;
|
||||||
bool isRectFullyOnScreen() const;
|
bool isRectFullyOnScreen() const;
|
||||||
|
bool isCenterOnScreenWithMargin(const Vector& margin) const;
|
||||||
|
|
||||||
|
|
||||||
bool isCoordinateInRadius(const Vector &pos, float r) const;
|
bool isCoordinateInRadius(const Vector &pos, float r) const;
|
||||||
|
@ -190,7 +191,8 @@ public:
|
||||||
Vector getWorldPosition() const;
|
Vector getWorldPosition() const;
|
||||||
Vector getWorldCollidePosition(const Vector &vec=Vector(0,0,0)) const;
|
Vector getWorldCollidePosition(const Vector &vec=Vector(0,0,0)) const;
|
||||||
|
|
||||||
RenderObject *getTopParent() const;
|
RenderObject *getTopParent();
|
||||||
|
const RenderObject *getTopParent() const;
|
||||||
|
|
||||||
virtual void onAnimationKeyPassed(int key){}
|
virtual void onAnimationKeyPassed(int key){}
|
||||||
|
|
||||||
|
|
|
@ -283,7 +283,7 @@ void Bone::renderCollision(const RenderState& rs) const
|
||||||
|
|
||||||
|
|
||||||
glTranslatef(collide.x, collide.y, 0);
|
glTranslatef(collide.x, collide.y, 0);
|
||||||
RenderObject *parent = this->getTopParent();
|
const RenderObject *parent = this->getTopParent();
|
||||||
if (parent)
|
if (parent)
|
||||||
drawCircle(collideRadius*parent->scale.x, 45);
|
drawCircle(collideRadius*parent->scale.x, 45);
|
||||||
glTranslatef(-collide.x, -collide.y, 0);
|
glTranslatef(-collide.x, -collide.y, 0);
|
||||||
|
|
Loading…
Add table
Reference in a new issue