Ой! А зачем поворачивать, если положение в пространстве пофиг, может лучше попробовать менять порядок точек текстуры, по часовой там, против. Вообще то текстура должна соответствовать фигуре, иначе будут искажения. В примере с градиентом искажения пойдут вдоль оси градиента и будут незаметны, сойдет простое наложение, типа четырехугольник. Если накладывать на параллелограмм что-то посложней градиента, придется деформировать изображение текстуры, как у текстуры луны, правда, как это должно выглядеть даже не представляю. Может делать обратный наклон изображения на текстуре и смещать точки по неиспользованным полям.
Вершинные координаты не имеют ни какого отношения к текстурным. Если развертку полигонов наложить на текстуру и замерить вершины, получим пиксельные координаты, и пиксельные перегоняем в текстурные: программную ширину текстуры равную 1, делим на действительную =512, и умножаем на пиксельную координату.
m[15,20]:byte - Массив поле v:byte; - Вектор направления, четыре направления - четыре значения 1,2,3,4 s:byte=3; - Количество сегментов удава
Инициализируем удава: 2-голова 3-тело 4- хвост
Рабочий цикл: 1-новое положение головы в зависимости от вектора направления, с проверкой коллизий. (если голова на кролике, увеличиваем s на 1) Далее сканируем поле, и если >0 и <254, ячейки массива увеличиваем на 1 (как бы сдвигаем сегменты в сторону головы). Вычисляем хвост if (m[a,b]==s+2){m[a,b]=0} (если голова на кролике, ничего не обнулится, s то выросла)
Code
const maxx=20; maxy=35;
var m:array[0..maxx,0..maxy]of byte; v:byte; s:byte;
/////////////////////////////////////////////////////////////////////// procedure Krolik; //Рандомный кролиа var a,x,y:integer; begin for a:=1 to 1000 do begin x:=random(maxx); y:=random(maxy); if m[x,y]=0 then begin m[x,y]:=254; break; end; end; end; //----------------------- procedure Ini; //Новая игра var a,b:integer; begin for b:=0 to maxy do begin for a:=0 to maxx do begin m[a,b]:=0; m[a,0]:=255; m[a,maxy]:=255; m[0,b]:=255; m[maxx,b]:=255; end; end;
m[maxx div 2,maxy div 2]:=1; m[maxx div 2,maxy div 2+1]:=2; m[maxx div 2,maxy div 2+2]:=3; v:=1; s:=3; Krolik; end; /////////////////////////////////////////////////////////////////////// procedure Tf.FormCreate(Sender: TObject); begin Randomize; Ini; end;
procedure Tf.FormClose(Sender: TObject; var Action: TCloseAction); begin // end;
procedure Tf.Timer1Timer(Sender: TObject); var a,b:integer; begin
// Рабочий цикл for b:=0 to maxy do begin for a:=0 to maxx do begin if m[a,b]=2 then begin if v=1 then begin if m[a,b-1]>0 then begin if m[a,b-1]=254 then begin m[a,b-1]:=1; // новое положение головы inc(s); Krolik; end else begin Ini; end; end else begin m[a,b-1]:=1; // новое положение головы end; end;
if v=2 then begin if m[a,b+1]>0 then begin if m[a,b+1]=254 then begin m[a,b+1]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a,b+1]:=1; end; end;
if v=3 then begin if m[a-1,b]>0 then begin if m[a-1,b]=254 then begin m[a-1,b]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a-1,b]:=1; end; end;
if v=4 then begin if m[a+1,b]>0 then begin if m[a+1,b]=254 then begin m[a+1,b]:=1; inc(s); Krolik; end else begin Ini; end; end else begin m[a+1,b]:=1; end; end; end; end; end;
// сдвиг сегментов удава и обнуление хвоста for b:=0 to maxy do begin for a:=0 to maxx do begin if (m[a,b]>0)and(m[a,b]<254) then m[a,b]:=m[a,b]+1; if m[a,b]=s+2 then m[a,b]:=0; end; end;
// отрисовка for b:=0 to maxy do begin for a:=0 to maxx do begin if m[a,b]=0 then f.Image1.Canvas.Brush.Color:=clsilver; if m[a,b]=255 then f.Image1.Canvas.Brush.Color:=clred; if m[a,b]=254 then f.Image1.Canvas.Brush.Color:=clYellow; if (m[a,b]>0)and(m[a,b]<254) then f.Image1.Canvas.Brush.Color:=clGreen; if m[a,b]=2 then f.Image1.Canvas.Brush.Color:=clTeal; f.Image1.Canvas.Rectangle(a*16,b*16,a*16+16,b*16+16); f.Image1.Canvas.TextOut(a*16,b*16,inttostr(m[a,b])); end; end; end; // управление движением procedure Tf.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key=87 then v:=1; if key=83 then v:=2; if key=65 then v:=3; if key=68 then v:=4; end;
Расслабься. Представь что, нужно сделать авиационный симулятор, реальный, с подъемной силой от элеронов там, хелеронов всяких. Или систему бух учета мега канторы, или модель погоды в пределах континента. Так что, сначала в авиационный, потом в экономический, геодеозеофезический, космо - гномоюредический, и в конце на прогера.
Карта делится на квадраты (двухмерный массив), выступает в роли базы данных. По x y юнита, записываем его положение в карту и смотрим соседние ячейки на наличие врагов (они тоже отмечают свое положение на карте). Тое перебираем юнитов и просматриваем их окружение.
Добавил Win7 к XP. Запустил демки GLEngine - поперли errorы с нолями. Сокеты работают без проблем. Задачи усложняются, остался без графического движка, придется лепить на канвасе, ужас, щас пойду напьюсь.
Хост hostinger отстой. Хотел вторую версию закинуть, облом, помучился и удалил акк. Когда удалил, выскачело: "у нас тут дос атака, спасибо за терпение и понимание", вот так хост без рекламы.