您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ GetDriver函数代码示例

51自学网 2021-06-01 21:06:56
  C++
这篇教程C++ GetDriver函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中GetDriver函数的典型用法代码示例。如果您正苦于以下问题:C++ GetDriver函数的具体用法?C++ GetDriver怎么用?C++ GetDriver使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了GetDriver函数的27个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: CanEnterVehicle

bool CPropVehicleManhack::CanEnterVehicle( CBaseEntity *pEntity ){	// Prevent entering if the vehicle's being driven by an NPC	if ( GetDriver() && GetDriver() != pEntity )		return false;	return true; }
开发者ID:Bubbasacs,项目名称:FinalProj,代码行数:8,


示例2: CanEnterVehicle

//-----------------------------------------------------------------------------// Purpose: Return true of the player's allowed to enter / exit the vehicle//-----------------------------------------------------------------------------bool CPropCrane::CanEnterVehicle( CBaseEntity *pEntity ){	// Prevent entering if the vehicle's being driven by an NPC	if ( GetDriver() && GetDriver() != pEntity )		return false;		// Prevent entering if the vehicle's locked	return ( !m_bLocked );}
开发者ID:Adidasman1,项目名称:source-sdk-2013,代码行数:12,


示例3: CanEnterVehicle

//-----------------------------------------------------------------------------// Purpose: Return true of the player's allowed to enter / exit the vehicle//-----------------------------------------------------------------------------bool CPropVehicleChoreoGeneric::CanEnterVehicle( CBaseEntity *pEntity ){	// Prevent entering if the vehicle's being driven by an NPC	if ( GetDriver() && GetDriver() != pEntity )		return false;	// Prevent entering if the vehicle's locked	return !m_bLocked;}
开发者ID:P1x3lF3v3r,项目名称:Estranged-Act-1,代码行数:12,


示例4: ForcePlayerOut

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropVehicleManhack::Think(void){	if ( GetDriver() )	{		if (GlobalEntity_GetState("manhacks_not_controllable") == GLOBAL_ON)			ForcePlayerOut();		BaseClass::Think();		SetNextThink( gpGlobals->curtime );		StudioFrameAdvance();		if (m_hManhack == NULL || m_iManhackHealth <= 0 || m_iManhackDistance >= 100)		{			if (m_iManhackDistance >= 100)			{				CNPC_Manhack *pManhack = m_hManhack;				if (pManhack)				{					pManhack->ComeBackToPlayer(m_hPlayer, 8.0f);				}			}			/*if (!FindNextManhack())			{				SetLocator( NULL );				ForcePlayerOut();				DestroyAllManhacks();				UTIL_Remove(this);			}*/			if (!FindNextManhack(true))			{				ForcePlayerOut();			}		} 		else if ( m_hPlayer.Get() != NULL )		{			UpdateManhackView( m_hPlayer.Get() );				UpdateManhackDistance(this);		}		if (!GetDriver() && m_bHadDriver)		{			DevMsg("We have no driver, lets disappear");			m_bHadDriver = false;			//SetRenderMode(kRenderTransColor );			//SetRenderColorA(0);			AddEffects( EF_NODRAW );			SetSolid(SOLID_NONE);			AddSolidFlags( FSOLID_NOT_SOLID );		}	}}
开发者ID:Bubbasacs,项目名称:FinalProj,代码行数:59,


示例5: GetDriver

//TERO: We want to take damage normally since this is not really a vehicle but a fake body//		We exit the vehicle so that it wouldn't look silly stiff man from the manhack point of viewint CPropVehicleManhack::OnTakeDamage( const CTakeDamageInfo &inputInfo ){	//Check to do damage to driver	if ( GetDriver() )	{		GetDriver()->TakeDamage( inputInfo );		ForcePlayerOut();	}	return 0;}
开发者ID:Bubbasacs,项目名称:FinalProj,代码行数:13,


示例6: CanEnterVehicle

//-----------------------------------------------------------------------------// Purpose: Return true of the player's allowed to enter the vehicle//-----------------------------------------------------------------------------bool CPropVehicleDriveable::CanEnterVehicle( CBaseEntity *pEntity ){	// Prevent entering if the vehicle's being driven by an NPC	if ( GetDriver() && GetDriver() != pEntity )		return false;	if ( IsOverturned() )		return false;	// Prevent entering if the vehicle's locked, or if it's moving too fast.	return ( !m_bLocked && (m_nSpeed <= m_flMinimumSpeedToEnterExit) );}
开发者ID:RaisingTheDerp,项目名称:raisingthebar,代码行数:15,


示例7: GetDriver

CClientPlayer * CClientVehicle::GetOccupant(BYTE byteSeatId){	if(byteSeatId == 0)		return GetDriver();	return GetPassenger(byteSeatId - 1);}
开发者ID:Azon099,项目名称:networked-iv,代码行数:7,


示例8: int

void GaussianBlurRender::Render(Engine& engine, IDirect3DSurface9* backBuffer, IDirect3DSurface9* dsSurface){	if (!_shader || !GetRT() || !GetRT()->IsInit() || !_colorTex)		throw int();	_shader->Apply(engine);	IDirect3DSurface9* targetSurf;	GetRT()->GetTex()->GetSurfaceLevel(0, &targetSurf);	GetDriver().GetDevice()->SetRenderTarget(0, targetSurf);	engine.SetTexture(0, _colorTex->GetTex());	//Horizontal	_shader->curTechnique = GaussianBlurShader::ttHorizontal;	engine.BeginDraw();	DrawScreenQuad(engine);	engine.EndDraw();	//Vertical	_shader->curTechnique = GaussianBlurShader::ttVertical;	engine.BeginDraw();	DrawScreenQuad(engine);	engine.EndDraw();	_shader->UnApply(engine);	engine.SetTexture(0, 0);	}
开发者ID:DimaKirk,项目名称:rrr3d,代码行数:26,


示例9: GetDriver

CPlayerEntity * CVehicleEntity::GetOccupant(BYTE byteSeatId){	if(byteSeatId == 0)		return GetDriver();	return new CPlayerEntity(); //GetPassenger(byteSeatId - 1);}
开发者ID:KomiHe,项目名称:IVMultiplayer,代码行数:7,


示例10: Think

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropVehicleDriveable::Think(){	BaseClass::Think();	// Always think if we have any driver in us	if ( GetDriver() )	{		SetNextThink( gpGlobals->curtime );	}	// If we have an NPC Driver, tell him to drive	if ( m_hNPCDriver )	{		GetServerVehicle()->NPC_DriveVehicle();	}	// Keep thinking while we're waiting to turn off the keep upright	if ( m_flTurnOffKeepUpright )	{		SetNextThink( gpGlobals->curtime );		// Time up?		if ( m_hKeepUpright && m_flTurnOffKeepUpright < gpGlobals->curtime && m_hKeepUpright )		{			variant_t emptyVariant;			m_hKeepUpright->AcceptInput( "TurnOff", this, this, emptyVariant, USE_TOGGLE );			m_flTurnOffKeepUpright = 0;			UTIL_Remove( m_hKeepUpright );		}	}}
开发者ID:RaisingTheDerp,项目名称:raisingthebar,代码行数:35,


示例11: InputForcePlayerOut

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropVehicleViewController::InputForcePlayerOut( inputdata_t &inputdata ){	if ( !GetDriver() )		return;	GetServerVehicle()->HandlePassengerExit( m_hPlayer );}
开发者ID:AluminumKen,项目名称:hl2sb-src,代码行数:10,


示例12: Interpolate

void CVehicleEntity::Interpolate(){	// Do we have a driver?	if(GetDriver())	{		// Update our target position		UpdateTargetPosition();		// Update our target rotation		UpdateTargetRotation();		// Update our interior		UpdateInterior(true);	}	else	{		// Update our interior		UpdateInterior(false);		// Remove our target position		RemoveTargetPosition();		// Remove our target rotation		RemoveTargetRotation();	}}
开发者ID:KomiHe,项目名称:IVMultiplayer,代码行数:26,


示例13: GetDriver

void UUnitTestNetConnection::HandleClientPlayer(class APlayerController* PC, class UNetConnection* NetConnection){	// Implement only essential parts of the original function, as we want to block most of it (triggers level change code)	PC->Role = ROLE_AutonomousProxy;	PC->NetConnection = NetConnection;	PlayerController = PC;	OwningActor = PC;	// @todo #JohnBReview: This might cause undesirable behaviour, if - for example - HandleDisconnect gets called by	//				RPC's, so may want to create a fake localplayer instead	PC->Player = GEngine->GetFirstGamePlayer(NUTUtil::GetPrimaryWorld());	// Sometimes, e.g. when executing in a commandlet, there is no available player, and one has to be created	if (PC->Player == NULL)	{		// Do nothing, other than just create the raw object		PC->Player = NewObject<ULocalPlayer>(GEngine, GEngine->LocalPlayerClass);	}	// Pass on notification	UNetDriver* CurDriver = GetDriver();	FNetworkNotifyHook* NotifyHook = (Driver != NULL ? (FNetworkNotifyHook*)CurDriver->Notify : NULL);	if (NotifyHook != NULL)	{		NotifyHook->NotifyHandleClientPlayer(PC, NetConnection);	}}
开发者ID:frobro98,项目名称:UnrealSource,代码行数:30,


示例14: return

bool UDemoNetConnection::ClientHasInitializedLevelFor(const UObject* TestObject) const{	// We save all currently streamed levels into the demo stream so we can force the demo playback client	// to stay in sync with the recording server	// This may need to be tweaked or re-evaluated when we start recording demos on the client	return ( GetDriver()->DemoFrameNum > 2 || Super::ClientHasInitializedLevelFor( TestObject ) );}
开发者ID:kidaa,项目名称:UnrealEngineVR,代码行数:7,


示例15: unregister_cdrom

void unregister_cdrom(int drive){	int device = GetDriver(drive);	if (device >= 4)		return;	cd_drives[drive] = -1;	numDrives--;}
开发者ID:ErisBlastar,项目名称:osfree,代码行数:8,


示例16: ShouldAttractAutoAim

//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------bool CPropAPC::ShouldAttractAutoAim( CBaseEntity *pAimingEnt ){	if( IsXbox() && pAimingEnt->IsPlayer() && GetDriver() )	{		return true;	}	return BaseClass::ShouldAttractAutoAim( pAimingEnt );}
开发者ID:paralin,项目名称:hl2sdk,代码行数:11,


示例17: CalculatePhysicsImpactDamage

//-----------------------------------------------------------------------------// Purpose: // The player takes damage if he hits something going fast enough//-----------------------------------------------------------------------------void CPropVehicleDriveable::VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ){	// Don't care if we don't have a driver	if ( !GetDriver() )		return;	// Make sure we don't keep hitting the same entity	int otherIndex = !index;	CBaseEntity *pHitEntity = pEvent->pEntities[otherIndex];	if ( pEvent->deltaCollisionTime < 0.5 && (pHitEntity == this) )		return;	BaseClass::VPhysicsCollision( index, pEvent );	// If we hit hard enough, damage the player	// Don't take damage from ramming bad guys	if ( pHitEntity->MyNPCPointer() )		return;	// Don't take damage from ramming ragdolls	if ( pEvent->pObjects[otherIndex]->GetGameFlags() & FVPHYSICS_PART_OF_RAGDOLL )		return;	// Ignore func_breakables	CBreakable *pBreakable = dynamic_cast<CBreakable *>(pHitEntity);	if ( pBreakable )	{		// ROBIN: Do we want to only do this on func_breakables that are about to die?		//if ( pBreakable->HasSpawnFlags( SF_PHYSICS_BREAK_IMMEDIATELY ) )		return;	}	// Over our skill's minimum crash level?	int damageType = 0;	float flDamage = CalculatePhysicsImpactDamage( index, pEvent, gDefaultPlayerVehicleImpactDamageTable, 1.0, true, damageType );	if ( flDamage > 0 )	{		Vector damagePos;		pEvent->pInternalData->GetContactPoint( damagePos );		Vector damageForce = pEvent->postVelocity[index] * pEvent->pObjects[index]->GetMass();		CTakeDamageInfo info( this, GetDriver(), damageForce, damagePos, flDamage, damageType );		GetDriver()->TakeDamage( info );	}}
开发者ID:RaisingTheDerp,项目名称:raisingthebar,代码行数:47,


示例18: VPhysicsTakeDamage

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------int CASW_PropJeep::OnTakeDamage( const CTakeDamageInfo &inputInfo ){	//Do scaled up physics damage to the car	CTakeDamageInfo info = inputInfo;	info.ScaleDamage( 25 );		// HACKHACK: Scale up grenades until we get a better explosion/pressure damage system	if ( inputInfo.GetDamageType() & DMG_BLAST )	{		info.SetDamageForce( inputInfo.GetDamageForce() * 10 );	}	VPhysicsTakeDamage( info );	// reset the damage	info.SetDamage( inputInfo.GetDamage() );	// small amounts of shock damage disrupt the car, but aren't transferred to the player	if ( info.GetDamageType() == DMG_SHOCK )	{		if ( info.GetDamage() <= 10 )		{			// take 10% damage and make the engine stall			info.ScaleDamage( 0.1 );			m_throttleDisableTime = gpGlobals->curtime + 2;		}	}	//Check to do damage to driver	if ( GetDriver() )	{		//Take no damage from physics damages		if ( info.GetDamageType() & DMG_CRUSH )			return 0;		// Take the damage (strip out the DMG_BLAST)		info.SetDamageType( info.GetDamageType() & (~DMG_BLAST) );		GetDriver()->TakeDamage( info );	}	return 0;}
开发者ID:BenLubar,项目名称:SwarmDirector2,代码行数:44,


示例19: UE_LOG

void UDemoNetConnection::LowLevelSend( void* Data, int32 Count ){	if ( Count == 0 )	{		UE_LOG( LogDemo, Warning, TEXT( "UDemoNetConnection::LowLevelSend: Ignoring empty packet." ) );		return;	}	if ( Count > MAX_DEMO_READ_WRITE_BUFFER )	{		UE_LOG( LogDemo, Fatal, TEXT( "UDemoNetConnection::LowLevelSend: Count > MAX_DEMO_READ_WRITE_BUFFER." ) );	}	if ( !GetDriver()->ServerConnection && GetDriver()->FileAr )	{		// If we're outside of an official demo frame, we need to queue this up or it will throw off the stream		if ( !GetDriver()->bIsRecordingDemoFrame )		{			FQueuedDemoPacket & B = *( new( QueuedDemoPackets )FQueuedDemoPacket );			B.Data.AddUninitialized( Count );			FMemory::Memcpy( B.Data.GetData(), Data, Count );			return;		}		*GetDriver()->FileAr << Count;		GetDriver()->FileAr->Serialize( Data, Count );		#if DEMO_CHECKSUMS == 1		uint32 Checksum = FCrc::MemCrc32( Data, Count, 0 );		*GetDriver()->FileAr << Checksum;#endif	}}
开发者ID:kidaa,项目名称:UnrealEngineVR,代码行数:33,


示例20: FlushNet

void UDemoNetConnection::FlushNet( bool bIgnoreSimulation ){	// in playback, there is no data to send except	// channel closing if an error occurs.	if ( GetDriver()->ServerConnection != NULL )	{		InitSendBuffer();	}	else	{		Super::FlushNet( bIgnoreSimulation );	}}
开发者ID:kidaa,项目名称:UnrealEngineVR,代码行数:13,


示例21: GetDriver

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CASW_PropJeep::CheckWaterLevel( void ){	CBaseEntity *pEntity = GetDriver();	if ( pEntity && pEntity->IsPlayer() )	{		CBasePlayer *pPlayer = static_cast<CBasePlayer*>( pEntity );				Vector vecAttachPoint;		QAngle vecAttachAngles;				// Check eyes. (vehicle_driver_eyes point)		int iAttachment = LookupAttachment( "vehicle_driver_eyes" );		GetAttachment( iAttachment, vecAttachPoint, vecAttachAngles );		// Add the jeep's Z view offset		Vector vecUp;		AngleVectors( vecAttachAngles, NULL, NULL, &vecUp );		vecUp.z = clamp( vecUp.z, 0.0f, vecUp.z );		vecAttachPoint.z += r_JeepViewZHeight.GetFloat() * vecUp.z;		bool bEyes = ( UTIL_PointContents( vecAttachPoint, MASK_WATER ) & MASK_WATER ) ? true : false;		if ( bEyes )		{			pPlayer->SetWaterLevel( WL_Eyes );			return;		}		// Check waist.  (vehicle_engine point -- see parent function).		if ( m_WaterData.m_bBodyInWater )		{			pPlayer->SetWaterLevel( WL_Waist );			return;		}		// Check feet. (vehicle_feet_passenger0 point)		iAttachment = LookupAttachment( "vehicle_feet_passenger0" );		GetAttachment( iAttachment, vecAttachPoint, vecAttachAngles );		bool bFeet = ( UTIL_PointContents( vecAttachPoint, MASK_WATER ) & MASK_WATER ) ? true : false;		if ( bFeet )		{			pPlayer->SetWaterLevel( WL_Feet );			return;		}		// Not in water.		pPlayer->SetWaterLevel( WL_NotInWater );	}}
开发者ID:BenLubar,项目名称:SwarmDirector2,代码行数:51,


示例22: ReadSectors

static int ReadSectors(int drive, Bit32u sector, Bit16u num, unsigned char *buf){	unsigned char req_buf[24];	unsigned save_ax = _AX;	int error;	Bit8u driver = GetDriver(drive);	if (driver >= 4)		return MSCDEX_ERROR_UNKNOWN_DRIVE;	*CALC_PTR(req_buf, MSCD_READ_STARTSECTOR, u_long) = sector;	*CALC_PTR(req_buf, MSCD_READ_ADRESSING, u_char) = 0;	*CALC_PTR(req_buf, MSCD_READ_NUMSECTORS, u_short) = num;	_AH = 2 | (driver << 6);	cdrom_helper(req_buf, buf);	error = _AL == 0 ? 0 : MSCDEX_ERROR_DRIVE_NOT_READY;	_AX = save_ax;	return error;}
开发者ID:ErisBlastar,项目名称:osfree,代码行数:17,


示例23: SetNextThink

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropVehicleChoreoGeneric::Think(void){	SetNextThink( gpGlobals->curtime + 0.1 );	if ( GetDriver() )	{		BaseClass::Think();				// If the enter or exit animation has finished, tell the server vehicle		if ( IsSequenceFinished() && (m_bExitAnimOn || m_bEnterAnimOn) )		{			GetServerVehicle()->HandleEntryExitFinish( m_bExitAnimOn, true );		}	}	StudioFrameAdvance();	DispatchAnimEvents( this );}
开发者ID:P1x3lF3v3r,项目名称:Estranged-Act-1,代码行数:21,


示例24: Assert

//-----------------------------------------------------------------------------// Purpose: // Input  : pPlayer - //-----------------------------------------------------------------------------void CChoreoGenericServerVehicle::ItemPostFrame( CBasePlayer *player ){	Assert( player == GetDriver() );	GetDrivableVehicle()->ItemPostFrame( player );	if (( player->m_afButtonPressed & IN_USE ) || GetVehicle()->ShouldForceExit() )	{		GetVehicle()->ClearForcedExit();		if ( GetDrivableVehicle()->CanExitVehicle(player) )		{			// Let the vehicle try to play the exit animation			if ( !HandlePassengerExit( player ) && ( player != NULL ) )			{				player->PlayUseDenySound();			}		}	}}
开发者ID:P1x3lF3v3r,项目名称:Estranged-Act-1,代码行数:23,


示例25: GetDriver

void UDemoNetConnection::HandleClientPlayer( APlayerController* PC, UNetConnection* NetConnection ){	Super::HandleClientPlayer( PC, NetConnection );	// Assume this is our special spectator controller	GetDriver()->SpectatorController = PC;	for ( FActorIterator It( Driver->World ); It; ++It)	{		if ( It->IsA( APlayerStart::StaticClass() ) )		{			PC->SetInitialLocationAndRotation( It->GetActorLocation(), It->GetActorRotation() );			if ( PC->GetPawn() )			{				PC->GetPawn()->TeleportTo( It->GetActorLocation(), It->GetActorRotation(), false, true );			}			break;		}	}}
开发者ID:kidaa,项目名称:UnrealEngineVR,代码行数:21,


示例26: HandleWater

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CASW_PropJeep::HandleWater( void ){	// Only check the wheels and engine in water if we have a driver (player).	if ( !GetDriver() )		return;	// Check to see if we are in water.	if ( CheckWater() )	{		for ( int iWheel = 0; iWheel < ASW_JEEP_WHEEL_COUNT; ++iWheel )		{			// Create an entry/exit splash!			if ( m_WaterData.m_bWheelInWater[iWheel] != m_WaterData.m_bWheelWasInWater[iWheel] )			{				CreateSplash( m_WaterData.m_vecWheelContactPoints[iWheel] );				CreateRipple( m_WaterData.m_vecWheelContactPoints[iWheel] );			}						// Create ripples.			if ( m_WaterData.m_bWheelInWater[iWheel] && m_WaterData.m_bWheelWasInWater[iWheel] )			{				if ( m_WaterData.m_flNextRippleTime[iWheel] < gpGlobals->curtime )				{					// Stagger ripple times					m_WaterData.m_flNextRippleTime[iWheel] = gpGlobals->curtime + RandomFloat( 0.1, 0.3 );					CreateRipple( m_WaterData.m_vecWheelContactPoints[iWheel] );				}			}		}	}	// Save of data from last think.	for ( int iWheel = 0; iWheel < ASW_JEEP_WHEEL_COUNT; ++iWheel )	{		m_WaterData.m_bWheelWasInWater[iWheel] = m_WaterData.m_bWheelInWater[iWheel];	}}
开发者ID:BenLubar,项目名称:SwarmDirector2,代码行数:40,


示例27: SetNextThink

//-----------------------------------------------------------------------------// Purpose: //-----------------------------------------------------------------------------void CPropCrane::Think(void){	SetNextThink( gpGlobals->curtime + 0.1 );	if ( GetDriver() )	{		BaseClass::Think();				if ( m_hNPCDriver )		{			GetServerVehicle()->NPC_DriveVehicle();		}		// play enter animation		StudioFrameAdvance();		// If the enter or exit animation has finished, tell the server vehicle		if ( IsSequenceFinished() && (m_bExitAnimOn || m_bEnterAnimOn) )		{			if ( m_bEnterAnimOn )			{				// Finished entering, display the hint for using the crane				UTIL_HudHintText( m_hPlayer, "#Valve_Hint_CraneKeys" );			}						GetServerVehicle()->HandleEntryExitFinish( m_bExitAnimOn, true );		}	}	else	{		// Run the crane's movement		RunCraneMovement( 0.1 );	}	// Update follower bones	m_BoneFollowerManager.UpdateBoneFollowers(this);}
开发者ID:Adidasman1,项目名称:source-sdk-2013,代码行数:40,



注:本文中的GetDriver函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ GetDroppedFlagGUID函数代码示例
C++ GetDriveTypeA函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。