|
2D-программирование Вопросы, касающиеся двумерного программирования |
05.02.2012, 19:01
|
#1
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
помогите плз
я решил создать свою 2д игру, и чет пока ничего особо не получается. хочу сделать игру отдалённо похожую на гта1. наработки уже есть. и сразу же появилась проблема(я не мастер программирования) надо сделать так, чтобы чел не проходил сквозь здания.
вот код игры:
Graphics 800,600,32,1
Global x=100
Global y=100
Global speed=4
SetBuffer BackBuffer()
Global player=LoadImage("1.bmp")
Global ground=LoadImage ("ground1.bmp")
Global house1=LoadImage ("house1.bmp")
;;Global mouseimage = LoadImage("cursor.bmp")
;;DrawImage mouseimage,MouseX(),MouseY()
;;Delay 20
;;HandleImage mouseimage,0,0
DrawImage player,x,y
MidHandle player
MaskImage player,0,0,10
DrawImage player,x,y
DrawImage ground,0,0
Function updateplayer()
DrawImage player,x,y
If ImagesCollide(player,x,y,0,house1,300,400,0) Then speed=0
If KeyDown(200)
y=y-speed
DrawImage player,x,y
EndIf
If KeyDown(208 )
y=y+speed
DrawImage player,x,y
EndIf
If KeyDown(205)
x=x+speed
DrawImage player,x,y
EndIf
If KeyDown(203)
x=x-speed;1,
DrawImage player,x,y
EndIf
End Function
While Not KeyDown(1)
updateplayer()
Flip
Cls
DrawImage ground,0,0
DrawImage house1,300,400
;If ImagesCollide Then speed=0
Wend
и чел немного заходит в дом, а назад никак. подскажите, плз!!!
|
(Offline)
|
|
05.02.2012, 19:31
|
#2
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
Тебе нужно векторное перемещение делать.
Имею ввиду, что где-то в программе есть две переменные (или больше, по числу измерений пространства) типа deltax, deltay. В которых хранится сдвиг координат игрока на текущий шаг/кадр. И еще отдельно скорость speed#.
Потом, в момент сдвига координаты игрока суммируются с координатами сдвига:
px# = px + deltax*speed#
py# = py + deltay*speed#
Расчет удобно производить в дробных числах, а для отрисовки графики потом откидывать дробную часть.
Пример:
Влево-вверх: deltax=-1; deltay=-1
Вправо-вверх: deltax=1; deltay=-1
Вниз: deltax=0; deltay=1
Ну и вариации, в зависимости от нужд. Можно тоже дробями сделать.
|
Спасибо не мне, а ему.
|
(Offline)
|
|
05.02.2012, 19:56
|
#3
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: помогите плз
А на примере написанного кода?
|
(Offline)
|
|
05.02.2012, 19:59
|
#4
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
Может за тебя игру сделать?
Первый пункт тоже почитай.
|
(Offline)
|
|
05.02.2012, 20:02
|
#5
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Нужна помощь
Уж слишком как-то все сложно объяснено
|
(Offline)
|
|
05.02.2012, 20:04
|
#6
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: помогите плз
Я не прошу за меня игру делать, я просто прошу помощи начинающему
|
(Offline)
|
|
05.02.2012, 20:21
|
#7
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: помогите плз
я думаю что на 3д будет даже лучше чем 2д тем более , тебе надо делать физику в 2д это геморойно а на 3д есть двиг PhysX и уже готовый пример гта с игроком и машинами , также в 3д будет просто современней
|
(Offline)
|
|
05.02.2012, 20:24
|
#8
|
Бывалый
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений (для 1,836 пользователей)
|
Ответ: помогите плз
Главная идея - догадаться проверить координаты до того, как сдвигать игрока. А иначе потом каждая проверка будет возвращать "столкновение".
И зачем в коде столько раз повторяется drawimage player?
<загрузка всех картинок>
<while>
--<обновляем координаты/проверяем столкновения>
--<стираем экран>
--<рисуем фон, потом игрока (всего один раз за весь код)>
--<flip (то есть все нарисованное переводится из памяти непосредственно на дисплей)>
<wend>
p.s. Если нужна физика, и вообще, вот цитата из аналогичной темы:
Сообщение от MoKa
Сразу предупреждаю: Blitz2D, использует старый и не поддерживаемый уже подход вывода 2D графики. Она выводится используя процессор, а не аппаратное ускорение (видео карту). Вывод происходит по пикселю, что очень медленно.
Не используй 2D в Blitz3D, это имхо, практически не несёт никакой пользы для развития, т.к. эти знания будут только относиться к Blitz2D.
Используй что-то более современное, например FastImage + Blitz3D, или BlitzMax.
Для физики, попиксельную также никто не делает, обычно используют физ. движки, есть Box2D для BlitzMax и другие, рекомендую их посмотреть. Для Blitz3D также есть физ движки.
|
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
05.02.2012, 20:27
|
#9
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
deltax#=0
deltay#=0
speed#=0
If KeyDown(200) Then deltay#=-1
If KeyDown(208) Then deltay#=1
If KeyDown(205) Then deltax#=1
If KeyDown(203) Then deltax#=-1
(громоздко конечно)
If KeyDown(203) Or KeyDown(208) Or KeyDown(205) Or KeyDown(200) Then
speed#=5.0
EndIf
(пусть px - временные, а x - окончательные координаты)
px=x+deltax*speed
py=y+deltay*speed
If px<0 Then px=1280
If px>1280 Then px=0
If py<0 Then py=1024
If py>1024 Then py=0
***отдельно где-то, где все функции***
Function CollideStones(px,py)
For s.stone=Each stone
(коллизия или проверка координат, все равно вроде)
If ImagesCollide(player,px,py,0,stoneimage,s\x, s\y, 0)
Return True
EndIf
Next
Return False
End Function
***
If Not CollideStones(px,py) then
x=px
y=py
Endif
Я этим пользуюсь. Опять же, спасибо FireOwl'у.
|
(Offline)
|
|
05.02.2012, 20:59
|
#10
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: помогите плз
а как объявлять функцию? может я покажусь тупым, но я в блице целых дня сижу.
|
(Offline)
|
|
05.02.2012, 21:02
|
#11
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
Не понял вопроса.
Function qwerty()
...
End Function
Потом пиши где хочешь qwerty().
Ты про это?
|
(Offline)
|
|
05.02.2012, 21:07
|
#12
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: помогите плз
Я не знаю как этот массив включить в мою игру
|
(Offline)
|
|
05.02.2012, 21:16
|
#13
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
Прости, но вообще не понимаю твоих вопросы. Какой массив?
|
(Offline)
|
|
05.02.2012, 21:22
|
#14
|
Нуждающийся
Регистрация: 05.02.2012
Сообщений: 57
Написано 2 полезных сообщений (для 4 пользователей)
|
Ответ: помогите плз
Блин... Не Массив, а вектора
|
(Offline)
|
|
05.02.2012, 21:25
|
#15
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: помогите плз
Copy-paste - самый лучший выбор.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:10.
|