作者KanoLoa (诺)
看板GameDesign
标题Re: [程式] 请教一个画面移动的问题
时间Tue Apr 15 19:19:11 2008
※ 引述《jijuan (naujij)》之铭言:
: 请问假设我有一张底图的大小是4000x3000
: 那我的萤幕一开始只能显示其中的一部份
: 如果我要做出当游戏里某个物件移动的边缘时
: 画面也会跟着移动
: 请问该从哪里下手呢?
1.场上的物件应该会需要有两种座标:
a. 显示於萤幕上的座标 , 用 ScreenX 还有 ScreenY来表示
b. 物件跟底图之间的关系座标,也是物件彼此之间的座标
可以称作逻辑座标, 或是世界座标,用 LogicX 和 LogicY表示。
※ 假设萤幕大小为 640 x 480 , 萤幕范围为 ( 0 至 640 , 0 至 480 )
座标轴最左上为 ( 0 , 0 ) 往右下数值递增。
2.然後你还需要一个镜头,镜头只需要逻辑座标,
负责利用逻辑座标差值计算所有物件应该在萤幕上出现的位置。
====================================================================
若是你要追踪的物件诞生在萤幕中央,且物件一开始就在底图中央。
则所追踪物件的座标:
LogicX , LogicY = ( 2000 , 1500 ) //底图正中央
ScreenX ,ScreenY = 物件逻辑座标 - 镜头逻辑座标 + 画面中心(镜头中心点)
= ( 2000 - 2000 + 320 , 1500 - 1500 + 240 )
= ( 320 , 240 ) // 萤幕正中央
底图的座标:
LogicX , LogicY = ( 0 , 0 )
ScreenX ,ScreenY = 物件逻辑座标 - 镜头逻辑座标 + 画面中心(镜头中心点)
= ( 0 - 2000 + 320 , 0 - 1500 + 240 )
= ( -1680 , -1260 ) // 底图大小为 4000 x 3000
// 萤幕中央刚好为底图中央
镜头逻辑座标 = 追踪物件一开始逻辑座标 。
状况1.一般状况:
物件往右移100像素,未到达画面移动的条件。
且底图的位置不会变,单纯物件从中央移动到右边一些。
所以物件的座标:
LogicX , LogicY = ( 2000 + 100 , 1500 )
ScreenX ,ScreenY = 物件逻辑座标 - 镜头逻辑座标 + 画面中心(镜头中心点)
= ( 2100 - 2000 + 320 , 1500 - 1500 + 240 )
= ( 420 , 240 ) //萤幕中央,右边100位置。
状况2.物件移动超过设定的范围:
假设在萤幕上,物件能达到最右边的位置是 ScreenX = 600 ,
物件若是往右移动 300 像素, 320 + 300 > 600 。
物件萤幕位置保持 ScreenX = 600 ,底图开始左移。
程式码:
物件向右移动(){
物件LogicX += 物件向右位移量 ;
if ( 物件的LogicX > 镜头的LogicX +280 ) //600 -320 = 280
镜头LogicX += 物件向右移动的位移量 ;
}
// 当物件逻辑座标 跟 镜头逻辑座标 差超过 280 的时候,
// 物件继续移动的位移量,镜头逻辑座标也要一起加上去。
// 例子中,镜头的座标会因为差超过 280 ,多加了 20 变为 2020 。
物件座标:
LogicX , LogicY = ( 2000 + 300 , 1500 )
ScreenX ,ScreenY = 物件逻辑座标 - 镜头逻辑座标 + 画面中心(镜头中心点)
= ( 2300 - 2020 + 320 , 1500 - 1500 + 240 )
= ( 600 , 240 ) //萤幕600位置。
地图座标:
LogicX , LogicY = ( 0 , 0 )
ScreenX ,ScreenY = 物件逻辑座标 - 镜头逻辑座标 + 画面中心(镜头中心点)
= ( 0 - 2020 + 320 , 0 - 1500 + 240 )
= ( -1700 , -1260 ) //萤幕中心,往左移动20的位置。
=======================================================================
怎麽越打越复杂的感觉 <囧>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.73.98.74
1F:推 jellyice:good 04/16 20:02
※ 编辑: KanoLoa 来自: 59.104.95.181 (04/16 23:04)
2F:推 jijuan:大推 04/21 09:05