|
Вопрос # 2 415/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
У меня к вам вопрос такой. Eсть 16 изображений и 16 графиков функций
я пишу массив a= 16 значений по x
массив b= 16 значений по y
массив с= 16 имен изображений
мне нужно что бы по нажатию кнопки 'вверх' данные из ячеек
[a1]:=x+1, b[1]:=y-1, c[1]:='1.bmp';
и ничего не получается
при последующем нажатии клавиши подставлялись значения следующих ячеек масивов менялось изображение и направление движения.
но при этом всегда должно быть движение вперед
т.е x+1 - движение вперед
x+1
y-1 - движение вперед и вниз
код программы в приложении к вопросу
Заранее спасибо.
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Image1: TImage;
- Timer1: TTimer;
-
- procedure FormActivate(Sender: TObject);
- // procedure Timer1Timer(Sender: TObject);
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure Timer1Timer(Sender: TObject);
-
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- const nx=400;
- ny=400;
- var
- Form1: TForm1;
- a : array [1..16] of integer;
- b : array [1..16] of integer;
- c: array[1..16] of string;
- x, y , i, j, m, n, w, h : integer;
- implementation
-
- {$R *.dfm}
- var
- back, bitmap, buf: Tbitmap;
- backRct, BitmapRct, BufRct: TRect;
-
- procedure TForm1.FormActivate(Sender: TObject);
- begin
- n:=1;
- back:=Tbitmap.Create;
- bitmap:=Tbitmap.Create;
- buf:=Tbitmap.Create;
- back.LoadFromFile('background.bmp');
- form1.Image1.Canvas.Draw(0,0,back);
- bitmap.LoadFromFile(c[n]);
- bitmap.Transparent:=true;
- bitmap.TransparentColor:=bitmap.Canvas.Pixels[1,1];
- w:=bitmap.Width;
- h:=bitmap.Height;
- buf.Width:=w;
- buf.Height:=h;
- buf.Palette:=back.Palette;
- buf.Canvas.CopyMode:=cmSrcCopy;
- bufrct:=bounds(0,0,w,h);
- x:=-w;
- y:=20;
- backrct:=bounds(nx+x,ny+y,w,h);
- buf.Canvas.CopyRect(bufrct,back.Canvas,backrct);
-
-
-
- end;
- procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- back.Free;
- bitmap.Free;
- buf.Free;
-
- end;
-
- procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
-
- begin
- if key=vk_left then
- begin
- a[1]:=x+1;
- b[1]:=y-0;
- c[1]:='1.bmp';
-
- a[2]:=x+2;
- b[2]:=y-1;
- c[2]:='2.bmp';
-
- a[3]:=x+1;
- b[3]:=y-1;
- c[3]:='3.bmp';
-
- a[4]:=x+1;
- b[4]:=y-2;
- c[4]:='4.bmp';
-
- a[5]:=x+0;
- b[5]:=y-2;
- c[5]:='5.bmp';
-
- a[6]:=x-1;
- b[6]:=y+2;
- c[6]:='6.bmp';
-
- a[7]:=x-1;
- b[7]:=y-1;
- c[7]:='7.bmp';
-
- a[8]:=x-2;
- b[8]:=y-1;
- c[8]:='8.bmp';
-
- a[9]:=x-1;
- b[9]:=y-0;
- c[9]:='9.bmp';
-
- a[10]:=x-2;
- b[10]:=y+1;
- c[10]:='10.bmp';
-
- a[11]:=x-1;
- b[11]:=y+1;
- c[11]:='11.bmp';
-
- a[12]:=x-1;
- b[12]:=y+2;
- c[12]:='12.bmp';
-
- a[13]:=x+0;
- b[13]:=y+2;
- c[13]:='13.bmp';
-
- a[14]:=x+1;
- b[14]:=y+2;
- c[14]:='14.bmp';
-
- a[15]:=x+1;
- b[15]:=y+1;
- c[15]:='15.bmp';
-
- a[16]:=x+2;
- b[16]:=y+1;
- c[16]:='16.bmp';
-
-
- timer1.Enabled:=true;
- timer1.Interval:=10;
- form1.Image1.Canvas.Draw(x,y,buf);
- n:=1;
- n:=n+1;
-
- if n=16 then
- begin
- n:=1;
- end;
-
- end;
-
-
- end;
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
-
- form1.Canvas.Draw(x,y,buf);
- x:=a[n];
- y:=b[n];
- if x>form1.Width then x:=-w;
- backrct:=bounds(a[n], b[n], w, h);
- buf.Canvas.CopyRect(BufRct, back.Canvas, backrct);
- form1.Image1.Canvas.Draw(x,y,bitmap);
-
- end;
-
-
-
- end.
 |
Вопрос задал: Ровный Ю А (статус: Посетитель)
Вопрос отправлен: 13 февраля 2009, 12:45
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 13 февраля 2009, 15:08; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 13 февраля 2009, 13:47 [#1]:
Долго читал, но так и не понял, что же не так работает. Да, кода много, но непонятно немного, что он делает в результате.
Вопрос, что хотелось, как бы есть, но он как то задан всколзь.
timer1.Interval:=10; - безсмысленная конструкция. Всё равно значения меньше 52 не работают так как ожидается. Ну не будет ось дергать так быстро таймер.
И сложилось впечетление, что о циклах и о том, что такое локальные/глобальные переменные ни гу-гу.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ровный Ю А (статус: Посетитель), 13 февраля 2009, 14:31 [#2]:
Просто когда я задаю каждую функцию на отдельную кнопку включаю таймер1 и указываю конкретную функцию x= y= и название изображения все работает как мне надо. Потом при нажатии другой кнопки приходиться выключать timer1 и включать таймер2 и менять паметры. Но это же обсурд управление 1 элементом 16ю кнопками. Циклами не получилось, решил массивами но опять же он не подставляет /x:=x+1/ а решает её и добавляет 1 вместо функции , а для движения необходимо написать x:=x+1. И поэтому движения нет вместо него перемещение по осям по точкам при нажатии клавиши. причем изображение не меняется а выдает ошибку что что-то с типами данных.
Вобщем эта программа отображает летящий самолет при нажатии кнопки вверх меняется угол направления полета например с горизонтального на диагональ и меняется изображение.
Я начинающий так что прошу помощи.
|
|
Вадим К (статус: Академик), 13 февраля 2009, 14:50 [#3]:
а чем отличается движения от перемещения?
То что вы начинающий, не избавляет от необходимости ясно излагать мысли.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ровный Ю А (статус: Посетитель), 13 февраля 2009, 15:08 [#4]:
Нет движения вперед по функции объект стоит на месте, а при нажатии клавиши он перемещается на другую позицию и остаётся стоять на месте
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|