Знающий
Регистрация: 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.
|