mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-15 10:35:11 -04:00
WIP on supporting splitscreen from launcher (Dreamcast and PS3 only ATM)
This commit is contained in:
parent
3b0e842ede
commit
b478c486a0
@ -306,6 +306,7 @@ typedef cc_uint8 cc_bool;
|
||||
#define CC_BUILD_LOWMEM
|
||||
#define CC_BUILD_HTTPCLIENT
|
||||
#define CC_BUILD_BEARSSL
|
||||
#define CC_BUILD_SPLITSCREEN
|
||||
#undef CC_BUILD_RESOURCES
|
||||
#elif defined PLAT_PS3
|
||||
#define CC_BUILD_PS3
|
||||
@ -314,6 +315,7 @@ typedef cc_uint8 cc_bool;
|
||||
#define CC_BUILD_OPENAL
|
||||
#define CC_BUILD_HTTPCLIENT
|
||||
#define CC_BUILD_BEARSSL
|
||||
#define CC_BUILD_SPLITSCREEN
|
||||
#elif defined N64
|
||||
#define CC_BIG_ENDIAN
|
||||
#define CC_BUILD_N64
|
||||
|
@ -727,7 +727,7 @@ static void LocalPlayer_RenderModel(struct Entity* e, double deltaTime, float t)
|
||||
AnimatedComp_GetCurrent(e, t);
|
||||
TiltComp_GetCurrent(p, &p->Tilt, t);
|
||||
|
||||
if (!Camera.Active->isThirdPerson) return;
|
||||
if (!Camera.Active->isThirdPerson && p == Entities.CurPlayer) return;
|
||||
Model_Render(e->Model, e);
|
||||
}
|
||||
|
||||
|
44
src/Input.c
44
src/Input.c
@ -421,10 +421,6 @@ static void KeyBind_Init(void) {
|
||||
int Gamepad_AxisBehaviour[2] = { AXIS_BEHAVIOUR_MOVEMENT, AXIS_BEHAVIOUR_CAMERA };
|
||||
int Gamepad_AxisSensitivity[2] = { AXIS_SENSI_NORMAL, AXIS_SENSI_NORMAL };
|
||||
static const float axis_sensiFactor[] = { 0.25f, 0.5f, 1.0f, 2.0f, 4.0f };
|
||||
/* Whether a gamepad joystick is being used to control player movement */
|
||||
static cc_bool joystick_movement;
|
||||
/* Angle of the gamepad joystick being used to control player movement */
|
||||
static float joystick_angle;
|
||||
|
||||
struct GamepadState {
|
||||
float axisX[2], axisY[2];
|
||||
@ -457,36 +453,46 @@ void Gamepad_SetButton(int port, int btn, int pressed) {
|
||||
}
|
||||
|
||||
void Gamepad_SetAxis(int port, int axis, float x, float y, double delta) {
|
||||
gamepads[port].axisX[axis] = x;
|
||||
gamepads[port].axisY[axis] = y;
|
||||
if (x == 0 && y == 0) return;
|
||||
|
||||
int sensi = Gamepad_AxisSensitivity[axis];
|
||||
float scale = delta * 60.0 * axis_sensiFactor[sensi];
|
||||
Event_RaisePadAxis(&ControllerEvents.AxisUpdate, port, axis, x * scale, y * scale);
|
||||
|
||||
if (Gamepad_AxisBehaviour[axis] == AXIS_BEHAVIOUR_MOVEMENT) {
|
||||
if (!Input.RawMode) return;
|
||||
|
||||
joystick_movement = true;
|
||||
joystick_angle = Math_Atan2(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void Gamepad_Tick(double delta) {
|
||||
int i;
|
||||
joystick_movement = false;
|
||||
int port;
|
||||
Window_ProcessGamepads(delta);
|
||||
|
||||
for (i = 0; i < INPUT_MAX_GAMEPADS; i++)
|
||||
for (port = 0; port < INPUT_MAX_GAMEPADS; port++)
|
||||
{
|
||||
Gamepad_Update(&gamepads[i], delta);
|
||||
Gamepad_Update(&gamepads[port], delta);
|
||||
}
|
||||
}
|
||||
|
||||
static void PlayerInputPad(int port, int axis, struct LocalPlayer* p, float* xMoving, float* zMoving) {
|
||||
float x, y, angle;
|
||||
if (Gamepad_AxisBehaviour[axis] != AXIS_BEHAVIOUR_MOVEMENT) return;
|
||||
|
||||
x = gamepads[port].axisX[axis];
|
||||
y = gamepads[port].axisY[axis];
|
||||
|
||||
if (x != 0 || y != 0) {
|
||||
float angle = Math_Atan2(x, y);
|
||||
*xMoving = Math_CosF(angle);
|
||||
*zMoving = Math_SinF(angle);
|
||||
}
|
||||
}
|
||||
|
||||
static void PlayerInputGamepad(struct LocalPlayer* p, float* xMoving, float* zMoving) {
|
||||
if (!joystick_movement) return;
|
||||
|
||||
*xMoving = Math_CosF(joystick_angle);
|
||||
*zMoving = Math_SinF(joystick_angle);
|
||||
int port;
|
||||
for (port = 0; port < INPUT_MAX_GAMEPADS; port++)
|
||||
{
|
||||
PlayerInputPad(port, PAD_AXIS_LEFT, p, xMoving, zMoving);
|
||||
PlayerInputPad(port, PAD_AXIS_RIGHT, p, xMoving, zMoving);
|
||||
}
|
||||
}
|
||||
static struct LocalPlayerInput gamepadInput = { PlayerInputGamepad };
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include "Utils.h"
|
||||
#include "LBackend.h"
|
||||
#include "Http.h"
|
||||
#include "Game.h"
|
||||
|
||||
#define LAYOUTS static const struct LLayout
|
||||
#define IsEnterButton(btn) (btn == CCKEY_ENTER || btn == CCPAD_START || btn == CCPAD_A || btn == CCKEY_KP_ENTER)
|
||||
@ -652,18 +653,79 @@ void MFAScreen_SetActive(void) {
|
||||
}
|
||||
|
||||
|
||||
/*########################################################################################################################*
|
||||
*----------------------------------------------------------SplitScreen----------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
#ifdef CC_BUILD_SPLITSCREEN
|
||||
static struct SplitScreen {
|
||||
LScreen_Layout
|
||||
struct LButton btnPlayers[3], btnBack;
|
||||
cc_bool signingIn;
|
||||
} SplitScreen;
|
||||
|
||||
#define SPLITSCREEN_MAX_WIDGETS 4
|
||||
static struct LWidget* split_widgets[SPLITSCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS sps_btnPlayers2[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -120 } };
|
||||
LAYOUTS sps_btnPlayers3[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -70 } };
|
||||
LAYOUTS sps_btnPlayers4[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, -20 } };
|
||||
LAYOUTS sps_btnBack[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 170 } };
|
||||
|
||||
static void SplitScreen_Start(int players) {
|
||||
static const cc_string user = String_FromConst(DEFAULT_USERNAME);
|
||||
Game_NumLocalPlayers = players;
|
||||
|
||||
Launcher_StartGame(&user, &String_Empty, &String_Empty, &String_Empty, &String_Empty);
|
||||
}
|
||||
|
||||
static void SplitScreen_Players2(void* w) { SplitScreen_Start(2); }
|
||||
static void SplitScreen_Players3(void* w) { SplitScreen_Start(3); }
|
||||
static void SplitScreen_Players4(void* w) { SplitScreen_Start(4); }
|
||||
|
||||
static void SplitScreen_Activated(struct LScreen* s_) {
|
||||
struct SplitScreen* s = (struct SplitScreen*)s_;
|
||||
|
||||
LButton_Add(s, &s->btnPlayers[0], 300, 35, "2 player splitscreen",
|
||||
SplitScreen_Players2, sps_btnPlayers2);
|
||||
LButton_Add(s, &s->btnPlayers[1], 300, 35, "3 player splitscreen",
|
||||
SplitScreen_Players3, sps_btnPlayers3);
|
||||
LButton_Add(s, &s->btnPlayers[2], 300, 35, "4 player splitscreen",
|
||||
SplitScreen_Players4, sps_btnPlayers4);
|
||||
|
||||
LButton_Add(s, &s->btnBack, 100, 35, "Back",
|
||||
SwitchToMain, sps_btnBack);
|
||||
}
|
||||
|
||||
void SplitScreen_SetActive(void) {
|
||||
struct SplitScreen* s = &SplitScreen;
|
||||
LScreen_Reset((struct LScreen*)s);
|
||||
|
||||
s->widgets = split_widgets;
|
||||
s->maxWidgets = Array_Elems(split_widgets);
|
||||
|
||||
s->Activated = SplitScreen_Activated;
|
||||
s->title = "Splitscreen mode";
|
||||
|
||||
Launcher_SetScreen((struct LScreen*)s);
|
||||
}
|
||||
|
||||
static void SwitchToSplitScreen(void* w) { SplitScreen_SetActive(); }
|
||||
#endif
|
||||
|
||||
|
||||
/*########################################################################################################################*
|
||||
*----------------------------------------------------------MainScreen-----------------------------------------------------*
|
||||
*#########################################################################################################################*/
|
||||
static struct MainScreen {
|
||||
LScreen_Layout
|
||||
struct LButton btnLogin, btnResume, btnDirect, btnSPlayer, btnRegister, btnOptions, btnUpdates;
|
||||
struct LButton btnLogin, btnResume, btnDirect, btnSPlayer, btnSplit;
|
||||
struct LButton btnRegister, btnOptions, btnUpdates;
|
||||
struct LInput iptUsername, iptPassword;
|
||||
struct LLabel lblStatus, lblUpdate;
|
||||
cc_bool signingIn;
|
||||
} MainScreen;
|
||||
|
||||
#define MAINSCREEN_MAX_WIDGETS 11
|
||||
#define MAINSCREEN_MAX_WIDGETS 12
|
||||
static struct LWidget* main_widgets[MAINSCREEN_MAX_WIDGETS];
|
||||
|
||||
LAYOUTS main_iptUsername[] = { { ANCHOR_CENTRE_MIN, -140 }, { ANCHOR_CENTRE, -120 } };
|
||||
@ -675,6 +737,7 @@ LAYOUTS main_lblStatus[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 20 } };
|
||||
LAYOUTS main_btnResume[] = { { ANCHOR_CENTRE, 90 }, { ANCHOR_CENTRE, -25 } };
|
||||
LAYOUTS main_btnDirect[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 60 } };
|
||||
LAYOUTS main_btnSPlayer[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 110 } };
|
||||
LAYOUTS main_btnSplit[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_CENTRE, 160 } };
|
||||
|
||||
LAYOUTS main_btnRegister[] = { { ANCHOR_MIN, 6 }, { ANCHOR_MAX, 6 } };
|
||||
LAYOUTS main_btnOptions[] = { { ANCHOR_CENTRE, 0 }, { ANCHOR_MAX, 6 } };
|
||||
@ -841,6 +904,10 @@ static void MainScreen_Activated(struct LScreen* s_) {
|
||||
SwitchToDirectConnect, main_btnDirect);
|
||||
LButton_Add(s, &s->btnSPlayer, 200, 35, "Singleplayer",
|
||||
MainScreen_Singleplayer, main_btnSPlayer);
|
||||
#ifdef CC_BUILD_SPLITSCREEN
|
||||
LButton_Add(s, &s->btnSplit, 200, 35, "Splitscreen (WIP)",
|
||||
SwitchToSplitScreen, main_btnSplit);
|
||||
#endif
|
||||
|
||||
LLabel_Add(s, &s->lblUpdate, "&eChecking..",
|
||||
Updater_Supported ? main_lblUpdate_N : main_lblUpdate_H);
|
||||
|
Loading…
x
Reference in New Issue
Block a user