|
3D-программирование Вопросы, касающиеся программирования 3D мира |
10.02.2013, 22:21
|
#1
|
AnyKey`щик
Регистрация: 10.02.2013
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Перемещение объектов
Помогите пожалуйста. Необходимо создать несколько объектов (к примеру 5), чтобы при клики на одном из них он выделялся (менял цвет, типа активный, либо рамка появлялась). Затем, при клике в любой части экрана, данный объект начинал туда перемещаться.
Я новичок в этом деле... написал, что-то типа такого
Graphics3D 840,580
SetBuffer BackBuffer()
kr1=0;
kr2=0;
cam=CreateCamera()
PositionEntity cam,0,5,0
lit=CreateLight()
cur=CreateSphere(8)
EntityColor cur,255,215,0
PositionEntity cur,0,1,15
EntityPickMode cur, 2
NameEntity cur, "cur1"
cur2=CreateSphere(8)
EntityColor cur2,55,55,55
PositionEntity cur2,0,5,20
EntityPickMode cur2, 2
NameEntity cur2, "cur22"
;pln=CreatePlane()
;tex=LoadTexture("floor.jpg")
;ScaleTexture tex,10,10
;EntityTexture pln,tex
Repeat
If MouseHit(1) = True
pos = CameraPick(cam,MouseX(),MouseY())
If pos
name$ = EntityName(pos)
If name = "cur1"
EntityColor cur, 155,155,155
kr1=1
If name = "cur22"
EntityColor cur2, 100,100,210
kr2=1
EndIf
EndIf
EndIf
EndIf
If MouseHit(2) = True And kr1=1
mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()
MoveEntity cur,mh*.01,mj*0.01,0
EndIf
If MouseHit(2) = True And kr2=1
mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()
MoveEntity cur2,mh*.01,0,-mj*0.01
EndIf
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End
Создал две сферы, одна выделяется вторая нет... Движения как такового тоже нет. Сфера перепрыгивает не совсем понятно куда.
Помогите пожалуйста реализовать, лучше не используя тот бред, который я написал. Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!
Последний раз редактировалось SBJoker, 11.02.2013 в 23:45.
|
(Offline)
|
|
11.02.2013, 08:01
|
#2
|
AnyKey`щик
Регистрация: 10.02.2013
Сообщений: 7
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Перемещение объектов
вместо mousehit() лучше использовать Getmouse()
Эм, если будет время отпишусь)
|
(Offline)
|
|
11.02.2013, 10:50
|
#3
|
Элита
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений (для 2,828 пользователей)
|
Ответ: Перемещение объектов
Сообщение от ligala
Помогите пожалуйста. Необходимо создать несколько объектов (к примеру 5), чтобы при клики на одном из них он выделялся (менял цвет, типа активный, либо рамка появлялась). Затем, при клике в любой части экрана, данный объект начинал туда перемещаться.
Я новичок в этом деле... написал, что-то типа такого
Graphics3D 840,580
SetBuffer BackBuffer()
kr1=0;
kr2=0;
cam=CreateCamera()
PositionEntity cam,0,5,0
lit=CreateLight()
cur=CreateSphere(
EntityColor cur,255,215,0
PositionEntity cur,0,1,15
EntityPickMode cur, 2
NameEntity cur, "cur1"
cur2=CreateSphere(
EntityColor cur2,55,55,55
PositionEntity cur2,0,5,20
EntityPickMode cur2, 2
NameEntity cur2, "cur22"
;pln=CreatePlane()
;tex=LoadTexture("floor.jpg")
;ScaleTexture tex,10,10
;EntityTexture pln,tex
Repeat
If MouseHit(1) = True
pos = CameraPick(cam,MouseX(),MouseY())
If pos
name$ = EntityName(pos)
If name = "cur1"
EntityColor cur, 155,155,155
kr1=1
If name = "cur22"
EntityColor cur2, 100,100,210
kr2=1
EndIf
EndIf
EndIf
EndIf
If MouseHit(2) = True And kr1=1
mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()
MoveEntity cur,mh*.01,mj*0.01,0
EndIf
If MouseHit(2) = True And kr2=1
mh%=MouseX()
mj%=MouseY()
mk%=MouseZ()
MoveEntity cur2,mh*.01,0,-mj*0.01
EndIf
UpdateWorld
RenderWorld
Flip
Until KeyHit(1)
End
Создал две сферы, одна выделяется вторая нет... Движения как такового тоже нет. Сфера перепрыгивает не совсем понятно куда.
Помогите пожалуйста реализовать, лучше не используя тот бред, который я написал. Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!
|
Ну прям сразу - MouseX/Y/Z узнаёт координаты указателя мыши на экране, а не в 3d-пространстве. Поэтому и сфера у тебя перемещается в непонятно какие координаты.
Что бы узнать место куда ты ткнул мышью в 3d-пространстве нужно создать какую нибудь поверхность с EntityPickMode равное 2 (у тебя был plane, раскоментируй например его), если не нравится скрыть её с помощью EntityAlpha, почитать справку и использовать следующие команды при нажатии на кнопку мыши:
CameraPick(cam, MouseX(), MouseY())
PositionEntity(cur, PickedX(), PickedY(), PickedZ()).
Это если мне не изменяет память.
Ну, думаю, пищу для размышлений дал.
апд
А вторая сфера не выделяется потому что у тебя неверно организовано условие на MouseHit(1).
If MouseHit(1) = True
pos = CameraPick(cam,MouseX(),MouseY())
If pos
name$ = EntityName(pos)
If name = "cur1"
EntityColor cur, 155,155,155
kr1=1
Else if name = "cur22"
EntityColor cur2, 100,100,210
kr2=1
EndIf
EndIf
EndIf
Сравни своё условие и как я его исправил. Разница видна.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.
Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2
Скачать Doom 2D: Remake v0.3.8a
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.02.2013, 23:31
|
#4
|
AnyKey`щик
Регистрация: 10.02.2013
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Перемещение объектов
Большое спасибо! Буду думать. О результатах отпишусь!
Последний раз редактировалось ligala, 13.02.2013 в 02:19.
|
(Offline)
|
|
13.02.2013, 12:21
|
#5
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: Перемещение объектов
Кстати, пришлось использовать правую кнопку мыши (MouseHit(2)) левая почему то не срабатывала вообще. Спасибо!
|
И MouseHit за цикл достается только один раз, при повторном вызове результата не быдет.
Я обычно делаю так
Global mx,my,mz,msx,msy,msz,MouseHit1,mouseHit2
While ...
ReadMouse()
....
Wend
End
Function ReadMouse()
mx=MouseX() ...
msx=MouseXSpeed() ...
MouseHit1=MouseHit(1)
End Function
А после вызова MouseRead уже пользуешься MouseHit1 без ограничений, и сокращениями удобнее пользоватьсяв формулах
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.02.2013, 23:31
|
#6
|
AnyKey`щик
Регистрация: 10.02.2013
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Перемещение объектов
Спасибо. Учту.
У меня новый набор вопросов =(
Что-то тяжело идет (5 лет не программировал)...
В общем решил, пока, сделать меню. Сделал что-то убогое, отдаленно напоминающее. Но вот не знаю как фоновую картинку вставить. Точнее вставляю, но она становится на передний план затуляя надписи (старт, выход). Может ли данная картинка быть .gif (анимацией). Помогите, пожалуйста решить данную проблему.
Вот код моего меню:
Graphics3D 640, 480, 16, 1
SetBuffer BackBuffer()
Global fontB=LoadFont("Verdana",82)
Global FontM=LoadFont("Verdana",32)
Global GameScr=0
Global aa=LoadImage("1.jpg")
;==================================
;main cycle
Repeat
Select GameScr
Case 0
UpdateStartScreen()
DrawImage aa, 0,0
End Select
Flip
Until KeyHit(1)
;=================================
;Functions
;=================================
Function UpdateStartScreen()
Cls
tShift=0
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,240-12,100,32) tShift=1
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,280-12,100,32) tShift=2
SetFont FontB ;setup font
Color 255,100,40
Text 320,150,"Project",True,True
SetFont FontM
If tShift=1 Color 0,255,0 Else Color 255,0,0
Text 320,240, "Start model",True,True
If tShift=2 Color 0,255,0 Else Color 255,0,0
Text 320,280, "Quit",True,True
Color 250,200,0
cursor=LoadImage("cursor.bmp")
DrawImage cursor, MouseX(),MouseY()
;Text MouseX(),MouseY(),"*",True,True
If MouseHit(1)
Select tShift
Case 1
End
Case 2
End
End Select
EndIf
End Function
2. Хочу добавить опции, чтобы можно было выбрать разрешение. Пока не знаю как. Или чтоб само подстраивалось по пользовательское...
3. Думал сделать не просто надписи (старт, выход), а параллелепипеды, натянуть на них текстуры, но можно ли как-то на них потом писать, т.е. поверх текстуры?
4. Не пойму как можно вставить видео при запуске игры. Типа заставки.
5. Это правда не относиться к меню, но можно ли забрать из файла матрицу, а потом вернуть преобразованную в другой файл (или хотя бы в этот же)?
6. Читал, что на цетере были статьи по созданию инвентаря, но сайт сейчас не работает, поделитесь, пожалуйста, опытом. Правда мне не инвентарь нужен, а панель состояния. Типа какое в руках у персонажа1 оружие, а какое у персонажа2 и т.д.
Люди добрые помогите, пожалуйста.
|
(Offline)
|
|
14.02.2013, 01:32
|
#7
|
Элита
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений (для 2,828 пользователей)
|
Ответ: Перемещение объектов
Сообщение от ligala
Спасибо. Учту.
У меня новый набор вопросов =(
Что-то тяжело идет (5 лет не программировал)...
В общем решил, пока, сделать меню. Сделал что-то убогое, отдаленно напоминающее. Но вот не знаю как фоновую картинку вставить. Точнее вставляю, но она становится на передний план затуляя надписи (старт, выход). Может ли данная картинка быть .gif (анимацией). Помогите, пожалуйста решить данную проблему.
Вот код моего меню:
Graphics3D 640, 480, 16, 1
SetBuffer BackBuffer()
Global fontB=LoadFont("Verdana",82)
Global FontM=LoadFont("Verdana",32)
Global GameScr=0
Global aa=LoadImage("1.jpg")
;==================================
;main cycle
Repeat
Select GameScr
Case 0
UpdateStartScreen()
DrawImage aa, 0,0
End Select
Flip
Until KeyHit(1)
;=================================
;Functions
;=================================
Function UpdateStartScreen()
Cls
tShift=0
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,240-12,100,32) tShift=1
If RectsOverlap(MouseX(),MouseY(),1,1,320-50,280-12,100,32) tShift=2
SetFont FontB ;setup font
Color 255,100,40
Text 320,150,"Project",True,True
SetFont FontM
If tShift=1 Color 0,255,0 Else Color 255,0,0
Text 320,240, "Start model",True,True
If tShift=2 Color 0,255,0 Else Color 255,0,0
Text 320,280, "Quit",True,True
Color 250,200,0
cursor=LoadImage("cursor.bmp")
DrawImage cursor, MouseX(),MouseY()
;Text MouseX(),MouseY(),"*",True,True
If MouseHit(1)
Select tShift
Case 1
End
Case 2
End
End Select
EndIf
End Function
2. Хочу добавить опции, чтобы можно было выбрать разрешение. Пока не знаю как. Или чтоб само подстраивалось по пользовательское...
3. Думал сделать не просто надписи (старт, выход), а параллелепипеды, натянуть на них текстуры, но можно ли как-то на них потом писать, т.е. поверх текстуры?
4. Не пойму как можно вставить видео при запуске игры. Типа заставки.
5. Это правда не относиться к меню, но можно ли забрать из файла матрицу, а потом вернуть преобразованную в другой файл (или хотя бы в этот же)?
6. Читал, что на цетере были статьи по созданию инвентаря, но сайт сейчас не работает, поделитесь, пожалуйста, опытом. Правда мне не инвентарь нужен, а панель состояния. Типа какое в руках у персонажа1 оружие, а какое у персонажа2 и т.д.
Люди добрые помогите, пожалуйста.
|
1.
Global aa=LoadImage("1.jpg")
это я так понимаю загрузка фонового изображения? Если я правильно понял, то судя по твоему коду основного цикла оно и должно быть сверху, т.к. рисуется после всех изображений и текстов. Минимум что надо сделать - сначала отрисовывать фон, потом всё остальное. Основываясь на твоём коде это будет так:
Repeat
Select GameScr
Case 0
DrawImage aa, 0,0
UpdateStartScreen()
End Select
Flip
Until KeyHit(1)
Если в теории, то фоновое изображание вполне может быть gif-анимацией, см. пункт 4. В теории - потому что я лично не пробовал.
2. Что бы программа на блице запускалась с разрешением пользовательского экрана надо заместо разрешения экрана указать нули. В твоём случае Graphics3d 0, 0, 16, 1. Для начала этого хватит. Но вполне реально реализовать и смену разрешения, глубины и оконности, там впринципе ничего трудного и нету.
3. Реально, можно рисовать и писать в текстуры, и потом текстурировать. Смотри блицевский пример по команде CreateTexture. Но лучше использовать готовые текстуры с текстом, хотя это лично моё мнение.
4. В последних версиях блица появились команды OpenMovie, CloseMovie, DrawMovie и какие то ещё связанные с этим. Они же, кстати, открывают и рисуют *.gif картинки. В блице есть примеры по их использованию.
5.6. не компетентен в данных вопросах, хотя забать из файла и записать в файл можно что угодно, вопрос будет ли соблюдаться формат первоначального файла (если нужно конечно).
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.
Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2
Скачать Doom 2D: Remake v0.3.8a
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.02.2013, 16:48
|
#8
|
AnyKey`щик
Регистрация: 10.02.2013
Сообщений: 4
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Перемещение объектов
2. Что бы программа на блице запускалась с разрешением пользовательского экрана надо заместо разрешения экрана указать нули. В твоём случае Graphics3d 0, 0, 16, 1. Для начала этого хватит. Но вполне реально реализовать и смену разрешения, глубины и оконности, там впринципе ничего трудного и нету.
|
Если использовать Graphics3d 0, 0, 16, 1, то как можно узнать то самое разрешение? Получается следующая беда, если писать Graphics3d 0, 0, 16, 1, то как подогнать картинки и видео под это разрешение? Возможно ли их растянуть/сузить или есть более изящное решение?
Можно подробнее про создание глубины и оконности?
Может есть утилиты для создания меню (какой-нить гуи менеджер или хз что) или примеры с коментами? Если есть какая-нибудь инфа поделитесь, пожалуйста. Т.к. помимо фона, так же съезжает и текст (start, quit и т.д., которые создаются так - Text 320,280, "Quit",True,True).
Может кто сталкивался с возможностью создания трехмерных букв, возможно даже отбрасывающих тени...
Большое спасибо за помощь!
|
(Offline)
|
|
17.02.2013, 17:13
|
#9
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Перемещение объектов
Сообщение от ligala
Если использовать Graphics3d 0, 0, 16, 1, то как можно узнать то самое разрешение?
|
width% = GraphicsWidth ()
height% = GraphicsHeight ()
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:38.
|