NDS开发Wiki翻译:第五天:背景(2)



掌叔
2008-06-06 15:52:21

摘自:chenyi1976.spaces.live.com
翻译:陈轶

背景滚动

一般滚动

滚动背景和移动精灵一样容易!只要使用一个简单的函数就行了,例子在PAlibExamples/ScrollBg :

PA_InitText(1, 0); // Init text on the top screen, background 0...

// Load Backgrounds and their palettes...
PA_LoadTiledBg(0, 3, BG3);
PA_LoadTiledBg(1, 3, BG3);

s32 scrollx = 0; // No X scroll by default...
s32 scrolly = 0; // No Y scroll by default...

// Infinite loop to keep the program running
while (1)
{
// We'll modify scrollx and scrolly according to the keys pressed
scrollx += (Pad.Held.Left - Pad.Held.Right) * 4; // Move 4 pixels per press
scrolly += (Pad.Held.Up - Pad.Held.Down) * 4; // Move 4 pixels per press

// Scroll the background to scrollx, scrolly...
PA_BGScrollXY(0, // Screen
3, // Background number
scrollx, // X scroll
scrolly); // Y scroll

// Display the X and Y scrolls :
PA_OutputText(1, 0, 0, "x : %d
y : %d ", scrollx, scrolly);

PA_WaitForVBL();
}

背景的装载和平常一样,在例子里面,文本也初始化了。。。我们将用文本来显示滚动的一些信息。(译:□□□□□此处删去×××字)

* scrollx += (Pad.Held.Left - Pad.Held.Right) * 4; 这个和精灵例子里面的代码很像,数字4表示背景滚动的速度!
* PA_BGScrollXY(Screen, Background number, X scroll, Y scroll); 这个也很容易理解:滚动屏幕到指定位置。。
* 文本信息用来显示背景当前位置。。。

当一个背景划出屏幕的时候,发生了什么?它回滚了。这样你就不会得到一个空的背景,而始终都是你的背景。。。如果你的背景是256象素宽,那么你把部分背景移出左方,移出的部分将立刻在屏幕右边出现。。。

视差滚动

视差滚动是一向让多层背景以不同的速度滚动的技术,可以生成一种非常漂亮的3D效果。。。使用简单,效果显著,不用这个技术就太可惜了!很有游戏都用它,从射击类到平面类。比如横版纵版射击中,让远处的星星移动得比近处的星星慢一点。比如在超级玛丽中,如果超级玛丽站在滑板上,背景上的山往后移,而天上的云以另外一种速度移动,这看上去就非常棒!发挥你的想象力吧。不过我们还是先来看看我们的Demo是怎么干的。。。

PAlib提供了一些很不错的函数,我们看一下Backgrounds/Parallax 例子先。。。

// Load the 4 Backgrounds on the bottom screen...
PA_LoadTiledBg(0, 1, BG1); //screen, background number, background name
PA_LoadTiledBg(0, 2, BG2);
PA_LoadTiledBg(0, 3, BG3);

// Initialise parallax vertically (Y axis) for both backgrounds
// 256 is normal speed, 128 half speed, 512 twice as fast...
PA_InitParallaxY(0, //screen
0, //Parallax speed for Background 0. 0 is no parallax (will scroll independently with BGScroll)
256, // Normal speed for Bg1
192, // 3/4 speed
128); // Half speed
PA_InitParallaxY(1, 0, 256, 192, 128); // Same thing, but for Screen 1...

s32 scroll = 0;


// Infinite loop to keep the program running
while (1)
{
scroll += 1; // Scroll by one pixel...
// Backgrounds with a parallax speed of 256 will scroll 1 pixel, 192 will scroll 0.75, and 128 0.5
// We could also have put a negative parallax speed to have some backgrounds scroll in different directions

PA_ParallaxScrollY(0, -scroll); // Scroll the screen 0 backgrounds.

PA_WaitForVBL();
}

首先,你需要装载一些背景,至少要有2个。。。如果只有1个,是做不到以不同速度滚动的!(译:无敌的解释啊。)

然后,你必须初始化视差滚动:PA_InitParallaxY(screen, bg0 speed, bg1 speed, bg2 speed, bg3 speed);.。你要做的事情就是赋予不同的背景不同的速度。记住,256代表了1级速度,512则是2级速度,128则是0.5级。。。你需要做一些测试来找出在你的游戏里面多少速度比较合适,这应该不困难。如果你在视差滚动的时候,还需要一个固定的背景,比如在超级玛丽中,有一个显示金币数的背景,那么你只要把0号背景的速度设置为0就可以了。

scroll += 1; 这句话是让屏幕自动滚动,我们也可以实现通过按键滚动。

PA_ParallaxScrollY(screen, scroll); 这个函数是真正地进行视差滚动。。。。这里的scroll参数是用来控制滚动方向的。。。


现在,编译并测试吧,它甚至可以在DualiS模拟器上跑!你应该看到一个漂亮的视差滚动。如何?很漂亮,不是吗?

好了,这里背景是垂直滚动的,而超级玛丽是水平滚动的。。。要改变滚动方向很容易。你有没有注意到PA_ParallaxScrollY函数的最后一个字母Y?只要把Y换成X就可以了。甚至你还可以组合使用XY。

(译:这一部分很有趣,使用视差滚动让你的朋友们崇拜你吧。是的,作为技术派,你也许觉得实现起来不够复杂,不乍得,但是外行们都是看热闹的,让他们为你欢呼吧)