由小白到大大的涅盘,从vgsky.com开始!

学习PSP游戏制作实况记录:用家操控和动画

Update:2007/10/6,Click:0 本文如有下载 请从下面附件中下载

举手之劳 是您对我们最大的支持 感谢您!

到现在还没能写出一个游戏, 开始心急了... 其实是开个玩笑:) 在下觉得, 写游戏最主要的不是技术, 而是耐性! 技术不会, 还可以找到别人的借用(像在下, 嘿嘿...), 但没有耐性, 就很难可以把一个游戏写完. 在游戏界, 惯常的说法是: 制作游戏的最后20%是占了整个过程的80%, 有些人甚至说是10% 与 90% 之比.iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
好了, 闲话少说, 进入主题 :) 在这篇, 新加了读入用家控制和把大图部份画到屏幕的功能, 还有就是简单的动画, 有了这些新功能, 大家基本上可以制作一个简单的游戏了 ;)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
在psp上读入用家操控, 非常容易, 只要初始了控制器, 就可以直接读入相关资料:iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      SceCtrlData pad;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      sceCtrlSetSamplingCycle(0);iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      sceCtrlReadBufferPositive(&pad, 1);              // read control pad
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
我们在这里用pad 存着控制器的相关数据, pad.Lx 和 pad.Ly 分别是模拟控制的x, y 值, 观察所得, 它们的数值是0-255, 我们把它当joystick 来用, 再配合Plot, 就可以弄个简单的"小画家", 看附图:iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
不过大家不要误会, 用PSP的模拟控制只可画出那些乱七八糟的线, 那只可爱的老鼠, 不是在PSP上画出来的, 是我的好友Anjou兄的大作, 在此先要跟他说声多谢! (Anjou的Blog)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
     int x = SCREEN_WIDTH/2;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
     int y = SCREEN_HEIGHT/2;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
     ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
               // pad.Lx 和 pad.Ly 的数值是 0-255iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
               // 但我们只想要知道它是向左右, 还是上下iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             if (pad.Lx<64)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    if (x>0) x--;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             else if (pad.Lx>196)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    if (x<SCREEN_WIDTH-1)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                           x++;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             if (pad.Ly<64)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    if (y>0) y--;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             else if (pad.Ly>196)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    if (y<SCREEN_HEIGHT-1)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                           y++;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
               // 画点iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             Plot(x, y, colors[currentColor]);
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
至于pad.Buttons 则是所有按钮的bit mask, Buttons 里每一个位, 代表了一个按钮, 当对应的位是1, 即表示该按钮被按下了, 0 则相反.iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
所以例如这句: "if (pad.Buttons&PSP_CTRL_TRIANGLE)" 就是测试三角按钮有没有被按下.iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
注意: 本文程序, 用三角按钮转换画点的颜色, 用圆按钮截图到记忆棒的根目录!iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
至于新加的函数DrawImageRect(), 把大图部份画到屏幕, 功能主要是用作动画. 一个游戏要是没有动画是很单调的, 所以我们要赶快加入这个功能:) 看下面的截图:iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
对于动画, 我们可以把动画的每一格图分开存为一个个的档案, 但制作游戏惯常的做法, 是把同一个动画甚至几个动画的图都放在同一个档内, 如下图:iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
这样, 我们就要从大图中, 选出需要的部份, 画到屏幕, 根据时间, 画不同的分格, 达到动画的效果!iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      int frame = 0;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      int timer = 0;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
       ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      int xMan = 10;      // 老鼠的初始位置iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      int yMan = 100;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      bool mirrored = false;     // 向左就不用反转画iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
       ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
       ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      while (!done)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             int timeNow = Sys_Milliseconds();iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             int delta = timeNow-lastTime;           // 计算自从上次行经这里到现在, iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             lastTime = timeNow;                         // 过了多少时间iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             timer += delta;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             if (timer>100)                   // 每0.1秒换到下一格动画iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             {iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    timer = 0;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    frame++;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                    if (frame>=3)iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
                           frame = 0;iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
             }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
        ...iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
        }iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      // 把现在的动画格画到屏幕iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
      DrawImageRect(rat, xMan, yMan, frame*100, 0, 100, 100, mirrored);
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
在这个函数中, 我也顺便加了把图像左右对调画的功能, 这样子, 一个游戏的角色, 就算有向左走同向右走的动画, 只要有一边的图, 另一边可以用函数对调画出, 很是方便:iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
大家用PSP的左右按钮, 可以控制老鼠左右移动!iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
iPVnek'l9{3/vHER`D:0}@ZK\b&本文来自:V电G玩S天K空Y
附带的执行包是1.50的 :) 自行编译, 要把rat.png放在记忆棒game02的目录内!

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】