diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-16 22:32:17 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-16 22:32:17 +0000 |
| commit | 4a3c2e2c8c3a8dee5828258f920f1c175e952cb0 (patch) | |
| tree | e0fda9dfad5e605c0810c8f27d719078cd48fd63 /src/game/client | |
| parent | 727c9a3a3249deec1c5a96025e99c0c654e7ff80 (diff) | |
| download | zcatch-4a3c2e2c8c3a8dee5828258f920f1c175e952cb0.tar.gz zcatch-4a3c2e2c8c3a8dee5828258f920f1c175e952cb0.zip | |
loads of fixes, skidding, velocity ramping and other stuff
Diffstat (limited to 'src/game/client')
| -rw-r--r-- | src/game/client/gc_client.cpp | 28 | ||||
| -rw-r--r-- | src/game/client/gc_client.h | 1 | ||||
| -rw-r--r-- | src/game/client/gc_effects.cpp | 54 | ||||
| -rw-r--r-- | src/game/client/gc_particles.cpp | 1 | ||||
| -rw-r--r-- | src/game/client/gc_render_obj.cpp | 45 |
5 files changed, 108 insertions, 21 deletions
diff --git a/src/game/client/gc_client.cpp b/src/game/client/gc_client.cpp index 7b191fbf..2526ab83 100644 --- a/src/game/client/gc_client.cpp +++ b/src/game/client/gc_client.cpp @@ -1373,11 +1373,15 @@ void render_game() { gfx_mapscreen(0, 0, 300*gfx_screenaspect(), 300); - float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y), - vec2(netobjects.local_character->x, netobjects.local_character->y)); + /*float speed = distance(vec2(netobjects.local_prev_character->x, netobjects.local_prev_character->y), + vec2(netobjects.local_character->x, netobjects.local_character->y));*/ + + float velspeed = length(vec2(netobjects.local_character->vx/256.0f, netobjects.local_character->vy/256.0f))*50; + + float ramp = velocity_ramp(velspeed, tuning.velramp_start, tuning.velramp_range, tuning.velramp_curvature); char buf[512]; - str_format(buf, sizeof(buf), "%.2f %d", speed/2, netobj_num_corrections()); + str_format(buf, sizeof(buf), "%.0f\n%.0f\n%.2f\n%d", velspeed, velspeed*ramp, ramp, netobj_num_corrections()); gfx_text(0, 150, 50, 12, buf, -1); } @@ -1481,6 +1485,24 @@ void render_game() count++; } + + y = y+count*6; + + gfx_texture_set(-1); + gfx_blend_normal(); + gfx_lines_begin(); + float height = 50.0f; + float pv = 1; + for(int i = 0; i < 100; i++) + { + float speed = i/100.0f * 3000; + float ramp = velocity_ramp(speed, tuning.velramp_start, tuning.velramp_range, tuning.velramp_curvature); + float rampedspeed = (speed * ramp)/1000.0f; + gfx_lines_draw((i-1)*2, y+height-pv*height, i*2, y+height-rampedspeed*height); + //gfx_lines_draw((i-1)*2, 200, i*2, 200); + pv = rampedspeed; + } + gfx_lines_end(); } gfx_text_color(1,1,1,1); diff --git a/src/game/client/gc_client.h b/src/game/client/gc_client.h index e6145954..55a880ed 100644 --- a/src/game/client/gc_client.h +++ b/src/game/client/gc_client.h @@ -142,6 +142,7 @@ void effects_update(); void effect_bullettrail(vec2 pos); void effect_smoketrail(vec2 pos, vec2 vel); +void effect_skidtrail(vec2 pos, vec2 vel); void effect_explosion(vec2 pos); void effect_air_jump(vec2 pos); void effect_damage_indicator(vec2 pos, vec2 dir); diff --git a/src/game/client/gc_effects.cpp b/src/game/client/gc_effects.cpp index fcf7ac93..094392e5 100644 --- a/src/game/client/gc_effects.cpp +++ b/src/game/client/gc_effects.cpp @@ -2,7 +2,8 @@ #include "gc_client.h" #include "../generated/gc_data.h" -static bool add_trail = false; +static bool add_50hz = false; +static bool add_100hz = false; void effect_air_jump(vec2 pos) { @@ -27,7 +28,7 @@ void effect_air_jump(vec2 pos) void effect_powerupshine(vec2 pos, vec2 size) { - if(!add_trail) + if(!add_50hz) return; particle p; @@ -48,7 +49,7 @@ void effect_powerupshine(vec2 pos, vec2 size) void effect_smoketrail(vec2 pos, vec2 vel) { - if(!add_trail) + if(!add_50hz) return; particle p; @@ -65,9 +66,28 @@ void effect_smoketrail(vec2 pos, vec2 vel) } +void effect_skidtrail(vec2 pos, vec2 vel) +{ + if(!add_100hz) + return; + + particle p; + p.set_default(); + p.spr = SPRITE_PART_SMOKE; + p.pos = pos; + p.vel = vel + random_dir()*50.0f; + p.life_span = 0.5f + frandom()*0.5f; + p.start_size = 24.0f + frandom()*12; + p.end_size = 0; + p.friction = 0.7f; + p.gravity = frandom()*-500.0f; + p.color = vec4(0.75f,0.75f,0.75f,1.0f); + particle_add(PARTGROUP_GENERAL, &p); +} + void effect_bullettrail(vec2 pos) { - if(!add_trail) + if(!add_100hz) return; particle p; @@ -77,7 +97,7 @@ void effect_bullettrail(vec2 pos) p.life_span = 0.25f + frandom()*0.25f; p.start_size = 8.0f; p.end_size = 0; - p.friction = 0.7; + p.friction = 0.7f; particle_add(PARTGROUP_PROJECTILE_TRAIL, &p); } @@ -170,14 +190,26 @@ void effect_explosion(vec2 pos) void effects_update() { - static float last_update = 0; - if(client_localtime()-last_update > 0.02f) + static float last_update_100hz = 0; + static float last_update_50hz = 0; + + if(client_localtime()-last_update_100hz > 0.01f) { - add_trail = true; - last_update = client_localtime(); - flow_update(); + add_100hz = true; + last_update_100hz = client_localtime(); } else - add_trail = false; + add_100hz = false; + + if(client_localtime()-last_update_50hz > 0.02f) + { + add_50hz = true; + last_update_50hz = client_localtime(); + } + else + add_50hz = false; + + if(add_50hz) + flow_update(); } diff --git a/src/game/client/gc_particles.cpp b/src/game/client/gc_particles.cpp index bdeb26fd..a0b1ff92 100644 --- a/src/game/client/gc_particles.cpp +++ b/src/game/client/gc_particles.cpp @@ -107,6 +107,7 @@ void particle_update(float time_passed) particles[first_free].prev_part = i; particles[i].prev_part = -1; particles[i].next_part = first_free; + first_free = i; } i = next; diff --git a/src/game/client/gc_render_obj.cpp b/src/game/client/gc_render_obj.cpp index 73f58a85..839a5261 100644 --- a/src/game/client/gc_render_obj.cpp +++ b/src/game/client/gc_render_obj.cpp @@ -25,15 +25,29 @@ void render_projectile(const NETOBJ_PROJECTILE *current, int itemid) gfx_quads_begin(); // get positions - float gravity = -400; - if(current->type != WEAPON_GRENADE) - gravity = -100; + float curvature = 0; + float speed = 0; + if(current->type == WEAPON_GRENADE) + { + curvature = tuning.grenade_curvature; + speed = tuning.grenade_speed; + } + else if(current->type == WEAPON_SHOTGUN) + { + curvature = tuning.shotgun_curvature; + speed = tuning.shotgun_speed; + } + else if(current->type == WEAPON_GUN) + { + curvature = tuning.gun_curvature; + speed = tuning.gun_speed; + } float ct = (client_tick()-current->start_tick)/(float)SERVER_TICK_SPEED + client_ticktime()*1/(float)SERVER_TICK_SPEED; vec2 startpos(current->x, current->y); - vec2 startvel(current->vx, current->vy); - vec2 pos = calc_pos(startpos, startvel, gravity, ct); - vec2 prevpos = calc_pos(startpos, startvel, gravity, ct-0.001f); + vec2 startvel(current->vx/100.0f, current->vy/100.0f); + vec2 pos = calc_pos(startpos, startvel, curvature, speed, ct); + vec2 prevpos = calc_pos(startpos, startvel, curvature, speed, ct-0.001f); select_sprite(data->weapons[clamp(current->type, 0, NUM_WEAPONS-1)].sprite_proj); vec2 vel = pos-prevpos; @@ -295,6 +309,7 @@ void render_player( bool stationary = player.vx < 1 && player.vx > -1; bool inair = col_check_point(player.x, player.y+16) == 0; + bool want_other_dir = (player.wanted_direction == -1 && vel.x > 0) || (player.wanted_direction == 1 && vel.x < 0); // evaluate animation float walk_time = fmod(position.x, 100.0f)/100.0f; @@ -305,7 +320,7 @@ void render_player( anim_eval_add(&state, &data->animations[ANIM_INAIR], 0, 1.0f); // TODO: some sort of time here else if(stationary) anim_eval_add(&state, &data->animations[ANIM_IDLE], 0, 1.0f); // TODO: some sort of time here - else + else if(!want_other_dir) anim_eval_add(&state, &data->animations[ANIM_WALK], walk_time, 1.0f); if (player.weapon == WEAPON_HAMMER) @@ -318,6 +333,22 @@ void render_player( float a = clamp((client_tick()-player.attacktick+ticktime)/40.0f, 0.0f, 1.0f); anim_eval_add(&state, &data->animations[ANIM_NINJA_SWING], a, 1.0f); } + + // do skidding + if(!inair && want_other_dir && length(vec2(prev.vx/256.0f, prev.vy/256.0f)*50) > 500.0f) + { + static int64 skid_sound_time = 0; + if(time_get()-skid_sound_time > time_freq()/10) + { + snd_play_random(CHN_WORLD, SOUND_PLAYER_SKID, 0.25f, position); + skid_sound_time = time_get(); + } + + effect_skidtrail( + position+vec2(-player.wanted_direction*6,12), + vec2(-player.wanted_direction*100*length(vel),-50) + ); + } // draw hook if (prev.hook_state>0 && player.hook_state>0) |