Показать сообщение отдельно
Старый 03.10.2008, 05:39   #14
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: интересные исходники или идеи реализации в MP

интересная статистика скачанных файлов: простым квестом интересовались больше, чем более сложными программами, тогда вот нашел что по-проще.. это наброски алгоритма по которым можно сделать аналог игры Worms, добавить: логику_противника/рисунки/генерация_случайной_карты/скроллирование_карты/разрыв_снарядов.

const
  g     = 9.81;
  count = 100;
var
  vx,vy,t,dt,rad     : real;
  angle,power,step   : integer;
  gx,gy,key,w,h      : integer;
  xp,yp              : integer;
  xx,yy,dx,dy,ok,no  : integer;
  exitCmd,editCmd,cmd: command;


function inbar(x,y,x1,y1,x2,y2 : integer) : boolean;
begin
  if (x>=x1) and (x<=x2) and (y>=y1) and (y<=y2) then inbar := true
    else inbar := false;
end;


procedure draw(b : boolean);
begin
  rad:= pi*angle/180;
  vx := cos(rad);
  vy := sin(rad);
  gx := xp+trunc(vx*10);
  gy := yp-trunc(vy*10);
  vx := vx*power;
  vy := vy*power;
  dt := (2*vy/g)/count;
  setColor(0,0,0);
  if b then setColor(0,255,0);
  drawText('angle='+angle, 0,0);
  drawText('power='+power, 0,16);
  drawText('x='+(gx+trunc(vx*dt*count)), 0,32);
  drawText('ok='+ok+'/no='+no, 0,48);
  drawText('[email protected]', 0,64);
  if b then setColor(255,255,100);
  drawLine(xp, yp, gx, gy);
  t  := dt*step;
  gx := gx+trunc(vx*t);
  gy := gy-trunc((vy*t)-(g*t*t/2));
  if b then setColor(255,0,0);
  fillEllipse(gx-2,gy-2,6,6);
  if b then setColor(0,255,100);
  fillEllipse(gx-3,gy-3,3,3);
  setColor(255,255,255);
  drawLine(0,yp,w,yp);
  drawRect(xp*4,yp-15,5,15);
  {play}
  setColor(0,0,0);
  if b then setColor(0,255,0);
  drawRect(xx-10,yp-1,20,2);
  if b=false then  {move block}
  begin
    xx := xx+dx;
    if (xx>=w) or (xx<=xp*5+5) then dx :=-dx;
  end;
  if b then repaint;
end;


procedure init;
begin
  xx := w div 2;
  yy := yp-2;
  dx := random(2)+1;
  if random(100) > 50 then dx:=-dx;
  dy := 0;
end;


begin
  exitCmd := createCommand('Exit', CM_EXIT, 1);
  addCommand(exitCmd);
  randomize;
  w  := getWidth;
  h  := getHeight;
  xp := 5;
  yp := h-5;
  angle := 90;
  power := 0;
  ok := 0;
  no := 0;
  init;
  setColor(0,0,0);
  fillRect(0,0,w,h);
  repeat
    {out to screen}
    draw(true);
    delay(10);
    draw(false);
    {gun-logic}
    if inbar(gx,gy, xx-10-2,yp-1-2,xx-10+20+2,yp-1+2+2) then
    begin
      init;
      power := 0;
      ok := ok+1;
    end;
    if ((gx>w) or (gy>yp)) or ((gx>=xp*5) and (gx<=xp*5+5) and (gy>=yp-15)) then
    begin
      power := 0;
      no := no+1;
    end
    {play control}
    if (power=0) then
    begin
      key := keyToAction(getKeyPressed);
      if key=GA_UP    then if (angle<170) then angle:=angle+1;
      if key=GA_DOWN  then if (angle>10)  then angle:=angle-1;
      if key=GA_FIRE  then
      begin
        step := 0;
        power := 10;
        repeat
          key := keyToAction(getKeyPressed);
          if (power<70) then  power:=power+1;
          draw(true);
          delay(50);
          draw(false);
        until (key<>GA_FIRE);
      end;
    end
      else step := step+1;
    cmd := getClickedCommand;
  until cmd<>emptyCommand;
  removeCommand(exitCmd);
end.
(Offline)
 
Ответить с цитированием