首页 资讯中心 硬件周边 攻略中心 秘籍中心 在线动漫 CG壁纸  
专题栏目: PSP NDS GBA PS2 PS3 XBOX XBOX360 WII
PSP 游戏资料 | 玩家宝典
您的位置:游狐网 >> PSP >> 玩家宝典 >> 软件教程

菜鸟也能为PSP编程 - Lua Player 编程初级指南

[ 时间:2008-5-6 9:40:37 | 来源:电玩巴士 | 收藏本文 ] 【

7——使用图像

  到目前为止,我们所有的程序均只使用了文本。我想下水前先湿湿脚比较好,有了基本编程知识,将使一切容易领会。在本节课中,我将介绍使用图像,及一些获取图像信息的命令。

  至于我们打算编写什么?嗯,就做一个看起来真正象是游戏的程序吧。它不会做任何华而不实或令人兴奋的事情,但足够应付本教程的目的了,图像。我们这里所学的只是众多图像命令的一部分。我们将在以后的教程里进一步了解这些。你也可以自己在luaplayer的文档中查询。我们的作品将包括一个可移动的角色,他可以在屏幕中自由走动,但不能够走出屏幕边缘。

  第一件事是将下面提供的图像保存到你的工作目录。这些图像只是做个样本,你完全可以用自己的。LuaPlayer 可以载入 PNG 和 JPEG 图像。大多数情况下我会使用 PNG 而不选 JPEG,尤其当你需要透明的时候。现在保存这些图像:点此下载

  解压至工作目录。你应该有如下3个图像:

  player.png
  grass.png
  flower.png

  现在我们先回到教程的第一部分,稍后再编写我们的代码。

载入图像

  要在lua中使用图像,你必须先将其载入程序,并赋予一个变量(或数据表)。你可以在程序开头这么做,也可以稍后再做,这取决于你什么时候需要该图像。在我们待会儿要写的代码中我们会在开始就预先载入图像。这里是一个载入图像的示例:

代码:

grass = Image.load("grass.png")

  这一句将载入图像文件 "grass.png" 并赋予变量 "grass"。要正确载入图像你得确保该图像与你的lua脚本文件位于同一目录。如果你把图像放在一个子文件夹,例如 "Images",你就得用 "Images/grass.png" 而不是 "grass.png"。大小写也不要搞错。image 的 I 要大写,load 的 l 要小写。载入图像很简单吧?!

显示图像

  要在屏幕上真正显示图像并不比载入更难。这里是完整命令:

代码:

screen:blit(x, y, Image source, [sourcex, sourcey, width, height], [alpha = true])

  这里有很多信息要填!不是所有的参数都必要,方括号里的如果你不需要你可以完全忽略。现在让我们解释一下。

  代码起始的 screen:blit 是一个命令,它将图像粘贴到屏幕上。

  括号里的内容是真正乐趣所在。

  x 和 y 与 print 命令中的相同。指定图像粘贴到屏幕上的位置。

  Image source 指定要粘贴的图像。上文中我们载入了一个图像叫 grass,所以我们可以用 grass 作为图像源。

  [sourcex, sourcey, width, height] 是可选的。用来载入某幅大图的一部分。分片图是个极好的例子。你可以载入一幅单图,分成好几个部分,使用此代码你可以只粘贴其中的一部分。sourcex 和 sourcey 是要截取区域开始点的 x 和 y 坐标值。这样粘贴的不是整幅图,而是其中一部分。

  width 和 height 是指图像截取区域的宽度和高度。

  命令的最后是 alpha 参数。这是用来设定图像的透明度的。如果设为 true 则图像透明, 设为 false 则显示原图。

  本课我们不会使用全部参数。

获取图像尺寸

  获取载入的图像尺寸有时很有用,这要用下面两个命令:

代码:

image:width()
image:height()

  实际使用时,用你想获取宽高的图像变量名替换此处的“image”。例如,要获取我们的grass图像的宽度和高度,你可以用:

代码:

grass:width()
grass:height()

开始编写程序

  让我们开始编写我们的游戏。第一件要做的就是载入我们的图像。创建一个新文件,输入如下代码:

代码:

grass = Image.load("grass.png")
player = Image.load("player.png")
flower = Image.load("flower.png")

  就这样。我们已经把我们的三个图像载入了程序。

  现在我们来用用那些获取图像尺寸的命令。先输入下列代码,然后我会解释的。我还想提醒你,你如果自己手工输入这些代码会比复制粘贴的效果要好。这样你会对这些命令记得更牢。不管怎样,添加如下代码:

