Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > 2D-программирование

Ответ
 
Опции темы
Старый 12.06.2007, 15:03   #1
jimon
 
Сообщений: n/a
Тип Камеры

я чуствую что занимаюсь велосепедизмом .. но все же

Global Camera:TCamera

Type TCamera

	Field camera_x,camera_y
	
	Method DrawImages(image:TImage,x,y)
		DrawImage image,x - camera_x, y - camera_y
	End Method
	
	Method Move(x,y)
		camera_x = camera_x + x
		camera_y = camera_y + y
	End Method
	
	Method SetXY(x,y)
		camera_x = x
		camera_y = y
	End Method
	
	Method GetX()
		Return camera_x
	End Method

	Method GetY()
		Return camera_y
	End Method
	
	Method GetMouseX()
		Return MouseX() + camera_x
	End Method

	Method GetMouseY()
		Return MouseY() + camera_y
	End Method
	
	Method GetScrX(x)
		Return x - camera_x
	End Method
	
	Method GetScrY(y)
		Return y - camera_y
	End Method
	
	Function CreateCamera()
		Camera = New TCamera
	End Function

End Type

Function DrawImg(image:TImage,x,y)
	Camera.DrawImages(image,x,y)
End Function
и примерно как юзать
TCamera.CreateCamera()
............


if KeyDown(KEY_D) Camera.Move(1,0)
If KeyDown(KEY_A) Camera.Move(-1,0)
If KeyDown(KEY_W) Camera.Move(0,-1)
If KeyDown(KEY_S) Camera.Move(0,1)
DrawImg (img,0,0)

просто я пока плохо перевариваю ограничение екрана мне надо больше
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dranichek (27.08.2013)
Старый 12.06.2007, 15:29   #2
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Re: Тип Камеры

Молодец) Сделай поддержку нескольких камер и переход между ними: через фейд или перелет.
(Offline)
 
Ответить с цитированием
Старый 12.06.2007, 20:50   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Тип Камеры

Я это реализовываю немного другим путём:
Я не создаю новый класс, у меня есть только 5 значений:
1,2 - Размер экрана.
3,4 - Позиция камеры (левый верхний угол, хотя сделать центр несложно).
5 - Коэфицент Зуума.
И далее в других классах есть отрисовка, например для линий есть локальная функция TLine.Render() где происходит перебор эллементов, каждый проверяется попала линия в экран исходя из 5 значений для камеры, если да то отрисовывать опять исходя из 5 значений.
Вот и всё. А заводить новый класс зачем? Я решил что мне не нужно много камер, я сделал плавное перемещение камеры и всё, даже если точку куда нужно переместить камеры, поставить очень далеко, то она не сразу туда двинется, а полетит.
А вообще хз, каждый по своему делает, кому как удобнее.

Да и относительно перемещения камеры, сделай так:
2 перменные отвечающие за точку куда должна переместиться камера, и двигай по формуле:
camera_x:+(camera_trgx-camera_x)*.01
camera_y:+(camera_trgy-camera_Y)*.01
А x и y в методе TCamera.Move прибоавляй к координатам цели. Будет приятнаое сглаживание.

А вообще твой способ в определённых ситуациях удобен, мне например координату мышки нужно было складывать постоянно, ну и т.п. а у тебя сразу, но совет: В начале цикла привязывай координаты мышки к переменным, а потом их юзай вместо вызова MouseX() и MouseY().
(Offline)
 
Ответить с цитированием
Старый 08.10.2007, 18:38   #4
jimon
 
Сообщений: n/a
Re: Тип Камеры

да кстати, вот последний тип камеры из jAqua

