![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Image перестал двигаться. [Delphi, Windows]
Zak3D[@Tm] © (2004-01-09 00:00:00)Мастера, помогите советом, сегодня начал добавлять к игре меню опции и заставку, всё было нормально, никаких ошибок не выскакивало, но машина(Image1-машина которой управляет игрок(///if KEY=VK_Left then x:=x-5///)) перестала ездить. Подробнее, первоночально была одна форма(собсно где проходит игра),потор решил добавить две формы(одну для заставки, а другую для меню), потом назначил главной, форму с заставкой т.к. я не знаю как сделать, чтобы сначала проигрывался ролик, потом появлялось меню настроек и только потом игра(что не делал, всегда сначала игра появляется или вобше ошибки выдаёт), собственно после этого рисунок и замер. Помогите пожалуйста советом, если не тяжело...
Zak3D[@Tm] (2004-01-09 19:51:00) [1]Кто-нибудь может подсказать как поверх флэшевского ролика заставить Image двигаться?
Zak3D[@Tm] (2004-01-09 15:12:00) [2]Ладно, попробую, но не в этой игре, сейчас я просто хочу, чтобы получилась простенькая гоночка, ну так сказать для набора опыта. ;)
Mihey (2004-01-09 14:05:00) [3]Можно, но не так нужно. Ты пытаешься сделать игру просто набросав компонентов. Это не подход. В конце концов у тебя всё начнёт тормозить по страшному. Тебе уже сейчас приходится использовать DoubleBuffered. Почитай статьи на сайте DelphiGFX, в своё время я по ним учился.
Zak3D[@Tm] (2004-01-09 12:22:00) [4]Да, ты был прав(как я сам этого не понял?), спасибо за помошь, не знаешь, нельзя ли сделать, чтобы флэш ролик проигрывался на заднем плане, а например машина(Image) ехала на его поверхности...
Zak3D[@Tm] (2004-01-09 12:07:00) [5]Спасибо Mihey сейчас попробую...
Mihey (2004-01-09 01:29:00) [6]P.S.: Пиши всегда код с отступами - тогда точно на такое не попадёшься.
Mihey (2004-01-09 01:28:00) [7]procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_Escape then if MessageDlg('Вы действительно хотите выйти?', mtConfirmation, [mbYes,mbNo], 0) = idYes then
begin
form3.Show;
ModalResult:=3;
hide;
end;
if Key=VK_Up then y:=y-5;
if Key=VK_Down then y:=y+5;
if Key=VK_Left then x:=x-5;
if Key=VK_Right then x:=x+5;
if x<0 then x:=0;
if x>trunc(ClientWidth-Panel1.Width-Image1.Width) then x:=trunc(ClientWidth-Panel1.Width-Image1.Width);
// а тут не надо
end;
Ты перепутал и поставил End в конец, т.е. остальные клавиши обрабатывались только когда пользователь нажимал Yes. Вот ещё совет - сильно с ModalResult не балуй и лучше может сначала Hide, потом ModalResult := ..., а потом Show.
Zak3D[@Tm] (2004-01-09 00:40:00) [8]Чёта я лишнего накопировал, сори, просто спешил чтобы ты не ушел
Zak3D[@Tm] (2004-01-09 00:31:00) [9]Код для формы с машиной такой(только начал писать)
///////////////
var
Form1: TForm1;
frames : integer;
fps : integer;
x,y,i2,i3,i4 : integer;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Frames:=Frames+1;
fps:=0;
image1.Left:=x;
image1.Top:=y;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_Escape then if MessageDlg('Вы действительно хотите выйти?',mtConfirmation,[mbYes,mbNo],0)=idYes then begin
form3.Show;
ModalResult:=3;
hide;
if Key=VK_Up then y:=y-5;
if Key=VK_Down then y:=y+5;
if Key=VK_Left then x:=x-5;
if Key=VK_Right then x:=x+5;
if x<0 then x:=0;
if x>trunc(ClientWidth-Panel1.Width-Image1.Width) then x:=trunc(ClientWidth-Panel1.Width-Image1.Width);
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
fps:=frames;
Frames:=0;
lblEdit1.Text:=intTostr(fps);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Enabled:=true;
randomize;
Label1.Caption:='Пре-пре-пре......' + #13 + 'Альфа моей игры!!!' + #13 + 'Вы используете эту' + #13 + 'программу на свой' + #13 + 'страх и риск!!!';
trackBar1.Position:=600;
x:=Image1.Left;
y:=Image1.Top;
image1.Parent.DoubleBuffered:=True;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
if Image2.Top>ClientHeight then
begin
Image2.Left:=Random(Form1.Width-Panel1.Width-image2.Width);
Image2.Top:=Trunc(-10-Image2.Height)
end
else image2.Top:=Image2.Top+6;
if Image3.Top>600 then
begin
Image3.Left:=Random(Form1.Width-Panel1.Width-image3.Width);
image3.Top:=-12-image3.Height
end
else image3.Top:=Image3.Top+5;
if Image4.Top>600 then
begin
Image4.Left:=Random(Form1.Width-Panel1.Width-image4.Width);
image4.Top:=-13-image4.Height
end
else image4.Top:=Image4.Top+5;
end;
procedure TForm1.Timer4Timer(Sender: TObject);
begin
if Trackbar1.position=0 then
begin
TrackBar1.Position:=600;
if MessageDlg('Финиш!!! Хотите попробовать ещё?',mtConfirmation,[mbYes,mbNo],0)=idNo
then Zastava.Close
end
else
Trackbar1.Position:=TrackBar1.Position - 1;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Image5.Top:=TrackBar1.Position-31;
end;
procedure TForm1.Timer5Timer(Sender: TObject);
begin
if Label1.Font.Color=clRed
then Label1.Font.Color:=ClBlue
else Label1.Font.Color:=clred;
end;
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Const
SC_DragMove=$F012;
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND,SC_DragMove,0);
end;
procedure TForm1.N1Click(Sender: TObject);
begin
AboutBox.Show;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.WindowState:=wsNormal;
Form3.Show;
ModalResult:=4;
hide;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form3.Show;
end;
///////////
Mihey (2004-01-09 00:22:00) [10]Это неправильный подход - использовать Timage в качестве спрайта (т.е. машинки в твоём случае). Главной должна быть назанчена та форма, при закрытии которой должна закрываться вся игра. Порядок появления окон можно назначить абсолютно любым. Очевидно, перестали обрабатываться клавишы. Приведи весь код, поможем.