이 기사에서는 델파이를 사용하여 핀볼 효과와 유사한 공의 충격을 구현하는 방법을 예제를 사용하여 설명합니다. "시작" 버튼을 클릭하면 형태의 녹색 공이 계속 부딪혀 좌우로 움직이며 크기도 계속 변합니다. 공을 멈추려면 "중지" 버튼을 클릭하세요. 공의 속도를 조정하려면 마우스를 사용하여 오른쪽 하단의 조정 컨트롤을 드래그하세요.
여기서는 이를 달성하기 위해 주로 Timer 컨트롤, Panel 컨트롤, TrackBar 컨트롤, SpinEdit 컨트롤, Shape 컨트롤 및 Button 컨트롤을 사용합니다. 초점은 Delphi의 Timer 컨트롤에 있습니다. 프로그램이 실행되는 동안 컨트롤은 표시되지 않으며 직접 조작할 수 없습니다. Timer 컨트롤은 정기적으로 OnTimer() 이벤트를 자동으로 트리거합니다. 이 예제에서는 이를 사용하여 공 이동 이벤트를 트리거합니다.
디자인 아이디어: 이 프로그램이 해결해야 할 주요 문제는 공의 움직임을 어떻게 제어하고 이동하는 동안 공의 속도와 크기를 제어하는 것입니다. Timer 컨트롤의 OnTimer() 이벤트를 사용하여 공의 움직임을 제어하고 TrackBar 컨트롤과 SpinEdit 컨트롤을 사용하여 공의 움직임 속도를 조정합니다. 공은 모양 컨트롤에 의해 생성됩니다.
하나. 신조:
(1) 델파이 6.0 프로그램을 시작합니다. "파일" 메뉴에서 "새로 만들기" 명령을 선택하고 팝업 하위 메뉴에서 응용 프로그램 옵션을 선택하면 새 프로젝트의 Form1 창이 나타납니다.
(2) "파일" 메뉴에서 "다른 이름으로 프로젝트 저장" 명령을 선택하여 유닛1을 다른 이름으로 저장 대화 상자를 표시합니다. "저장 위치" 목록 상자에서 창 파일을 저장해야 하는 디렉터리 이름을 선택합니다. "파일 이름" 편집 상자에 파일 이름을 입력하고 여기에 "Unit1"을 입력한 후 "저장" 버튼을 클릭합니다. 위의 옵션을 저장하려면
(3) 이전 단계를 실행하면 "다른 이름으로 프로젝트 저장" 대화 상자가 나타납니다. "저장 위치" 목록 상자에서 프로젝트를 저장해야 하는 디렉터리 이름을 선택합니다. "파일 이름" 편집 상자에서 (2) 단계와 동일한 디렉터리를 선택하는 것이 가장 좋습니다. 프로젝트의 소스 코드를 저장하려면 여기에 "Project1"을 입력하고 "저장" 버튼을 클릭하여 위 옵션을 저장하세요.
둘. 일부 매개변수 설정:
(1) Unit1 창을 활성화하고 "속성" 패널에서 양식의 Caption 속성을 "movingsphere"로 설정하고 Color 속성을 "clMoneyGreen"으로 설정합니다.
(2) "표준" 페이지에서 패널 옵션을 선택하고 양식에 패널 컨트롤을 추가한 후 적절한 크기와 위치를 조정하고 "속성" 패널에서 컨트롤의 이름 속성을 "Panel1"로 설정하고 BevelInner "bvLowered" "로, BevelOuter는 "blNone", BorderStyle은 "bsSingle"로 설정되고 Color 속성은 "clSkyBlue"로 설정됩니다.
(3) "시스템" 페이지에서 타이머 옵션을 선택하고 폼에 타이머 컨트롤을 추가한 다음 개체 검사기 패널에서 Interval 속성을 1로, 이름 속성을 "Timer1"로 설정합니다.
(4) "추가" 페이지에서 모양 옵션을 선택하고 양식의 Panel1에 모양 컨트롤을 추가한 다음 "속성" 패널에서 힌트 표시 속성을 "True"로 설정하고 힌트 속성을 "스포츠 구"로 설정합니다. Brush.Color 속성은 ClLime이고 Shape 속성은 "slCircle"로 설정됩니다.
(5) "표준" 페이지에서 버튼 옵션을 선택하고 세 개의 버튼 컨트롤을 양식에 추가한 후 적절한 크기와 위치를 조정합니다. "속성" 패널에서 캡션 속성을 각각 "시작", "중지" 및 "종료"로 설정합니다.
(6) Win 32 페이지에서 TrackBar 옵션을 선택하고, TrackBar 컨트롤을 폼에 추가하고, 적절한 크기와 위치를 조정합니다. 속성 패널에서 적절한 속성을 설정합니다.
(7) 샘플에서 SpinEdit 옵션을 선택하고 양식에 SpinEdit 컨트롤을 추가한 후 적절한 크기와 위치를 조정합니다. 속성 패널에서 적절한 속성을 설정합니다.
3. 코드 분석:
(1) 공이 앞뒤로 움직이는 기능을 구현하기 위해서는 전역변수, 즉 정수 I를 설정해야 한다. I의 초기값은 1이다. I=1일 때 공은 왼쪽으로 이동하며, 패널의 왼쪽 벽에 부딪히면 I 값은 2가 됩니다. 이때 공은 오른쪽으로 이동하고, 패널의 오른쪽 벽에 닿으면 I 값이 2가 됩니다. , I 값은 다시 1이 됩니다. 이와 같이 I값의 변화를 통해 공의 앞뒤 움직임이 구현된다. 코드의 다음 부분은 OnTimer 이벤트에 있습니다.
절차 TForm1.Timer1Timer(Sender: TObject);beginTimer1.interval:=trackbar1.position; //i=1이면 타이머 컨트롤의 트리거 시간 간격을 설정합니다. then //공은 왼쪽으로 이동합니다.beginif shape1.left>0 thenbeginshape1 .left: =shape1.left-10; //공의 위치 변경 Shape1.Width:=(shape1.Width+1)mod 70; //공이 위치한 직사각형의 너비를 변경합니다. Shape1.Height:=(shape1.Height+1)mod 70; //공이 위치한 직사각형의 높이를 변경합니다. endelsei:=2; 오른쪽 끝으로 공; i=2인 경우 시작if shape1.left<(panel1.Width-shape1.Width-5) thenbeginshape1.left:=shape1.left+10; //공의 위치를 변경합니다. Shape1.Width:=(shape1.Width+1)mod 70;//공이 위치한 직사각형의 너비를 변경합니다. Shape1.Height:=(shape1.Height+1)mod 70 ;/ /공이 위치한 직사각형의 높이 변경endelsei:=1;end;end;
(2) "시작" 및 "중지" 버튼은 공의 이동 여부를 제어합니다. 실제로 타이머 작동 여부를 제어합니다.
절차 TForm1.Button1Click(Sender: TObject);beginTimer1.interval:=trackbar1.position; //타이머 컨트롤의 트리거 간격 설정 Timer1.Enabled:=true; //공이 움직이기 시작합니다.end;procedure TForm1.Button2Click(Sender : TObject);beginTimer1.Enabled:=False; //공이 움직이지 않습니다.end;
(3) TrackBar와 SpinEdit의 두 컨트롤은 공의 이동 속도를 제어합니다. 해당 코드는 다음과 같습니다.
절차 TForm1.SpinEdit1Change(Sender: TObject);begintrackbar1.position:=spinEdit1.Value; //이동 속도 변경end;procedure TForm1.TrackBar1Change(Sender: TObject);beginspinEdit1.value:=trackbar1.Position; value SpinEdit 컨트롤에 변경 내용을 알립니다.
4. 델파이 핀볼의 전체 코드는 다음과 같습니다:
단위 Unit1;인터페이스usesWindows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,ExtCtrls, ComCtrls, StdCtrls, Spin;typeTForm1 = class(TForm)Panel1: TPanel;Button1: TButton;Button2: TButton;TrackBar1: TTrackBar;Timer1 : TTimer;Shape1: TShape;SpinEdit1: TSpinEdit;Button3: TButton;프로시저 Timer1Timer(Sender: TObject);프로시저 Button1Click(Sender: TObject);프로시저 Button2Click(Sender: TObject);프로시저 SpinEdit1Change(Sender: TObject);프로시저 TrackBar1Change(Sender: TObject); 절차 Button3클릭(발신자: TObject);private{ 비공개 선언 }public{ 공개 선언 }end;varForm1: TForm1;i:integer;implementation{$R *.DFM}procedure TForm1.Timer1Timer(Sender: TObject);beginTimer1.interval:=trackbar1.position; //i=1인 경우 타이머 컨트롤의 트리거 시간 간격을 설정한 다음 //shape1.left>0인 경우 공이 왼쪽으로 이동하기 시작합니다. thenbeginshape1.left:=shape1.left-10; //공의 위치를 변경합니다. Shape1.Width:=(shape1.Width+1)mod 70;//공이 위치한 직사각형의 너비를 변경합니다. := (shape1.Height+1)mod 70;//공이 위치한 직사각형의 높이를 변경합니다endelsei:=2; //공이 오른쪽 끝으로 이동합니다. i=2이면 시작합니다. Shape1.left<(panel1.Width-shape1.Width-5) thenbeginshape1.left:=shape1.left+10; //공의 위치 변경 Shape1.Width:=(shape1.Width+1)mod 70; /공이 위치한 직사각형의 너비를 변경합니다.shape1.Height:=(shape1.Height+1)mod 70;//공이 위치한 직사각형의 높이 변경endelsei:=1;end;end;procedure TForm1.Button1Click(Sender: TObject);beginTimer1.interval:=trackbar1.position //트리거링 시간 간격 설정; 타이머 컨트롤 Timer1 .Enabled:=true; //공이 움직이기 시작합니다.end;절차 TForm1.Button2Click(Sender: TObject);beginTimer1.Enabled:=False; //공의 움직임이 멈춥니다.end; TForm1.SpinEdit1Change(Sender: TObject);begintrackbar1.position:=spinEdit1.Value; //이동 속도 변경end; TForm1.TrackBar1Change(Sender : TObject);beginspinEdit1.value:=trackbar1.Position; //Trackbar 값의 변경 사항을 SpinEdit 컨트롤에 알립니다. end;procedure TForm1.Button3Click(Sender: TObject);beginclose; //Exitend;initializationi:=1;end.