Type TCamera

	'camera coordinates
	Field camera_x#,camera_y#
	
	Field Zoom# = 1.0
	Field GlobalAlpha# = 1.0
	
	Field EnableZoom% = 1
	Field EnableGlobalAlpha% = 1
	
	Field GrapX#
	Field GrapY#
	
	Method Serealize()
		SerFloat(camera_x)
		SerFloat(camera_y)
		SerFloat(Zoom)
		SerFloat(GlobalAlpha)
		SerInt(EnableZoom)
		SerInt(EnableGlobalAlpha)
	End Method
	
	'draw image with camera
	Method DrawImages(image:TImage,x#,y#,frame%=0)
		If image = Null Then
			RuntimeError "WTF ?! null image in camera.drawimages , please debug again :)"
		End If
		
		If EnableGlobalAlpha = 1 Then SetAlpha(GetAlpha()*GetGlobalAlpha())
		
		If EnableZoom = 1 Then
			Local scx#,scy#
			GetScale scx,scy
			SetScale scx*GetZoom(),scy*GetZoom()
		End If
		
		DrawImage image,GetScrX(x),GetScrY(y),frame
	End Method
	
	Method GetZoom#()
		If EnableZoom = 1 Then
			Return Zoom
		Else
			Return 1.0
		End If
	End Method
	Method GetGlobalAlpha#()
		If EnableGlobalAlpha = 1 Then
			Return GlobalAlpha
		Else
			Return 1.0
		End If
	End Method
	
	'move camera
	Method Move(x#,y#)
		camera_x :+ x
		camera_y :+ y
	End Method
	
	'set camera positon
	Method SetXY(x#,y#)
		camera_x = x
		camera_y = y
	End Method
	
	'get camera position
	Method GetX#()
		Return camera_x
	End Method
	Method GetY#()
		Return camera_y
	End Method
	
	'get mouse position with camera
	Method GetMouseX#()
		Return GetWorldX(MouseX())
	End Method
	Method GetMouseY#()
		Return GetWorldY(MouseY())
	End Method
	
	'get screen coordinates from world
	Method GetScrX#(x#)
		Return (x - camera_x)*GetZoom()
	End Method
	Method GetScrY#(y#)
		Return (y - camera_y)*GetZoom()
	End Method

	'get world coordinates from screen
	Method GetWorldX#(x#)
		Return x/GetZoom() + camera_x
	End Method
	Method GetWorldY#(y#)
		Return y/GetZoom() + camera_y
	End Method
	
	'return 1 if cordinates in current viewport
	Method InViewPort%(x#,y#)
		Local x2#,y2#
		x2 = GetScrX(x)
		y2 = GetScrY(y)
		
		If x2 >= 0 And x2 <= GrapX And y2 >= 0 And y2 <= GrapY Then
			Return 1
		Else
			Return 0
		End If
	End Method
	Method BoxInViewPort%(x#,y#,Width#,Height#)
		Local x2#,y2#,x3#,y3#
		x2 = GetScrX(x + Width/2.0)
		y2 = GetScrY(y + Height/2.0)
		x3 = GetScrX(x - Width/2.0)
		y3 = GetScrY(y - Height/2.0)
		
		If x2 >= 0 And x3 <= GrapX And y2 >= 0 And y3 <= GrapY Then
			Return 1
		Else
			Return 0
		End If
	End Method
	Method ImageInViewPort%(Img:TImage,x#,y#)
	
		Local x2#,y2#,x3#,y3#
		x2 = GetScrX(x + Float(Img.width)/2.0)
		y2 = GetScrY(y + Float(Img.height)/2.0)
		x3 = GetScrX(x - Float(Img.width)/2.0)
		y3 = GetScrY(y - Float(Img.height)/2.0)
		
		If x2 >= 0 And x3 <= GrapX And y2 >= 0 And y3 <= GrapY Then
			Return 1
		Else
			Return 0
		End If
	End Method
	
	
	Function Create:TCamera()
		Local cam:TCamera = New TCamera
		cam.GrapX = GraphicsWidth()
		cam.GrapY = GraphicsHeight()
		
		Return cam
	End Function
	
End Type
можете удалить метод Serealize нафиг
ибо вам он не нужен
 
Ответить с цитированием
Старый 18.10.2007, 22:07   #5
Igorr
Нуждающийся
 
Регистрация: 17.05.2006
Сообщений: 72
Написано 2 полезных сообщений
(для 4 пользователей)
Сообщение Re: Тип Камеры

Я это делал так. Если кому интересно.

Type TCamera
Field CameraX#,CameraY#
Field GW#,GH#

MethodNew()
GW#=GraphicsWidth()
GH#=GraphicsHeight()
EndMethod 

Method GetRenderingCoords(x# Var,y# Var)
x#=GW#/2+x#
y#=GW#/2-y#
EndMethod 

Method Refresh()
GW#=GraphicsWidth()
GH#=GraphicsHeight()
EndMethod 

Method Position(NewX#,NewY#)
CameraX#=newX#
CameraY#=newY#
EndMethod 

Method Move(SpeedX#,SpeedY#)
CameraX#:+SpeedX#
CameraY#:+SpeedY#
EndMethod 
EndType 
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FoV камеры HolyDel 3D-программирование 1 01.08.2008 15:56
Эффекты камеры)))))))) AndruXa Blitz3D 12 21.11.2007 00:01
Баг камеры Wins Vega 3D-программирование 1 08.05.2007 04:14
1 окно, 2 камеры Chuma 3D-программирование 9 18.02.2007 01:14
КАМЕРЫ Akima 3D-программирование 6 09.12.2005 20:45


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com