開場(chǎng)詩:不儒不道又不仙,非神非圣也非賢。輕吐心頭尋常語,開辟文武一片天。
小子“鵬凌三千”,欲將心頭事,付與有緣人,列位看官請(qǐng)了。
我們都知道,目前國(guó)內(nèi)游戲引擎開發(fā)領(lǐng)域中(請(qǐng)注意,我是在說游戲引擎),大體以C/C++為主導(dǎo),Delphi次之,其他參差不齊。由于游戲引擎開發(fā)耗時(shí)耗力,很多人不愿意參與進(jìn)來,所以一提[引擎]似乎就延伸到所謂[高手]、[大神]的范圍,而不應(yīng)為我輩凡夫俗子所矚目。
所以,目前國(guó)內(nèi)的真實(shí)情況是,有志于游戲開發(fā)的同好們,現(xiàn)狀無外分成幾類:
1. 無敵悍匪型:有很高的數(shù)學(xué)與編程基礎(chǔ),加盟某些公司成為技術(shù)骨干,主導(dǎo)開發(fā)一款熱門游戲(目前主要是網(wǎng)游……),終生受用不盡。這類人以游戲開發(fā)為本職工作,月收入不菲,平時(shí)除了編程就是了解游戲,大多數(shù)是偶老師或以上級(jí)別(本人并未學(xué)習(xí)過游戲開發(fā),但是偶在大學(xué)時(shí)有個(gè)代課老師曾經(jīng)是以前赫赫有名的[前導(dǎo)]骨干,據(jù)說他開發(fā)過[赤壁]且主導(dǎo)開發(fā)過[血獅]……殘念……),這批人的工作就是公司項(xiàng)目,當(dāng)然不會(huì)輕易加入到開源的工作中來,不過有時(shí)會(huì)為提高知名度,而發(fā)布一些非開源的游戲。
2. 人中龍鳳型:雖然沒有很好的基礎(chǔ),但是學(xué)歷較高,[EQ]較高,能夠被領(lǐng)導(dǎo)認(rèn)為適合擔(dān)當(dāng)管理型角色,基本上屬于[挑刺]的能手,讓這些人當(dāng)產(chǎn)品測(cè)試再合適不過,做個(gè)企劃,吸引投資也有勝任的可能,讓他開發(fā)游戲,下輩子吧……
3. 善用工具型:很多朋友現(xiàn)在常用的RMXP等工具一樣可以開發(fā)同人游戲,而且熟悉Ruby語言的朋友也可以用在其中自定義腳本,利用其擴(kuò)展現(xiàn)有程序,“本鵬”甚至見過同人版的S.RPG仙劍和同人的斜45°單機(jī)大話西游,效果也確實(shí)不錯(cuò)。不過是利用日本人的工具,始終刻上RM系列的烙印(別說你用eXeScope等工具修改,RM系列組件的接口標(biāo)識(shí)你有辦法抹去?……),而且由于其本身[玩具類]工具的通病,程序不可避免的存在大量冗余數(shù)據(jù),一個(gè)同人游戲程序的大小,可能是原版程序體積的1-5倍還不止……也實(shí)在令人難以忍受……就算腳本作的異常之好,被某些公司當(dāng)作[范本]進(jìn)行二次開發(fā),也不過是充當(dāng)了個(gè)[劇本]的作用,當(dāng)了一次[小編],實(shí)在太過雞肋。
4. 神筆馬良型:不錯(cuò),就是能寫會(huì)畫的劇本和美工們,決定一款游戲好壞的,除非系統(tǒng)算法上極大的突破,否則在大同小異的情況下,100%就是美工的插畫和腳本的劇情。在Flash大行其道的今天,如果他們能多學(xué)習(xí)一些Action Script方面的知識(shí),甚至完全可以自己開發(fā)出一款即叫好,又叫做,而且可移植性強(qiáng)的游戲來。如果一個(gè)人美工即強(qiáng),編程又到了[從心所欲,不滯于物]的境界,那就意味著這個(gè)人已達(dá)[天人]境界,自己一個(gè)人幾乎可以挑起整個(gè)公司了……當(dāng)然,前提是他不被累死的話……
5. 心大膽小型:[心比天高,命比紙薄]是這類人最真實(shí)的寫照,大體上都屬于[一瓶子不滿,半瓶子晃蕩]的角色(比如某鵬……||||),偶更經(jīng)常看到有人在各種論壇上發(fā)帖招集美工,腳本等人員進(jìn)行游戲開發(fā),并且有時(shí)會(huì)發(fā)出一個(gè)地圖編輯器類的東西作參考(上次看見一個(gè)要做《夢(mèng)幻模擬戰(zhàn)》同人的,地圖編輯器照搬某平面打飛機(jī)游戲……),然后就不了了之,這類人說起來天下無敵,辦起來有心無力,是國(guó)內(nèi)號(hào)稱[游戲開發(fā)者]中的絕大多數(shù),也是中國(guó)人劣根性的集中體現(xiàn)……
6. 有心無力型:有恒心,有決心,有癡心,就是沒能力,同樣是主流之一,同樣典型,作品大多為真情流露之做,多為畫面和程序很粗燥,但游戲性卻很強(qiáng)的小游戲作者,比如,以前上學(xué)時(shí)記得有個(gè)VB的《北京飄流記》之類的游戲……
目前除了專業(yè)公司的游戲開發(fā)人員,和有心進(jìn)入各大公司或自立門戶的[準(zhǔn)專業(yè)]人員,大體上都屬于小打小鬧,做同人游戲[自娛自樂]的階段,而同人游戲的開發(fā)者,目前則多以RMXP系列及Flash系列為開發(fā)工具,雖然也有部分利用Delphi和VB制作的精良游戲,但是通常都以程序代碼取代了引擎的作用,很難重用到新的開發(fā)中去。
“本鵬”有鑒于此,就想到寫幾篇文章以起到拋磚引玉的效果,但是用什么語言呢?(雖然偶不反對(duì)使用現(xiàn)成的游戲制作工具,但畢竟能否“制造和使用工具”,目前還是區(qū)別人與動(dòng)物的標(biāo)準(zhǔn)之一)C/C++雖然效果最好,但是也最難……本人非C/C++程序員,用Delphi和VB也是后續(xù)計(jì)劃,目前這一階段還是以本職工作Java為主作為RPG類游戲(包括A.RPG,S.RPG等)開發(fā)語言較好(雖然偶?jí)焊皇亲鲇螒蜷_發(fā)的……)。
PS:很奇怪,國(guó)內(nèi)的Java游戲大體上集中在嵌入式開發(fā)的領(lǐng)域中,多以手機(jī)為主,雖然J2ME(Java微型版,用于嵌入式開發(fā))確實(shí)適合手機(jī)游戲開發(fā)(默認(rèn)提供Sprite類,且支持很多的游戲算法),但是在Web和桌面程序的領(lǐng)域中,卻很少有人用J2SE進(jìn)行開發(fā)(或者說,沒有……),請(qǐng)不要提Java的效率問題,Java代碼經(jīng)過優(yōu)化后效率并不慢。所以我更要使用Java開發(fā),這樣寫壞了也沒人知道,嘿嘿。
從游戲運(yùn)行效果上看,Java開發(fā)游戲的優(yōu)點(diǎn)Flash幾乎都有(Flash幾乎就是為做界面而生的……),缺點(diǎn)卻幾乎都沒有。但是從開發(fā)效率上將,Java游戲可以很輕易的實(shí)現(xiàn)復(fù)雜引擎并完成快速開發(fā),而Flash游戲越大則開發(fā)效率將越低,就好比華山[氣宗]和[劍宗]的關(guān)系(當(dāng)然了,隨著Action Script的增強(qiáng),這個(gè)屏蔽始終是會(huì)被打破的,但是打幾年卻不知道……)。另外,Java是支持真3D的。
天下武學(xué),殊途同歸,招無強(qiáng)弱,人有優(yōu)劣。
下面,我們進(jìn)入講座開始前的預(yù)備內(nèi)容,Java界面的構(gòu)成。
1. Hello Java (關(guān)于Java中圖形界面的顯示)
“本鵬”此次的RPG開發(fā)講座將重心放置于J2SE架構(gòu)之上,以Swing為基礎(chǔ)架構(gòu)JFrame之上,利用JPanel進(jìn)行擴(kuò)展。現(xiàn)在,我們從最基礎(chǔ)的第一步開始講起,即如何利用Java構(gòu)建一個(gè)Windows窗口。
運(yùn)行界面如下圖:

