java模擬生存RPG游戲開發


2013-01-22 MVC

將原有程序,改寫為MVC模式,同時學習優化、單例的使用。部分技能開始嘗試用狀態機實現。

近期最想實現的是,讓給矮人添加尋路算法,讓他自己動起來。。

2013-01-07 帶消息機制的狀態機

帶消息機制的狀態機,基本完成,准備在自己的環境里面測試

目前需要解決的問題:

1、ID的設計管理。如果將每個圖塊都設置一個ID ,太多了。

      (消息機,暫時不使用,感覺目前沒必要)

2、各種消息的處理。針對不同的 物品 設置不同的處理方式

      (計划將每種物品單獨設置為final類,設定獨一的ID,這樣物品的增刪,擴展比較容易,不同的物品效果不同)

3、技能 是否可以用消息機的方法來設計

      (目前在這樣測試,初步可行)

package ai;

import java.util.*;

import bin.StaticValue;

public class MessageDispatcher {

// 消息管理

private Set<Telegram> priority;

//
private void discharge(BaseGameEntity reciver, Telegram tel) {
reciver.handleMessage(tel);
}

// singleton
// 單例
private MessageDispatcher() {
};

private static MessageDispatcher instance = new MessageDispatcher();

public static MessageDispatcher getInstance() {
return instance;
}

// send message
public void dispatchMessage(int sender, int receiver, MsgType msg, int delay) {
BaseGameEntity receiverEntity = EntityManager.getInstance()
.getEntityFromID(receiver);
Telegram telegram = new Telegram(sender, receiver, msg, delay);
if (delay <= 0) {
discharge(receiverEntity, telegram);
} else {
long currentTime = StaticValue.timeLong;
telegram.dispatchTime = currentTime + delay;
priority.add(telegram);
}
}

// send delay message. this function must put in main loop.
public void dispatchDelaedMessage() {
// get now time
long currentTime = StaticValue.timeLong;
while (priority.iterator().hasNext()) {
Telegram telegram = priority.iterator().next();
while (telegram.dispatchTime < currentTime
&& telegram.dispatchTime > 0) {
BaseGameEntity reciver = EntityManager.getInstance()
.getEntityFromID(telegram.receiver);
// send telegram to reciver;
discharge(reciver, telegram);
// remove this telegram;
priority.remove(telegram);
}
}
}
}

2013-01-05 自治可移動游戲智能體

又墮落一個多月,今天完成部分可移動游戲智能體(聽起來有點怪),

向量設計,向量運算方法(點乘,垂直,夾角,都忘差不多了。。還查了半天資料= =),

行為的控制,只做了追擊,逃跑,到達。等做完了,看看放到里面能用不。目前的方塊環境,真是有些玄。。

動畫的更新方法,多思考update()考慮。

向量設計,照貓畫虎

package ai;

public class Vector2D {

//矢量的設計
private double x;
private double y;

public Vector2D(){
this.x = 0.0;
this.y = 0.0;
}

public Vector2D(double x,double y){
this.x = x;
this.y = y;
}

public void zero(){
this.x = 0.0;
this.y = 0.0;
}

public final boolean isZero(){
return this.x == 0.0 && this.y==0.0;
}
//矢量長度
public final double lengthSq(){
return Math.sqrt(this.x*this.x + this.y * this.y);
}
public final double length(Vector2D v2){
return this.x*v2.x + this.y * v2.y;
}


//矢量長度的平方
public final double length(){
return this.x * this.x + this.y * this.y ;
}
//矢量點乘
public final double dot(final Vector2D v2){
return this.x * v2.x + this.y * v2.y;
//return this.length()*v2.length()*this.getCost(v2);
}
//矢量數乘
public final Vector2D operatorX(double m){
return new Vector2D(this.x * m ,this.y * m);
}
//矢量的直角
public final Vector2D perp(){
//return this.normalize();
return new Vector2D(this.y,-this.x);
}


//矢量的歸一化,eg, 運行體的頭的方向與速度的方向保持一致
public final Vector2D normalize(){
double m;
double newX,newY;
m = Math.sqrt(this.x*this.x + this.y * this.y);
newX = this.x / m;
newY = this.y / m;

//return new Vector2D(this.x/this.lengthSq(),this.y/this.lengthSq());

return new Vector2D(newX ,newY);
}


//矢量算法 加 減 乘 除
public Vector2D operatorAdd(Vector2D newVector2D){
return new Vector2D(this.x + newVector2D.x, this.y + newVector2D.y);

}
public Vector2D operatorSub(Vector2D newVector2D){
return new Vector2D(this.x - newVector2D.x, this.y - newVector2D.y);

}
public Vector2D operatorMul(Vector2D newVector2D){
return new Vector2D(this.x * newVector2D.x, this.y * newVector2D.y);

}
public Vector2D operatorDiv(Vector2D newVector2D){
return new Vector2D(this.x / newVector2D.x, this.y / newVector2D.y);

}
//得到相反向量
public Vector2D getReverse(){
return new Vector2D(-this.x ,-this.y);
}


//倆矢量間的夾角 cost
public double getCost(Vector2D v){
return this.dot(v)/(this.length()*v.length());
}

public double getX() {
return x;
}

public void setX(double x) {
this.x = x;
}

public double getY() {
return y;
}

public void setY(double y) {
this.y = y;
}



}




原計划的消息機制,目前不加如現在的代碼中,必須將現有的優化,整理一下再加,不然,亂的。。。



2012-11-15  照貓畫虎,做了一個FSM

參考書C++代碼,做了個java的有限狀態機,從中學到不少東西。。枚舉類,接口的用法,泛型的用法,單例模式等。

也從中發現不少自己的不足,基礎不扎實造成很多錯誤。

下步,做個消息機制,把消息機制做完了,測試FSM在自己游戲中的應用。

狀態機的代碼

package test;

public class StateMachine<E> {

//
private E owner;
private State<E> currentState;
private State<E> previousState;
private State<E> globalState;

public StateMachine(E owner){
this.owner = owner;
this.currentState = null;
this.globalState = null;
this.previousState = null;
}

public void update(){
if(globalState != null){
globalState.execute(owner);
}
if(currentState != null){
currentState.execute(owner);
}
}
//改變狀態
public void changeState(State<E> newState){

if(newState == null){
System.out.println("trying to change to a null state");
}else{
previousState = currentState;
currentState.exit(owner);
currentState = newState;
currentState.enter(owner);
}
}
//回到前一個狀態
public void revertPreviousState(){
changeState(previousState);

}


//初始化狀態
public void setCurrentState(State<E> currentState) {
this.currentState = currentState;
}





public void setPreviousState(State<E> previousState) {
this.previousState = previousState;
}




public void setGlobalState(State<E> globalState) {
this.globalState = globalState;
}


//獲得狀態

public State<E> getCurrentState() {
return currentState;
}

public State<E> getPreviousState() {
return previousState;
}

public State<E> getGlobalState() {
return globalState;
}



}


 

 

2012-11-02

買了幾本書,《java游戲高級編程》等,苦讀中,思維開闊不少,站在巨人的肩膀上,果然看得更遠些。奮斗

昨天考駕校理論,同行的三個美女倆個滿分,一個98,額,太強了。= = ,和她們相比,某人的豬腦子,就不提了。。害羞

近期,接連二三的被微博上的小學數學題難住,= = 某人實在捂臉說自己是數學專業的。。閉嘴

明顯感覺思維有些停滯了,不會思考,老是原地打轉。。得想想辦法。抓狂

代碼暫時緩緩,磨刀不誤砍柴工,先補補基礎,從美女那學了點讀書方法,提高提高效率。。得意




2012-10-26

