Разработка проэктов

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Разработка проэктов » Другое » Движение


Движение

Сообщений 1 страница 8 из 8

1

помогите пожалуйста, неможем заставить танк двигаться вот кусок кода
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=37 then tx:=x-1;
if key=37 then step:=1;
if key=38 then ty:=y-1;
if key=38 then step:=0;
if key=39 then tx:=x+1;
if key=39 then step:=3;
if key=40 then ty:=y+1;
if key=40 then step:=2;

if((mas[trunc(tx/32),trunc(ty/32)]=1) or (mas[trunc(tx/32),trunc(ty/32)]=0)) and
  ((mas[trunc((tx+32)/32),trunc(ty/32)]=1) or (mas[trunc((tx+32)/32),trunc(ty/32)]=0)) and
  ((mas[trunc(tx/32),trunc((ty+32)/32)]=1) or (mas[trunc(tx/32),trunc((ty+32)/32)]=0)) and
  ((mas[trunc((tx+32)/32),trunc((ty+32)/32)]=1) or (mas[trunc((tx+32)/32),trunc((ty+32)/32)]=0))
  then
  begin

x:=tx;
y:=ty;

view();
sprite();
end;
end;

0

2

поставьте в начале функции приравнивание по умолчанию
tx:=x;
ty:=y;

когда вы проверяете нажатие клавиши вы устанавливаете значение только одной переменной либо tx либо ty а их нужно вместе устанавливать.

0

3

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList,ExtCtrls;

type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    ImageList2: TImageList;
    Timer1: TTimer;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    procedure view();
    procedure sprite;
    procedure map;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  mas:array [0..20,0..20] of byte;
   i,j: integer;
   x,y,tx,ty,step:integer;
implementation

{$R *.dfm}

procedure TForm1.view();
begin
for i:=0 to 20 do
for j:=0 to 20 do
begin
imagelist1.Draw(form1.canvas,i*32,j*32,mas[i,j]);
end;
end;

procedure tform1.sprite;
begin
x:=200;
y:=630;
imagelist2.draw(form1.Canvas,x,y,step);
end;

procedure tform1.map;
begin

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
for i:=1 to 30 do
begin
x:=random(21);
y:=random(21);
mas[x,y]:=2;
end;

for i:=1 to 15 do
begin
x:=random(21);
y:=random(21);
mas[x,y]:=0;
end;

for i:=1 to 30 do
begin
x:=random(21);
y:=random(21);
mas[x,y]:=1;
end;

for i:=1 to 30 do
begin
x:=random(21);
y:=random(21);
mas[x,y]:=3;
end;

x:=0;
y:=0;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
tx:=x;
ty:=y;

if key=37 then tx:=x-1;
if key=37 then step:=1;
if key=38 then ty:=y-1;
if key=38 then step:=0;
if key=39 then tx:=x+1;
if key=39 then step:=3;
if key=40 then ty:=y+1;
if key=40 then step:=2;

if((mas[trunc(tx/32),trunc(ty/32)]=1) or (mas[trunc(tx/32),trunc(ty/32)]=0)) and
  ((mas[trunc((tx+32)/32),trunc(ty/32)]=1) or (mas[trunc((tx+32)/32),trunc(ty/32)]=0)) and
  ((mas[trunc(tx/32),trunc((ty+32)/32)]=1) or (mas[trunc(tx/32),trunc((ty+32)/32)]=0)) and
  ((mas[trunc((tx+32)/32),trunc((ty+32)/32)]=1) or (mas[trunc((tx+32)/32),trunc((ty+32)/32)]=0))
  then
  begin

x:=tx;
y:=ty;

view();
sprite();
end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
view();
sprite();
end;

end.

0

4

во первых вы не за комментировали проверку на взаимодействие в процедуре опроса клавиатуры

во вторых посмотрите внимательно процедуру отрисовки спрайта

procedure tform1.sprite;
begin
x:=200;
y:=630;
imagelist2.draw(form1.Canvas,x,y,step);
end;

для чего вот это???
x:=200;
y:=630;

0

5

для чего вот это???
x:=200;
y:=630;

Это положение танка на карте

0

6

т.е. вы хотите сказать, что каждый раз когда вы нажимаете клавишу вы изменяете координату например x

вот ваш алгоритм

после того как вы нажали на клавишу отрабатывается событие
допустим у вас в самом начале работы события x=210 y=150

например вы нажали на клавишу вправо то x = x + 1 соответственно x=211

далее вызываем процедуру отрисовки
а в ней говорим
x=200
y=630
и выводим спрайт с координатами x,y

ничего лишнего не находите?

0

7

x=200
y=630
это действительно было лишнее, но возникает другой вопрос как сделать точку респа танка?

0

8

именно респавна танка или начальное положение танка при запуске программы?

если при запуске программы то у вас есть событие создания формы там и вписывайте чему равны координыт

а вот если респавна то придется вводить дополнительные две переменные например resx resy которые также будут назначаться в событии создании формы но только при определенных условиях (например при смерти танка) вы пишете что
x=resx
y=resy

0


Вы здесь » Разработка проэктов » Другое » Движение