⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cl_newfx.pas

📁 delphi编的不错的贪吃蛇
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := -2.0;
    p^.color := particleColor;
    dist := DotProduct(move, forward_);
    VectorMA(move, 8 * cos(dist), up, p^.org);
    for j := 0 to 2 do
    begin
      //			p^.org[j] := move[j] + crand();
      p^.vel[j] := 0;
      p^.accel[j] := 0;
    end;
    p^.vel[2] := 5;

    VectorAdd(move, vec, move);
  end;
end;

procedure CL_Tracker_Shell(const origin: vec3_t);
var
  dir: vec3_t;
  i: Integer;
  p: cparticle_p;
begin
  for i := 0 to 299 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := INSTANT_PARTICLE;
    p^.color := 0;

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);

    VectorMA(origin, 40, dir, p^.org);
  end;
end;

procedure CL_MonsterPlasma_Shell(const origin: vec3_t);
var
  dir: vec3_t;
  i: Integer;
  p: cparticle_p;
begin
  for i := 0 to 39 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := INSTANT_PARTICLE;
    p^.color := $E0;

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);

    VectorMA(origin, 10, dir, p^.org);
    //		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
  end;
end;

procedure CL_Widowbeamout(self: cl_sustain_p);
const
  colortable: array[0..3] of Integer = (2 * 8, 13 * 8, 21 * 8, 18 * 8);
var
  dir: vec3_t;
  i: Integer;
  p: cparticle_p;
  ratio: Single;
begin
  ratio := 1.0 - ((self^.endtime - cl.time) / 2100.0);

  for i := 0 to 299 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := INSTANT_PARTICLE;
    p^.color := colortable[rand() and 3];

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);

    VectorMA(self^.org, (45.0 * ratio), dir, p^.org);
    //		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
  end;
end;

procedure CL_Nukeblast(self: cl_sustain_p);
const
  colortable: array[0..3] of Integer = (110, 112, 114, 116);
var
  dir: vec3_t;
  i: Integer;
  p: cparticle_p;
  ratio: Single;
begin
  ratio := 1.0 - ((self^.endtime - cl.time) / 1000.0);

  for i := 0 to 699 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := INSTANT_PARTICLE;
    p^.color := colortable[rand() and 3];

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);

    VectorMA(self^.org, (200.0 * ratio), dir, p^.org);
    //		VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
  end;
end;

procedure CL_WidowSplash(const org: vec3_t);
const
  colortable: array[0..3] of Integer = (2 * 8, 13 * 8, 21 * 8, 18 * 8);
var
  i: Integer;
  p: cparticle_p;
  dir: vec3_t;
begin
  for i := 0 to 255 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;

    p^.time := cl.time;
    p^.color := colortable[rand() and 3];

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);
    VectorMA(org, 45.0, dir, p^.org);
    VectorMA(vec3_origin, 40.0, dir, p^.vel);

    p^.accel[0] := 0;
    p^.accel[1] := 0;
    p^.alpha := 1.0;

    p^.alphavel := -0.8 / (0.5 + frand() * 0.3);
  end;

end;

procedure CL_Tracker_Explode(const origin: vec3_t);
var
  dir, backdir: vec3_t;
  i: Integer;
  p: cparticle_p;
begin
  for i := 0 to 299 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := -1.0;
    p^.color := 0;

    dir[0] := crand();
    dir[1] := crand();
    dir[2] := crand();
    VectorNormalize(dir);
    VectorScale(dir, -1, backdir);

    VectorMA(origin, 64, dir, p^.org);
    VectorScale(backdir, 64, p^.vel);
  end;

end;

(*
===============
CL_TagTrail

===============
*)

procedure CL_TagTrail(const start, end_: vec3_t; color: Single);
var
  move: vec3_t;
  vec: vec3_t;
  len: Single;
  j: Integer;
  p: cparticle_p;
  dec: Integer;
begin
  VectorCopy(start, move);
  VectorSubtract(end_, start, vec);
  len := VectorNormalize(vec);

  dec := 5;
  VectorScale(vec, 5, vec);

  while (len >= 0) do
  begin
    len := len - dec;

    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := -1.0 / (0.8 + frand() * 0.2);
    p^.color := color;
    for j := 0 to 2 do
    begin
      p^.org[j] := move[j] + crand() * 16;
      p^.vel[j] := crand() * 5;
      p^.accel[j] := 0;
    end;

    VectorAdd(move, vec, move);
  end;
