Simple Multiplayer is working
This commit is contained in:
+51
-16
@@ -43,8 +43,8 @@ InWorld::InWorld() {
|
|||||||
|
|
||||||
snprintf(p.playerInfo.handle, PACKET_STRING_SIZE, "%s", configUtil->CString("handle"));
|
snprintf(p.playerInfo.handle, PACKET_STRING_SIZE, "%s", configUtil->CString("handle"));
|
||||||
snprintf(p.playerInfo.avatar, PACKET_STRING_SIZE, "%s", configUtil->CString("avatar"));
|
snprintf(p.playerInfo.avatar, PACKET_STRING_SIZE, "%s", configUtil->CString("avatar"));
|
||||||
p.playerInfo.position = {0, 50};
|
p.playerInfo.position = {50, 50};
|
||||||
p.playerInfo.motion = {60, 0};
|
p.playerInfo.motion = {0, 0};
|
||||||
|
|
||||||
netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet));
|
netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet));
|
||||||
|
|
||||||
@@ -115,39 +115,56 @@ void InWorld::MouseButtonUp(SDL_MouseButtonEvent const& button) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
void InWorld::KeyDown(SDL_KeyboardEvent const& key) {
|
||||||
|
//general
|
||||||
switch(key.keysym.sym) {
|
switch(key.keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
ExitGame();
|
ExitGame();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//player movement
|
||||||
|
if (infoMgr->GetPlayerIndex() == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(key.keysym.sym) {
|
||||||
case SDLK_w:
|
case SDLK_w:
|
||||||
//up
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::NORTH);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_s:
|
case SDLK_s:
|
||||||
//down
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::SOUTH);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_a:
|
case SDLK_a:
|
||||||
//left
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::WEST);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_d:
|
case SDLK_d:
|
||||||
//right
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::EAST);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
|
||||||
//reversed
|
//player movement reversed
|
||||||
switch(key.keysym.sym) {
|
switch(key.keysym.sym) {
|
||||||
case SDLK_w:
|
case SDLK_w:
|
||||||
//
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::SOUTH);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_s:
|
case SDLK_s:
|
||||||
//
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::NORTH);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_a:
|
case SDLK_a:
|
||||||
//
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::EAST);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
case SDLK_d:
|
case SDLK_d:
|
||||||
//
|
playerCharacters[infoMgr->GetPlayerIndex()].MoveDirection(CardinalDirection::WEST);
|
||||||
|
SendState();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,13 +261,14 @@ void InWorld::AddPlayer(Packet& p) {
|
|||||||
throw(runtime_error("Duplicate players detected"));
|
throw(runtime_error("Duplicate players detected"));
|
||||||
}
|
}
|
||||||
|
|
||||||
//sprite
|
//position
|
||||||
playerCharacters[p.playerInfo.index].GetSprite()->SetSurface(surfaceMgr->Get(p.playerInfo.avatar), 32, 48);
|
|
||||||
|
|
||||||
//pos
|
|
||||||
playerCharacters[p.playerInfo.index].SetPosition(p.playerInfo.position);
|
playerCharacters[p.playerInfo.index].SetPosition(p.playerInfo.position);
|
||||||
playerCharacters[p.playerInfo.index].SetMotion(p.playerInfo.motion);
|
playerCharacters[p.playerInfo.index].SetMotion(p.playerInfo.motion);
|
||||||
|
|
||||||
|
//sprite
|
||||||
|
playerCharacters[p.playerInfo.index].GetSprite()->SetSurface(surfaceMgr->Get(p.playerInfo.avatar), 32, 48);
|
||||||
|
playerCharacters[p.playerInfo.index].FaceDirection();
|
||||||
|
|
||||||
//is it this player?
|
//is it this player?
|
||||||
if (p.meta.clientIndex == infoMgr->GetClientIndex()) {
|
if (p.meta.clientIndex == infoMgr->GetClientIndex()) {
|
||||||
infoMgr->SetPlayerIndex(p.playerInfo.index);
|
infoMgr->SetPlayerIndex(p.playerInfo.index);
|
||||||
@@ -276,4 +294,21 @@ void InWorld::UpdatePlayer(Packet& p) {
|
|||||||
|
|
||||||
playerCharacters[p.playerInfo.index].SetPosition(p.playerInfo.position);
|
playerCharacters[p.playerInfo.index].SetPosition(p.playerInfo.position);
|
||||||
playerCharacters[p.playerInfo.index].SetMotion(p.playerInfo.motion);
|
playerCharacters[p.playerInfo.index].SetMotion(p.playerInfo.motion);
|
||||||
|
playerCharacters[p.playerInfo.index].FaceDirection();
|
||||||
|
}
|
||||||
|
|
||||||
|
void InWorld::SendState() {
|
||||||
|
//send the state of this player's character
|
||||||
|
if (infoMgr->GetPlayerIndex() == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Packet p;
|
||||||
|
p.meta.type = Packet::Type::PLAYER_UPDATE;
|
||||||
|
p.meta.clientIndex = infoMgr->GetClientIndex();
|
||||||
|
p.playerInfo.index = infoMgr->GetPlayerIndex();
|
||||||
|
p.playerInfo.position = playerCharacters[infoMgr->GetPlayerIndex()].GetPosition();
|
||||||
|
p.playerInfo.motion = playerCharacters[infoMgr->GetPlayerIndex()].GetMotion();
|
||||||
|
|
||||||
|
netUtil->Send(GAME_CHANNEL, &p, sizeof(Packet));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ protected:
|
|||||||
void RemovePlayer(Packet&);
|
void RemovePlayer(Packet&);
|
||||||
void UpdatePlayer(Packet&);
|
void UpdatePlayer(Packet&);
|
||||||
|
|
||||||
|
void SendState();
|
||||||
|
|
||||||
//services
|
//services
|
||||||
ConfigUtility* configUtil = Singleton<ConfigUtility>::Get();
|
ConfigUtility* configUtil = Singleton<ConfigUtility>::Get();
|
||||||
SurfaceManager* surfaceMgr = Singleton<SurfaceManager>::Get();
|
SurfaceManager* surfaceMgr = Singleton<SurfaceManager>::Get();
|
||||||
|
|||||||
+31
-25
@@ -45,31 +45,17 @@ void PlayerCharacter::MoveDirection(CardinalDirection cd) {
|
|||||||
motion.y += WALKING_SPEED;
|
motion.y += WALKING_SPEED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CardinalDirection::EAST:
|
case CardinalDirection::WEST:
|
||||||
if (motion.x >= 0) {
|
if (motion.x >= 0) {
|
||||||
motion.x -= WALKING_SPEED;
|
motion.x -= WALKING_SPEED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CardinalDirection::WEST:
|
case CardinalDirection::EAST:
|
||||||
if (motion.x <= 0) {
|
if (motion.x <= 0) {
|
||||||
motion.x += WALKING_SPEED;
|
motion.x += WALKING_SPEED;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//short cut
|
|
||||||
if (motion.x != 0 && motion.y != 0) {
|
|
||||||
sprite.SetInterval(0.1);
|
|
||||||
limitSpeed = true;
|
|
||||||
}
|
|
||||||
else if (motion.x != 0 || motion.y != 0) {
|
|
||||||
sprite.SetInterval(0.1);
|
|
||||||
limitSpeed = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sprite.SetInterval(0);
|
|
||||||
sprite.SetCurrentFrame(0);
|
|
||||||
limitSpeed = false;
|
|
||||||
}
|
|
||||||
//face the correct direction
|
//face the correct direction
|
||||||
FaceDirection();
|
FaceDirection();
|
||||||
}
|
}
|
||||||
@@ -82,10 +68,10 @@ void PlayerCharacter::FaceDirection(CardinalDirection cd) {
|
|||||||
case CardinalDirection::SOUTH:
|
case CardinalDirection::SOUTH:
|
||||||
sprite.SetCurrentStrip(0);
|
sprite.SetCurrentStrip(0);
|
||||||
break;
|
break;
|
||||||
case CardinalDirection::EAST:
|
case CardinalDirection::WEST:
|
||||||
sprite.SetCurrentStrip(2);
|
sprite.SetCurrentStrip(2);
|
||||||
break;
|
break;
|
||||||
case CardinalDirection::WEST:
|
case CardinalDirection::EAST:
|
||||||
sprite.SetCurrentStrip(3);
|
sprite.SetCurrentStrip(3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -93,16 +79,36 @@ void PlayerCharacter::FaceDirection(CardinalDirection cd) {
|
|||||||
|
|
||||||
void PlayerCharacter::FaceDirection() {
|
void PlayerCharacter::FaceDirection() {
|
||||||
//base the direction on the character's movement
|
//base the direction on the character's movement
|
||||||
|
if (motion.y < 0) {
|
||||||
|
FaceDirection(CardinalDirection::NORTH);
|
||||||
|
}
|
||||||
if (motion.y > 0) {
|
if (motion.y > 0) {
|
||||||
FaceDirection(CardinalDirection::SOUTH);
|
FaceDirection(CardinalDirection::SOUTH);
|
||||||
}
|
}
|
||||||
else if (motion.y < 0) {
|
if (motion.x < 0) {
|
||||||
FaceDirection(CardinalDirection::NORTH);
|
|
||||||
}
|
|
||||||
else if (motion.x < 0) {
|
|
||||||
FaceDirection(CardinalDirection::EAST);
|
|
||||||
}
|
|
||||||
else if (motion.x > 0) {
|
|
||||||
FaceDirection(CardinalDirection::WEST);
|
FaceDirection(CardinalDirection::WEST);
|
||||||
}
|
}
|
||||||
|
if (motion.x > 0) {
|
||||||
|
FaceDirection(CardinalDirection::EAST);
|
||||||
|
}
|
||||||
|
CheckSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PlayerCharacter::CheckSpeed() {
|
||||||
|
//diagonal
|
||||||
|
if (motion.x != 0 && motion.y != 0) {
|
||||||
|
sprite.SetInterval(0.1);
|
||||||
|
limitSpeed = true;
|
||||||
|
}
|
||||||
|
//cardinal
|
||||||
|
else if (motion != 0) {
|
||||||
|
sprite.SetInterval(0.1);
|
||||||
|
limitSpeed = false;
|
||||||
|
}
|
||||||
|
//not moving
|
||||||
|
else {
|
||||||
|
sprite.SetInterval(0);
|
||||||
|
sprite.SetCurrentFrame(0);
|
||||||
|
limitSpeed = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public:
|
|||||||
|
|
||||||
void MoveDirection(CardinalDirection);
|
void MoveDirection(CardinalDirection);
|
||||||
void FaceDirection(CardinalDirection);
|
void FaceDirection(CardinalDirection);
|
||||||
|
void FaceDirection();
|
||||||
|
|
||||||
void DrawTo(SDL_Surface* const dest) { sprite.DrawTo(dest, position.x, position.y); }
|
void DrawTo(SDL_Surface* const dest) { sprite.DrawTo(dest, position.x, position.y); }
|
||||||
|
|
||||||
@@ -49,7 +50,7 @@ public:
|
|||||||
|
|
||||||
SpriteSheet* GetSprite() { return &sprite; }
|
SpriteSheet* GetSprite() { return &sprite; }
|
||||||
private:
|
private:
|
||||||
void FaceDirection();
|
void CheckSpeed();
|
||||||
|
|
||||||
Vector2 position;
|
Vector2 position;
|
||||||
Vector2 motion;
|
Vector2 motion;
|
||||||
|
|||||||
Reference in New Issue
Block a user