Тема: Vivo
Показать сообщение отдельно
Старый 06.05.2012, 22:06   #333
Nikich
Бывалый
 
Регистрация: 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

Так, мне нужна ваша помощь, и сейчас это действительно серьёзно. Я вообще не понимаю почему код не работает. Точнее сказать работает, но только на каких-то разрешениях экрана, хотя не ясно как это вообще взаимосвязано.
И проверьте новую версию, возможно нашёл ошибку.
Вложения
Тип файла: rar vivo.rar (766.7 Кб, 775 просмотров)

Последний раз редактировалось Nikich, 06.05.2012 в 23:30.
(Offline)
 
Ответить с цитированием