end;

(*
===============
CL_ColorExplosionParticles
===============
*)

procedure CL_ColorExplosionParticles(const org: vec3_t; color, run: Integer);
var
  i, j: Integer;
  p: cparticle_p;
begin
  for i := 0 to 127 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;

    p^.time := cl.time;
    p^.color := color + (rand() mod run);

    for j := 0 to 2 do
    begin
      p^.org[j] := org[j] + ((rand() mod 32) - 16);
      p^.vel[j] := (rand() mod 256) - 128;
    end;

    p^.accel[0] := 0;
    p^.accel[1] := 0;
    p^.accel[2] := -PARTICLE_GRAVITY;
    p^.alpha := 1.0;

    p^.alphavel := -0.4 / (0.6 + frand() * 0.2);
  end;
end;

(*
===============
CL_ParticleSmokeEffect - like the steam effect, but unaffected by gravity
===============
*)

procedure CL_ParticleSmokeEffect(var org, dir: vec3_t; color, count, magnitude: Integer);
var
  i, j: Integer;
  p: cparticle_p;
  d: Single;
  r, u: vec3_t;
begin
  MakeNormalVectors(dir, r, u);

  for i := 0 to count - 1 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;

    p^.time := cl.time;
    p^.color := color + (rand() and 7);

    for j := 0 to 2 do
    begin
      p^.org[j] := org[j] + magnitude * 0.1 * crand();
      //			p^.vel[j] := dir[j]*magnitude;
    end;
    VectorScale(dir, magnitude, p^.vel);
    d := crand() * magnitude / 3;
    VectorMA(p^.vel, d, r, p^.vel);
    d := crand() * magnitude / 3;
    VectorMA(p^.vel, d, u, p^.vel);

    p^.accel[0] := 0;
    p^.accel[1] := 0;
    p^.accel[2] := 0;
    p^.alpha := 1.0;

    p^.alphavel := -1.0 / (0.5 + frand() * 0.3);
  end;
end;

(*
===============
CL_BlasterParticles2

Wall impact puffs (Green)
===============
*)

procedure CL_BlasterParticles2(const org, dir: vec3_t; color: Cardinal);
var
  i, j: Integer;
  p: cparticle_p;
  d: Single;
  count: Integer;
begin
  count := 40;
  for i := 0 to count - 1 do
  begin
    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;

    p^.time := cl.time;
    p^.color := color + Cardinal(rand() and 7);

    d := rand() and 15;
    for j := 0 to 2 do
    begin
      p^.org[j] := org[j] + ((rand() and 7) - 4) + d * dir[j];
      p^.vel[j] := dir[j] * 30 + crand() * 40;
    end;

    p^.accel[0] := 0;
    p^.accel[1] := 0;
    p^.accel[2] := -PARTICLE_GRAVITY;
    p^.alpha := 1.0;

    p^.alphavel := -1.0 / (0.5 + frand() * 0.3);
  end;
end;

(*
===============
CL_BlasterTrail2

Green!
===============
*)

procedure CL_BlasterTrail2(const start, end_: vec3_t);
var
  move: vec3_t;
  vec: vec3_t;
  len: Single;
  j: Integer;
  p: cparticle_p;
  dec: Integer;
begin
  VectorCopy(start, move);
  VectorSubtract(end_, start, vec);
  len := VectorNormalize(vec);

  dec := 5;
  VectorScale(vec, 5, vec);

  // FIXME: this is a really silly way to have a loop
  while (len > 0) do
  begin
    len := len - dec;

    if (free_particles = nil) then
      Exit;
    p := free_particles;
    free_particles := p^.next;
    p^.next := active_particles;
    active_particles := p;
    VectorClear(p^.accel);

    p^.time := cl.time;

    p^.alpha := 1.0;
    p^.alphavel := -1.0 / (0.3 + frand() * 0.2);
    p^.color := $D0;
    for j := 0 to 2 do
    begin
      p^.org[j] := move[j] + crand();
      p^.vel[j] := crand() * 5;
      p^.accel[j] := 0;
    end;

    VectorAdd(move, vec, move);
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -