[英]Java better way to store procedural Information
我想知道如何優化存儲過程信息和訪問數據列表中的特定元素。
例如,當我在我的世界中創建植被時,我告訴我的系統從0開始,一個10行的線,然后它回到0並增加z位置以創建另一條線。
通過在ArrayLists中存儲位置,旋轉,紋理和模型等數據來跟蹤任何對象,以便在需要時在其他位置訪問它們,例如在碰撞檢測中:
public void collision_ForestTree001() {
int modelID = 0;
while(treeXArray.size() != modelID && treeZArray.size() != modelID) {
// player and object bounds
float playerX = 0.15f;
float playerZ = 0.15f;
float objectX = 0.2f;
float objectZ = 0.2f;
// collision check
if((PlayerX)+playerX < treeXArray.get(modelID)-objectX ||
(PlayerX)-playerX > treeXArray.get(modelID)+objectX) {
collisionX = false;
} else {
collisionX = true;
}
if((PlayerZ)+playerZ < treeZArray.get(modelID)-objectZ ||
(PlayerZ)-playerZ > treeZArray.get(modelID)+objectZ) {
collisionZ = false;
} else {
collisionZ = true;
}
modelID++;
}
}
我想知道是否有更好的存儲和訪問數據的方式,因為使用ArrayLists訪問信息似乎有點愚蠢,因為我必須逐個瀏覽元素才能找到所需的數據..感謝您的幫助!
如果每個森林的行為都是獨立的,那么您的解決方案似乎並不那么糟糕。 如果要優化CPU並減少列表的迭代次數,可以使用一些與屏幕區域和林相關聯的映射。 因此,根據玩家的位置,您將僅檢查屏幕區域中與森林的碰撞。
編輯子問題:
別客氣。 我也喜歡游戲編程。 請享用 :)
正如我在最初的消息中所說,如果每棵樹的行為都是獨立的,那么這是一個很好的方法。 獨立的意思是當你的玩家接觸到一棵樹時,這棵樹必須通過做一些小動作做出反應,你沒有選擇:你必須檢查玩家所在地區的每棵樹才能做出反應對於被觸摸的樹。
但是,如果當您的玩家觸摸到一棵樹時,樹沒有反應,只有玩家做出反應(例如通過阻止他),您可以將碰撞檢測分解。 因此,您可以考慮不應在用戶所在的區域計算碰撞,而應在樹木所在的整個區域進行計算。 因此,您可以使用一個或多個矩形來覆蓋樹碰撞檢測,並且您不必強制迭代列表。
為了存儲這樣的數據,我建議你創建一個類來表示將存儲所有數據的每個植被對象。 該對象稱為實體。
public class Entity {
private double xCord;
private double yCord;
private double zCord;
//or in opengl you can use Vector3f() depending on your library
private double rotX;
private double rotY;
private double rotZ;
private Texture texture;
//assuming your model is represented by a class object
private Model model;
public Entity(double xC, double yC, double zC, double rX,
double rY, double rZ, Texture t, Model m) {
xCord = xC;
yCord = yC;
zCord = zC;
rotX = rX;
rotY = rY;
rotZ = rZ;
texture = t;
model = m;
}
public double getX(){
return xCord;
}
public double getY(){
return yCord;
}
public double getZ(){
return zCord;
}
public double getRotX(){
return rotX;
}
public double getRotY(){
return rotY;
}
public double getRotZ(){
return rotZ;
}
public Texture getTexture(){
return texture;
}
public Model getModel(){
return model;
}
}
然后,您可以將所有實體存儲在一個arraylist中,您將遍歷它以呈現每個實體。 此外,您可以添加mutator方法來編輯實體,例如更改旋轉或位置。 同樣為了獲得最大效率,您可以使用距離公式來確定哪些實體處於渲染距離,並僅渲染和測試碰撞的實體。 這可以加快程序的速度,因為渲染是幾乎所有程序中最重的任務。
既然你問的是如何做得更好,這里有幾個指針。
處理你的封裝。 我假設您每幀都調用此方法來更改collisionX和collisionZ的值(外部方法應該是不可變的)。 這是糟糕的OOP。 您應該將此方法傳遞給確定碰撞所需的參數,然后返回collisionX和collisionZ的狀態。
初始化playerX / Z,對象X / Z在while循環范圍之外。 每次循環時都不需要創建新變量。
進一步抽象你的對象。 將對象總區域的坐標存儲在Map / Hashmap中的2d平面上。
通過定義更大的不太密集的碰撞檢查來減少計算壓力。 例如,僅檢查與上面建議的屏幕區域中的對象,網格區域中的碰撞,或者如果您有復雜的對象形狀,確定包裹整個碰撞對象的最小圓圈,對您的玩家角色執行相同操作,然后進行距離檢查他們各自的圈子中心之間。 如果距離檢查返回足夠高的值,則只需跳過碰撞檢查,否則,使用更准確的碰撞檢查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.