Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2009, 22:26   #1
aruy
 
Регистрация: 27.07.2009
Сообщений: 8
По умолчанию

как новичок, пытаюсь написать что-то простенькое, начал с арканоида. код достаточно прост, но при отбивании шара от платформы второй раз, отбивание,собственно, не происходит. Буду благодарен за помощь в решении проблемы. вся графика- Canvas.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Shape1: TShape;
    Timer1: TTimer;
    Shape2: TShape;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
  procedure shar;
    { Public declarations }
  end;

var
  Form1: TForm1;
  Posx,Posy,speedx,speedy,shx,shy:integer;

implementation
{$R *.dfm}
  procedure TForm1.shar;
  begin

  if (posx>shx) and (posx<shx+shape2.width) and(posy=shape2.Top-shape2.Height)
    then begin speedy:=-speedy; posy:=posy-5 end;

  posx:=posx+speedx;
  posy:=posy+speedy;

  if posx>clientwidth-shape1.Width then speedx:=-speedx
  else
  if posx<0 then
  begin
  posx:=0;
  speedx:=-speedx;
  end;

  if posy>clientheight-shape1.Height then {begin exit; label1.Caption:='you lose'; end}speedy:=-speedy
  else
  if posy<0 then
  begin
  posy:=0;
  speedy:=-speedy;
  end;

  shape1.left:=posx;
  shape1.top:=posy;
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
shar;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
posx:=3;
posy:=7;
speedx:=2;
speedy:=2;
shx:=shape2.left;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var
    a:integer;
begin
  a:=ord(key);
  if a=37 then shx:=shx-20;                         ;
  if a=39 then shx:=shx+20;
  shape2.Left:=shx;
end;

end.

Последний раз редактировалось rpy3uH; 29.07.2009 в 08:21.
aruy вне форума Ответить с цитированием
Старый 29.07.2009, 00:12   #2
Mr.Qwerty
Что? Где? Когда?
Форумчанин
 
Аватар для Mr.Qwerty
 
Регистрация: 14.07.2009
Сообщений: 220
По умолчанию

В этом уроке я покажу вам как с легкостью сделать летающий шарик у себя на форме. Ну что открываем Delphi, создаем новый проект. Нам понадобиться компонент Shape с закладки Additional и компонент Timer с закладки System. Кидаем их на форму, щелкаем по компоненту shape и меняем свойство shape на ctCircle теперь вместо квадрата компонент примет форму круга. Все на этом предварительные приготовления завершены начинаем кодить.
После ключевого слова var обьявлем 4 глобальные переменные типа single:
Код:
PosX, Posy, VelX, Vely: single;
Создаем обработчик событий на форме (OnCreate) прост щелкнув по ней 2 раза мышкой. Между begin end; пишем:
Код:
Posx:=3;
PosY:=5;
VelX:=2;
VelY:=2;
На данном этапе мы присваиваем ранее объявленным переменным нужные значения.
Далее нам понадобиться создать одну не большую процедуру. После ключевого слова private пишем :
Код:
procedure shar();
Нажимаем сочетание клавиш Ctrl+Shift+C и Delphi автоматически сгенерирует заготовку для нашей будущей процедуры. Забегая вперед открою вам не большой секрет, именно эта процедура и будет отвечать за полет шарика. Ладно немного отвлеклись, вставляем ниже приведенный код между словами begin end в нашей процедуре.

Код:
// Текущая координата шарика + скорость
PosX:= PosX+VelX;
PosY:= PosY+VelY;

// Что бы шарик не вылетал за границы поля по ширине
// Если X координата шарика больше ширины формы - ширины самого //шарика то
if PosX > ClientWidth - Shape1.Width then
begin
//X координата шарика присвоит значение ширина формы - ширина //шарика
PosX:= ClientWidth - Shape1.Width;
// Включаем заднюю скорость) или меняем значение скорости на минус
VelX:= - VelX;
end
else if PosX < 0 then
begin
POsX:= 0;
VelX:= - VelX;
end;

// Здесь по аналогии только работаем с Y координатой
if PosY > ClientHeight - Shape1.Width then
begin
POsY:= ClientHeight - Shape1.Width;
VelY:= - VelY;
end
else if PosY < 0 then
begin
POsY:= 0;
VelY:= - VelY;
end;
// Перемещаем шарик в пространстве
Shape1.Left:= Round(PosX);
Shape1.Top:= Round(PosY);
Сейчас не стоит пугаться процедура не такая уж сложная как кажется на первый взгляд. Если кто не понял что в ней происходит читайте комментарии в коде. Кратко поясню что-же за переменные использованы в процедуре

Переменные PosX и PosY хранят координаты положение шарика в пространстве, VelX и VelY отвечают за скорость его перемещения. ClientWidth, ClientHeight - ширина и высота формы. Shape1.Width ширина шарика.

Ну что справились с процедурой ?! Ладно едим дальше свойство Interval у таймера ставим 10, а свойство Enabled = true. Кликаем по компоненту timer два раза и в обработчике событий пишем имя нашей процедуры
Код:
shar;
На этом все, запускаем проект и наслаждаемся результатом. А вот что получилось у меня:
screen.png
©Copyright Автор: Владимир Любаев - http://delphiexpert.ru/view_lesson.php?id=43
Вот тебе действия, на основе пиши игру..Удачи...нужна помощь-отпишись
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Stilet; 29.07.2009 в 17:05.
Mr.Qwerty вне форума Ответить с цитированием
Старый 29.07.2009, 17:02   #3
aruy
 
Регистрация: 27.07.2009
Сообщений: 8
По умолчанию Спасибо

Спасибо, основа для арканоида готова, но вот еще один вопрос, каким образом лучше выводить платформы( ну те, которые нужно уничтожать шаром)? Имеется ввиду Canvas, shape-ы или что-то другое.
aruy вне форума Ответить с цитированием
Старый 29.07.2009, 17:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Имеется ввиду Canvas, shape-ы или что-то другое.
А как тебе удобнее? Можно и TImage применить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2009, 17:30   #5
aruy
 
Регистрация: 27.07.2009
Сообщений: 8
По умолчанию

В принципе, да но если заранее не известно кол-во платформ(например с каждым новым уровнем количество увеличивается на 1 ряд), то сTimage и Tshape не получится ведь их нужно ставить на форму заранее, правильно я понимаю?
aruy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арканоид Kostia Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 03.04.2021 21:50
Арканоид в Делфи (столкновение шаров) Scabby Gamedev - cоздание игр: Unity, OpenGL, DirectX 31 07.03.2010 22:30
Код игры Арканоид Mclaren Софт 6 21.05.2009 20:58
Арканоид Mclaren Помощь студентам 10 14.05.2009 15:06
АРКАНОИД!? Mclaren Помощь студентам 5 28.04.2009 14:18