DinkSmallwoodHD/source/Component/FPSControlComponent.cpp
seth d4f66a5d2e Initial commit of Dink Smallwood HD source. See the "Programmer readme.txt" for information on how to set it up.
git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1469 353e56fe-9613-0410-8469-b96ad8e6f29c
2017-09-12 04:57:47 +00:00

271 lines
No EOL
7.4 KiB
C++

#include "PlatformPrecomp.h"
#include "FPSControlComponent.h"
#include "util/GLESUtils.h"
#include "Entity/EntityUtils.h"
#include "BaseApp.h"
#include "GUI/GameMenu.h"
#define C_GUI_FADE_OUT_TIMER 400
#define C_GUI_FADE_IN_TIMER 150
FPSControlComponent::FPSControlComponent()
{
SetName("FPSControl");
}
FPSControlComponent::~FPSControlComponent()
{
}
void FPSControlComponent::OnAdd(Entity *pEnt)
{
EntityComponent::OnAdd(pEnt);
m_pArrowEnt = NULL;
m_pCenterBall = NULL;
m_pPos2d = &GetParent()->GetVar("pos2d")->GetVector2();
m_lastTouchDir = CL_Vec2f(0, 0); //the middle
m_bTouchingArrows = false;
//register ourselves to render if the parent does
GetParent()->GetFunction("OnRender")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnRender, this, _1));
GetParent()->GetFunction("OnUpdate")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnUpdate, this, _1));
float guiTrans = GetApp()->GetVar("gui_transparency")->GetFloat();
GetApp()->GetVar("gui_transparency")->Set(guiTrans);
GetBaseApp()->m_sig_arcade_input.connect(1, boost::bind(&FPSControlComponent::OnArcadeInput, this, _1));
m_arrowMinTransparency = guiTrans;
m_arrowMaxTransparency = rt_max(0.5f, guiTrans);
//movement arrows?
if (GetApp()->GetUsingTouchScreen())
{
m_pArrowEnt = CreateOverlayEntity(GetParent(), "arrow_gui", ReplaceWithDeviceNameInFileName("interface/iphone/arrows.rttex"), 0, 0);
EntityComponent *pStripComp = m_pArrowEnt->AddComponent(new TouchStripComponent);
m_pArrowEnt->GetVarWithDefault(string("touchPadding"), Variant(CL_Rectf(100, 100, 100, 100)))->GetRect();
//m_pArrowEnt->AddComponent(new TouchHandlerComponent);
//for speed, we've disabled movement message handling in App.cpp, but we actually want them just here, so we'll hardwire it
AddInputMovementFocusIfNeeded(m_pArrowEnt);
m_pArrowEnt->GetFunction("OnTouchStripUpdate")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnStripUpdate, this, _1));
m_pArrowEnt->GetFunction("OnOverStart")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnOverStart, this, _1));
m_pArrowEnt->GetFunction("OnOverEnd")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnOverEnd, this, _1));
GetParent()->GetParent()->GetFunction("OnKillingControls")->sig_function.connect(1, boost::bind(&FPSControlComponent::OnKillingControls, this, _1));
SetAlphaEntity(m_pArrowEnt, 0);
FadeEntity(m_pArrowEnt, true, m_arrowMinTransparency, 300, 0);
//limit it to touches only on the left side of the screen
//m_pCenterBall = CreateOverlayEntity(m_pArrowEnt, "center_ball", "interface/center_ball.rttex",0,0);
if (m_pCenterBall)
{
m_pCenterBall->GetVar("color")->Set(MAKE_RGBA(255,255,255,0));
//SetAlphaEntity(m_pCenterBall, 0);
SetAlignmentEntity(m_pCenterBall, ALIGNMENT_CENTER);
}
m_timeOfLastTouch = GetTick(TIMER_SYSTEM);
SetAlignmentEntity(m_pArrowEnt, ALIGNMENT_CENTER);
CL_Vec2f vArrowPos = FlipXIfNeeded(iPhoneMap(CL_Vec2f(80, 240)));
if (IsIPAD())
{
if (IsInFlingMode())
{
vArrowPos = CL_Vec2f( FlipXIfNeeded(149-30), C_FLING_JOYSTICK_Y);
} else
{
vArrowPos = FlipXIfNeeded(CL_Vec2f(137-20, 651-80));
}
}
m_pArrowEnt->GetVar("pos2d")->Set(vArrowPos);
m_vArrowImageSizeOver2 = m_pArrowEnt->GetVar("size2d")->GetVector2()/2;
VariantList vList;
OnOverEnd(&vList);
}
}
void FPSControlComponent::OnRemove()
{
EntityComponent::OnRemove();
}
void SendKey(eDinkInput key, bool bIsDown)
{
if (bIsDown)
{
g_dglo.m_dirInput[key] = true;
g_dglo.m_dirInputFinished[key] = false; //make sure it wasn't scheduled to stop pressing
} else
{
g_dglo.m_dirInputFinished[key] = true;
}
}
void FPSControlComponent::ProcessLastJoystickReading()
{
CL_Vec2f vDir = m_lastTouchDir;
vDir.normalize();
if (m_pCenterBall)
m_pCenterBall->GetVar("pos2d")->Set(m_vArrowImageSizeOver2+vDir* (rt_min(m_lastTouchDir.length(), 1) * 58));
float deadSpace = 0.25f/2;
if (IsInFlingMode())
{
deadSpace *= 1.4f;
} else
{
if (IsIPADSize) deadSpace *= 2;
}
if (m_lastTouchDir.length() < deadSpace)
{
//dead space
if (m_pCenterBall)
{
m_pCenterBall->GetVar("pos2d")->Set(m_vArrowImageSizeOver2);
}
return;
}
//convert to 360 degrees
int dir = (int(RAD2DEG(atan2(m_lastTouchDir.y, m_lastTouchDir.x))+(90)));
const int maxDirections = 8;
int finaldir = mod(dir+ (360/ (maxDirections*2)), 360)/ (360/maxDirections);
//nah, let's do 8 actually
//LogMsg("Pressing %s, which is dir %d (final: %d)", PrintVector2(m_lastTouchDir).c_str(), dir, finaldir);
switch (finaldir)
{
case 0: SendKey(DINK_INPUT_UP, true); break;
case 1: SendKey(DINK_INPUT_RIGHT, true); SendKey(DINK_INPUT_UP, true); break;
case 2: SendKey(DINK_INPUT_RIGHT, true); break;
case 3: SendKey(DINK_INPUT_RIGHT, true); SendKey(DINK_INPUT_DOWN, true); break;
case 4: SendKey(DINK_INPUT_DOWN, true); break;
case 5: SendKey(DINK_INPUT_DOWN, true); SendKey(DINK_INPUT_LEFT, true); break;
case 6: SendKey(DINK_INPUT_LEFT, true); break;
case 7: SendKey(DINK_INPUT_LEFT, true); SendKey(DINK_INPUT_UP, true); break;
}
}
void FPSControlComponent::OnKillingControls(VariantList *pVList)
{
RemoveFocusIfNeeded(m_pArrowEnt);
}
void FPSControlComponent::OnArcadeInput(VariantList *pVList)
{
int vKey = pVList->Get(0).GetUINT32();
bool bIsDown = pVList->Get(1).GetUINT32() != 0;
//LogMsg("Key %d, down is %d", vKey, int(bIsDown));
switch (vKey)
{
case VIRTUAL_KEY_DIR_LEFT:
SendKey(DINK_INPUT_LEFT, bIsDown);
break;
case VIRTUAL_KEY_DIR_RIGHT:
SendKey(DINK_INPUT_RIGHT, bIsDown);
break;
case VIRTUAL_KEY_DIR_UP:
SendKey(DINK_INPUT_UP, bIsDown);
break;
case VIRTUAL_KEY_DIR_DOWN:
SendKey(DINK_INPUT_DOWN, bIsDown);
break;
}
}
void FPSControlComponent::OnOverStart(VariantList *pVList)
{
}
void FPSControlComponent::OnOverEnd(VariantList *pVList)
{
m_bTouchingArrows = false;
ClearKeyInput();
if (m_pCenterBall)
m_pCenterBall->GetVar("color")->Set(MAKE_RGBA(255,255,255,0));
//m_pArrowEnt->GetVar("alpha")->Set(1.0f);
FadeEntity(m_pArrowEnt, false, m_arrowMinTransparency, C_GUI_FADE_OUT_TIMER);
if (m_pCenterBall)
FadeEntity(m_pCenterBall, false, 0.0, C_GUI_FADE_OUT_TIMER/3);
}
void FPSControlComponent::ClearKeyInput()
{
SendKey(DINK_INPUT_UP, false);
SendKey(DINK_INPUT_DOWN, false);
SendKey(DINK_INPUT_LEFT, false);
SendKey(DINK_INPUT_RIGHT, false);
}
void FPSControlComponent::ProcessArrowInput(CL_Vec2f vDir)
{
if (m_bTouchingArrows || 1)
{
m_lastTouchDir = vDir*2 - CL_Vec2f(1, 1);
//update current position
ClearKeyInput();
ProcessLastJoystickReading();
} else
{
// m_lastTouchDir = CL_Vec2f(0,0);
if (m_pCenterBall)
m_pCenterBall->GetVar("pos2d")->Set(m_lastTouchDir);
}
}
void FPSControlComponent::OnStripUpdate(VariantList *pVList)
{
if (!m_bTouchingArrows)
{
m_bTouchingArrows = true;
//m_pArrowEnt->GetVar("pos2d")->Set( ConvertEntityClickToScreenCoords(pVList->Get(0).GetVector2(), pVList->Get(1).GetEntity()));
//ProcessArrowInput(pVList->Get(1).GetVector2());
if (m_pCenterBall)
m_pCenterBall->GetVar("color")->Set(MAKE_RGBA(255,255,255,255));
FadeEntity(m_pArrowEnt, false, m_arrowMaxTransparency, C_GUI_FADE_IN_TIMER);
if (m_pCenterBall)
FadeEntity(m_pCenterBall, false, m_arrowMaxTransparency, C_GUI_FADE_OUT_TIMER/3);
}
ProcessArrowInput(pVList->Get(1).GetVector2());
}
void FPSControlComponent::OnRender(VariantList *pVList)
{
CL_Vec2f vFinalPos = pVList->m_variant[0].GetVector2()+*m_pPos2d;
}
void FPSControlComponent::OnUpdate(VariantList *pVList)
{
}