Дивиджей | Дата: Суббота, 07.03.2015, 19:05 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 22
Статус: Offline
| Здравствуйте. Не могу разобраться в скроллинге. Есть карта, персонаж и непроходимый объект. Когда начинаю ходьбу персонажем, происходит скроллинг карты, но персонаж начинает уходить от центрирования. Вот собственно код:
var buf: tbitmap; mas: array [0..24, 0..24] of integer; ground: array [0..1] of tbitmap; // 0-трава, 1-вода player: tbitmap; x,y,speed: integer; mx,my: integer;
FormCreate; var i: integer; begin buf: =tbitmap.create; buf.width:=640; buf.height:=480;
for i:=0 to 1 do begin ground[i]:=tbitmap.create; ground[i].loadfromfile('pic/’+inttostr(i)+’.bmp'); end;
player:=tbitmap.create; player.transparent:=true; player.loadfromfile('pic/pers.bmp’); x:=330; y:=255; speed:=1;
mx:=0; my:=0;
scrollbar1.max:=32*800-640-32; scrollbar2.max:=32*600-480-32; end;
Timer; var i,j: integer; begin
for i:=0 to 24 do // по ширине получается 800; for j:=0 to 20 do // по высоте получается 600; begin buf.canvas.draw(i*32-mx, j*32-my, ground[mas[i,j]]); end;
buf.canvas.draw(300-mx, 200-my, ground[1]; // объект вода buf.canvas.draw(x,y,player); form1.canvas.draw(0,0,buf);
// Управление
if keypressed(37) then // лево begin x:=x-speed; mx:=mx-speed; end;
if keypressed(39) then // право begin x:=x+speed; mx:=mx+speed; end;
if keypressed(38) then // вверх begin y:=y-speed; my:=my-speed; end;
if keypressed(40) then begin y:=y+speed; my:=my+speed; end;
ScrollBar1.Change; begin mx:=scrollbar1.position; end;
ScrollBar2.Change; begin my:=scrollbar2.position; end;
И помогите как-то сделать чтобы персонаж не смог пройти непроходимый объект, в моем случае воду. Очень буду благодарен!
|
|
| |
Armageddets | Дата: Воскресенье, 08.03.2015, 14:14 | Сообщение # 2 |
Лейтенант
Группа: Администраторы
Сообщений: 68
Статус: Offline
| Когда рисуешь персонажа, тоже необходимо вычитать мх и му. И вообще все должно рисоваться с учетом скроллинга.
А по поводу непроходимости участков когда проверяешь нажатиеклавиш добавь еще проверку чтобы в клетке не было текстуры с номером 0 (допустим, что вода это ноль) примерно так:
if (map[Player.X div 32, Player.Y div 32].Ground<>0) and ( keypressed(37)) then ...
Второй вариант - это проверять углы персонажа на нахождения в клетках. При движенни вправо проверять правый верхний и правый нижний, при движении влево - левые углы, вниз - нижние и т.д. Тоже проверять, чтобы не находились на воде. Примерно так:
if (map[Player.X div 32, Player.Y div 32].Ground<>0) and (map[Player.X div 32, (Player.Y+32) div 32].Ground<>0) and ( keypressed(37)) then ...
|
|
| |