2010-04-02 7 views
32

मैं <canvas> का समर्थन करने वाले तेज़ ब्राउज़र के लिए एक आइसोमेट्रिक गेम पर काम कर रहा हूं, जो बहुत मजेदार है। प्रत्येक टाइल की जानकारी बचाने के लिए, मैं एक दो आयामी सरणी जो की तरह, टाइल आईडी का प्रतिनिधित्व संख्या शामिल का उपयोग करें:एक आइसोमेट्रिक गेम के टाइल डेटा को बचाने के लिए सबसे प्रभावी तरीका

var level = [[1, 1, 1, 2, 1, 0], 
      [0, 1, 1, 2, 0, 1], 
      [0, 1, 1, 2, 1, 1]]; 

var tiles = [ 
    {name: 'grass', color: 'green'}, 
    {name: 'water', color: 'blue'}, 
    {name: 'forest', color: 'ForestGreen'} 
]; 

अब तक यह अच्छा काम करता है, लेकिन अब मैं ऊंचाई और इस तस्वीर में की तरह ढलानों के साथ काम करना चाहते हैं : alt text http://harmen.no-ip.org/isometrictiles.png

प्रत्येक टाइल के लिए मुझे इसकी टाइल आईडी, ऊंचाई और जानकारी को किनारों के ऊपर की ओर से सहेजने की आवश्यकता है।

मैं सभी चार कोनों में से एक बिटवाइज़ प्रतिनिधित्व के बारे में एक साधारण विचार के साथ आया था, इस तरह:

1011 // top, bottom and left corner turned up 

मेरा प्रश्न है: क्या प्रत्येक कक्ष के लिए इन तीन मूल्यों को बचाने के लिए सबसे कारगर तरीका है? क्या इन तीन मानों को एक पूर्णांक के रूप में सहेजना संभव है?

+8

+1 :) – cletus

+4

+1 उत्कृष्ट प्रश्न। खेल में रुचि रखते हैं। –

+1

+1 न केवल तस्वीर बल्कि प्रश्न की समग्र स्पष्टता के लिए। किसी ऐसे व्यक्ति को देखना वाकई अच्छा होता है जो अपना समय पूरी तरह से एक प्रश्न पूछने में लेता है। अस्पष्टता से बचने के लिए – Ricket

उत्तर

14

यदि आप तस्वीर की तरह कुछ करने की कोशिश कर रहे हैं तो आपको स्टोर करने की आवश्यकता नहीं है कि कौन से कोनों को ऊपर/नीचे रखा गया है क्योंकि इसे आसपास के टाइल्स से लिया जा सकता है।

उदाहरण के लिए यदि वर्तमान टाइल अ n और मौजूदा टाइल से टाइल एक ऊपर की ऊंचाई है ऊंचाई n+1 है तो मौजूदा टाइल "शीर्ष कोने तक" होना आवश्यक है

वाह! धन्यवाद! मैं इसे लागू करने की कोशिश करूंगा। आपके उत्तर को पूरा करने के लिए एक और विचार: क्या ऊंचाई और टाइल आईडी को पूर्णांक के रूप में स्टोर करना संभव है?

हां। आपको Bitwise Operations का उपयोग करने की आवश्यकता होगी।

आप समान रूप से ऊंचाई और आईडी के बीच पूर्णांक विभाजित हैं ऊंचाई के लिए पहले 16 बिट और आईडी के बाकी

var id = tile & 0x0000FFFF; //mask the first 16 bits 
var height = tile >>> 16; //shift the first 16 bits to the right 

सेटिंग एक समान मन्नार

tile &= 0xFFFF0000; //remove id bits 
tile |= id; //set new id 

tile &= 0x0000FFFF; //remove height bits 
tile |= (height << 16); 
+5

+1, लेकिन सेल ऊंचाइयों की बजाय कोने ऊंचाई को स्टोर करें। –

+0

ग्रेट! धन्यवाद! मैं इसे लागू करने की कोशिश करूंगा। आपके उत्तर को पूरा करने के लिए एक और विचार: क्या 'ऊंचाई' और 'टाइल आईडी' को पूर्णांक के रूप में स्टोर करना संभव है? – Harmen

+0

ग्रेट समाधान। हालांकि, प्रत्येक कोने की ऊंचाई को स्टोर करने से अधिक CPU महंगा है। (सभी कोनों की ऊंचाई निर्धारित करने के लिए, इसे 9 बिट-लुकअप करना चाहिए, उनके बिट शिफ्ट के साथ।) – Pindatjuh

0

हैं में किया जा सकता का उपयोग कर ऊंचाई [0, 255] रेंज में है, आप बिट हेरफेर का उपयोग करके एक ही पूर्णांक में 4 ऊंचाइयों को बचा सकते हैं। हेक्स में:

0xAABBCCDD, ए.ए. = पहले ऊंचाई, बी बी = दूसरा, आदि ..

सबसे बाईं ओर ऊंचाई आप ((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF करना होगा, जो 170 (0xAA) रिटर्न प्राप्त करने के लिए।

यह सेट करने के लिए: integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

+0

की ऊंचाई को संग्रहीत करने पर एक स्पेस लाभ प्रदान करेगा, लेकिन आप निश्चित रूप से ऐसा कर सकते हैं, लेकिन याद रखें कि जावास्क्रिप्ट सभी संख्याओं के लिए फ़्लोटिंग पॉइंट का उपयोग करता है, इसलिए दक्षता जिसे आप सी ++ में प्राप्त करेंगे या जो भी वास्तव में लागू नहीं होगा। – Pointy

3

हाँ, आप कर सकते हैं:

var corners = 11; // binary 1011; 
var topCornerUp = corners & 0x8; 
var bottomCornerUp = corners & 0x2; 

आप इसे अनुकूलित करना चाहते हैं, हालांकि, पर वे कौन-Yacoby said - आप कोनों की एक सरणी के बजाय उन्हें बचाने के संग्रहीत कर सकती है प्रत्येक टाइल के लिए अलग से।

0

क्षेत्र आयताकार है? यदि यह है कि आप आसानी से क्षेत्र की चौड़ाई और ऊंचाई, टाइल लंबाई और चरम ऊंचाई का प्रतिनिधित्व करने वाले पूर्णांक की एक सरणी स्टोर कर सकते हैं।चित्र के लिए

संबंधित मुद्दे