lol its indeed funny
i doubt on using huds on my first thougth, but huds arent static like menu.vars!
you can have alot fun with them, i did a short test, and it works
nothing big, only to test, how the menu reacts to the mouse...
i added a treshold, maybe 10 is still too big
also there is nothing dynamic in it, there are just 4 menus
maybe, when you choose the menu, on one side the submenu will appear, on the other side a back-menu will appear
feel free to do it better xD
but good idea kung!
>>>WATCH ME<<<
Code:
init()
{
level.quickmenu[0] = &"^1Menu 1"; precacheString( level.quickmenu[0] );
level.quickmenu[1] = &"^2Menu 2"; precacheString( level.quickmenu[1] );
level.quickmenu[2] = &"^3Menu 3"; precacheString( level.quickmenu[2] );
level.quickmenu[3] = &"^4Menu 4"; precacheString( level.quickmenu[3] );
precacheShader( "white" );
level thread onPlayerConnecting();
}
onPlayerConnecting()
{
while( true )
{
level waittill( "connected" , player );
player thread onPlayerSpawned();
}
}
onPlayerSpawned()
{
self endon( "disconnect" );
while( true )
{
self waittill( "spawned_player" );
self thread quickMenu();
}
}
quickMenu()
{
self endon( "disconnect" );
self endon( "killed_player" );
if( isSubStr( self.name , "bot" ) )
return;
self thread cleanUp();
menuCount = 4;
radius = 100;
treshold = 10;
while( true )
{
while( !self useButtonPressed() )
{
wait( 0.5 );
}
oa = self getPlayerAngles();
na = oa;
self.active_menu = 0;
while( self useButtonPressed() )
{
if( !isDefined( self.quickhud_string ) )
{
self.quickhud_string = [];
self.quickhud_shader = [];
for( i = 0 ; i < menuCount ; i++ )
{
/*
Menu2
/ \
/ \
Menu1 Menu3
\ /
\ /
Menu0
*/
deg = 360 / menuCount * i;
x = sin( deg ) * radius;
y = cos( deg ) * radius;
self.quickhud_string[i] = newMenuStringHud( self , x , y , i );
self.quickhud_shader[i] = newMenuShaderHud( self , x , y );
}
self setActiveMenu( 0 );
}
na = self getPlayerAngles();
if( na != oa )
{
hDiff = angleDiff( na[1] , oa[1] );
vDiff = angleDiff( na[0] , oa[0] );
if( hDiff > treshold )
{
// self iPrintLn( "hDiff = " + hDiff + " side = right" );
self setActiveMenu( 1 );
}
else if( hDiff < 0 - treshold )
{
// self iPrintLn( "hDiff = " + hDiff + " side = left" );
self setActiveMenu( 3 );
}
else
{
// iPrintLn( "hDiff = " + hDiff );
}
if( vDiff > treshold )
{
// self iPrintLn( "vDiff = " + vDiff + " side = up" );
self setActiveMenu( 2 );
}
else if( vDiff < 0 - treshold )
{
// self iPrintLn( "vDiff = " + vDiff + " side = down" );
self setActiveMenu( 0 );
}
else
{
// iPrintLn( "vDiff = " + vDiff );
}
}
oa = na;
wait( 0.5 );
}
if( isDefined( self.quickhud_string ) )
{
for( i = 0 ; i < self.quickhud_string.size ; i++ )
{
self.quickhud_string[i] destroy();
self.quickhud_shader[i] destroy();
}
self.quickhud_string = undefined;
self.quickhud_shader = undefined;
}
}
}
setActiveMenu( menuID )
{
ID = self.active_menu;
self.quickhud_string[ID].color = ( 1 , 1 , 1 );
self.quickhud_string[ID].fontscale = 1.0;
self.quickhud_shader[ID].color = ( 1 , 1 , 1 );
self.quickhud_shader[ID].alpha = 0.2;
self.active_menu = menuID;
self.quickhud_string[menuID].color = ( 0 , 0 , 1 );
self.quickhud_string[menuID].fontscale = 1.5;
self.quickhud_shader[menuID].color = ( 0 , 0 , 1 );
self.quickhud_shader[menuID].alpha = 0.5;
}
newMenuStringHud( player , x , y , menuID )
{
hud = newClientHudElem( player );
hud.x = x;
hud.y = y;
hud.horzAlign = "center";
hud.vertAlign = "middle";
hud.alignX = "center";
hud.alignY = "middle";
hud setText( level.quickmenu[menuID] );
return hud;
}
newMenuShaderHud( player , x , y )
{
w = 50;
h = 20;
hud = newClientHudElem( player );
hud.x = x - ( w * 0.5 );
hud.y = y - ( h * 0.5 );
hud.horzAlign = "center";
hud.vertAlign = "middle";
hud.alpha = 0.2;
hud setShader( "white" , w , h );
return hud;
}
cleanUp()
{
self waittill( "killed_player" );
if( isDefined( self.quickhud_string ) )
{
for( i = 0 ; i < self.quickhud_string.size ; i++ )
{
self.quickhud_string[i] destroy();
self.quickhud_shader[i] destroy();
}
self.quickhud_string = undefined;
self.quickhud_shader = undefined;
}
}
angleDiff( firstAngle , secondAngle )
{
/*
diff = int( secondAngle - firstAngle );
while( diff < -180 ) diff += 360;
while( diff > 180 ) diff -= 360;
*/
diff = secondAngle - firstAngle;
if( diff > 180 || diff <= -180 )
{
diff = ( 360 / 2048 ) * ( int( diff * 2048 / 360 ) & 2047 );
if( diff >= 180 )
diff -= 360;
}
return diff;
}