simulation update
This commit is contained in:
		
							parent
							
								
									7cd9805539
								
							
						
					
					
						commit
						d956b8f2b3
					
				@ -3,9 +3,12 @@
 | 
				
			|||||||
#include <ctime>
 | 
					#include <ctime>
 | 
				
			||||||
#include <cstdlib>
 | 
					#include <cstdlib>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PI 3.1416
 | 
					#define PI 3.1416f
 | 
				
			||||||
#define MAX_ANGULAR_SPEED 1
 | 
					#define MAX_ANGULAR_SPEED 0.05f
 | 
				
			||||||
#define MAX_SPEED 3
 | 
					#define MAX_FORWARD_SPEED 1.f
 | 
				
			||||||
 | 
					#define MAX_REVERSE_SPEED 0.5f
 | 
				
			||||||
 | 
					#define MAX_ACCELERATION 0.02f
 | 
				
			||||||
 | 
					#define MAX_DECELERATION (MAX_ACCELERATION*2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Simulation::Simulation()
 | 
					Simulation::Simulation()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -23,9 +26,9 @@ std::vector<InitClientPacket>* Simulation::getWorldData()
 | 
				
			|||||||
void Simulation::addClient()
 | 
					void Simulation::addClient()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    InitClientPacket info;
 | 
					    InitClientPacket info;
 | 
				
			||||||
    info.x = std::rand()%50;
 | 
					    info.x = std::rand()%30;
 | 
				
			||||||
    info.y = std::rand()%50;
 | 
					    info.y = std::rand()%30;
 | 
				
			||||||
    info.angle = ((float)(std::rand()%360)) / PI;
 | 
					    info.angle = ((float)(std::rand()%360))*PI/180.f;
 | 
				
			||||||
    info.vforward = 0;
 | 
					    info.vforward = 0;
 | 
				
			||||||
    info.vangle = 0;
 | 
					    info.vangle = 0;
 | 
				
			||||||
    worldData.push_back(info);
 | 
					    worldData.push_back(info);
 | 
				
			||||||
@ -43,18 +46,40 @@ void Simulation::removeClient(int i)
 | 
				
			|||||||
void Simulation::clientInput(int i, const DeltaClientPacket &delta)
 | 
					void Simulation::clientInput(int i, const DeltaClientPacket &delta)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    InitClientPacket *info = &(worldData[i]);
 | 
					    InitClientPacket *info = &(worldData[i]);
 | 
				
			||||||
    info->vangle += delta.dvangle;
 | 
					    float dvforward;
 | 
				
			||||||
    info->vforward += delta.dvforward;
 | 
					    // handling speed
 | 
				
			||||||
    if(info->vforward>3)
 | 
					    if(delta.acceleration > 0.01f) // if accelerating
 | 
				
			||||||
        info->vforward = MAX_SPEED;
 | 
					    {
 | 
				
			||||||
    if(info->vforward<0)
 | 
					        if(fabs(delta.acceleration) < 1)
 | 
				
			||||||
        info->vforward = 0;
 | 
					            dvforward = delta.acceleration*MAX_ACCELERATION;
 | 
				
			||||||
    float speed = info->vforward;
 | 
					        else
 | 
				
			||||||
    float maxAngularSpeed = speed <= 1 ? speed*MAX_ANGULAR_SPEED : MAX_ANGULAR_SPEED/speed;
 | 
					            dvforward = info->vforward >= 0 ? MAX_ACCELERATION : -MAX_ACCELERATION;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if(delta.acceleration < -0.01f)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(fabs(delta.acceleration) < 1)
 | 
				
			||||||
 | 
					            dvforward = delta.acceleration*MAX_DECELERATION;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            dvforward = info->vforward >= 0 ? -MAX_DECELERATION : MAX_DECELERATION;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else // not accelerating
 | 
				
			||||||
 | 
					        dvforward = -info->vforward/8;
 | 
				
			||||||
 | 
					    info->vforward += dvforward;
 | 
				
			||||||
 | 
					    if(info->vforward>MAX_FORWARD_SPEED)
 | 
				
			||||||
 | 
					        info->vforward = MAX_FORWARD_SPEED;
 | 
				
			||||||
 | 
					    if(info->vforward<-MAX_REVERSE_SPEED)
 | 
				
			||||||
 | 
					        info->vforward = -MAX_REVERSE_SPEED;
 | 
				
			||||||
 | 
					    // handling angle
 | 
				
			||||||
 | 
					    info->vangle = delta.turning;
 | 
				
			||||||
 | 
					    if(abs(info->vangle) > 0.01f)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        float x = 2*PI*fabs(info->vforward)/MAX_FORWARD_SPEED;
 | 
				
			||||||
 | 
					        float maxAngularSpeed = (x/5 + 1 + cos(PI + x))*MAX_ANGULAR_SPEED;
 | 
				
			||||||
        if(info->vangle > maxAngularSpeed)
 | 
					        if(info->vangle > maxAngularSpeed)
 | 
				
			||||||
            info->vangle = maxAngularSpeed;
 | 
					            info->vangle = maxAngularSpeed;
 | 
				
			||||||
        if(info->vangle < -maxAngularSpeed)
 | 
					        if(info->vangle < -maxAngularSpeed)
 | 
				
			||||||
            info->vangle = -maxAngularSpeed;
 | 
					            info->vangle = -maxAngularSpeed;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Simulation::update()
 | 
					void Simulation::update()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user