求大型pspgba格式游戏下载 画面质量好的 最...

GBA游戏大全_GBA游戏合集_好玩的GBA游戏
GBA是任天堂推出的最成功的掌机之一,在其上诞生了许多经典的游戏,很多人都选择用电脑上的GBA模拟器来玩GBA游戏,9553GBA游戏大全给大家推荐好玩的GBA游戏,快来下载吧。
游戏大小:8.15MB游戏类型:角色扮演
【游戏简介】
《光明力量:黑暗龙的复活》是一款日式回合制角色扮演游戏。游戏在1991年MD版的基础上又加入了很多新要素。黑暗龙在上古被...
游戏大小:4.90MB游戏类型:模拟游戏
《淘金者》这款经典游戏对于曾经玩过红白机的朋友一定不会陌生吧。曾经是&爆破者&进化的。当初风靡一时的经典名作如今表现依然不俗。另外...
游戏大小:5.632MB游戏类型:模拟游戏
发行厂商:Nintendo游戏容量:256M游戏类型:小游戏合集类存档类型:Eeprom-64kbit游戏版本:日版美版中版游戏平台:GBA游戏原名:メイドイン...
游戏大小:5.22MB游戏类型:模拟游戏
英文名称:ElevatorActionOld&New游戏原名:エレベーターアクションOLD&NEW游戏语言:中文开发厂商:TaitoCorporation发行厂商:TaitoCorpo...
游戏大小:6.451MB游戏类型:模拟游戏
游戏名称:数码暴龙赛车游戏类型:模拟器游戏游戏语言:日文、英文游戏简介
《数码暴龙赛车》是一款以《数码宝贝》为主题的卡丁车赛车...
游戏大小:4.669MB游戏类型:模拟游戏
游戏名称:蜘蛛侠:米斯特里奥的威胁游戏类型:模拟器横轴动作游戏语言:中文游戏简介
《蜘蛛侠:米斯特里奥的威胁》是一款根据系列著...
游戏大小:4.403MB游戏类型:模拟经营
游戏名称:模拟城市2000游戏类型:模拟经营游戏语言:中文游戏环境:DOS游戏简介
《模拟城市2000》是在DOS下运行的一款模拟城市建设管...
游戏大小:5.724MB游戏类型:模拟游戏
【游戏封面】 【游戏简介】 《银河战士零点任务》(MetroidZeroMission)是老任掌机GBA上第二部《银河战士》相关作品。由于是系列初代的重...
游戏大小:7.45MB游戏类型:模拟游戏
游戏名称:BA模拟器-忍者神龟英文名称:TeenageMutantNinjaTurtles游戏类型:动作类游戏语言:中文&【游戏截图】&&
游戏大小:5.345MB游戏类型:模拟游戏
游戏名称:洛克人ZERO3英文名称:MegamanZero3游戏类型:模拟器游戏游戏语言:简体中文游戏介绍
《洛克人ZERO3》这是一款以获得各式各...
游戏大小:135MB游戏类型:模拟游戏
游戏名称:GBA经典游戏45合1游戏类型:合集类游戏版本:GBA 【游戏介绍】
模拟GBA游戏,这次将个人感觉不错的45款经典游戏推荐给大家...
游戏大小:2.734MB游戏类型:模拟游戏
游戏名称:魂斗罗:执念游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《魂斗罗:执念》是一款高节奏的横轴动作射击游戏,玩家将继...
游戏大小:9.359MB游戏类型:模拟游戏
游戏名称:GBA模拟器赤壁风云游戏类型:模拟器游戏游戏语言:简体中文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单;...
游戏大小:7.659MB游戏类型:模拟游戏
游戏名称:GBA模拟器萨尔达传说(塞尔达传说)缩小帽游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器萨尔达传说(塞尔达传说...
游戏大小:2.314MB游戏类型:模拟游戏
游戏名称:GBA模拟器艾列米克斯物语游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器艾列米克斯物语》是一款GBA动作冒险游...
游戏大小:1.699MB游戏类型:模拟游戏
游戏名称:GBA模拟器华容道2之滑到吐游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器华容道2之滑到吐》是一款GBA华容道游...
游戏大小:4.812MB游戏类型:模拟游戏
游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单;以保证游戏正常运行。游戏简介
《GBA模拟器仓鼠天堂》是一款GBA模...
游戏大小:6.471MB游戏类型:模拟游戏
游戏名称:超写真麻雀游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《超写真麻雀》是一款麻将游戏,但是呢是有剧情的,玩家作为主...
游戏大小:652MB游戏类型:模拟游戏
游戏名称:最终幻想5游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《最终幻想5》是一款经典日式奇幻风格的角色扮演模拟器游戏,游...
游戏大小:3.409MB游戏类型:模拟游戏
游戏名称:超级马里奥:耀奇岛游戏别名:超级马里奥兄弟:耀西岛游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《超级马里奥:耀奇...
游戏大小:3.307MB游戏类型:模拟游戏
游戏名称:闪灵二人组游戏类型:模拟器游戏游戏语言:中文游戏简介
《闪灵二人组》是一款根据同名动画制作的角色扮演类模拟器游戏,游...
游戏大小:2.314MB游戏类型:模拟游戏
【游戏简介】本游戏为模拟器游戏,进入游戏可能会提示错误,无需理会,直接点击确定。然后点击游戏窗口左上角的&文件&选择&打开&选择到...
游戏大小:5.478MB游戏类型:模拟游戏
游戏名称:超级街头霸王二代X:复苏游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《超级街头霸王二代X:复苏》是一款非常经典的横...
游戏大小:6.051MB游戏类型:模拟游戏
游戏名称:GBA模拟器口袋妖怪火红游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器口袋妖怪火红》是GB上的《口袋妖怪红绿...
游戏大小:14.6MB游戏类型:模拟游戏
游戏名称:人鱼之心出品公司:Nintendo游戏类型:娱乐类所属机种:中文GBA模拟器:VisualBoyAdvance 【游戏介绍】
人鱼之心是款经典...
游戏大小:1.617MB游戏类型:模拟游戏
游戏名称:GBA模拟器口袋妖怪绿游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器口袋妖怪绿》实际上与《GBA模拟器口袋妖怪...
游戏大小:6.38MB游戏类型:模拟游戏
游戏名称:口袋怪兽弹珠台-红宝石和蓝宝石出品公司:GameFreak游戏类型:娱乐类所属机种:中文GBA模拟器:VisualBoyAdvance 【游戏介绍】
游戏大小:1.607MB游戏类型:模拟游戏
游戏名称:GBA模拟器口袋妖怪蓝游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器口袋妖怪蓝》在原版的基础上新增加了宝石...
游戏大小:6.25MB游戏类型:模拟游戏
游戏名称:快打旋风ONE英文名称:FinalFightOne游戏类型:动作游戏发布时间:日 【游戏介绍】
这个是CAPCOM的著名横版...
游戏大小:1.904MB游戏类型:模拟游戏
游戏名称:GBA模拟器口袋妖怪银游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器口袋妖怪银》是《口袋妖怪心之金、魂之银...
游戏大小:1.884MB游戏类型:模拟游戏
游戏名称:GBA模拟器口袋妖怪黄游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器口袋妖怪黄》是第一世代《口袋妖怪》系列...
游戏大小:11.1MB游戏类型:模拟游戏
《口袋妖怪:漆黑的魅影》是《口袋妖怪》国内实力Hack版本,不明就里的朋友可以直接上百度&漆黑的魅影&吧了解情况,《口袋妖怪》系列一直...
游戏大小:8.5MB游戏类型:模拟游戏
游戏名称:游戏王:世锦赛2004游戏类型:模拟器游戏游戏语言:简体中文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单...
游戏大小:11.059MB游戏类型:模拟游戏
游戏名称:GBA模拟器真三国无双A游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器真三国无双A》是GBA上非常火爆的《真三国...
游戏大小:2.856MB游戏类型:模拟游戏
游戏名称:GBA模拟器神游之超级马力欧世界游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器神游之超级马力欧世界》是神游...
游戏大小:2.99MB游戏类型:模拟游戏
游戏名称:GBA模拟器神游之超级马力欧2游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器神游之超级马力欧2》是神游《超级...
游戏大小:8.01MB游戏类型:模拟游戏
游戏名称:GBA模拟器-VR网球游戏类型:体育竞技运行环境:GBA游戏大小:5M 【游戏介绍】
《VR网球》是SEGA的经典网球游戏,不但有出...
游戏大小:4.249MB游戏类型:模拟游戏
游戏名称:侏罗纪公园3:DNA因素游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《侏罗纪公园3:DNA因素》是一款根据著名好莱坞同名...
游戏大小:5MB游戏类型:模拟游戏
中文名称:恶魔城-晓月圆舞曲英文名称:CastlevaniaMinuetofDawn游戏类型:动作冒险游戏产地:日本发行商:Konami产品序列:AGB-A2CJ-JPN游戏类型...
游戏大小:5.345MB游戏类型:模拟游戏
游戏名称:四狂神战记外传沉默的遗迹游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《四狂神战记外传沉默的遗迹》是一款日式风格的...
游戏大小:5.7MB游戏类型:模拟游戏
中文名字:恶魔城:白夜协奏曲游戏类型:动作角色扮演类软件语言:中文、日文游戏简介
《恶魔城:白夜协奏曲》是一款2D动作角色扮演类模...
游戏大小:3.348MB游戏类型:模拟游戏
游戏名称:战国革命外传游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《战国革命外传》是一款以日本战国时代为故事背景日式神鬼风...
游戏大小:8.11MB游戏类型:模拟游戏
幽游白书:战略版是根据著名漫画《幽游白书》改编的同人回合制策略战略游戏,本身带有一定的角色扮演性质,所以分类比较复杂。
游戏大小:5.304MB游戏类型:模拟游戏
游戏名称:幽游白书灵界侦探游戏类型:模拟器游戏游戏语言:英文游戏简介
《幽游白书灵界侦探》是知名漫画《幽游白书》改编的同人动作...
游戏大小:1.341MB游戏类型:模拟游戏
游戏名称:幽游白书魔界最强列传游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《幽游白书魔界最强列传》是非常热血的知名同名漫画...
游戏大小:3.921MB游戏类型:模拟游戏
游戏名称:植木的法则:神器炸裂游戏类型:模拟器游戏游戏语言:中文游戏简介
《植木的法则:神器炸裂》是一款富有角色扮演元素的横轴...
游戏大小:4.823MB游戏类型:模拟游戏
游戏名称:育成足球游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《育成足球》是一款模拟球队经营的模拟经营类模拟器游戏。不知道...
游戏大小:10.1MB游戏类型:模拟游戏
一款经典的掌机游戏 GBA模拟器安装后选择目录下对应的《侠盗车手.gba》文件即可运行。
游戏大小:8.26MB游戏类型:模拟游戏
游戏名称:GBA模拟器-鬼太郎危机一发游戏类型:模拟器游戏地区:鬼太郎是漫画大师水木茂创作著名漫画人物,游戏中将遇到各种
游戏大小:6.45MB游戏类型:模拟游戏
游戏名称:GBA模拟器-鬼武者战略版游戏类型:模拟器游戏地区:美国语言:中文【游戏介绍】
《鬼武者战略版》的故事架构基于PS2原作。...
游戏大小:15.6MB游戏类型:模拟游戏
【游戏简介】
由于是GBA上恶魔城系列的第一作,所以画面相对比较粗糙一点,但是KONAMI把重点放在了游戏的新系统上面了,通过收集卡片...
游戏大小:13.158MB游戏类型:模拟游戏
游戏名称:地球冒险3(母亲3)游戏类型:模拟器游戏游戏语言:简体中文、日文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白...
游戏大小:3.747MB游戏类型:模拟游戏
游戏名称:妖怪守护者游戏类型:模拟器游戏游戏语言:简体中文、日文游戏简介
《妖怪守护者》是回合制角色扮演游戏,玩家将在开始的时...
游戏大小:4.413MB游戏类型:模拟游戏
游戏名称:瓦力欧寻宝记游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《瓦力欧寻宝记》是一款非常欢乐幽默搞笑的以瓦力欧为故事主...
游戏大小:4.997MB游戏类型:模拟游戏
游戏名称:皇家骑士团外传游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《皇家骑士团外传》是一款经典的回合制角色扮演游戏,游戏...
游戏大小:3.911MB游戏类型:模拟游戏
游戏名称:简单学英文游戏类型:模拟器游戏游戏语言:英文游戏简介
《简单学英文》是一款采用角色扮演方式进行游戏的英文教学娱乐游戏...
游戏大小:4.444MB游戏类型:模拟游戏
游戏名称:钻地小子A游戏类型:模拟器游戏游戏语言:简体中文游戏介绍
《钻地小子A》是一款非常经典非常幽默的传统模拟器游戏,一改以...
游戏大小:7.65MB游戏类型:角色扮演
哈利波特消失的密室
随着电影《哈利波特-消失的密室》的上映,GBA上又出了第2部&哈利波特&的游戏,哈利迷们又要高兴了。比起&哈利1...
游戏大小:6.3MB游戏类型:模拟游戏
《海贼王:棒球进行曲》是BANDAI公司制作的一款以人气漫画&海贼王&为题材的棒球游戏。   在这款游戏中,玩家将可以使用所熟悉的&海贼...
游戏大小:8.05MB游戏类型:模拟游戏
经典的战略角色扮演游戏!剧情充满波折,给你讲述骑士们的故事。
鉴于前两作的平庸表现,QUEST在本作里基本沿袭了《皇家骑士团2》...
游戏大小:5.59MB游戏类型:模拟游戏
魂斗罗异型战争EX
魂斗罗在GBA平台上推出的正统续作,游戏继承了FC时代的射击爽快感,画面也较为不错,超刺激的BOSS战更是分量十足,射...
游戏大小:318MB游戏类型:动作格斗
由原作游戏《大番长-BBA》改编的格斗类游戏,体现了游戏的格斗方面的内涵,制作精良华丽,人物技能十分漂亮,被称为2008年格斗游戏神作,但...
游戏大小:117.964MB游戏类型:动作格斗
游戏名称:初音洛克人游戏类型:横轴动作格斗、射击游戏语言:英文游戏介绍
《初音洛克人》初音洛克人下载是初音版的洛克人,开始看名字...
游戏大小:3KB游戏类型:模拟游戏
游戏名称:胜利11人世界足球游戏类型:模拟器游戏游戏语言:中文、英文游戏简介
《胜利11人世界足球》就是PC版同名足球类体育竞技游戏的...
游戏大小:5.816MB游戏类型:模拟游戏
英文名称:MonsterSummoner游戏原名:怪獸召喚师游戏类型:角色扮演类游戏语言:中文开发厂商:Nintendo发行厂商:Nintendo发售日期:2004-...
游戏大小:5.242MB游戏类型:模拟游戏
游戏名称:光明军团:黑暗龙复活游戏类型:角色扮演游戏语言:中文、日文、英文游戏简介
《光明军团:黑暗龙复活》是一款标准的日式奇幻...
游戏大小:6.174MB游戏类型:模拟游戏
游戏名称:世界传说召唤者之血统游戏类型:模拟器游戏游戏语言:简体中文、日文游戏简介
《世界传说召唤者之血统》是《幻想传说》的故...
游戏大小:4.976MB游戏类型:模拟游戏
游戏名称:奥特曼格斗游戏类型:模拟器游戏游戏语言:简体中文、英文游戏简介
《奥特曼格斗》是一款让奥特曼迷为之振奋的&奥特曼打怪...
游戏大小:3.829MB游戏类型:模拟游戏
游戏名称:魔法气泡大会战游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《魔法气泡大会战》是一款包含日式角色扮演元素的益智竞赛...
游戏大小:5.089MB游戏类型:模拟游戏
游戏名称:超级街头霸王方块Ⅱ游戏类型:模拟器经典消除游戏语言:中文游戏简介
《超级街头霸王方块Ⅱ》是一款以《超级街霸》人物设定...
游戏大小:7.546MB游戏类型:模拟游戏
【游戏简介】游戏运行说明:本游戏为模拟器游戏,进入游戏可能会提示错误,无需理会,直接点击确定。然后点击游戏窗口左上角的&文件&选择...
游戏大小:9.68MB游戏类型:模拟游戏
中文名称:火焰之纹章封印之剑游戏类型:GBA模拟游戏地区:美国语言:中文【游戏介绍】
《火焰之纹章封印之剑》是一款面向GBA平台的模拟...
游戏大小:3.891MB游戏类型:动作格斗
《舞之刃》是一款有别于传统的横版卷轴打斗过关游戏,你将操作游戏中五位妹纸中的任何一位,通过精准的操控配合音乐的节奏使出包含有冰...
游戏大小:3.686MB游戏类型:角色扮演
网球王子连载动画的GBA游戏版,主要以NPC对战方式进行,属于角色扮演类的动作游戏。本版游戏进度依据动画版剧情进行,让大家体验网球王...
游戏大小:10.2MB游戏类型:角色扮演
91年的圣剑传说首作改良版新约圣剑传说。男主角为一名在竞技场中与猛兽搏斗磨炼剑技的斗剑士;女主角则是引用由神秘力量而被邪教徒迫害的玛...
游戏大小:8.85MB游戏类型:角色扮演
携带电兽2是日本Smilesoft公司制作的游戏,它本身与《女神转生恶魔之子》,《口袋妖怪》《数码宝贝》并行的口袋系列,但与后三者不同的是它...
游戏大小:2.764MB游戏类型:模拟游戏
游戏名称:科纳米哇哇赛车游戏类型:模拟器游戏游戏语言:英文、日文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单以...
游戏大小:5.59MB游戏类型:益智解谜
小青蛙魔法过的大冒险是一款模拟器上的动作类解谜游戏,画面轻松明快,操作简单,作为休闲益智的游戏来说是不可多得的好作品。
游戏大小:14.2MB游戏类型:模拟游戏
【游戏简介】游戏运行说明:本游戏为模拟器游戏,进入游戏可能会提示错误,无需理会,直接点击确定。然后点击游戏窗口左上角的&文件&选择...
游戏大小:4.894MB游戏类型:模拟游戏
游戏名称:古墓丽影:预言游戏类型:模拟器游戏游戏语言:中文游戏简介
《古墓丽影:预言》是一款GBA上的劳拉探险游戏,至此劳拉的脚步已...
游戏大小:3.051MB游戏类型:模拟游戏
游戏名称:高校受验英熟语编游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《高校受验英熟语编》是一款英语趣味问答游戏,游戏包含多...
游戏大小:22.4MB游戏类型:模拟游戏
《超级大金刚2》是继&超级大金刚&成功搬上GBA平台大受好评后。本作除了继承了原作的所有版面外,附加了许多新的小游戏,如钓鱼,还可以通...
游戏大小:17.5MB游戏类型:模拟游戏
【游戏简介】《莉卡的时尚日记》一款GBA模拟类女性向的冒险游戏,玩家要扮演可爱莉卡娃娃,在游戏中解决各种化妆问题,此外还附带了很多小...
游戏大小:2.519MB游戏类型:模拟游戏
游戏名称:波利口袋游戏类型:模拟器游戏游戏语言:英文游戏简介
《波利口袋》是著名游戏运作商威望迪发行的由DICE加拿大分部制作的横...
游戏大小:5.775MB游戏类型:模拟游戏
游戏名称:波斯王子:时之沙游戏类型:模拟器游戏游戏语言:简体中文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单以...
游戏大小:8.181MB游戏类型:模拟游戏
游戏名称:冒险王比特:克星之路游戏类型:模拟器游戏游戏语言:日文游戏说明:
由于破解原因,游戏主程序会被报毒,请将其加入白名单以...
游戏大小:10.598MB游戏类型:模拟游戏
【游戏简介】游戏运行说明:本游戏为模拟器游戏,进入游戏可能会提示错误,无需理会,直接点击确定。然后点击游戏窗口左上角的&文件&选择...
游戏大小:10.4MB游戏类型:模拟游戏
《游戏王:双六的骰子》是根据大人气动慢作品《游戏王》改编的卡片游戏,游戏中玩家要收集各种各样的怪兽卡片,并利用这些卡片与对手战斗,...
游戏大小:4.229MB游戏类型:模拟游戏
游戏名称:GBA模拟器侏罗纪公园3游戏别名:GBA模拟器侏罗纪公园3:遗传因子游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟...
游戏大小:4.833MB游戏类型:模拟游戏
游戏名称:GBA模拟器洛克人EXE2游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器洛克人EXE2》是《洛克人》系列游戏的一个...
游戏大小:9.687MB游戏类型:模拟游戏
游戏名称:GBA模拟器洛克人ZERO4游戏类型:模拟器游戏游戏语言:简体中文游戏简介
《GBA模拟器洛克人ZERO4中文版》是《洛克人》游戏系...
游戏大小:4.198MB游戏类型:模拟游戏
中文名称:GBA模拟器-合金弹头游戏类型:模拟器游戏地区:美国语言:中文【游戏介绍】
《GBA模拟器-合金弹头》是一款过关射击题材的GBA模...
游戏大小:5.12MB游戏类型:模拟游戏
中文名称:皇家骑士团游戏类型:gba模拟器游戏地区:美国语言:英文【游戏介绍】
《皇家骑士团》是一款以骑士冒险为题材的gba模拟器游戏...
游戏大小:5.324MB游戏类型:模拟游戏
中文名称:极品飞车:卡本峡谷游戏类型:GBA模拟器游戏地区:美国语言:英文【游戏介绍】
《极品飞车:卡本峡谷》是一款以赛车竞速为题材...
游戏大小:27.648MB游戏类型:模拟游戏
中文名称:口袋妖怪合集英文名称:PoketMonster游戏类型:GBA模拟器游戏发行时间:2005年制作发行:任天堂地区:日本语言:中文【游戏介绍】
游戏大小:7.987MB游戏类型:模拟游戏
中文名称:真三国无双英文名称:ShinSangokuMusou游戏类型:GBA模拟器游戏地区:日本语言:中文【游戏介绍】
《真三国无双》是一款三国争...
游戏大小:5.724MB游戏类型:战争战略
游戏名称:恐龙世纪游戏类型:战争策略游戏语言:中文游戏简介
《恐龙世纪》是一款DOS下的战争策略游戏,玩家扮演古生物学家安妮,为解...
游戏大小:6.574MB游戏类型:模拟游戏
游戏名称:犬夜叉-奈落之圈套迷幻森林之请帖英文名称:Inuyasha-NarakunoWana!MayoinoMorinoShoutaijou游戏类型:模拟器游戏制作发行:Taka...
热门游戏合集制作游戏高手进阶——GBA游戏编程简介
GBA游戏编程菜鸟入门篇(一)——简介及开发工具
玩GBA游戏编程的时候,发现GBA编程不难。自己总结了一些心得,写成教程,贴在这里吧!
编程的时候发现,GBA编程涉及很多GBA硬件方面的知识,也和微机原理有着千丝万缕的联系。我前些日子曾经入门过GBA游戏汉化,当时不知道或者懵懂的东西,现在差不多都豁然开朗了。如果你有汉化游戏的欲望,又对微机原理略微了解一些,而苦于自己是菜鸟一直徘徊在汉化门口,那么你不妨看看我的教程,相信你会有所发现。如果你对游戏开发颇有兴趣,又略微学过一些C语言,希望看到自己在GBA上面的作品,而看到天书一般的汇编代码吓得六神无主,那么你也不妨看看我的教程,相信你会很快找回自信……
好,闲话少说,开始!
首先声明一下,本人水平很低,低到什么程度呢?我没有学过C语言;。如果我的教程中出现可笑的低级错误,请各位海涵……另外,也请编程达人多多指正,疯狂王帷在这里感谢各位!
许多人认为编程很难。没错!编程是很难。但是,所谓世上无难事,兴趣是最好的老师。只要你有兴趣,有持之以恒的决心,那么就不难。我在论坛上见到不少朋友非常喜欢玩游戏,也曾梦想着自己编写自己的游戏;但是看到涉足编程领域困难重重就一直在门口徘徊。如果你也和他们一样,那么请放下包袱,尝试着走进来;或许你会发现,编程领域也不是像你想象的那样……
关于在GBA上面编程,现在网上的达人们似乎都认为它要比在PC上面编程简单一些。我不持这样的观点。毕竟,在GBA上面编程,迄今为止还没有像VB、VC之类的所谓“所见即所得”的面向对象的开发工具;一切都要靠汇编和C语言……如果你接触过汇编或者C语言,那么,上手就很容易了!
好了,闲话少说,开始吧!由于我不知道大家对于计算机语言的了解情况,在这里,我就假定你是已经稍微接触过C语言,但是绝对没有深入研究过,大约也就只能写出“求三个数的最大值”之类的小程序;对于微机原理处于懵懂状态,能看得懂16进制,知道所谓“高字节数据存放在内存高地址,低字节数据存放在内存低地址”的菜鸟……门槛不高吧?
由于使用C语言要比使用汇编效率高,所以,在这里我建议大家使用C语言。我这里,也将以C语言来讲述。
工欲善其事,必先利其器。必要的工具,我们必须具备:
1.函数库:这里,我强烈推荐使用“GsLIB”。这是一种高效率的GBA函数库,作者是国内开发达人黄炎中。GsLIB将GBA的各种功能进行封装,形成标准库函数。使用的时候直接调用。现在可以下载到的版本有2.6
ARMSDT版本、2.6 GNUPRO版本和2.7 GNUPRO版本。在我的教程里面,使用2.6
ARMSDT版本。不同的版本有着一些细小的差异。GsLIB可以在黄炎中达人的主页直接下载到。完全免费!如果你打算以我的教程为指导,那么请下载2.6
ARMSDT版本。
2.开发环境和编译器:有两种编译器可以选择,就是ARMSDT和GNUPRO。其中,ARMSDT是ARM公司的商业软件,要想使用得要交钱的;而GNUPRO是免费软件,任何人都可以直接下载到。不过,GBA的CPU是ARM公司的产品,所以使用ARMSDT开发效率高。而GNUPRO据说是有BUG,开发效率也比ARMSDT低,生成的ROM体积也稍微大一些……无论如何,由于我们使用的GsLIB是ARMSDT版本,所以必须使用ARMSDT。但是这个软件,网上似乎很难下载到……我在这里也没法提供下载(软件安装包接近30M,附件方式放不上来)不过,最近我有发现D版的ARMSDT,是ARMSDT2.50版本,试用版,在这里如果只是当作GBA编译器的话可以正常使用。在搜索引擎里面找一下,应该可以找到吧……如果实在找不到,论坛的群里有共享。但是,群里的ARMSDT,有不能用的先例……(6lay大人:(阴沉着脸)你说谁?)
3.写程序的工具:既然是C语言,那么,在VC里面写就当然是最好!要是没有,你也完全可以在“记事本”或者“写字板”里面写代码,写完之后保存成后缀名为.c的文件。不过,这两个Windows自带的工具都有一些缺点,比如不能显示行号,不能自动缩进,函数名也不能彩色显示之类的。在这里我就要极力推荐Ultra
Edit了!这是个16进制编辑器,也可以用来写文本文件。它的功能之强大,你用了就知道了!这个软件,网上多得满天飞。估计你任意找个下载软件的网站都能下载到……
4.测试工具:写完程序,经过编译链接之后,生成的文件就是我们想要的ROM了。它的后缀名是.gba……这个,我不说你也知道用什么打开吧!在这里我要说明的是,VBA的版本不要太低,因为有些功能在低版本的VBA里面还没有开放。另外,记住要用英文版,中文版的话,和教程里面会出现不一致,你也许会不知所措。
5.调试工具:你写出来的ROM出现BUG甚至错误是必然的。调试是一项很关键的任务。这里需要一个强大的反汇编模拟器。我推荐的是No$GBA。这也是商业软件,据说正式版需要2000美元……但是我们可以很得意的找到破解版……在稍微大一点的模拟网站或论坛里面应该可以找得到。不过,据说现在在网上流传的No$GBA,声音没有破解,因此我们编译出来的ROM,用这个模拟器打开,如果有背景音乐的话会出现噪音。不过这也无所谓,菜鸟教程中声音方面基本不需要调试……就算是要调试,也可以在VBA里面调试……
6.组合精灵编辑器:这是GsLIB的辅助工具之一,不知为什么黄达人没有把它和函数库放在一起。你需要单独下载。下载地址也是。或者到TGB论坛去下载:
剩下的差不多就是辅助工具了……
1.PhotoShop:基本上PS就是为了处理图片的调色盘才被我加进去的。游戏中最常用的就是图片,而在GBA里面,我们需要关心图片的调色盘。PS可以很轻松的处理调色盘。……你不知道什么叫做调色盘?不急不急,用到的时候我自然会讲解!PhotoShop的下载地址不用我说吧?找不到的话去附近卖光盘的商店转转,100%有卖的!
2.ModPlug:如果你想要在你的游戏中加入背景音乐或者是真人语音,那么就少不了这个软件!GBA不能直接支持MID,虽然现在有个所谓的“MP2K”可以使GBA播放MID但非常不幸的是我们的编译器ARMSDT不支持MP2K!所以这条路就走不通了……幸运的是GBA支持MOD。什么是MOD?我也不知道……反正你就认为这是一种类似于MID的音乐格式就行了……到时候我会详细讲述如何用ModPlug制作MOD,如何在GBA上使用MOD的……这个软件也是外国人写的,界面是全英文,好像还没有汉化版,凑合用吧!下载地址我不说了,去搜索引擎里面搜索一下,一定会找到的。
需要的工具大概就这么多了。当然,系统自带的工具也是少不了的!“画图”、“计算器”之类的,随手就到!
那么,今天就到这里。从下次开始,我们就要正式进入编程。下次要讲的内容是:在GBA上面显示文字!理论课内容是“中断请求和响应”。
GBA游戏编程菜鸟入门篇(二)——中断请求及显示文字
嘿嘿……大家好!又见面了!上次教程中提到的必备工具,有没有准备好啊?有准备的,那就开始吧!
GBA的显示屏分辨率大家都知道吧!240*160。就是说,宽240像素,高160像素。
GBA上有6种显示模式,分别命名为MODE0到MODE5。这六种模式中,MODE0、1、2很相似,被称为TILE方式;MODE3、4、5也很相似,被称为位图方式。
什么叫做“TILE方式”呢?简单地说,GBA上面的图像,是用一块一块的小方块拼成的。这种小方块叫做“TILE”,大小是8像素*8像素。在MODE0至MODE2中显示图片,就以这种方式显示。你想不想直观的看一下什么是TILE?找一个规模稍微大一点的GBA汉化网站或论坛,搜索一下叫做“TLP”的软件。下载下来之后,用它打开任意一个GBA的ROM。注意必须是GBA的ROM,也就是说不要压缩。打开之后,你会看到一大片花花绿绿的什么东西。这些花花绿绿的东西,被网格分开。其中每一小格都是8*8像素。这一个小格,就是一个TILE。
那么“位图方式”就很简单了。就是所谓的“点阵图像”。MODE3至MODE5下面以这种方式显示图像。
但是MODE4和MODE5还和MODE3有点不同……MODE4和MODE5采用了一种叫做“双缓冲”技术,使得显示高速的图像不会出现闪烁。双缓冲,形象地说,就像两张叠在一起的图片,上面那张你能看的到,下面那张被上面的挡住看不到。当你看到了上面那张之后,下面那张翻上来,上面那张翻到下面换成另一张图片。这样你就看到了刚才在下面现在又翻到了上面的那张图片。然后再将这张图片翻到下面,把那张换过的图片再翻上来,同时再将翻下去的换图片……反正就像这绕口令一样,看到上面的图片的同时将下面的图片更新,然后翻转,使你能看到下面那张图片;你看到翻上来的图片的同时更新下面的图片……再翻转……
那么,在哪种方式下可以显示文字呢?哪种都可以!但是,不同的方式下显示文字的函数有点不同。我们先试着写个GBA的DEMO来显示文字。
在哪种方式下显示呢?TILE吧。游戏经常用这种模式显示文字。
所有的软件安装好了吗?还没有?得得的!我来!
首先安装UltraEdit。方便起见简称UE。UE是准绿色软件,双击安装文件,你随意设置安装路径。安装完之后桌面上就有快捷方式了。如果你下载的版本是试用版,去网上找注册码,或者掏腰包注册。两种途径随你选择。
然后安装ARMSDT。双击setup.exe进行安装,自己随意选择路径,然后你可能会看到下面这个对话框。
全都不选。点击Next。然后可能会弹出一个错误对话框。
不要管它,继续。(这个对话框在有的系统上不会出现。系统是WinXP的时候不会弹出来,但Win2000会弹出来。不过这也不是绝对的,我同学的电脑,XP系统,也会弹出来……反正就是,管它弹出还是不弹出,继续就行了……)
然后小等一下就搞定了。安装结束的时候可能会询问你是否要建立快捷方式,不要!建立了也没用!ARMSDT仅仅是一个编译器,除了编译我们用不着它的其他任何功能!这里我假设你是把ARMSDT安装到了D:\\ARMSDT文件夹下面。安装正确的话,文件夹下面会出现文件夹“BIN”、“LIB”、“INCLUDE”、“TEMPLATE”和文件“DeIsL1.isu”、“MFC42.DLL”、“MSVCRT.DLL”、“README.TXT”、“UNINST.DLL”。
然后就是函数库GsLIB了。这是绿色软件,解压缩到任意文件夹。这里我假设你是把GsLIB解压缩到了D:\\GsLIB文件夹下面。解压正确的话,文件夹下面会出现文件夹“DOC”、“INCLUDE”、“LIB”、“SAMPLES”、“SYSTEM”、“TOOLS”和文件“cgo.exe”“gsgo.bat”。
这里我有必要解释一下GsLIB的这些文件和文件夹:
首先是DOC文件夹。里面是GsLIB的帮助文件。非常详细!唯一有点缺憾的是解释的不是很明白。无论如何,这里是学习GsLIB的天堂。以后在我的教程里面,如果出现了你没有见过的函数,就到这里面找吧。
再者是Include文件夹。里面是库函数。如果你打算看更低层的东西例如寄存器和内存单元的分配以及命名,那么这里面或许有你想要找的。
然后是Lib文件夹。我不知道这里面的那个文件有什么用……
SAMPLES文件夹!这是最令人激动的文件夹。里面有不少的例子,基本上都很简单!你一定要看!以后我们写程序,就在这个文件夹里面写。
SYSTEM文件夹。这是GsLIB的系统文件夹,我们会用得到的。
Tools文件夹。这里面是开发游戏的时候,有可能用得到的工具。
然后是文件:cgo.exe。这个文件不用管它。
Gsgo.bat。批处理文件。相当重要的文件!你马上就知道,编译程序的时候,就靠它了。
行了,继续!
模拟器们,都是绿色软件,随你安装吧!
那几个辅助工具,我就不讲解了。想必你们都会了!
哦!差点忘了!你有下载“组合精灵编辑器”吧!这是GsLIB的专用工具,将它解压缩到GsLIB\\Tools文件夹里面。
先进入GsLIB\\system文件夹,复制“makefile”文件。
然后退出来进入GsLIB\\samples文件夹,新建一个文件夹。假设你建立的文件夹叫做“Temp”。
进入Temp文件夹,粘贴,这个时候刚才复制的“makefile”就粘贴到了这里。
再新建一个文本文件,取名叫“main.c”。记住后缀名必须是“.c”!这个时候文本文件的图标会变成UE图标的样子。双击,UE自动将这个文件打开了。
然后,开始写代码吧!
从现在开始,我会详细解释所有的代码。里面涉及的函数,在GsLIB\\DOC文件夹里面的帮助文件里有详细的说明。
&GsGBA.h&//这是载入GsLIB函数库。以后你写的所有程序,第一句必须加上这个包含。
&GsText.h&//要想显示文字,必须载入字库。以后你写的程序如果有需要显示汉字,记住加上这个包含。
const IntrFuncp IntrTable[14]=
& &dummy,dummy,dummy,dummy,
& &dummy,dummy,dummy,dummy,
& &dummy,dummy,dummy,dummy,
& &dummy,dummy
};//这是中断向量表。下面我会简单讲解中断,现在你就记住要这样写就行了。
int AgbMain()//主函数。注意这和标准C不一样!标准C中主函数是Main();,而这里是AgbMain();。
&&GsSetMode(
MODE_0);//设置模式函数。这里将模式设置为MODE0,TILE模式。
&&BGPaletteMem[1]=0//这是设置调色盘。BGPaletteMem[
]可以看作是一个数组。这句就是说,将16进制数0xffff写入数组BGPaletteMem的第1号元素中。以后,调色盘中中的第1号颜色就是它了。
&&GsInitBG();//初始化BG。这是一个很重要的函数。只要在TILE模式下,就要涉及一个“BG”问题。只要使用BG,则必须在使用之前初始化BG。关于BG的详细内容,下一次的教程《GBA游戏编程菜鸟入门篇3——TILE模式及显示图片》中我将以大篇幅详细讲解;再下一次的教程《GBA游戏编程菜鸟入门篇4——多层BG及TILE模式下的多层BG》我将以更大篇幅讲解。现在,可以说,掌握了BG,就掌握了GBA游戏编程的三分之一……
&&GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,0,21,0);//设置BG。如果想对BG进行什么操作的话,则必须在初始化BG之后对其进行设置。根据帮助文件,可以得知这是设置BG0,大小是256*256,TEXT属性,16色,TILE数据在第0号区域,MAP数据在第21号区域,不允许马赛克特效。现在你或许对这些参数为什么要这样设置感到疑惑,不过,下一次的教程你就明白了。如果下一次的教程你还没明白,那么再下一次的教程你就能明白。再次强调,BG是很重要的,掌握了BG,就掌握了GBA编程的三分之一……熟练运用BG,你就可以自由自在地在GBA上操纵图片显示。
&&GsTileTextInit(0,3,21,0);//初始化文字显示。如果你想在GBA的某个BG上显示文字,则必须对该BG进行初始化文字显示。根据帮助文件,这是将BG0进行初始化,MAP数据在第21号区域,使用第0组调色盘。
&&GsSetBgState(0,ON);
&&GsSetBgState(1,OFF);
&&GsSetBgState(2,OFF);
&&GsSetBgState(3,OFF);//打开BG0,关闭BG1~3。在MODE0模式下,BG有4层。在这里我们只用到了BG0,并用于显示文字。所以,将BG0打开,其他BG,关闭就行了。
&&GsTileTextOut(20,40,"我爱TGB,我爱烧录地带!",1);//显示文字啦!这就是传说中的显示文字的函数。根据帮助文件,这是在GBA屏幕上的(20,40)坐标处开始显示“我爱TGB,我爱烧录地带!”这几个字,颜色是调色盘中第1号颜色。在程序的开始,我们已经定义了调色盘中的第一号元素是0xffff,这里就使用这种颜色。
while(1)//开始循环。
GsWaitSync();//等待同步。这是什么意思呢?就是说等待发生VBLANK中断。每当GBA显示完成一幅图片之后,就发生一次VBLANK中断。也就是说,当发生中断之后,屏幕上的图片已经显示完了。
}//GBA的ROM就是一个永不停止的循环,在这里进行循环,就是显示完文字之后,等待同步。一旦等到了同步,文字也显示完了。于是屏幕上就在坐标(20,40)处显示出了“我爱TGB,我爱烧录地带!”这几个字。颜色为0xffff,就是白色。
return 0;//函数值返回主函数。由于主函数是int类型而不是void类型,所以会有返回值。
就这样,写完了。保存。很难吗?去掉那些注释看看,很简单!
程序写完了,编译。
退到GsLIB文件夹下面,双击gsgo.bat文件。这个时候会弹出来一个DOS窗口。
键入“cd samples\\Temp”回车,进入你新建的那个文件夹。
然后键入“make”。make在这里是编译的意思。一点回车,窗口立即向下刷屏。
这就说明编译链接成功。注意看下面有句话“ARM Linker:finished, 0 informational, 1 warning
and 0 error
messages.”这里标明了你的程序里面的警告错误。这个时候再进入GsLIB\\samples\\Temp文件夹看看,是不是多了几个文件?其中有个叫做“main.bin”的文件,那就是ROM啦!把它的后缀名改成.gba,然后用VBA打开看看吧!
至于“ARM Linker:finished, 0 informational, 1 warning and 0 error
messages.”这句话,我们需要关心那个warning和error。如果出现的是“1 warning and 0 error
messages”,就是说一个警告,没有错误。这一个警告是什么呢?你看看多出来的文件里面,是不是有一个“log.txt”呢?这就是记录warning的文件。打开看看,大意就是在Windows环境下,生成的文件未必能正常运行。这是当然的啦!GBA的ROM是运行在GBA平台的……又不是Windows平台!而模拟器,只是在Windows平台上模拟了一个GBA平台而已……如果出现的warning不止一个,那就说明你的程序里面有未定义的函数什么的,编译没通过……而要是出现error,那就说明程序有错误,无法编译了!这两种情况一旦出现,仔细检查程序,改正遗漏错误什么的……
我刚才说到make这个命令。这个命令在DOS里面是没有的,只有你安装了ARMSDT,make命令才可以使用。在这里make是用来编译程序,生成ROM的。还有两个命令,我也有必要说一下:就是make
clean和make vba这两个命令。make
clean是清除所有文件,包括ROM,但是保留程序文件main.c。当你的程序里面有新添加资源的时候,编译之前最好用这个命令清除一下然后再编译;因为有时候程序有添加新资源但是其他一些编译产生的中间文件比如o文件、s文件什么的还是保持没有添加资源的状态,这个时候编译出来的ROM会出错。make
vba,就是编译完成之后立即调用VBA载入ROM察看。不过遗憾的是它调用的VBA是SDL版本,这个版本没有图形界面,很难操作,不推荐使用。
最后,该讲解中断了。
中断是CPU为了协调外设和它之间速度和反应的差异才设立的。CPU的运行速率非常高,相比之下外设就相当慢了。假如CPU想访问键盘,而这个时候你并没有按键,难道CPU就一直等着你按键吗?当然不会这样!这个时候CPU继续它的工作,当你有按键的时候,键盘向CPU发出按键中断请求,也就是请求CPU中断程序,处理你按下的按键。当CPU收到键盘的中断申请时,暂停程序,转去处理键盘。处理完键盘之后,CPU再回到刚才中断的程序处,继续运行……
GBA的部件中,能发出中断的部件很多,那么,这么多中断,CPU怎么判断到底是谁发出的中断请求呢?中断向量表!中断向量表中有14个中断可以受到你的控制。这14个中断,依次是:
VBLANK中断、HBLANK中断、VCOUNTER中断、TIMER0中断、TIMER1中断、TIMER2中断、TIMER3中断、串行通信(Serial
Communicating)中断、DMA0中断、DMA1中断、DMA2中断、DMA3中断、按键(Key)中断还有卡带(Cartrage)中断。
这14个中断中,常用的只有两个:VBLANK中断和DMA0中断。你会看到以后我的程序中只用一个VBLANK中断就完全够了。关于DMA0中断我一般不用,估计只会在讲DMA的时候才会用到吧……
怎么使用中断呢?如果你的程序很简单,不需要中断,那么就像上面写的一样,14个中断全部填“dummy”空函数,或者干脆不填,留个分号在那里就行;如果你想让程序响应VBLANK中断,那就在中断向量表中VBLANK的位置替换成你的中断服务子程序。具体怎样做呢?下次我就给出讲解和例子!下次要讲的内容:在GBA上显示图片!理论课内容是TILE模式详解。下一次的教程中,我们就详细看看TILE模式,并对BG进行初步解释。一般的GBA游戏中,TILE模式下的MODE0是最常用的。学好了TILE模式,或者说,学好了MODE0的使用,你基本上就可以自由操纵GBA了。位图模式,相信你可以独立学习……
GBA游戏编程菜鸟入门篇(三)——TILE模式及显示图片
今天我们来看一下GBA怎么显示图片。
还记得TILE模式吧!GBA有两种显示模式——TILE模式和位图模式。其中MODE0、1、2属于TILE模式,MODE3、4、5属于位图模式。
那么,一幅图,或者精确地说,位图,包含哪些数据呢?TILE、MAP、PALETTE。
TILE:就是前面曾经说过的,8*8像素的小方块。整张图片就是由这样一块一块的方块拼成的。
MAP:一块一块的小方块拼成了图片,那么,哪块小方块在图片的什么位置,怎么确定呢?MAP数据就用来确定TILE在整张图片中的坐标。还包括其他一些数据这里我暂时不做涉及。
PALETTE:调色盘。就是图片中所有用到的颜色。GBA支持的调色盘有3种:16色(4位)、256色(8位)和32768色(15位)。可见,对于真彩的24位位图(1600多万色),GBA是不支持的。不过,对于人类来说,恐怕没有谁能分辨出来32768色和24位色的区别吧!所以,支持这三种调色盘,可以说足够了。
那么,你就会明白了,一张256*256像素的图片,包含(256/8)*(256/8)=1024个TILE。这1024个TILE,形成了一个TILE数组。
那么,确定了图片的三个重要数据,GBA怎么显示这张图片呢?图层的概念你听说过吧!为了使图像富有立体感,GBA上面应用了图层的技术。你在GBA上面看到的图片,那就是图层叠加技术产生的效果。比如下面这张图:
它是怎么做出来的呢?它是由下面这几个图层叠加出来的!
假如我规定,在这里黑色是透明色,就是说如果图片中有某部分是黑色,那么在GBA上这部分就呈现透明状态不显示。这样的话将这几幅图叠在一起,显示出来的就是上面那幅图。当然,叠加是有顺序的。从上面那张完整的图中能看出来,“口袋怪兽”这一层应该是最上层,因为它下面的几层被它覆盖了一部分。烈空座这层应该是最底层,因为它似乎哪层都没能覆盖……
(众人:你等等!)雷精灵:有什么疑问吗?(众人:你截的图是不是少了一幅啊?那“绿宝石”“PUSH START
BUTTON”和公司版权那几个字,属于哪一层?)
雷精灵:我正要解释这个问题:那几个字,不是图层。它们是“精灵”。它们处于图层的最上方。有关精灵这部分,以后我会详细讲解。精灵的出现,堪称游戏中的一大革命。掌握了这部分,你就能作出很漂亮的动画效果了!
GBA有几个图层可用呢?4个。分别被称为BG0、BG1、BG2和BG3。这4个图层,GBA本身并没有规定谁是高层谁是底层,而是完全由你规定。每一个图层,你都可以随意操纵,例如图层面积、使用的调色盘、特效设置等等。
有了图层的概念,那么下面的就很容易理解了。
TILE方式下,你知道,有三种模式。游戏中最常用的是MODE0,因此我重点说明MODE0。其他几个MODE,因为都是TILE方式,大同小异你自己完全可以理解!
MODE0,具体是什么样的呢?
MODE0由4个非旋转(TEXT)图层组成。是普通游戏里用的最多的模式。硬件上支持的大小有这么几种:256*256、256*512、512*256和512*512。你会发现这几种大小都超过了GBA的显示区域。惊讶?别,GBA硬件最大支持大小的图片;而在GsLIB的支持下,理论上可以支持无限大的图片。要这么大的BG有什么用?一般的RPG里面的地图,不会就只有一个GBA屏幕那么大吧!这个时候GBA通过滚动BG来显示整张图片。这种技术叫做“卷轴”。
MODE0支持两种调色盘:16色(4位)和256色(8位)。也就是说,MODE0下面的这4个图层,可以都是16色的,也可以都是256色的,也可以是既有16色也有256色的。
MODE0不支持图层旋转。旋转,不用多解释吧!你要是想做出图层旋转特效,不要使用MODE0。具体一些……《马里奥赛车》玩过吧!杯赛刚开始的时候,伴随着背景音乐,画面由远拉近,同时镜头由正对选手们的方向转向背对选手们的方向。那些选手是“精灵”我们暂时不讨论;背景,那就是“旋转”!不过,这个“旋转”,还不是真正的图层旋转,这实际上是传说中的“MODE7”。关于这方面的技术我也不是很了解……现在我们先放一下,继续回到MODE0。
嗯……就这么多啦。其他几种MODE,我给个表格比较。
明白了这些理论,下面这个程序你就不难理解了。我们现在就写个在MODE0下显示图片的DEMO。这一次,我们将让CPU能够响应键盘操作。什么效果呢?还记得MODE0下面BG的大小均超过GBA屏幕大小吗?我们在键盘上按方向键,对BG进行卷轴。
和上次一样,首先,在GsLIB\\samples\\文件夹下面新建一个文件夹;把GsLIB\\system文件夹里面的“makefile”复制到新文件夹里面;新建一个叫做“main.c”的文本文件,用UE打开……准备工作就完成了。我这里还是假设你新建的文件夹叫做temp。
让GBA显示什么图片呢?新建一个位图,起名叫“BG.bmp”,然后用Windows的“画图”打开,将图片的大小设置成256*256像素,然后你随便画点什么。保存。
然后用PS将这个位图转成16色的。
(众人:你等等!)雷精灵:有什么疑问吗?(众人:转成16色?为什么要转成16色?)雷精灵:还记得MODE0支持的两种调色盘吗?这次我们让GBA在MODE0下面显示16色位图。(众人:那么,假如说我的位图颜色很丰富,转成16色岂不就会掉色很严重?)
雷精灵:没错!16色对于高画质的的图片的确很不适合,因为颜色太少,会使画质严重下降。这个时候你就用256色。但是256色依然是颜色太少,如果你对画质要求非常高,比如是想做CG特写之类的,那MODE0就无能为力了。这个时候你就用位图方式下的MODE3吧!不过,256色一般情况下也应该足够了。你可以用PS将一个真彩的位图转成15位位图另存,然后再转成8位位图另存,你会发现不仔细看基本上也没多少差别……更何况是在GBA的屏幕上,也不怎么能看得出来……
好,图片准备好了。这张位图,大小是256*256像素,颜色为16色。格式为bmp。
但是GBA并不能直接识别位图,我们需要把位图转成三种数据——TILE数据、MAP数据和PALETTE数据。
双击GsLIB文件夹下的“gsgo.bat”,弹出DOS窗口,键入“cd
samples\\temp”,进入你新建的那个文件夹。(众人:还没写程序编译干什么?)雷精灵:谁说要编译了?
键入下面的命令:“gfx2gba -fsrc -c16 -t8 -mm -pBG.pal
BG.bmp”,点回车之后,文件夹下面多出三个文件来,分别是“BG.pal.c”“BG.map.c”和“BG.raw.c”。这几个文件,想必你一眼就能看出来是什么吧!还不知道?用UE打开这些文件,你就完全明白了。
(众人:那个命令是干什么的?)雷精灵:gfx2gba,这是GBA用的一个工具。它可以将一张位图转化成位图的三个数据,并保存成C语言数组。关于这个工具的详细介绍,GsLIB的帮助文件里面有很详细的说明。不过,请注意一下,这次我们转化的图片,大小是256*256的。这不是凭空规定的,也不是因为MODE0下面的BG支持的那四种大小规定的,而是下面我们使用的传递MAP数据的函数决定的。关于这个问题,我想留到下一次《GBA游戏编程菜鸟入门篇4——多层BG及TILE模式下的多层BG》的时候再讲。
然后写程序了。
&GsGBA.h&//不用多解释了吧?由于这次用不着显示文字,所以就不用包含&GsText.h&了。
#include "BG.map.c"
#include "BG.raw.c"
#include "BG.pal.c"//这三个包含,就是把你那张位图的所有数据包含到程序里了。
//这里定义了两个变量。这两个变量是后面对BG进行卷轴操作的偏移量。
void Vblank();//在这里先声明一下VBLANK中断服务程序
const IntrFuncp IntrTable[14]={
Vblank,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy
};//注意看这个中断向量表。VBLANK的中断位置,被一个函数Vblank所占用。这个时候,假如CPU响应中断的话,每当VBLANK中断到来,都会去执行一次Vblank函数。
int AgbMain()//主函数了
&&GsOpenIRQ();//这是初始化所有中断,并打开开VBlank中断,
Key中断,DMA0 ,DMA1 ,DMA2 ,DMA3中断请求。以后如果出现这些中断,CPU就可以响应。
&&GsSetMode(MODE_0);//这是设置模式。这次使用MODE0来显示图片。
&&GsInitBG();//初始化BG。只要是使用MAP,必须初始化BG。
&&GsLoadBgPal16(BG_Palette,0);//装载图片的调色盘到GBA的调色盘内存的0号区域。在MODE0下面GBA的调色盘最大为256色。这256色调色盘,又可以分成16组,每组16色。这次使用的,就是这256色调色盘中的第一组,也就是调色盘0号区域。根据前面的表格,在MODE0下面,调色盘可以是1个256色的调色盘,或者是16个16色的调色盘。由于我们的图片是16色的,因此就用那16个16色的调色盘中的第一个就行了。关于调色盘,下次教程我会详细解释!
&&GsLoadBgMap(BG_Map,sizeof(BG_Map),31);//装载图片的MAP数据到Char
Base第31号区域。GBA图像内存,除去调色盘内存和OAM内存(这个OAM内存你现在暂时不要管它)被划分为4个块,共32个区域,也就是每个块有8个区域。
这每一个块,被称为一个Char Base。
&&GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),0);//装载图片的TILE数据到第0号Char
&&GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,0,31,0);//设置BG。我们将使用BG0来显示图片。这个BG,是TEXT属性,大小是256*256,颜色是16色,其中MAP数据在BG的31号区域,TILE数据在BG的第0号Char
Base,禁止该BG的马赛克特效。
&&GsBgPriority(0,0);//设置BG的优先级。BG0优先级最高。也就是,处于所有BG的上层。
&&GsSetBgState(0,ON);//设置BG状态。将BG0打开。由于GBA默认所有BG在初始化之后都是打开状态,所以这一步要不要无所谓。
&&while(1)
&&GsWaitSync();//等待同步。
&&return 0;//返回。
void Vblank()//VBLANK中断服务。每当中断到来的时候都会执行这个函数。
&&KeyRead();//读键盘函数。这个函数会得到你所按下的按键。
&&if (Cont &
L_KEY)x--;//如果检测到键盘左键连续按下,则变量x自减。
&&if (Cont &
R_KEY)x++;//不用解释了吧?
&&if (Cont &
U_KEY)y-- ;
&&if (Cont &
D_KEY)y++ ;
&&GsBgOffset(0,x,y);//对BG进行卷轴操作。
行了,程序完成。编译吧。
能够看到,屏幕上出现了你的图片,按下键盘的方向键,图片就开始卷轴。
我们来分析一下程序的运行状况:首先GBA打开了中断。从此以后,只要有中断产生,GBA就可以响应了。然后GBA将图片的所有数据装载到内存里。再然后,GBA设置BG0,并使图片在BG0上显示。再然后,程序进入死循环,每循环一次,等待一次同步,而每等待一次同步,图片就显示一次。于是GBA屏幕上就连续不断的显示出了那张图片。然后,假设VBLANK中断发生了。这个时候GBA执行中断服务。首先查询键盘。如果这个时候你没有按键,那么两个变量就没有变化。卷轴偏移为0,也就是不偏移。中断完成之后GBA又回到死循环里,继续显示图片。假如又发生了一次中断,而恰巧这个时候你有按键,于是GBA检测到按键,并得到你按下的按键值。假如是左键,那么x变量自减,于是图片向左偏移一个像素。连续按键,于是图片就连续卷轴……卷轴完成之后,GBA又回到死循环,继续显示图片……
OK!这个图片是正常显示了,而我们也可以对它进行键盘操作了。希望你能明白这个程序。下次的教程,我们来看一下多层BG共存;就像上面那张口袋妖怪绿宝石的标题画面一样。掌握了多层BG技术,你可以做出非常漂亮的游戏标题!还有,你有玩过《逆转裁判》吧!对那种图层结构组成感觉如何?下次的教程,我就教你“屏幕上一个漂亮的背景图层+屏幕下方的对话框+对话框里面的文字”,也就是,三个BG同时使用!这三个BG中,一个图层是用来显示256色背景图片的;另一个图层是16色对话框的;还有一个是用来显示文字的……下次的内容:多层BG!理论课内容:TILE模式下的多层BG。另外,下次将要涉及程序调试;这是一个很令人惊讶和振奋的工作,因为你能看到以前屏幕上乱七八糟的突然间就显示出一幅美丽的图片……别忘了准备好你的模拟器们!
GBA游戏编程菜鸟入门篇(四)——多层BG及TILE模式下的多层BG
废话少说,开始今天的教程。为了方便说明多层BG这个概念,顺利操作多层BG,我们这次改变一下学习顺序……
首先打开上次你编译好的ROM,就是那个显示一张图片的ROM。
然后菜单-Tools-Map Viewer,这个时候出现了一个窗口。
这个窗口,可谓调试游戏的巨大帮手之一。我们仔细看一下,这个窗口有什么作用。
首先,左上角的“Frame”框架:这个框架是灰化状态,就是说,当前不可用。那么这个框架到底有什么用呢?还记得位图模式吗?还记得“双缓冲”吗?没错!这里直接反映双缓冲!Frame0,就是双缓冲的上层;Frame1,当然就是下层。在我们这个程序里面,使用的是TILE模式,不存在双缓冲,当然这个框架是灰化状态……
紧挨着它下面的“Background”框架:这就是所谓“BG”了!我们知道,在位图模式下不存在BG的概念,只有TILE模式下有BG。而MODE0下面可用的BG有4层,分别是BG0到BG3。这里就直接反映出了这4层BG。在我们这个程序里面,是使用了BG0用来显示图片,所以BG0有图片。你切换到BG1到BG3看看,都是“空白”吧!
在下面两个复选框:分别是拉伸和自动更新。一般,拉伸选项没有很大的作用。不过,那个自动更新,确实有一定作用!在以后的程序里面,可以很方便的跟踪BG。到时候,我们会涉及的……
再下面,是一个TILE。当你的鼠标点击右边的BG预览窗口的时候,这里就放大鼠标点到的TILE。一般来说,作用不大。
最重要的,就是中间那几个数据了!
MODE:直接反映程序当前使用的MODE。我们这个程序使用MODE0,所以……
MAP:这是图片MAP数据存放地址。根据我们这个程序,可以知道MAP数据存放在第31号区域,它的地址就是0x。关于这个16进制数到底怎么和区域号换算,一会儿你就会很直观地看到了!
CHAR:毫无疑问了,这是TILE数据的存放地址。我们的程序里面,使用第0块Char
Base来存放TILE数据。它的地址是0x。同样,这个16进制数也和Char
Base有换算关系。一会儿你也会很直观地看到。
SIZE:大小。程序里面设置BG的时候,规定BG是“Gs_BG_TEXT_SIZE_256x256”,所以这里显示256*256。
COLOR:颜色。16色一点不错!程序里就是这样设置的。
PRIORITY:优先级。优先级从0到3依次降低,就是说优先级为0的话,可以遮挡其他优先级的BG。程序里面就是这样设定的。
MOSAIC:马赛克。如果你设置BG的时候,允许该层BG使用马赛克特效,那么这里就会出现“1”。我们的程序里面不允许马赛克特效,所以这里显示为0。关于马赛克,我先说两句:马赛克属于BG的一种特效。GBA硬件支持4种特效,分别是马赛克特效、透明特效(ALPHA特效)、窗口特效和FADE特效。完全学会TILE模式之后,你就可以初步控制BG了。这个时候,来点锦上添花的特效那是再好不过的了!到我讲完TILE模式和多层BG的时候,我们就深入特效……
OVERFLOW:溢出。这个数据,我到现在还不知道它有什么用……请达人不吝赐教!
再往下三个数据,当你的鼠标点击右边的BG预览窗口的时候,左下方出现TILE的放大图的时候,这里显示这个TILE的详细数据。由于我们有一个更强大的反汇编模拟器,而那个模拟器在这方面的功能实在是强大,所以我一般忽略这里……
最后,那个小黑窗口……装饰吧……?
嗯……差不多了,MapView窗口就这么多东西。然后是Tools-Tile Viewer。
这是察看TILE数据的天堂。我们继续。
Color框架:我不用解释吧?如果你的图片是16色,那么选中“16”;如果是256色的,就选中“256”。选错了,右边的窗口预览就乱得不像样。
(众人:那么,32768色呢?)雷精灵:哼哼……TILE模式下会出现15位色吗?(众人:谁说TILE模式了?位图的MODE3、MODE5不就支持15位色吗?)雷精灵:位图模式下这个框架就会灰化……
CHAR BASE:这是最需要关注的!你会看到,这里有五个单选框,实际上,前4个代表了BG的4个Char
Base,最后一个是精灵RAM,又称OAM。现在,我们需要重点关注前4个。
在我们的程序里面有关TILE数据地函数是这样设置的:GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),0);GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,0,31,0);。可以看出,TILE数据被保存在显存第0块Char
Bsae。因此,选中最上面的“0x6000000”,右边的预览窗口出现了图片。不过,图片是支离破碎的。至于我们它为什么会这样先不管。
现在你修改这两个函数成这样:GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),1);GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,1,31,0);。明显,这次是使用第1块来存放TILE数据。这个时候编译出来的ROM,选中第一个0x6000000”时,图片出现在窗口下方,而选中下面一个“0x6004000”,图片像没修改的时候一样出现了。
这个时候,你选中“0x6000000”,用鼠标点击一下图片的第一个TILE,中间的“ADDRESS”数据出现了“0x6004000”!看到了吗?这就是第1块的地址啊!
综上所述,程序使用哪个块存放TILE,你就选中哪个单选框。于是支离破碎的图片就显示在右边的预览窗口中。并且是顶头显示。如果你选中的是别的单选框,要么图片不显示,要么TILE数据上面出现了“空白”……
于是,有人就试着使用第3块了。察看的时候,预览窗口出现了这样的景象。
预览窗口最下面出现了一些奇怪的竖道……这是什么?切换成256色,还是那样。“0x6010000”里面呢?黑的……
(众人:雷精灵!这是什么?)雷精灵:这是MAP数据!
看看程序,MAP数据是存放在第31号区域的。我前面说过,一个块,可以分成8个区域。那么BG可用的是4个块,分别为0到3块;那么就有32个区域,分别为0到31号区域。所以,在第3块的最低层,那里就是第31个区域,MAP数据就在这里面呢……
MAP数据的存放位置是受你控制的,因此可以存放在任意一个区域中,只要是不和TILE数据冲突就行!
(众人:那么,冲突会有什么效果呢?)雷精灵:试试呀!我们来改一下程序:GsLoadBgMap(BG_Map,sizeof(BG_Map),0);GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),0);GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,0,0,0);。这样就是把TILE保存到0块Char
Base,把MAP数据保存到第0号区域。编译,看看吧!
看到了吧!图片花了……
所以,当要显示图片的时候,千万记住不要让TILE数据和MAP数据冲突!这一条,是实现多层BG的基础。
好!下一个,调色盘察看窗口。Tools-Palette Viewer。
左方,明显是察看BG的调色盘的。右方,是察看精灵调色盘的。我们的程序中没有使用精灵,所以精灵调色盘就是空的。
BG调色盘中,可以看到是16*16方阵,共256个小格。每一格代表一种颜色。可见,这里最多显示256种颜色。如果是位图模式,那么这里就全是空的。
这256种颜色,可以分成16组;每一行为一组,分别称为第0号调色盘到第15号调色盘。在MODE0下GBA可以使用16个16色的调色盘,或者1个256色调色盘。这里很重要,请务必记住。
那么,回过头来看我们的程序:我们这张图片,是16色的,程序中也设置BG的颜色属性是16色。所以GBA就从调色盘中腾出一组空间来,用于存放图片的调色盘数据。腾出来的是哪组调色盘呢?你设置的:GsLoadBgPal16(BG_Palette,0);——第0组!所以,调色盘察看窗口中,第一行调色盘,也就是第0组调色盘,出现了图片的调色盘数据。
那么,能不能用别的组?可以!这16组中的任意一组都行,随你的便!你可以改一下程序看看,效果完全不变!唯一变化的,就是调色盘察看窗口中图片调色盘的存放位置……
(众人:为什么第0组调色盘似乎没填满的样子?)雷精灵:说是16色,实际上不到16色……你用来转化位图成C语言数组的那个工具——gfx2gba,就是你键入的那一串命令,自动优化了调色盘。没有用到的颜色,就扔了……
关于调色盘,我必须说明一点!对于16色的调色盘,你知道的,共有16组。这每一组的第一个颜色,都是“透明色”!也就是说,对于16色调色盘,最左边这一竖排,都是“透明色”。什么是透明色?就是说,这种颜色在GBA上面不会显示出来。你可以看一下察看窗口,第一种颜色是绿色,0x03e0。这种颜色在GBA上面没有被显示出来。我们的程序中,用于显示图片的是BG0,其他几个BG,颜色都是绿色——都被透明了!所以,只显示出来BG0……这个时候,想必你也明白了,在第一个DEMO中,就是显示文字的那个DEMO,我为什么把颜色装载进调色盘数组的第1号而不是第0号……
我刚才说,16色的调色盘,第一种颜色是透明色;其实,256色调色盘也是第一色为透明色。只不过,因为256色调色盘可以容纳16个16色的调色盘,所以对于整个调色盘来说,16色的调色盘可以有16个透明色而256色的只能有一个透明色。
以上所说的非常重要。你可以看看教程3中那张《口袋妖怪》的片头截图:它是采用了3层BG。根据高优先级的BG可以遮挡低优先级的BG这一原则,那么可以知道“口袋妖怪”这层BG优先级最高,以此类推。但是,如果简单的把三层BG叠加起来,那么很明显只能显示出“口袋妖怪”这一层。因为这一层的黑色,把下面的BG遮挡了!所以,可以推断,在这里黑色为透明色!同样,云雾那层BG,黑色也是透明色。至于最后烈空座这层,无法推断谁是透明色……
(众人:那么,我要是自己做了一张图片,想规定某某颜色为透明色,应该怎么做呢?)雷精灵:呵呵呵……有请PhotoShop!
还是我们上次做例子的那张图片。用PS打开。由于截图太大我不放上去了。
然后,菜单-图像-模式。这个时候,后面出现了一级子菜单。
注意看那个“索引颜色”和“RGB颜色”。如果这个时候默认选中的是“RGB颜色”你就选择“索引颜色”。
弹出一个窗口。看到了吗?这里更明显的显示出了图片颜色数确实不到16色。
不过我们关心的不是这个。“调板”选择“局部(可**)”中的任意一个,然后颜色数你就可以自己规定了。填上15。记住一定不要填16!否则这张图片无法保存成4位位图!
然后点“强制”下拉框,选择“自定”。如果本来就是“自定”你就再选一次。
这个时候弹出来一个颜色窗口。
点第一格颜色。一定要点第一格颜色!因为GBA调色盘规定第一种颜色是透明色,而我们正是要选择透明色……
然后出现“拾色器”窗口。扔在那里不要管它!把鼠标移动到你那张图片上。这个时候,鼠标变成了吸管。
你想让哪种颜色为透明色,就用吸管去吸那种颜色就行了。吸完之后,“拾色器”选定了你选择的颜色。
然后一路“确定”就行了。最后“另存为”4位位图就搞定了。
那么,256色位图呢?一样的方法。自己规定颜色数的时候就随你便了,只要不大于256就可以。填256色行吗?行!
然后就完全一样了。保存的时候,保存为8位位图。
图片搞定了,转化,编译吧!
嗯?没变?别胡扯!你看看调色盘!第0号颜色,是不是变成了你选择的那种颜色?
(众人:那么,怎么显示出来没有变化啊?)雷精灵:我问你,如果这种颜色成为透明色,那么图片中涂有这种颜色的区域,显示出来会有什么变化?(众人:透明呗!)雷精灵:对!确实是透明!那么,BG0的某块区域透明了,会有什么后果?(众人:如果BG0优先级最高的话,其他的BG会在透明的区域显示出来。)雷精灵:你这不是明白了吗!你看看BG1到BG3。(众人:噢噢噢!原来是这样!)雷精灵:就是这样。如果其他几个BG没有用到的话,它们自动使用透明色。但是由于没有给它们定义调色盘,所以对它们而言,调色盘第0号颜色就不是透明色。所以,它们几个BG,显示出来了。但是对于你用到的BG,该透明的区域确实透明了!只不过,后面的BG颜色是透明色,并且通过透明的区域显示了出来……
那么,既然都明白了,我们来做个显示多层BG的DEMO!这一次,我一步一步的写源代码。
(众人:不是还有几个窗口没讲吗?还有一个OAM Viewer……)雷精灵:我知道。那个OAM
Viewer,是用来察看精灵的。但是反汇编模拟器No$GBA在这点做得极为出色,所以你可以抛弃VBA的OAM
Viewer。其他几个比如IO Viewer什么的,一般用不到。
嗯……首先是图片资源。自己找图吧。
首先我们需要的是一个256色的背景图片,256*256像素。我在这里给它命名为BG.bmp。
这张背景图片有点特殊要求:还记得MODE0下面的调色盘,最大为256色吧!那么,我们这次的DEMO,是要同时显示这张256色背景图片和另一张16色的对话框图片,还有位于对话框里面的文字。这就出现了一个矛盾:如果将256色图片的调色盘装载到调色盘内存里面,那么,那个16色图片的调色盘,装载到哪里呢?调色盘最大256色,已经没有空间留给16色调色盘了;更何况,还有文字层,至少需要2种颜色(透明色和文字颜色);如果你想要文字描边效果那还得需要一种颜色;一般的RPG里面,为了突出某些重要的剧情物品或者重要对话,有些文字反白显示或者高亮度显示或者红色显示什么的……这又得需要若干颜色。
以最坏的情况考虑,对话框图片是16色,那么就需要一组调色盘,文字颜色,也给它分配16色!(15种颜色,显示文字绝对够用了……)那么,那张256色图片,留给它的调色盘的空间,只有224色!
所以,你找到的这张图片,如果颜色超过224色,请注意要减色!否则,对话框图片的调色盘和文字调色盘将会覆盖你的256色图片调色盘的一部分,导致显示出来的图片出现颜色异常!
减色也很简单。还是有请PhotoShop,还是像选择透明色一样,只不过到了填色的时候,填224就行了。由于是背景图片,也就是它的BG优先级最低了,所以没必要选择透明色。
这张图是我从GBC的《心跳回忆》里面截出来的。由于GBC窗口小,所以做了加工,将它拉大到240*160,就是GBA屏幕大小。然后再拉大到256*256,以适应程序需要。图片截出来的时候,是真彩色(24位色),然后用PS减色,减到224色了。
转成C语言数组。由于这次的图片是256色,转成数组的时候,命令有点变化。根据gfx2gba的说明,这次的命令是:gfx2gba
-fsrc -t8 -c256 -pBG.pal BG.bmp。
然后文件夹里面多出了BG.PAL.C、BG.MAP.C和BG.RAW.C这几个文件。
然后就是16色的对话框图片了。依然,16色,256*256像素。起名为Frame.bmp。
记住这张图片要选择透明色。然后转成数组。
这张图是我从HuangYZ大人写的《心跳回忆GBA》的DEMO里面截出来的。最近我一直在写烧录地带的《心跳回忆》,当时为了能够在游戏对话中显示姓名所以对那张图修改了一下使对话框左上角突出一块。这次直接拿来用了。在这张图片里面黑色被我设置为透明色。
好,写程序。
首先最好规划一下:我打算,让BG0显示256色背景图片,Char
Base使用第0块;BG1显示16色对话框图片,CharBase使用第1块;BG2显示文字,Char Base使用第2块;至于Char
Base第3块,存放这几个BG的MAP数据……优先级毫无疑问,BG3不使用,BG2最高,BG1次之,BG0最低。
#include &GsGBA.h&
#include &GsTEXT.h&
#include "BG.pal.c"
#include "BG.map.c"
#include "BG.raw.c"
#include "Frame.pal.c"
#include "Frame.map.c"
"Frame.raw.c"//你也有感觉到,这一堆包含实在是太让人头疼了。确实,一张图片就有三个包含,以后出现的DEMO,万一出现更多的图片,这个包含,岂不是要写很长……所以,我们最好把这三个文件合并。最简单的方法,就是用DOS下面的COPY命令,把三个文件组合到一起。不过,每次处理完一张图片就要打一次COPY命令,也有够麻烦的。最好的方法是写一个小程序(当然这是运行在Windows环境下面的程序),每当生成完那几个数据文件就自动将这三个文件组合。我偷懒了一下,写了个批处理,也自动完成了这样的任务……
const IntrFuncp
IntrTable[14]={dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,dummy,
};//中断向量表。这次,仅仅是显示而已,不对它进行操作,不设中断。
int AgbMain()
GsSetMode(MODE_0);
GsInitBG();
GsLoadBgPal(BG_Palette,224);//载入256色调色盘。这个函数的参数请参阅帮助文件。我前面说过,最坏的情况下载入256色调色盘时最多载入224色,所以这里调色盘载入字节数设为224。
GsLoadBgMap(BG_Map,sizeof(BG_Map),31);//还是一样,将256色背景图片的MAP数据装载到第31号区域。
GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),0);//还是一样,将256色背景图片的TILE数据装载到Char
Base第0块。
GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR256,0,31,0);//设置BG0:TEXT属性,大小是256*256,颜色是256色,其中MAP数据在BG的31号区域,TILE数据在BG的第0块,禁止该BG的马赛克特效。
GsBgPriority(0,3);//设置BG0的优先级。最低。
GsSetBgState(0,ON);//打开BG0。写到这里,如果就此停止,再写上死循环、等待同步和函数返回,那么编译之后,就应该显示出那个256色的背景了……不过我们可不能就此停止,后面还有两个BG呢……
GsLoadBgPalEx(Frame_Palette,224,16);//这个函数是实现多层BG调色盘的关键。假如,我直接载入BG1的调色盘,那么它将默认从调色盘0号位置开始存放。这样做的后果就是将BG0的调色盘覆盖了一部分!导致BG0那张256色的图片颜色不正常。所以这里必须要用这个函数!根据帮助文件,可以得知Frame图片的调色盘将从调色盘内存第224号开始存放,存放16种颜色。这正好和上面那张256色的调色盘相接起来,既不浪费空间又不导致冲突……
GsLoadBgMapSelectPal(Frame_Map,sizeof(Frame_Map),30,14);//这个函数是实现多层BG
MAP的关键。既然Frame图片的调色盘是从第224号位置开始存放的,那么对于MAP数据,也应该从第224号位置(也就是第14组调色盘)读取调色盘……(众人:MAP数据与调色盘数据有什么关系啊?)雷精灵:怪我怪我,我当时没有说清楚,MAP数据里面保存TILE数据的坐标,还有一些调色盘的索引数据,TILE的形状和翻转数据什么的……这个不重要,所以我当时没讲……
GsLoadBgTile(Frame_Tiles,sizeof(Frame_Tiles),1);//这个不需要变动函数,直接将16色图片的TILE数据装载到Char
Base第1块就行了……
GsSetBg(1,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,1,30,0);//设置BG1:TEXT属性,大小是256*256,颜色是16色,其中MAP数据在BG的30号区域,TILE数据在BG的第1块,禁止该BG的马赛克特效。
GsBgPriority(1,2);//设置BG1的优先级。次低。
GsSetBgState(1,ON);//打开BG1。接着是文字层了……
BGPaletteMem[241]=0x00
GsSetBg(2,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,2,29,0);//设置BG2:TEXT属性,大小是256*256,颜色是16色,其中MAP数据在BG的29号区域,TILE数据在BG的第2块,禁止该BG的马赛克特效。
GsTileTextInit(2,2,29,15);//初始化文字层。根据帮助文件,被初始化的文字层是BG2,MAP数据将被保存到第29号区域,使用第15组调色盘。而那个强烈推荐为3的参数,被我改了!我为什么要改呢?你想一下:这个参数是CHAR
BASE号,既然文字层使用的CHAR BASE是第2块,那么这个参数当然不能再用3,而只能用2了!不信?你改成3看看!
GsTileTextOut(20,110,"我爱TGB,我爱烧录地带!",241);//……
GsBgPriority(2,0);//设置BG2的优先级。最高。
GsSetBgState(2,ON);//打开BG2。
GsSetBgState(3,OFF);//关闭BG3。没用到的图层,最好把它关了!
GsWaitSync();
}//死循环里依然是等待同步。
程序结束。虽然看起来很多但是分成块之后就一点都不难了!编译看看结果吧!
表面上看,确实相当不错!美中不足的是,那一行文字,有点偏上!最好能把它拉下来,放到对话框里面!这个问题怎么解决呢?我先不说答案,大伙讨论讨论,应该怎么做?
众人:简单之极!文字函数中,不是有控制显示坐标的变量吗?例子中文字的y坐标是110,那么,增加y坐标,文字不就降下来了么!others:嗯……嗯……说的有道理!)雷精灵:呵呵……我不信!你试试!
(the one who just expressed his
ideas:嗯?怎么会这样?文字被砍掉一半!others:是呀是呀!我稍微降得多了一些,文字就全没了!)雷精灵:再仔细看看文字显示函数!
只见帮助文件上赫然写着:“参数:int x,y : 坐标 注意,y必须在0~120之内”!
(众人:那怎么办?文字拉不下去啊?)雷精灵:呵呵……只拉文字,确实是拉不下去……但是……
(another one:……但是……如果连整个BG都一起往下拉的话……)雷精灵:对!就是这样!对文字层进行卷轴!
将这个函数添加到显示文字之前:GsBgOffset(2,0,-10);然后看效果……
好,这次的DEMO就差不多完成了。如果你对上面的代码还是不甚了解的话,建议你再从教程2重新阅读一下。如果你彻底明白了,那么,我们来玩一个游戏:找不同!你看DEMO中背景图片,和上面那张源背景图片有没有什么不一样的地方……找到的话,你就看一下TILE
VIEWER。注意要仔细看看CHAR
BASE!如果你发现了什么,那么,你就有能力继续看下一篇教程了——《GBA游戏编程菜鸟入门篇5——Char
Base冲突》……下一次的教程,我们来彻底根除这次的DEMO中出现的问题。理论课内容也是Char Base冲突。
GBA游戏编程菜鸟入门篇(五)——Char Base冲突
上次的教程实在太长,我的手,打字都快打抽筋了……帖到论坛上的时候甚至发生了“发帖内容不得超过15K”这样的警告!我不得不把教程分成两次帖上去。但是这同时引起了代码错误,所有颜色都丢失了。这是没办法的事情,唯一解决的途径,就是让管理员将论坛限制放宽一些……扯远了……这次的教程很简单,内容也少,不过,不是很容易理解……大家做好心理准备!
想必聪明眼尖的朋友一定已经发现了,上次生成的那个DEMO中,256色背景图片,楼房窗口处和源图片不同。察看TILE
VIEWER,发现原本用来存放Frame对话框图片的CHAR BASE,出现了其他数据!
用16色察看,只能依稀辨别出来,最前面几个TILE还有点像Frame的某些TILE,后面一堆TILE,就不知道是什么了……用256色察看,竟然发现这是256色背景图片的下半部分!
这是怎么回事?
回过头看看程序:背景图片是存放在0号CHAR BASE,Frame存放在1号Char
Base。存放在0号的256色的背景,怎么会跑到1号里去?
(众人:0号Char Base不够存放背景图片,导致溢出的部分跑到了1号里面去啦?)
雷精灵:强啊!你怎么知道的?
(众人:把两个图片的TILE文件打开,明显BG的TILE远大于Frame嘛!而每块Char
Base的空间只有0xxx4000这么大,万一BG的TILE大于Char
Base的容量,那很明显多出来的数据会顺序存到下面的Char Base里面去啊!)
雷精灵:Exactly!那么,怎么解决这个问题?
(众人:……)
雷精灵:(得意地笑)最简单的方法,就是不用1号Char
Base存放Frame图片了。根据程序,0号已经用来存放BG图片,1号被占用了一部分不能使用,2号存放文字,那只能用3号!
(众人:慢着!3号里面有这3个图层的MAP数据!你也不能用!)
雷精灵:没错。但是MAP数据很小,我让MAP数据搬家,腾出空间来存放Frame图片的TILE。
(众人:那么,MAP朝哪里存放?)
雷精灵:1号Char Base不是被占用了一部分么?把那没被占用的部分拿出来存放Map数据吧!
(众人:(怀疑的目光)行么?)
雷精灵:试试吧!
从主函数开始吧!
int AgbMain()
GsSetMode(MODE_0);
GsInitBG();
GsLoadBgPal(BG_Palette,224);//与调色盘无关,不用管它。
GsLoadBgMap(BG_Map,sizeof(BG_Map),15);//这次将256色背景图片的MAP数据装载到第15号区域。
为什么是第15号?你想……一块CharBase容量为0x4000;一块CharBase有8个MAP区域,那么,每个MAP区域容量就有0x4000/8=
0x0800。你看看在1号CharBase中,哪块区域还没有被占用?(0xx6000000)/0x0800=0xf=15!那个数据0x6007800怎么得到的?打开Tile
Viewer,选中256色,切换到1号Char
Base,看到图片下面的“空白”了吧!鼠标点上空白区域的第一个Tile,看看它的地址……
GsLoadBgTile(BG_Tiles,sizeof(BG_Tiles),0);//还是一样,将256色背景图片的TILE数据装载到Char
Base第0块。
GsSetBg(0,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR256,0,15,0);//设置BG0:TEXT属性,大小是256*256,颜色是256色,其中MAP数据在BG的15号区域,TILE数据在BG的第0块,禁止该BG的马赛克特效。
GsBgPriority(0,3);
GsSetBgState(0,ON);
GsLoadBgPalEx(Frame_Palette,224,16);
GsLoadBgMapSelectPal(Frame_Map,sizeof(Frame_Map),16,14);//那这里,明显就存放在16号得了!
GsLoadBgTile(Frame_Tiles,sizeof(Frame_Tiles),3);//这个不需要变动函数,直接将16色图片的TILE数据装载到Char
Base第3块就行了……
GsSetBg(1,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,3,16,0);//设置BG1:TEXT属性,大小是256*256,颜色是16色,其中MAP数据在BG的16号区域,TILE数据在BG的第1块,禁止该BG的马赛克特效。
GsBgPriority(1,2);//设置BG1的优先级。次低。
GsSetBgState(1,ON);//打开BG1。接着是文字层了……
BGPaletteMem[241]=0x00
GsSetBg(2,Gs_BG_TEXT_SIZE_256x256,Gs_BG_COLOR16,2,17,0);//设置BG2:TEXT属性,大小是256*256,颜色是16色,其中MAP数据在BG的17号区域,TILE数据在BG的第2块,禁止该BG的马赛克特效。
GsTileTextInit(2,2,17,15);//那这里也是一样了。
GsTileTextOut(20,110,"我爱TGB,我爱烧录地带!",241);//……
GsBgPriority(2,0);//设置BG2的优先级。最高。
GsSetBgState(2,ON);//打开BG2。
GsSetBgState(3,OFF);//关闭BG3。没用到的图层,最好把它关了!
修改完了,试试看吧!
什么!!!
哎呀呀……疏忽了!看来1号CharBase没剩下多少空间,把BG0的MAP载入的时候,还可以容纳,但是这个时候已经满了,BG1和BG1的MAP,跑到2号CharBase里面去了……
没戏了,MAP还是放回31、30和29号区域吧!好心没得好报!
终于行了……有够累!
从这个DEMO,我们能看出来,在作多层BG操作的时候,请多加留意!对于比较大的图片,你必须充分考虑到这图片的TILE是不是会超出一个CharBase所能容纳的范围!如果超过了,那么它的下一个CharBase就会被占用一部分,从而导致这个CharBase不能再容纳其他BG的TILE数据……当然,可以将其占用之后剩下来的空间作为MAP数据的存放空间,但是,你仍然需要注意剩下来的空间是不是足够放MAP数据……对于2层BG来说,基本上不会遇到这种情况,即使这两个BG都是256色。不可质疑这仅仅是“基本上”,无论如何你需要留心!相比之下3层BG,尤其是其中有一层BG是256色,这种情况出现的几率就会大大增加……如果是4层BG,仅仅是“如果”,那么这种情况出现的几率就是100%。这个时候请务必精打细算,仔细寻找可以容纳MAP数据,而又不会造成冲突的空间。你必须耐心的计算,到底哪里可以容纳MAP数据,到底哪里可以存放TILE。实在必要的时候,穷举法也不失为一种方法……
但是,通过最近自己写的DEMO,我发现,某些图片,如果比较精细,颜色数较多,那么有一定几率会出现:这张图片的TILE数据甚至2个CharBase都不能容纳!这个时候千万不要进行大于2层BG的多层操作!否则,你会很沮丧的发现根本没地方容纳另一层BG的数据!这个时候你面临的就是,牺牲图片精细度和牺牲表现效果这两个抉择……不用我说,这两个抉择都是很痛苦的……
嗯……差不多就这些了。到现在为止,如果你能完全理解上面几篇教程中的思想,那么你就掌握了GBA编程的三分之一。诸位不要说我罗嗦,再次强调一遍,TILE模式下的BG技术很重要……想进入GBA编程,请一定要掌握这些内容!
那么,难点已经过去了,下一次我们来点轻松的——特效!在特效的配合下,BG就会变得多姿多彩!关于特效的调试,基本上不需要。你只需要通过VBA,看看效果是否符合你的想法就可以了。另外,我推荐的两种模拟器,在表现特效方面有一些明显的不同。具体地说,No$GBA表现马赛克特效的时候,是将这种特效作为水波特效处理的;表现FADE特效的时候BG和精灵不一样。由于在GBA机器上,特效的效果是和VBA一样的,而且VBA远比No$GBA普及,所以你就以VBA为准吧。下一次的内容:硬件特效!理论课内容:GBA的BG特效。
GBA游戏编程菜鸟入门篇(六)——GBA的BG特效及硬件特效
特效,不是BG的专利,精灵也有特效。不过,我们暂时不讨论精灵特效。到了《GBA游戏编程中级进阶篇》的时候,我会详细讲解精灵,当然精灵特效也会讲解……
对于GBA来说,硬件直接支持的特效有4种:马赛克(Mosaic)特效、透明特效(Alpha)、窗口特效(Window)和明暗特效(Fade)。而通过相关算法,又能实现若干软件特效例如烟花特效、水波特效、颜色滚动特效之类的。其中有一个比较出名,就是伪3D特效。GBA超级大作、人世间最强大的GBA游戏、不到长城非好汉不玩这游戏就白活的经典、人类智慧最美丽的结晶、(后面省略形容词10000字)的游戏《黄金太阳》,将这种特效发挥的淋漓尽致、入木三分、(后面省略副词10000个)……
这一次,我们先看看BG的硬件特效。至于软件特效,因为这要涉及对TILE和MAP甚至调色盘的数据操作,而这种数据操作还不是一般的位操作或者循环就能完成的,所以我打算在《GBA游戏编程高级技术篇》中讲述……
首先是马赛克特效。这种特效在现在的GBA游戏里面很常见。例如《口袋妖怪》,当口袋妖怪中毒之后,主角在大地图上行走的时候,每走4步画面就马赛克一下然后迅速恢复正常同时伴随着中毒掉血的效果音。再例如《恶魔城-晓月圆舞曲》中,游戏刚开始的时候主角来须苍真醒来,发现弥那小姐坐在他身边,阿鲁卡多站在右边。苍真醒来的过程,画面就是慢慢由模糊变成清晰的马赛克过程……还有几个GBA的Hgame,里面的马赛克特效实在是令人不爽……(众人:这小子有够无耻……)
马赛克特效的原理是什么呢?这不是很重要,但是了解一下也不坏。假如GBA硬件不支持马赛克特效,你知道它的原理后也能自己写出相应的算法,实现软件马赛克特效。
规定图片的左上角坐标为(0,0),向右横坐标增加,向下纵坐标增加。假如要做双轴3倍的马赛克特效,那么,横坐标和纵坐标均为3的倍数的坐标点例如(0,0)、(3,0)、(6,3)、(6,6)之类的坐标点,其左方和下方两个坐标点处的像素,均变成横坐标和纵坐标均为3的倍数的像素。我画个图表示一下:
涂有同一种颜色的像素,均变成它的右上角那个点的像素。这样,图片就形成了一块一块的明显的方块。
那么,同样的,要做x轴4倍y轴5倍的马赛克特效,就是横坐标为4的倍数,纵坐标为5的倍数的点,像素值变成它的右上角那一点的像素值……可见,控制马赛克化面积的变量就是那个倍数。在GBA里面,横坐标和纵坐标的倍数都可以由你控制。
那我们就做个DEMO看看效果吧!
就拿写单层BG的那个例子吧。我先照抄程序,到需要修改的地方,我会加上注释。
#include &GsGBA.h&
#include "BG.map.c"
#include "BG.raw.c"
#include "BG.pal.c"
//这里定义了两个变量。这两个变量是后面对BG进行卷轴操作的偏移量。
int mos=0;//这个变量是用于马赛克特效渐变的变量。
void Vblank();
const IntrFuncp IntrTable[14]={
Vblank,dummy,dummy,dummy,dummy,dummy,dummy,

我要回帖

更多关于 pspgba格式游戏下载 的文章

 

随机推荐