forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   помогите плз (http://forum.boolean.name/showthread.php?t=16287)

undertaker 05.02.2012 19:01

помогите плз
 
:SOS: я решил создать свою 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

и чел немного заходит в дом, а назад никак. подскажите, плз!!!

Nikich 05.02.2012 19:31

Ответ: помогите плз
 
Тебе нужно векторное перемещение делать.
Цитата:

Имею ввиду, что где-то в программе есть две переменные (или больше, по числу измерений пространства) типа deltax, deltay. В которых хранится сдвиг координат игрока на текущий шаг/кадр. И еще отдельно скорость speed#.

Потом, в момент сдвига координаты игрока суммируются с координатами сдвига:
px# = px + deltax*speed#
py# = py + deltay*speed#
Расчет удобно производить в дробных числах, а для отрисовки графики потом откидывать дробную часть.

Пример:
Влево-вверх: deltax=-1; deltay=-1
Вправо-вверх: deltax=1; deltay=-1
Вниз: deltax=0; deltay=1

Ну и вариации, в зависимости от нужд. Можно тоже дробями сделать.
Спасибо не мне, а ему.
http://forum.boolean.name/showthread.php?p=20368
4-ый,5-ый и последний пункт особенно внимательно изучи.

undertaker 05.02.2012 19:56

Ответ: помогите плз
 
А на примере написанного кода?

Nikich 05.02.2012 19:59

Ответ: помогите плз
 
Может за тебя игру сделать?
Первый пункт тоже почитай.

undertaker 05.02.2012 20:02

Нужна помощь
 
Уж слишком как-то все сложно объяснено

undertaker 05.02.2012 20:04

Ответ: помогите плз
 
Я не прошу за меня игру делать, я просто прошу помощи начинающему

tirarex 05.02.2012 20:21

Ответ: помогите плз
 
я думаю что на 3д будет даже лучше чем 2д тем более , тебе надо делать физику в 2д это геморойно а на 3д есть двиг PhysX и уже готовый пример гта с игроком и машинами , также в 3д будет просто современней

FireOwl 05.02.2012 20:24

Ответ: помогите плз
 
Главная идея - догадаться проверить координаты до того, как сдвигать игрока. А иначе потом каждая проверка будет возвращать "столкновение".

И зачем в коде столько раз повторяется drawimage player?

Код:

<загрузка всех картинок>
<while>
--<обновляем координаты/проверяем столкновения>
--<стираем экран>
--<рисуем фон, потом игрока (всего один раз за весь код)>
--<flip (то есть все нарисованное переводится из памяти непосредственно на дисплей)>
<wend>

p.s. Если нужна физика, и вообще, вот цитата из аналогичной темы:

Цитата:

Сообщение от MoKa (Сообщение 204540)
Сразу предупреждаю: Blitz2D, использует старый и не поддерживаемый уже подход вывода 2D графики. Она выводится используя процессор, а не аппаратное ускорение (видео карту). Вывод происходит по пикселю, что очень медленно.
Не используй 2D в Blitz3D, это имхо, практически не несёт никакой пользы для развития, т.к. эти знания будут только относиться к Blitz2D.
Используй что-то более современное, например FastImage + Blitz3D, или BlitzMax.
Для физики, попиксельную также никто не делает, обычно используют физ. движки, есть Box2D для BlitzMax и другие, рекомендую их посмотреть. Для Blitz3D также есть физ движки.


Nikich 05.02.2012 20:27

Ответ: помогите плз
 
Код:

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'у.

undertaker 05.02.2012 20:59

Ответ: помогите плз
 
а как объявлять функцию? может я покажусь тупым, но я в блице целых дня сижу.

Nikich 05.02.2012 21:02

Ответ: помогите плз
 
Не понял вопроса.
Код:

Function qwerty()
...
End Function

Потом пиши где хочешь qwerty().
Ты про это?

undertaker 05.02.2012 21:07

Ответ: помогите плз
 
Я не знаю как этот массив включить в мою игру

Nikich 05.02.2012 21:16

Ответ: помогите плз
 
Прости, но вообще не понимаю твоих вопросы. Какой массив?

undertaker 05.02.2012 21:22

Ответ: помогите плз
 
Блин... Не Массив, а вектора:-D

Nikich 05.02.2012 21:25

Ответ: помогите плз
 
Copy-paste - самый лучший выбор.

undertaker 05.02.2012 21:36

Ответ: помогите плз
 
Ты же делаешь очень похожую игру...по движку помоги пожалуйста, все, что мне нужно это сделать так, чтобы гг не выходил за пределы экрана, и не проходил сквозь дома

Nikich 05.02.2012 21:46

Ответ: помогите плз
 
У меня также, как я написал. Сделай как написано выше, и не будет главный герой в здания проходить и границы незаконно пересекать. И ещё раз повторю, за тебя игру делать не буду.

undertaker 05.02.2012 21:58

Ответ: помогите плз
 
Как правильно объеденить мою обработку(#1) и векторное перемещение(#9)?

Nikich 05.02.2012 22:15

Ответ: помогите плз
 
Просто копируешь и вставляешь! У тебя переменные такие же(x и y) для игрока.

undertaker 05.02.2012 22:33

Ответ: помогите плз
 
А в какие места вставлять?

Nikich 05.02.2012 22:58

Ответ: помогите плз
 
В труднодоступные. Программирование игры - это, пока, не твое. Для начала, сделай пару калькуляторов:)

undertaker 05.02.2012 23:02

Ответ: помогите плз
 
А помочь начать никак?

Nikich 05.02.2012 23:59

Ответ: помогите плз
 
ВНИМАТЕЛЬНО первый пункт правил!
Тебе. Никто. Ничего. Не должен.

undertaker 06.02.2012 00:05

Ответ: помогите плз
 
Я же не прошу '' обязательно напиши!'' а просто по старой дружбе

Hurrit 06.02.2012 00:15

Ответ: помогите плз
 
ДА БЛЖДАД, ВЫУЧИ ОСНОВЫ ПРОГРАММИРОВАНИЯ, ОБЪЯВЛЕНИЕ ПРОЦЕДУР И ПРОЧЕЕ. И ЗАЧЕМ ВООБЩЕ ТЫ ВЗЯЛСЯ СРАЗУ ЗА ГТА? ПИЛИ ЧТО-ТО ПОПРОЩЕ.
извиняюсь за верхний регистр и неровный почерк.

undertaker 06.02.2012 00:47

Ответ: помогите плз
 
Например?

Nikich 06.02.2012 01:14

Ответ: помогите плз
 
Прости за грубость, но у тебя должна быть своя голова на плечах. Ты сразу думай, потом опять думай, еще раз подумай и, если не получается, пиши на форум.
P.S. Когда ждешь ответа на форуме не забывай думать.

undertaker 06.02.2012 17:32

Ответ: помогите плз
 
А как сделать так, чтобы гг(или другой нпц) поворачивался, чтобы он смотрел в ту же сторону, в которую и идет?

dsd 06.02.2012 18:42

Ответ: помогите плз
 
Находишь вектор перемещения.
VectorPitch(), VectorYaw(), RotateEntity pitch,yaw,0; как то так.
Еще можно AlignToVector

undertaker 06.02.2012 19:01

Ответ: помогите плз
 
А это прокатит, даже если перемещение не через вектора?

dsd 06.02.2012 19:08

Ответ: помогите плз
 
Ты походу 2д делаешь. Новая координата минус старая будет вектор перемещения на плоскости. Считаешь его длину. Делишь координаты вектора на длину. Результат деления икс координата это cos(angle) =>
acos даст тебе нужный угол.

Nikich 06.02.2012 19:42

Ответ: помогите плз
 
2 dsd, это функции для 3D, а не для 2D, насколько я помню.
2 undertaker, делай вектора блеа.

L-ee-X 06.02.2012 19:45

Ответ: помогите плз
 
Парень под ником undertaker
Иди короче справку читать по Blitz3D
У тебя столько вопросов, сдается мне ты его впервые сегодня открыл и решил там GTA-1 написать!
Думаешь поди аля ща все сделаю!
У тебя на каждый ответ находится новый вопрос от того у меня и выводы, что ты сегодня впервые столкнулся с программированием!

undertaker 06.02.2012 20:51

Ответ: помогите плз
 
Ник, я тебе еще раз говорю, я не особо понимаю, как вектора делать

Colossus 06.02.2012 21:33

Ответ: помогите плз
 
undertaker, прежде чем лезть на форум со своими вопросами, перечитай несколько раз справку от корки до корки... я раньше сам таким был, а потом понял что помошника лучше с правки и быть не может.

Nikich 06.02.2012 21:49

Ответ: помогите плз
 
2 undertaker
Тебе сказали как делать? Да. Тебе объянснили векторное перемещение? Да. Ну и что тебе еще нужно? Если ты не понимаешь из-за ограниченных возможностей мозга, никто тебе не поможет! Тут даже к блитцу никакого отношения нету . Тут саморазвития нету. По-моему, тебе поможет только бан на этом форуме, и дни усердной умственной деятельности, чтобы ты САМ во всем разобрался.


Часовой пояс GMT +4, время: 02:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot