![]() |
![]() ![]() |
![]() |
mithquessir |
![]()
Сообщение
#1
|
Гость ![]() |
Вот вздумалось мне писать арканойд. Вроде все получается, но как сделать, чтобы шарик менял угол полета в зависимости от попадания в разные части доски?
Код uses dos,crt,graph; type Coords = record x,y:real; end; const step = 50; l = 100; {lenght} h = 10; {height} size = 5; spd_ = 0.1; k = 1; var pos,spd:Coords; angle,gd,gm,i,x,y:integer; procedure Draw(x,y,color:integer); begin SetColor(color); Rectangle(x,y,x+l,y+h); end; procedure DrawBall(color:byte); begin SetColor(color); Circle(trunc(pos.x),trunc(pos.y),size); end; procedure RecalcBall; procedure ChX; begin pos.x := pos.x - spd.x * spd_; spd.x := - spd.x * k; end; procedure ChY; begin pos.y := pos.y - spd.y * spd_; spd.y := - spd.y * k; end; begin DrawBall(black); pos.x := pos.x + spd.x * spd_; if (pos.x >= GetMaxX - size) or (pos.x <= size) then ChX; pos.y := pos.y + spd.y * spd_; if (pos.y <= size) then ChY; if (pos.Y = GetMaxY-(size+h)) and (pos.X >= x) and (pos.X <= X+l) then ChY; if (pos.y >= GetMaxY) then begin pos.x := Random(640); pos.y := Random(480)-10; end; DrawBall(white); end; var scancod:word; begin gd := Detect; InitGraph(gd,gm,''); x := 0; y := 469; Draw(x,y,white); spd.x := random(7) + 4; spd.y := 10; pos.x := GetMaxX div 2; pos.y := GetMaxY div 2; repeat RecalcBall; delay(500); if port[$60]<$80 then begin scancod:=port[$60]; mem[0:$41C]:=mem[0:$41A]; case scancod of 77:begin{right} Draw(x,y,black); inc(x,step); if x >= (GetMaxX - l) then x := GetMaxX - l; Draw(x,y,white); end; 75:begin{left} Draw(x,y,black); dec(x,step); if x <= 0 then x := 0; Draw(x,y,white); end; end; port[$60]:=$80; end; if (scancod<>1) and (scancod<>0) then begin port[$60]:=$80; scancod:=0 end; until scancod=1; CloseGraph; end. |
xds |
![]()
Сообщение
#2
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Прибавляй к горизонтальной компоненте скорости шарика горизонтальную компоненту скорости доски.
-------------------- The idiots are winning.
|
Echelone |
![]()
Сообщение
#3
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вопрос.
Вот эта строчка: mem[0:$41C]:=mem[0:$41A]; Зачем? |
Echelone |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(xds @ 31.12.04 0:37) Прибавляй к горизонтальной компоненте скорости шарика горизонтальную компоненту скорости доски. Как можно еще изменить скорость шарика: 1) Сделай ветер. На заднем плане падает что-нибудь типа снега, которое указывает, куда он дует. К горизонтальной скорости шарика, тогда добавь скорость ветра. А ветер пусть меняется RANDOMом. 2) Сотвори подобие силы тяжести. В процедуре RECALCBALL добавь строчку dec(pos.y,1); В результате, у тебя шарик будет летать по параболе... Я такую штуку в арканоиде BreakOut нашел...Реально... Арканоид тоже неплохой :-) [quote] Programmers don't die/ They just GOSUB without RETURN... |
xds |
![]()
Сообщение
#5
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата(Echelone @ 7.01.05 6:39) Вопрос. Вот эта строчка: mem[0:$41C]:=mem[0:$41A]; Зачем? Очистка буфера клавиатуры. Работа с последней здесь организована несколько странным образом: изнасиловали BIOS. :D Я бы посоветовал воспользоваться классическим методом - перехватывать IRQ1. ...Только заметил: истезанию подвергся и контроллер клавиатуры - ему в порт данных затолкали $80. Сообщение отредактировано: xds - 7.01.2005 5:00 -------------------- The idiots are winning.
|
xds |
![]()
Сообщение
#6
|
![]() N337 ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 737 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Как можно еще изменить скорость шарика Добавь гравиконцентраты (области повышенной гравитации) ;) -------------------- The idiots are winning.
|
![]() ![]() |
![]() |
Текстовая версия | 15.07.2025 0:46 |