角色能動了,終於發現問題所在了,還是得補補基礎。。單位這段時間有點忙。。代碼時間減少。個人問題依舊迷茫中。。哭呵呵。

最近在做幾個工具類,發現自己悟性好差,現在才想到這個。。。哭

用剛寫好的繪圖工具類把找的 A* 算法顯示了出來,感覺當然比文字的強,目前問題是,我的是3D的,而尋路算法是2D的,這要怎么轉化,而且效率問題也要考慮,又難住了。。

總之在邊學邊練邊開發,光看書實在體會不了。。腦子轉的還是太慢太慢了。。。555

呵呵,FF6A出來完全中文版了,打算通關,目前過到世界崩潰了。。通關一下也算圓了一下FF的夢,FF玩過的不少。通關的目前沒一個害羞丟人啊。。

 

下一步:設計一個任務類,做一個砍樹的任務 可以讓角色自己去砍樹 ,加油奮斗

 

2012-10-17

群中 雪梨 將DF漢化了。。內核漢化。。太厲害了。。

發現個嚴重的問題,DF漢化了。我做的這個,不就沒市場了!!!。。

喜憂參半。呵呵。多想了。。對AI一竅不通的我,大算往里面加狀態機和A*尋路了。。讓矮子,開始自己生活。。

上帝保佑我吧。。

附 DF 漢化的圖片

 

2012 10 15 剛完成一個csv文件的讀取。

以后數據就可以直接通過編輯csv文件(excel的逗號分割文件)來進行了。。方便不少。

在寫的當中發現一個小問題,parseInt,不能識別0xffffff這樣的十六進制表示數值,而且,也不會報錯。。

 

看着自己亂七八糟的代碼,頭疼,沒有好好規划,抱着走一步算一步的想法,現在開始嘗到惡果了。。

 

 

20121009 時間真快。這幾天,就打掃辦公室了~~

今天又烏龍了一把,以為把早已給同事換過去的打印機丟了,還驚動了領導。額。。記憶力,限制着我的發展啊。。

辦公室基本打掃好了。現在的環境相較而言更安靜,更便於學習。。

把上次做的菜單稍微修改了一下,最近看了看DF的相關wiki學習了一下DF的思路。

 

DF里面的窗口

 

 

我自己做的。。= = 用的tiles不同,形似有了。。。繼續努力。。再改進改進。。做一個游戲,美術,編程,亂七八糟的知識 等等,都得有啊。。

 

 

20121006 國慶節馬上要結束了,這個國慶和以往的一樣,在家中度過。

個人問題遲遲沒有解決啊。呵呵,原因還在自己,感覺自的感情有點封閉起來了。。快哭了

寫了點代碼,進度一般般。可以優化改寫的地方太多了。基礎不好真不行。。委屈,每次改寫都相當郁悶,以前怎么沒想到可以這樣那樣。

離一個完整的雛形是還有一段距離,想象的速度,遠超實際的代碼速度。。果然是思想的巨人,行動的矮子。。

 

今天寫的一個消息窗口,提供消息和關鍵字,就可以顯示,消息框的大小根據消息的內容自行改變;關鍵字,是為了以后做任務的時候,的一點人性話提示。

本來想寫交易對話框的。結果一想,我靠連npc都沒有,連物品欄都沒,要交易框干嘛,就暫時不弄那了。。

下一步,1、想整理一下基礎的物品類。將物品分類。

總覺得,這里用繼承,接口什么的應該可以,但是對那不熟,還沒感覺出多方便,就用笨辦法,一點點的感覺了。。

2、想將整個窗口弄成一個矩陣,然后運算結果,最后一次性繪制上去。。這樣,應該能加快點速度,減少點浪費。。

3、物品啊,裝備啊、狀態啊、555還有好多好多要做。。大哭

ps:改寫了一個移動算法,以前用了幾百行,現在十多行,額,服了自己了。

 

20120910 教師節,願所有的老師,教師節快樂

