2012-05-13 69 views
0

我一直在爲一個遊戲構建一個簡單的基於圖塊的地形生成系統,並嘗試構建一個遊戲,障礙。我正在嘗試開發一種新的方式來選擇和存儲我需要的各個圖塊的位圖。我有一個非常簡單的方法,在遍歷世界繪圖之前全部加載位圖,並且根據它是哪種類型的瓷磚來選擇位圖。需要減少正在加載的位圖的數量(靜態位圖參考?)

不幸的是,選擇過程可能會變得非常複雜,因爲我添加了瓷磚和世界類型的變體。因此,將這些數據存儲在圖塊對象中似乎是個不錯的主意,以及確定將使用哪個圖塊所需的所有規則。

我遇到的問題是,這種方法正在導致我加載每個瓦片的位圖的副本,而不是隻加載一個指向位圖的指針。反過來,這又消耗了我的記憶力,導致我的GC出現了一些故障。

我正在尋找的是一種簡單的方法來創建靜態指針到不同的位圖將被使用,然後引用瓷磚對象中的這些指針,而不是加載位圖的新副本。我遇到的問題是,如果沒有對上下文的引用,我無法加載位圖,我無法弄清楚如何在靜態方法中引用上下文。

有沒有人有任何想法如何解決這個問題?

這裏是我的瓷磚類,和瓷磚類型的類的實例(他們都是大同小異的)

瓷磚: 包com.psstudio.hub.gen;

import java.io.Serializable; 

import android.graphics.Bitmap; 

public class Tile implements Serializable 
{ 
/**** 
* Create a BitmaHolder class that uses a case for which field type it isn, and then 
* loads all applicable bitmaps into objects. The individuak tile types then reference 
* those objects and return bitmaps, which are ultimately stored in this super class. 
*/ 
double elevation = 0.0;  //tile's elevation 

int type = 0;  //tile's type 
int health = 0;  //tile's health - used for harvestable tiles (trees, stone, mountain, etc.) 
Bitmap bitmap;   //pointer to the bitmap 

public void setTile(Bitmap _bitmap, double _elev, int _type){ 
    bitmap = _bitmap; 
    elevation = _elev; 
    type = _type; 
} 
public void setBreakableTile(Bitmap _bitmap, double _elev, int _type, int _health){ 
    bitmap = _bitmap; 
    elevation = _elev; 
    type = _type; 
    health = _health; 
} 

} 

瓷磚類型(草):

package com.psstudio.hub.gen.tiles; 

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

import com.psstudio.hub.R; 
import com.psstudio.hub.gen.Tile; 

public class Grass extends Tile { 
Bitmap holder; 
BitmapFactory.Options bFOptions = new BitmapFactory.Options(); //used to prevent bitmap scaling 

Random r = new Random(); 

public Grass(Context context, int mapType, Double elevation){ 
    super.setTile(pickBitmap(context, mapType), elevation, 4); 
    pickBitmap(context, mapType); 

} 

public Bitmap pickBitmap(Context context, int mapType){ 
    bFOptions.inScaled = false; 

    switch(mapType){   
    case 1:     //Forest Type 1 
     holder = BitmapFactory.decodeResource(context.getResources(), R.drawable.grass, bFOptions); 
     break; 
    } 

    return holder; 
} 
} 

的「持有人= BitmapFactory」是,我認爲是什麼原因造成了我的問題,因爲它加載一個新的位圖,每草磚,而不是僅僅指向到預先加載的一個。

回答

0

好吧,我設法找出一種方法來做我所需要的。我不知道這是否是最合適的方式,但它適用於我所需要的。

我創建了一個BitmapLoader類,它根據世界類型加載圖像,然後將它們存儲到靜態位圖,然後由靜態圖塊引用它們。

不是最優雅的解決方案,但它完成了工作。 ^^

+0

我可以問你究竟如何引用加載器類的這些位圖嗎?我已經做了一個沒有這樣的加載器的遊戲,但它往往會消耗內存。我還在使用位圖持有者類來研究另一個類,但我很好奇你發現哪些工作最好;一個你每次調用的公共靜態位圖(drawBitmap(loader.firstStaticBmp))還是你在surfaceview(Bitmap bmp = loader.firstBmp)中創建一個bmp或者你使用弱引用? – MacD

+0

@MacD我使用的方法可能不是一個好的方法,但我所做的是創建一個類:BitmapLoader(),併爲其添加了「靜態BitmapLoader加載器」。當我創建一個BitmapLoader的新實例時,我加載給定字段的tile,然後設置'loader = this',然後從我在遊戲中的任何位置進行設置:'bitmap = BitmapLoader.loader.loadedBitmap'其中loadedBitmap是存儲我正在查找的位圖的公共變量。就像我說的,不知道這個想法有多好,但它適用於我所嘗試的。希望它有幫助,抱歉這麼長時間,我剛剛看到關於你的帖子的通知。 –