06.05.2012, 22:06
|
#333
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
dx=KeyDown(KEY_D)-KeyDown(KEY_A)
If dx=1 dpic=1 это для картинки
If dx=-1 dpic=0
If camera_x+50*dx>0 And camera_x+R1+50*dx<map_width*16 And camera_y-g>0 And camera_y+R2-g*20<map_height*16 проверяем, не выходит ли камера за пределы карты
If solid[map[Int((camera_x+R1/2)/16),Int((camera_y-g+R2/2+48)/16)]]=1 Or solid[map[Int((camera_x+24+R1/2)/16),Int((camera_y-g+R2/2+48)/16)]]=1 Or solid[map[Int((camera_x+15+R1/2)/16),Int((camera_y-g+R2/2+48)/16)]]=1 проверяем на наличие твёрдого блок под игроком. +48 - из-за того, что размеры картинки игрока 28 на 48. Три раза проверяем потому что игрок может занять сразу три блока.
g=0 Останавливаем скорость игрока по оси y
If KeyDown(KEY_SPACE) g=7 Проверяем на нажатие пробела
camera_y=(Int(camera_y+49)/16)*16-38-g !!!!! ВОТ ОНО. ВОТ ЭТОТ БРЕД МОИХ КОШМАРОВ!!! объясняю логику. camera_y+49 - из-за размеров картинки, то есть проверяем пикслель под игроком. /16 - переводим координаты в блоки, *16 - обратно в нормальную систему. -g - это для поднятия игрока, если он прыгает. -38 - наш злобный враг. В нём вся соль. Дело в том, что если мыслить логически, то мы должны написать -49( мы ведь проверяли блок под(!) игроком, а камера находится на уровне головы), но вот в практике -49 не даёт результата. Точнее оно может дать результат на каком-то разрешении. -38 даёт результат на высоте экрана в 600( лично у меня ). Дальше комментировать думаю не стоит, ибо там всё понятно, да и ошибка не там.
Else
g=g-0.4
If g<-20 g=-20
If g>0
If solid[map[Int((camera_x+R1/2+28)/16),Int((camera_y+R2/2-1)/16)]]=0 And solid[map[Int((camera_x+R1/2)/16),Int((camera_y+R2/2-1)/16)]]=0 And solid[map[Int((camera_x+R1/2+16)/16),Int((camera_y+R2/2-1)/16)]]=0
camera_y=camera_y-g
Else
g=-g
EndIf
Else
camera_y=camera_y-g
EndIf
EndIf
If Not collision()
camera_x=camera_x+dx*speed
EndIf
EndIf
End Function
Function collision()
For i=1 To 3
If solid[map[Int((camera_x-2+dx*speed+R1/2)/16),Int((camera_y-1+R2/2)/16)+i]]=1
camera_x=(Int((camera_x)/16)-1)*16+16
Return True
EndIf
Next
For i=1 To 3
If solid[map[Int((camera_x+dx*speed+28+R1/2)/16),Int((camera_y-1+R2/2)/16)+i]]=1
'camera_x=(Int((camera_x+32)/16))*16
Return True
EndIf
Next
End Function
Так, мне нужна ваша помощь, и сейчас это действительно серьёзно. Я вообще не понимаю почему код не работает. Точнее сказать работает, но только на каких-то разрешениях экрана, хотя не ясно как это вообще взаимосвязано.
И проверьте новую версию, возможно нашёл ошибку.
Последний раз редактировалось Nikich, 06.05.2012 в 23:30.
|
(Offline)
|
|