對2.5D的畫面進行一定的修改

MVC分層開始

2.5D效果如圖

 

 

 

 20120906

進行游戲 保存 讀取 測試。用序列化和反序列化。出現內存溢出。計划重新整理,MVC不夠清晰。

 

這幾月 ,單位有事,自己也有些墮落,想解決單身問題。。所以編程耽擱了。不過,我一直在思考。。。

 

卡在 數據 存取上了。。沒想到好辦法。。java基礎還不行,在看《瘋狂java》,不錯的一本書,講的比較深入。

 

20120510 進行2.5D化測試

根據DF里面 2.5D顯示插件Stonesense_Slate素材,進行2.5D化測試,初步測試,速度方面可以保證,可以進行一鍵(暫定空格鍵)進行2D與2.5D之間切換。效果如圖

 

 

 

 

 當然只是測試。= = ,很多地方都沒進行改動。。只是看看能不能顯示。。發覺2.5D 沒我想象中的復雜。。還是有可能進行的。

 

之前的消息 :

 

參考 矮人要塞 這個游戲 做個rpg

其實我想的游戲和矮人要塞,有一些差距的,我想做一個比較真實點的沙盤,然后人們在里面生存互動,最后改變環境,環境治理等等的。

不過,這個矮人要塞竟然可以用2D,來表現3D而且他的地理生物等的生成和結構設計都相當的嚴謹,非常棒,所以想拿來學習學習,磨練磨練自己的編程技能(目前菜的一坨)

目前這個游戲的很多思路都是參考 矮人要塞,這次開發,主要是以DF(矮人要塞,以下用DF來代替)為產考模板,防止DF 從中學習他的設計思路等,投石問路摸索前進。

等把DF里面經典的學到一些后,能解決以后編程方面的問題,我會轉向自己設想的游戲開發,這是我從小就像做的樂趣。

 

 

 1、圖塊設計(目前) (一直在改動)

 因為要生成非常大的地圖。。而且,每個圖塊都要有一些真實的物理屬性。所以圖塊的設計是比較復雜重要的。

現在的圖塊設計,已經經歷了多次的變革,而且相信還要進行變革。所以這塊一直在改動。還好目前的方案,根本上已經不錯了。。很難想到再好點的了。

 

由原來的圖塊類、到后來的int數組矩陣層、再到現在long數組矩陣,幾經變革,目前還是用的 數組矩陣層。因為要表示疊層關系,所以這個相對容易一些。

 

圖塊ID設計方面還是有待於加強。

 

圖層的顯示基本正常了,疊層現在顯示還好。有 從上而下 有 鋪墊層(雨雪等動態效果) 物品層 土壤層 地板層。

 

圖塊必須有一定的物理效果,這樣才合理,目前的圖塊可以有相關的物理屬性,但是,對應的方法還未進行添加。

優化存儲結構,方便較大數量的調用

 

圖塊的信息設置成三塊, 1、表皮 2、實體層 3、實體內部 這樣,在一層之中的東西,顯示比較直觀,而且也更容易讓人理解。

 

表皮(floor) 可以看做是該快地形的表面,表面可以有草皮、藤蔓、雪、積水等等

實體(wall) 可以看做是地塊的內在的主要填充物 如 實體可以有空氣、水、土壤、沙石、岩石、礦藏等   注意:大型的家具也可以作為一種空心的實體。

內部 (obj) 可以看做是在填充物內部的東西如空氣里面可以放置的任意物品(obj)、水里面可以有魚、烏龜、蝦等水生動物、土壤里面可以有種子、沙石里面可以有化石、岩石里面可以有一定量的礦物、礦物里面有金屬礦、化石礦;注意,特殊的大型家具里面可以有個 obj[] 存放多個物品。

2012.5.8日,對該設計進行重新思考。計划將 obj 與 wall 組合為一個。floor單獨使用。具體如何設計,還未考慮完全。

 

 

 2、自然環境(下一步)

