Mam's WebSite
建築CGパース住宅CGパース

Mamの覚書Q&A検索

トップページMamの覚書Q&A検索Delphi(いろいろ)⇒Q&A


大項目:「 Delphi 」 - 中項目:「 いろいろ 」

「 Delphiでブロック崩しゲームを作成するには 」

Delphiでブロック崩しゲームを作成するには


回答

ファイル⇒新規作成⇒
VCLフォームアプリケーション Delphi を選択します。
TForm1のClientHeightプロパティを320にClientWidthプロパティを410に設定します。
白紙のフォームにTTimerをドラッグ&ドロップし、Intervalを10に設定します。
以下ソースコードを入力すると完成です。

ソース

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    block_x:array of integer;
    block_y:array of integer;
    block_f:array of boolean;
    c:integer;
    ball_x:double;
    ball_y:double;
    ball_wx:double;
    ball_wy:double;
    racket_x:integer;
    racket_w:integer;
    procedure MyDraw();
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  c:=30;
  SetLength(block_x,c);
  SetLength(block_y,c);
  SetLength(block_f,c);
  for i := 0 to c-1 do
  begin
    block_x[i]:=(i mod 10)*40 + 10;
    block_y[i]:=(i div 10) *30 + 30;
    block_f[i]:=true;
  end;
  racket_x:=0;
  racket_w:=50;
  ball_x:=30;
  ball_y:=150;
  ball_wx:=1;
  ball_wy:=2;
end;
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssRight in Shift then
    application.Terminate;
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  racket_x:=x-racket_w div 2;
  if racket_x<0 then
    racket_x:=0;
  if racket_x>(self.Width-racket_w ) then
    racket_x:=(self.Width-racket_w );
end;
 
procedure TForm1.MyDraw;
var bmp:TBitmap;
    i:integer;
begin
  bmp:=Tbitmap.Create;
  try
    bmp.Width:=width;
    bmp.Height:=Height;
    bmp.Canvas.Brush.Style:=bsSolid;
    bmp.Canvas.Brush.color:=clWhite;
    bmp.Canvas.FillRect(Rect(0,0,bmp.Width,bmp.Height));
    for i := 0 to c-1 do
    begin
      if block_f[i] then
      begin
        bmp.Canvas.Brush.Style:=bsSolid;
        bmp.Canvas.Brush.color:=clBlack;
        bmp.Canvas.FillRect(Rect(block_x[i],block_y[i],block_x[i]+30,block_y[i]+20));
      end;
    end;
    bmp.Canvas.Brush.Style:=bsSolid;
    bmp.Canvas.Brush.color:=clBlack;
    bmp.Canvas.FillRect(Rect(racket_x,300,racket_x+racket_w,300+5));
    bmp.Canvas.Ellipse(trunc(ball_x-2),trunc(ball_y-2),trunc(ball_x+2),trunc(ball_y+2));
    self.Canvas.Draw(0,0,bmp);
  finally
    bmp.Free;
  end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
  ball_x:=ball_x+ball_wx;
  ball_y:=ball_y+ball_wy;
  //ラケットに当たったとき
  if (ball_y>=300) and (ball_y<=305) then
  begin
    if (ball_x>=racket_x) and (ball_x<=(racket_x+racket_w)) then
    begin
      ball_wy:=-ball_wy;
      ball_x:=ball_x+ball_wx;
      ball_y:=ball_y+ball_wy;
      ball_wx:=-(racket_x+(racket_w div 2)-ball_x) / 10
    end;
  end;
  //壁に当たったとき
  if ball_y<=0 then
  begin
    ball_wy:=-ball_wy;
    ball_y:=0;
  end;
 
  if ball_x<=0 then
  begin
    ball_wx:=-ball_wx;
    ball_x:=0;
  end;
  if ball_x>=self.width then
  begin
    ball_wx:=-ball_wx;
    ball_x:=self.Width;
  end;
  //blockにあたったとき
  for i := 0 to c - 1 do
  begin
    if  (block_x[i]<=ball_x) and (ball_x<=(block_x[i]+30))
    and (block_y[i]<=ball_y) and (ball_y<=(block_y[i]+20))
    and block_f[i]=true
    then
    begin
      if ((block_x[i]-1)<=ball_x) and (ball_x<=(block_x[i]+1)) then
        ball_wx:=-ball_wx
      else
        ball_wy:=-ball_wy;
 
      block_f[i]:=false;
    end;
  end;
  if ball_y>=self.Height then
  begin
    timer1.Enabled:=false;
    showmessage('ゲームオーバー');
  end;
  MyDraw();
end;
 
end.


Mam's WebSite