| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Jul 2011
Beiträge: 26
|
Hallo Leute; ich wurde gerne meine spritesheets cachen (in Array schmeissen). Ich will mein System so haben dass meine Objekte auf den Cache (es wird mehrere unterschiedliche Zaches geben) mit den bitmapDatas bloss noch zugreifen muessen. Aber irgendwie funktioniert das nicht, denn es wird absolut nichts gerendert. Und zwar gar nichts. Fehlermeldungen habe ich auch keine gesehen. Im cache selbst befindet sich durchaus was (ich gehe mal davon aus dass es bitmapDatas sind) und null ist es auch nicht aber irgendwie wird rein gar nichts aus dem cache heraus gerendert. Es wäre sehr nett, wenn mir da bitte jemand weiterhelfen koennte denn ich komme da einfach nicht mehr weiter. Vielen Dank. diese Funktion soll die einzelnen Titels aus dem Spritesheet heraus erstellen und in einen Array (cache) schmeissen Code: private function tileToCache():void {
var tileBitmapData:BitmapData = new BitmapData(tileWidth, tileHeight, true, 0x00000000);
var tilePt:Point = new Point(0, 0);
var tileRect:Rectangle = new Rectangle;
tileCache = [];
for (var tileCtr:int = 0; tileCtr < tilesLength; tileCtr++) {
tileBitmapData.lock();
tileRect.x = int((tileCtr % spritesPerRow)) * tileWidth;
tileRect.y = int((tileCtr / spritesPerRow)) * tileHeight;
tileBitmapData.copyPixels(tileSheet, tileRect, tilePt);
tileBitmapData.unlock();
tileCache.push(tileBitmapData);
}
} Code: public function renderCachedTile(canvasBitmapData:BitmapData, tileArray:Array):void
{
tileCache = tileArray;
tileArray = [];
x = nextX;
y = nextY;
point.x = x;
point.y = y;
tileRect.x = tileWidth;
tileRect.y = tileHeight;
if (animationCount >= animationDelay)
{
animationCount = 0;
if(reverse)
{
currentTile--;
if (currentTile < 1)
{
currentTile = tilesLength - 1;
}
} else {
currentTile++;
if (currentTile >= tilesLength - 1)
{
currentTile = 0;
}
}
} else {
animationCount++;
}
canvasBitmapData.lock();
canvasBitmapData.copyPixels(tileCache[currentTile], tileRect, point);
canvasBitmapData.unlock();
} Geändert von drpelz (26-10-2011 um 00:41 Uhr) |
| | |
| | #2 (permalink) |
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.868
| PHP-Code: PHP-Code: Geändert von thomas_E (26-10-2011 um 05:56 Uhr) |
| | |
| | #3 (permalink) |
| Neuer User Registriert seit: Jul 2011
Beiträge: 26
|
Wow! Vielen Dank! Eine FRage haette ich allerding noch: Du sagst ich habe doppelten Speicherverbrach. Wenn ich mein urspruengliches tileSheet aus dem Speicher loesche sollte doch wieder alles in Ordnung sein, oder? Sollte man ein tileSheet waehrend des Spielprozesses auslesen (z.Bsp. mit copyPixels) oder alles aus einem Array? Was ist schneller? Momentan wird alles aus dem tileSheet in Echtzeit ausgelesen und irgendwie kommt mir mein Spiel seitdem etwas langsamer vor. |
| | |
| | #4 (permalink) | ||
| Keine Panik Registriert seit: Apr 2010 Ort: Düsseldorf (im ernst)
Beiträge: 1.868
|
müsste ich mal testen. sollte eigentlich keinen Unterschied machen, da die selbe Anzahl an Pixeln kopiert und verarbeitet werden muss. Zitat:
(BitmapData.dispose()) Zitat:
das sollte so aussehen: PHP-Code: | ||
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: Jul 2011
Beiträge: 26
|
Rendering funktioniert wieder wirft aber bei mir Fehlermeldungen aus ("Error #2007: Parameter sourceBitmapData must be non-null. at flash.display::BitmapData/copyPixels() at com.framework_mod.src::BasicBlitArrayObject/renderCachedTile()"). Ich vermute der Fehler liegt bei currentTile (bin mir aber nicht 100% sicher). Ich hab 'ne Frage: ich brache ja dieses eine Kachel nur fuer eine pixel-genaue Kollisionsabfrage. Gibt's da irgendwie 'ne Moeglichkeit das TileSheet zu kacheln ohne dass es doppelt so viel Speicher frisst?? Selbst wenn ich tileSheet.dispose mache verbraucht mein Spiel deutlich mehr Speicher als vorher (momentan: 111000 kb, vorher: 89000 kb). Du hattest ja geschrieben , dass man einen Array nur mit den Rects machen kann. Kann man mit diesem Ansatz irgendwie da was machen? Das mit dem Cache hatte ich uebrgiens aus diesem Tutorial hier: http://www.8bitrocket.com/2008/3/25/...eroids-Part-4/ Update: Fehler ist weg. Lag an falschem Wert bei tiles.length. Momentan habe ich 5 verschiedene Caches angelegt, damit jedes unterschiedliche Objekt auf seinen entsprechenden Cache zugreifen kann. Es funktioniert. Die pixel-genaue Abfrage funzt auch wie geschmiert. Bitte nicht hauen - ist das sinnvoll oder voelliger Bloedsinn (funktioniert aber): Code: for each (tempAsteroid in asteroidManager.asteroids) {
//tempAsteroid.renderCachedTile(canvasBitmapData);
switch (tempAsteroid._size) {
case 1:
tempAsteroid.renderCachedTile(canvasBitmapData, asteroidManager.tileCache1);
break;
case 2:
tempAsteroid.renderCachedTile(canvasBitmapData, asteroidManager.tileCache2);
break;
case 3:
tempAsteroid.renderCachedTile(canvasBitmapData, asteroidManager.tileCache3);
break;
case 4:
tempAsteroid.renderCachedTile(canvasBitmapData, asteroidManager.tileCache4);
break;
case 5:
tempAsteroid.renderCachedTile(canvasBitmapData, asteroidManager.tileCache5);
break;
}
} Geändert von drpelz (30-10-2011 um 20:13 Uhr) |
| | |
![]() |
| Lesezeichen |
| Stichworte |
| action script 3, array, cache, spieleentwicklung |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Bitmap-caching - bei vergrößerung funktioniert's nicht | Path00 | Flash Einsteiger | 3 | 08-04-2007 17:57 |
| Automatisches Teil-Ausblenden eines MC funzt nicht richtig | txikitero | Flash MX 2004 | 7 | 11-09-2005 23:12 |
| Preloader eines externen Film funzt nicht | Def-Soul | Flash MX 2004 | 7 | 26-05-2004 15:10 |
| button funzt nicht innerhalb eines movieclips | kronic | Flash MX | 14 | 03-03-2004 13:53 |
| rendering funzt nicht | lindner | Am Rande | 3 | 14-08-2002 21:25 |