文件名:Example0.java
package org.loon.chair.example0;
import java.awt.Container;
import javax.swing.JFrame;
/**
*
* Java RPG開發(fā)講座之0
*
* @author chenpeng
*
*
*/
//在Java開發(fā)中,[子類]可以通過[extends]關(guān)鍵字繼承[父類]
public class Example0 extends JFrame{
public Example0() {
//設(shè)置窗體標(biāo)題,也可寫作 super("Hello Java"); 的形式
setTitle("Hello Java");
//實(shí)例化自定義面板
MyPanel panel = new MyPanel();
//獲得當(dāng)前窗體[容器]的實(shí)例,實(shí)際上可以直接設(shè)定,此處為演示
//故應(yīng)用后設(shè)定。
Container contentPane = getContentPane();
//加載自定義的面板[MyPanel]到窗體中,就好比在底板上再帖一層畫面。
//也就是說顯示什么內(nèi)容,是由我們加載那個(gè)[面板]來決定的,可以輕松
//的實(shí)現(xiàn)游戲中不同畫面間的切換.
contentPane.add(panel);
//自動(dòng)整合窗體
pack();
}
public static void main(String[]args){
Example0 e0=new Example0();
//令窗體接受關(guān)閉[事件]
e0.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//顯示窗體(PS:在Java中本有show()方法,但已成為準(zhǔn)淘汰方法,
//說不定什么時(shí)候便不支持了,強(qiáng)烈不建議使用,雖然Visible內(nèi)部
//目前還是調(diào)用它……
e0.setVisible(true);
}
}
文件名:MyPanel.java
package org.loon.chair.example0;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
* 自定義面板,用以擴(kuò)展原有JPanel類功能.
*
* @author chenpeng
*
* Loon Framework in Game
*
*/
public class MyPanel extends JPanel{
//定義全局常量,為默認(rèn)的[面板]寬與高
private static final int WIDTH = 300;
private static final int HEIGHT = 300;
public MyPanel() {
//設(shè)置背景顏色R,G,B參數(shù),個(gè)人喜歡用白色做底
setBackground(new Color(255,255,255));
//設(shè)置Panel默認(rèn)大小
setPreferredSize(new Dimension(WIDTH, HEIGHT));
}
/**
* Graphics為java.awt下所有類,用以[描繪]圖形界面
* 大多數(shù)Java下的圖形界面開發(fā)時(shí),都是以此類為基礎(chǔ)的。
*
*/
public void paintComponent(Graphics g) {
//這里我們沒有自定義Graphics,而是直接調(diào)用[父類]的同名方法實(shí)現(xiàn)。
super.paintComponent(g);
//在MyPanel(20,50)的位置上"畫"出"Easy Java"
//如果換成drawImage函數(shù)就能在指定位置加載一張圖片。
g.drawString("Easy Java", 40, 40);
}
}
架構(gòu)關(guān)系如下圖所示。

實(shí)際Java RPG游戲開發(fā)中案例:
如下圖,為日本某Java游戲運(yùn)行畫面,即為JFrame和JPanel的拼合顯示。

下圖為“本鵬”開發(fā)中Java S.RPG引擎地圖(此項(xiàng)目完成后開源)運(yùn)行畫面,原理相同:
浙公網(wǎng)安備 33010602011771號(hào)