在游戏中通常不可能允许一幅场景贯穿始终,这就提出了场景变更的要求,基于这一要求的实现,我们将进行如下效果的
Java
代码实现。
下载地址[url]http://www.3adisk.com/?onlinezero[/url][文件名:RpgChair0to6.rar]
或另存以下X(gif)文件为rar
或另存以下X(gif)文件为rar
由于代码量已开始增加,由本回开始仅给出部分代码实现,详细请进行下载:
在本例中,本人采取的位图偏移算法如下:
MyPanle
中实现如下:
// X
偏移位置
int
offsetX = MyPanel.
WIDTH
/ 2 -
role
.getX() *
CS
;
//
计算
X
偏移量
offsetX = Math.min(offsetX, 0);
offsetX = Math.max(offsetX, MyPanel.
WIDTH
- GameMap.
WIDTH
);
// Y
偏移位置
int
offsetY = MyPanel.
HEIGHT
/ 2 -
role
.getY() *
CS
;
//
计算
Y
偏移量
offsetY = Math.min(offsetY, 0);
offsetY = Math.max(offsetY, MyPanel.
HEIGHT
- GameMap.
HEIGHT
);
//System.out.print(role.getX()+":"+role.getY());
//
绘制可偏移位置的地图
map
.draw(g, offsetX, offsetY);
//
绘制可偏移位置的角色
role
.draw(g, offsetX, offsetY);
在
GameHandle
及
GameMap
中,均需注入
offsetX
及
offsetY
值,以生成对应图像。
GameHandle
实现:
//
自
Example6
开始,为了实现背景的移动,所有算法都要加入偏移值
public
void
draw(Graphics g,
int
offsetX,
int
offsetY) {
//
以
count
作为图像的偏移数值
,
并于
Example4
中添加
direction
以获取所处图像块位置
g.drawImage(
p_w_picpath
,
x
*
CS
+ offsetX,
y
*
CS
+ offsetY,
x
*
CS
+ offsetX +
CS
,
y
*
CS
+ offsetY +
CS
,
count
*
CS
,
direction
*
CS
,
CS
+
count
*
CS
,
direction
*
CS
+
CS
,
panel
);
}
GameMap
实现:
//
修正
Example6
中绘制方式,引入地图坐标偏移计算
public
void
draw(Graphics g,
int
offsetX,
int
offsetY) {
int
firstTileX = pixelsToTiles(-offsetX);
//
变更
X
坐标
int
lastTileX = firstTileX + pixelsToTiles(MyPanel.
WIDTH
) + 1;
//
返回最小
X
偏移值
lastTileX = Math.min(lastTileX,
COL
);
int
firstTileY = pixelsToTiles(-offsetY);
//
变更
Y
坐标
int
lastTileY = firstTileY + pixelsToTiles(MyPanel.
HEIGHT
) + 1;
//
返回最小
Y
偏移值
lastTileY = Math.min(lastTileY,
ROW
);
//
在
Java
或任何游戏开发中,算法都是最重要的一步,本例尽使用
//
简单的双层
for
循环进行地图描绘,
for
(
int
i = firstTileY; i < lastTileY; i++) {
for
(
int
j = firstTileX; j < lastTileX; j++) {
// switch
作为
java
中的转换器,用于执行和
()
中数值相等
//
的
case
操作。请注意,在
case
操作中如果不以
break
退出
//
执行;
switch
函数将持续运算到最后一个
case
为止。
switch
(
map
[i][j]) {
case
0 :
//
地板
g.drawImage(
floorImage
, tilesToPixels(j) + offsetX, tilesToPixels(i) + offsetY,
panel
);
break
;
case
1 :
//
墙壁
g.drawImage(
wallImage
, tilesToPixels(j) + offsetX, tilesToPixels(i) + offsetY,
panel
);
break
;
}
}
}
}