添加雨、雪等自然天氣效果,不僅僅有相關的動畫,還要有相應的屬性變化什么的。

下雨效果,下雨的實現 下雨的開始時間、雨量、動畫、結束時間(簡單實現)

溫度影響植物生產、人的生存 ,目前的植物是隨機生成,不存在區域的划分,后續會加入,不同的氣候帶,不同的生物出現。

 

水的流動改變自然環境(困難)

 水流的侵蝕算法,要涉及到專業的知識,目前還缺乏相應的知識和能力。

水的流動,簡單實現,可以進行挖水渠操作(簡單實現)

四季溫度的變化(可以解決) 

四季變化:春天的的發芽、夏天的開花、秋天的落葉、冬天的風雪。這些都是可以實現的。難度不大(可以解決)

用一個函數來繪制不同時間的溫度(簡單實現)

設置全局變量。根據刷新速度計算時間的進度,年 季度 日 時 分 秒(簡單實現)

自然環境的變化(升級發展)

人為的改變環境,容易造成自然環境永久性損失。

例如:洪水、沙漠化、泥石流、沙塵暴等等。不僅需要對抗,更需要治理。(人與自然環境)

 

 3、物品背包(目前)

比較真實的背包,負重與容量雙重的影響

 

目前弄了個簡單的背包,還未對這些進行影響(簡單實現)

目前的背包可以拿去東西,選擇相應的物品,進行相關 吃、放置、觀察等操作。

 

 

 4、技能

各種生存技能

砍樹、生火、打獵、釣魚、制作陷阱、制作帳篷等等

 砍樹、生火、釣魚(簡單實現)

打獵需要設置野生動物的AI,在AI這塊,暫時還沒有計划進行。這是個大的工程。以后升級在弄

今天寫了個簡單的釣魚,還未引入技能等級的影響 = = (簡單實現)

 

 

 5、建築(重點)(目前)

建築的自由性,存在一定的組合過程。

例如建築的擺放,物料存放區,生產區,產品區,能量傳輸等。可以自由搭配,合理的擺放,能夠提高生產效率,更可以進行自動化生產。

建築與菜單有扯不開的聯系,而這倆項都是比較復雜的,所以開發起來有些難度,而且要想得到比較好的建築效果,也需要細心的設計。

 

模擬建築風車,結果風車不會轉動。建築物的動畫效果也是要考慮的難點重點。

 

這幾天在考慮怎么弄建築過程, 要合理,要方便操作,要豐富。。比如 有能源的輸入 材料框 工作室 產出框,而且一個工坊可以生產很多種產品。等等。。。

 

 6、合理的礦物礦層分布(難點)(目前)

有一定科學根據的礦藏分布

可以用相關的知識來判斷簡單的礦藏位置

目前得到的信息是根據地層結果,沉積層、沖積層 什么的進行簡單設置。

要得到真實的效果,需要更加真實復雜的規則

些了個簡單的挖礦技能,可以概率在相應的岩石里面得到礦石(簡單實現)

 

7、能量物質的循環(最后)

整個地圖中的物質是循環的

即存在一個循環使用的過程

能量是作為物質循環的動力

 

8、具備一定AI的生物群落(升級發展)

添加生物群落,並給生物群落一定的AI

提供角色肉、骨頭、皮革等來源

增加與這些生物的互動

 

9、具有AI的npc(升級發展)

npc有自己的思考行動模式

能與玩家扮演的角色互動

 

可以有多種玩法

當自己成為一員時是角色扮演

當自己作為上帝角色時是模擬經營

 

10、人物狀態(下一步)

視線,在不同時段視線可以看到的區域大小不同,而且存在着障礙物的遮擋 (功能實現)

飢餓、口渴、疲勞等技術屬性(功能實現)

屬性,智力、力量等

設計更加真實的屬性系統。放棄使用HP/MP/SP這類設定。

裝備

 

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: