Автор работы: Пользователь скрыл имя, 21 Декабря 2011 в 12:10, курсовая работа
Для курсовой работы я выбрала игру Pac-Man. Меня заинтересовала история создания этой игры. Pac-Man — культовая компьютерная игра в жанре аркады, впервые вышедшая в 1979 г. в Японии. Игра была разработана в основном работником компании Namco Тору Иватани в течение восемнадцати месяцев. Сначала это творение называлось pakku-man [пакку-ман]., что на расово японском означает «поедать, откусывать, многократно широко раскрывая рот и захлопывая его». Часто упоминается, что идея игры к Иватани пришла, когда он увидел пиццу без одного кусочка пиццы. В интервью 1986 года он отметил, что это было наполовину правдой: Иватани округлил иероглиф кути (яп. рот) как символ поедания и придал ему подобие рта.
Иватани попытался сделать игру интересной для более широких слоёв населения, п
Основные данные о работе 1
Содержание 2
Основная часть 5
1 Разработка эскизного и технического проектов программы 5
2 Разработка рабочего проекта 6
Заключение 42
Глоссарий 45
Список использованных источников 46
Приложения 47
var
Fmain: TFmain;
ImBack,ImMap,Pic:TBitmap;
Map:array[0..149,0..24] of byte;
State:TState;
Player:TPlayer;
Port:array [0..1] of TPoint;
Enemy:array [0..6] of TEnemy;
EnemyStart:Tpoint;
ShowPanel: TCanvasPanel;
Level:byte;
Score:TScore;
LevelSeed:integer;
LMSG:Tlabel;
Bonus:TBonus;
pl:array [0..7] of TMediaPlayer;
implementation
{$R *.dfm}
//----------------------------
constructor TCanvasPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
DoubleBuffered:=true;
Canvas := TControlCanvas.Create; // Небыло у TPanel канвы, а теперь появилась :)
TControlCanvas(Canvas).Control := Self;
end;
//----------------------------
procedure TCanvasPanel.PaintWindow(DC: HDC);
begin
Canvas.Lock;
try
Canvas.Handle:=DC;
try
TControlCanvas(Canvas).
Paint;
finally
Canvas.Handle:=0;
end;
finally
Canvas.Unlock;
end;
end;
//----------------------------
procedure TFmain.S_Frame1MouseDown(
begin
ReleaseCapture;
SendMessage(FMain.handle,WM_
end;
//----------------------------
procedure TFmain.L_ExitClick(Sender:
begin
FMain.Close;
end;
//----------------------------
procedure TFmain.FormMouseDown(Sender:
begin
ReleaseCapture;
SendMessage(FMain.handle,WM_
end;
//----------------------------
procedure TFmain.ImExitClick(Sender:
begin
FMain.Close;
end;
//----------------------------
procedure TFmain.Prepare(level:byte);
var a:byte;
begin
Bonus.Kind:=0;
Bonus.Life:=0;
Player.direction:=dLeft;
Player.newdir:=dLeft;
Player.x:=Player.StartPos.x;
Player.y:=Player.StartPos.y;
Player.AgeNewDir:=0;
LLife.Caption:=inttostr(
LLevel.Caption:=inttostr(
for a:=0 to level+1 do // Создание врагов. Количество врагов равно (номер уровеня+1). Нумерация с нуля.
begin
Enemy[a].x:=EnemyStart.x*23;
Enemy[a].y:=EnemyStart.y*23;
Enemy[a].direction:=dUp;
Enemy[a].State:=esNormal;
Enemy[a].ColorIndex:=a;
Enemy[a].ShyCount:=0;
Enemy[a].Frame:=random(2); // Чтобы анимация отличалась.
Enemy[a].ndCount:=9;
Enemy[a].Delay:=500*a+100; //Задержка для выползания призраков из загона. Иначе всё выглядит, как будто они клонируются.
Enemy[a].Speed:=0;
end;
GameTimer.Enabled:=true;
State:=stGame;
end;
//----------------------------
procedure TFmain.NewLevel(level:byte);
var dx,dy,Template:byte;
a:Integer;
begin
a:=0;
Player.Lives:=Player.Lives+1;
LevelSeed:=0;
ImMap.Canvas.FillRect(rect(0,
for dx:=0 to 24 do
for dy:=0 to 24 do
begin
case map[dy+level*25,dx] and 15 of
mpNone: begin ImList.DrawingStyle:=dsNormal;
mpSeed: begin Imlist.Draw(ImMap.Canvas,dx*
mpBigSeed: begin Imlist.Draw(ImMap.Canvas,dx*
mpPlayerStart: begin Player.Startpos.x:=dx*23; Player.Startpos.y:=dy*23; end;
mpPort: begin Port[a].x:=dx; Port[a].y:=dy; inc(a); end;
mpEnemyStart: begin EnemyStart.x:=dx; EnemyStart.y:=dy; end;
mpGate,mpWall:
begin
Template:=0;
if dy-1 >=0 then if map[dy-1+level*25,dx] and 15 in [mpWall, mpGate] then Template:=Template+1;
if dx+1 <=24 then if map[dy+level*25,dx+1] and 15 in [mpWall, mpGate] then Template:=Template+2;
if dy+1 <=24 then if map[dy+1+level*25,dx] and 15 in [mpWall, mpGate] then Template:=Template+4;
if dx-1 >=0 then if map[dy+level*25,dx-1] and 15 in [mpWall, mpGate] then Template:=Template+8;
if map[dy+level*25,dx] and 15=mpWall then
Imlist.Draw(ImMap.Canvas,dx*
else
ImList.Draw(ImMap.Canvas,dx*
end;
end;
end;
Bonus.Time:=random(500)+500;
Bonus.Kind:=0;
Bonus.Life:=0;
end;
//----------------------------
procedure TFmain.LoadLevels;
var FD:TFileStream;
begin
FD:=TFileStream.Create('.\
FD.Read(Map,3750);
FD.Free;
Player.Lives:=1;
Score.Seed:=0;
Score.Tomato:=0;
Score.Carrot:=0;
Score.Grape:=0;
Score.Cherry:=0;
Score.Ghost:=0;
Score.Total:=0;
Updatescore;
ImStart.Visible:=false;
ImLeave.Visible:=false;
LStart.Visible:=false;
LLEave.Visible:=false;
Level:=0;
end;
//----------------------------
procedure TFmain.FormCreate(Sender: TObject);
var a,b:byte;
ImMask:TBitmap;
begin
Randomize;
Pic:=TBitmap.Create;
ImBack:=TBitmap.Create;
ImMap:=TBitmap.Create;
ImMask:=TBitmap.Create;
Pic.LoadFromFile('.\Data\
ImMap.Width:=23;
ImMap.Height:=23;
ImBack.Width:=575;
ImBack.Height:=575;
ImMap.Canvas.Brush.Color:=0;
ImBack.Canvas.Brush.Color:=0;
// Грузим картинки в imagelist. Дело в том, что прямая загрузка bmp
// в imagelist через методы FileLoad/ResourceLoad нарушает гамму изображения,
// (разработчиков убивать надо, за то, что компоненты по-разному работают в design и run-time режиме)
// а загрузка картинки в
// Можно обойтись вообще без
imagelist и работать через Canvas.
// но это громоздко и не
// С imagelist же работать удобно и наглядно, а скорость не страдает.
for a:=0 to 3 do
for b:=0 to 15 do
begin
ImMap.Canvas.CopyRect(rect(0,
ImMask.Assign(ImMap);
ImMask.Dormant;
ImMask.Mask(0);
ImList.Add(ImMap,ImMask);
end;
ImList.DrawingStyle:=dsNormal;
ImList.GetBitmap(31,
ImList.GetBitmap(22,
ImList.GetBitmap(23,
ImList.GetBitmap(24,
ImList.GetBitmap(25,
ImList.GetBitmap(62,
ImList.GetBitmap(29,ImExit.
ImList.GetBitmap(27,ImStart.
ImList.GetBitmap(28,ImLeave.
ImList.GetBitmap(38,ImLife.
ImList.DrawingStyle:=
ImList.Draw(ImScoreGhost.
ImMap.Width:=575;
ImMap.Height:=575;