代码:

screenwidth = 480 - player:width()
screenheight = 272 - player:width()

  这有什么用吗?我来解释一下它的用途。这部分代码帮助我们让玩家角色到达屏幕边缘时停止,无论是往左或往右(水平方向)。我们知道PSP屏幕尺寸是480,但是如果我们设定屏幕边界是480,我们的角色就会超出屏幕32个像素,因为角色是32像素宽。player:width() 获取玩家图像的宽度,也就是 32 像素。从屏幕的宽度和高度中扣除该值就可以让角色图像在屏幕边缘停止。

  接着我们来创建一个数据表以存储玩家角色的信息。此例程中需要的唯一信息就是玩家在屏幕上的 x 和 y 坐标位。输入如下代码:

代码:

Player = { } Player[1] = { x = 200, y = 50 }

  这将存储玩家在屏幕上的x、y位置。我们将让玩家从 x 200、y 50 的位置开始。

  现在开始我们的主循环。输入如下代码:

代码:

while true do
pad = Controls.read()
screen:clear()

  在下一部分代码中我将引入一个新的循环命令。就是“for”循环。我先举个例子让你了解它的工作方式,无需放在你的代码中。这个例子通过使用一个小循环打印了5个玩家的武器。

代码:

for a = 1,5 do
screen:print(10, 10, Player[a].weapon, green)
end

  要使用 for 循环,你要赋予一个临时变量起始值和终止值。

  在上文中我们说 "for a = 1,5 do",这意味着创建一个循环,其变量 a 的起始值为 1,终止值为 5。你可以理解为“a 等于 1 至 5”。

  然后在循环中我们要打印玩家的武器到屏幕上。

  最后一行是 end 语句,必须使用以终止循环。

  这样,该循环将不断重复直到 a 等于终止值,然后循环终止。第一次循环执行时 a 等于 1。下一次循环时 a 将等于 2,然后是 3,然后是 4,最后是 5。这样就可以快速的将玩家 1 至 5 的武器都打印到屏幕上。当然。实际操作时你需要更改 print 命令的屏幕坐标,不然就都打印到一起去了。但是这展示了该循环的用法。在 for 循环中你也可以根据需要使用 if 语句。

  我们将使用这个命令把我们的grass图像平铺在整个屏幕上。输入下述代码,然后我会解释。当然,如果要做一个带卷轴之类的复杂游戏,使用平铺引擎将是更好的办法,不过目前我们不需要用它。

代码:

for a = 0, 14 do
for b = 0,8 do
screen:blit(32 * a, 32 * b, grass)
end
end

  这里我们在一个 for 循环中嵌套了又一个 for 循环!这将把 grass 图像粘贴到整个屏幕上。横向贴 15 幅图,纵向 9 幅图。请注意,我们设定起始值为 0 而不是 1,这样图像会从屏幕最左边贴起。

  现在让我们再贴一些图像。

代码:

screen:blit(100,100,flower)
screen:blit(300,220,flower)
screen:blit(Player[1].x,Player[1].y,player)

  这一段就是简单的贴上两幅 flower 图像,还有 player 的图像。很快,当我们使用移动按键时我们将在每次循环中让玩家的坐标随着按键的按下而改变。使用上述 blit 命令我们的 player 图像将自动粘贴到屏幕的正确区域。

  现在让我们加上那些按键,以检测是否按下了方向键。输入下述代码:

代码:

if pad:left() and Player[1].x > 0 then
Player[1].x = Player[1].x - 2
end

if pad:right() and Player[1].x < screenwidth then
Player[1].x = Player[1].x + 2
end

if pad:up() and Player[1].y > 0 then
Player[1].y = Player[1].y - 2
end

if pad:down() and Player[1].y < screenheight then
Player[1].y = Player[1].y + 2
end

  这些代码将检测我们是否按下了“上下左右”键。使用 and 语句同时确保我们没有超出屏幕边界。既然屏幕的最左侧和最顶端的坐标是 0,我们只要检查我们的位置是否大于 0 即可。其他部分我们使用 screenwidth 向右走,screenheight 则用来向下走。这些变量我们之前已创建。如果我们的位置通过了 if 测试,则玩家的 x 或 y 坐标递增或递减 2 点。每次主循环执行都会将 player 图像粘贴到提供给它的新位置。

  最后让我结束循环。使用如下代码:

代码:

screen.waitVblankStart()
screen.flip()
end

  保存你的工作,运行吧。使用方向键让角色在屏幕上穿梭。你应该是无法穿越屏幕边缘的。