एक आस्की नक्शा बनाने और एक ब्राउज़र (जैसे बौना किले) में चलती पात्रों के लिए अच्छे तकनीकी समाधान? [बन्द है]


10

मैं अपनी गेम वेबसाइट के लिए एक वेबऐप बनाना चाहता हूं जिसमें जानवरों और लोगों का प्रतिनिधित्व करने के लिए पाठ वर्णों का उपयोग करना शामिल है, और उन्हें स्वतंत्र (सर्वर संचालित) एआई के साथ मैप स्क्वायर पर ले जाना है।

इसलिए अनिवार्य रूप से, ब्राउज़र में एक बौना-किला नक्शा: बौना किले-उदाहरण चलती प्राणियों, मॉब, एन पीसी और पीसी के साथ। हालांकि ऐसा नहीं है कि मैं इस पैमाने को स्वीकार नहीं कर रहा हूं, मैं शायद इस सामग्री का एक चौथाई या किसी भी समय दिखाना शुरू कर दूंगा।

संभवतः कुछ पृष्ठभूमि / इम्मोबाइल टाइल्स को स्टैटिकली लोड किया जा सकता है। लेकिन प्राणियों / जानवरों और उन चीजों के लिए जो आगे बढ़ सकते हैं, मुझे यकीन नहीं है कि प्रौद्योगिकी समाधान सबसे प्रभावी होगा।

मैं के बारे में पता कर रहा हूँ <canvas>हालांकि मैं नहीं पता कि अपनी क्षमताओं उपयोग के इस मामले फिट। निश्चित रूप से कुछ राशि जावास्क्रिप्ट आवश्यक होने वाली है।

क्या वहाँ जावास्क्रिप्ट लाइब्रेरी या कैनवास लाइब्रेरी हैं जो इस उपयोग के मामले में फिट हैं? एक और तकनीक जिसके बारे में मुझे जानकारी नहीं है? किसी को भी उन वेबसाइटों के किसी भी उदाहरण के बारे में पता है, जिन्होंने इसके समान कुछ भी किया है, ताकि मैं उनसे विचारों को पालना कर सकूं?



खैर, rot.js ठीक वही हो सकता है जो मैं देख रहा था, लेकिन यह नहीं जानता था।
कजकाई

जवाबों:


5

मैंने वास्तव में वेब के लिए एक चरित्र प्रदर्शन पुस्तकालय बनाया है, यूनिकोडेटाइल्स.जेएस , जिसे मैंने न केवल अनुकूलन के लिए कुछ समय बिताया है, बल्कि यह पाठ को प्रस्तुत करने के विभिन्न तरीकों की पड़ताल भी करता है; इसके तीन रेंडर हैं:

  1. DOM, जो <div>प्रत्येक ग्लिफ़ को अनुकूलन योग्य अग्रभूमि और पृष्ठभूमि रंगों के साथ रेंडर करने के लिए तत्वों के एक मैट्रिक्स का उपयोग करता है ।
  2. कैनवस, जो <canvas>तत्व का उपयोग करके वर्णों को आकर्षित करता है। यह बहुत तेज़ है, और प्रदर्शन परीक्षण ऐसे हैं कि वापस जाएं: http://tapiov.net/unicodetiles.js/tests/
  3. WebGL, जो एक फॉन्ट टेक्सचर बनाने के लिए कैनवस-एलिमेंट का उपयोग करता है और फिर WebGL का उपयोग करके रेंडर करता है, जो कि बड़े व्यूपोर्ट आकारों में और भी तेज और बहुत स्केलेबल है, लेकिन साथ ही साथ ब्राउज़रों में समर्थित नहीं है।

ध्यान दें कि लिंक किए गए प्रदर्शन परीक्षण बहुत चरम हो सकते हैं, हर फ्रेम को हर चरित्र को बदल सकते हैं। व्यवहार में, यहां तक ​​कि डोम रेंडरर अधिकांश प्रयोजनों के लिए काफी तेज है।

यदि आप अपनी खुद की लाइब्रेरी बनाने का निर्णय लेते हैं, तो मैं अभी भी कैनवास का उपयोग करने की सलाह दूंगा क्योंकि यह बेहतर प्रदर्शन करता है, जिससे बड़े दृश्यों की अनुमति मिलती है। केवल WebGL का उपयोग करने से उपयोगकर्ता का आधार सीमित हो जाएगा और इसे लागू करना जटिल है (Unicodetiles में स्वचालित फ़ॉलबैक तंत्र है)।


एक और पुस्तकालय, जिसके बारे में मैंने सुना है कि हाल ही में बहुत कुछ सुझाया गया है । यह विशेष रूप से roguelikes की ओर तैयार है क्योंकि यह FOV प्रणाली और कालकोठरी जनरेटर के साथ आता है। यदि आप एक पूर्ण पैकेज चाहते हैं, तो यह जाने का रास्ता हो सकता है।


अच्छा लगा। मैं उसका उपयोग कर सकता हूं। या कम से कम उस तरीके से सीखें जिस तरह से किसी और ने अपने दृष्टिकोण को सूचित करने के लिए किया था, क्योंकि मैं एक रगूलाइक बनाना चाहता हूं, लेकिन रग्गुलाइक की तरह नहीं। : डी
कज़कई

@ टैपिओ मैं यूनिकोडेटाइल्स के साथ पैक्समैन को लागू करने की कोशिश कर रहा हूं, समस्या खिलाड़ी हमेशा नक्शे में केंद्रित है, यह पैक्मैन के लिए अवांछनीय है, क्या मैं इसे किसी भी तरह से अक्षम कर सकता हूं, या क्या मैं खिलाड़ी को निर्दिष्ट किए बिना आसपास पहुंच सकता हूं।
user3995789

6

मुझे लगता है कि सबसे प्रभावी तरीका सिर्फ इसे नकली करना होगा। स्प्राइट फॉन्ट में निर्मित अपने स्वयं के उपयोग से कुछ लक्ष्य तत्व तक पहुँचाना जैसे कि आप एक सामान्य 2 डी स्क्रीन प्रदान कर रहे हैं। यह दृष्टिकोण सुनिश्चित करता है कि कोई भी अजीब चीज तब न हो जब लोग लापता फॉन्ट हैं, या एक बहुत अलग भाषा (चीनी, रूसी) का उपयोग कर रहे हैं।

सभी ब्राउज़रों पर सभी स्थानों में पिक्सेल सही पाने के लिए फ़ॉन्ट्स और पाठ सबसे कठिन बात है। यहां तक ​​कि जब एक फ़ॉन्ट एम्बेड करना और कुछ सीएसएस जादू ब्राउज़र और प्रयोज्य सेटिंग्स का उपयोग करना अभी भी इसे ओवरराइड और बदल सकता है। सामान्य वेबसाइटों के लिए पिक्सेल-परफेक्ट टेक्स्ट कोई समस्या नहीं है, लेकिन बौने किले जैसे गेम में कुछ पिक्सेल बहुत ही असंगत दृश्य पैदा कर सकते हैं। यहां तक ​​कि जब एक ब्राउज़र का उपयोग नहीं कर रहा है, लेकिन एक सामान्य अनुप्रयोग पाठ रेंडरिंग के साथ समस्याएँ हैं। यहां तक ​​कि बौना किला भी मेरे द्वारा बताए गए दृष्टिकोण का उपयोग करता है।

http://en.wikipedia.org/wiki/Dwarf_Fortress

ऑन-स्क्रीन डिस्प्ले, बिटगैप के रूप में कार्यान्वित 16 अलग-अलग रंगों में थोड़ा संशोधित कोड पेज 437 वर्णों का उपयोग करता है, जो ओपनगेल के साथ प्रस्तुत किया गया है

संपादित करें: क्योंकि मुझे कुछ टिप्पणियां मिलीं, मैंने उत्तर को थोड़ा बढ़ाया


क्या अन्य भाषाएँ ASCII के प्रतिस्थापन के बजाय विस्तार नहीं हैं? सामान्य पाठ-युक्त वेबसाइटें "नकली" क्यों नहीं हैं?
एको

1
अधिकांश वर्ण एन्कोडिंग समस्याओं को UTF-8 एन्कोडिंग का उपयोग करके रोका जा सकता है।
फिलिप

रूसी में एएससीआईआई की तुलना में एक अलग फ़ॉन्ट है, और चीनी और भी अलग है। सौंदर्यशास्त्र के बारे में सामान्य वेबसाइट देखभाल, जिसमें चर आकार के ग्लिफ़्स, कर्लिंग, पाठ का अच्छा "प्रवाह" आदि शामिल हैं। डीएफ-जैसे गेम अक्षरों की नियमित नियुक्ति के बारे में परवाह करता है, जो वेब ब्राउज़र में मज़बूती से नहीं किया जा सकता है।
लियोसन

1
@ Liosan यकीन है कि यह कर सकते हैं। बस सीएसएस घोषणा का उपयोग करें font-family:monospace;और वेब ब्राउज़र डिफ़ॉल्ट मोनोस्पेस फ़ॉन्ट का उपयोग करेगा।
फिलिप

मुझे वास्तव में यकीन नहीं है कि यह एक एम्बेडेड सीएसएस मोनोस्पेस-फैमिली वेब फ़ॉन्ट बनाम लाभ का कैसे होगा? मेरा मतलब है, यह अधिक प्रतिपादन करेगा, माएबे यह मुद्दों को फैलाने के लिए अधिक मज़बूती से हल करने की अनुमति देगा, लेकिन एक एम्बेडेड सीएसएस फ़ॉन्ट के साथ यह कोई फर्क नहीं पड़ता कि क्या लोग फ़ॉन्ट को याद कर रहे थे या एक अलग भाषा का उपयोग कर रहे थे? हालांकि मुझे लगता है कि ऑपरेशनों को सिर्फ एम्बेडेड वेब फॉन्ट के कैरेक्टर सेट, हम्मम तक ही सीमित रखा जाएगा।
कजकाई

3

आपके द्वारा आउटपुट की जाने वाली लाइनों और स्तंभों की संख्या का पता लगाने के लिए, आपको खिड़की की चौड़ाई और ऊंचाई की जांच करनी चाहिए और उसके अनुसार इसे बदलना चाहिए। OnResize घटनाओं को सुनने के लिए याद रखें और तदनुसार चौड़ाई और ऊंचाई को संशोधित करें।

जब आप इसे शाब्दिक तरीके से करना चाहते हैं , तो आप पाठ का उपयोग एक मोनोसैप्ड फ़ॉन्ट और एक तालिका के साथ कर सकते हैं जहां प्रत्येक कक्ष में एक वर्ण होता है।

व्यक्तिगत वर्णों को संबोधित करने के लिए आप <table>सही संख्या में पंक्तियों और स्तंभों के साथ बना सकते हैं , जहां प्रत्येक <td>में एक आईडी होती है जिसमें उसके x- और y- निर्देशांक होते हैं। इस तरह से आप आईडी द्वारा अलग-अलग सेल को संबोधित कर सकते हैं और पत्र को बदलने के लिए उनके आंतरिक HTML को बदल सकते हैं और उनके रंग को बदलने के लिए अपने सीएसएस वर्ग को बदल सकते हैं।

एक कैनवास का उपयोग करना , हालांकि, तेज हो सकता है क्योंकि आपको प्रत्येक चरित्र के लिए एक बड़े डोम ट्री को हेरफेर करने की आवश्यकता नहीं है जो आपको बदलना है। बौना किला वैसे ही काम कर रहा है। जिन वस्तुओं का उपयोग वस्तुओं को दर्शाने के लिए किया जाता है, वे वास्तव में बिटमैप होते हैं, न कि सच्चे टेक्स्ट आउटपुट के लिए, और वे 2d ग्राफिक एपीआई का उपयोग करके तैयार किए जाते हैं। HTML5 कैनवास इसके लिए अच्छी तरह से सुसज्जित है। इसमें संदर्भ है। FillText विधि जो आपको कैनवास पर पाठ आकर्षित करने की अनुमति देती है। इसका उपयोग व्यक्तिगत पात्रों को आकर्षित करने के लिए किया जा सकता है। आप चर जोड़ तोड़ द्वारा आकार और फ़ॉन्ट चेहरा बदल सकते हैं context.font और फोन करके प्रत्येक अक्षर के रंग context.fillStyle

ध्यान दें कि प्रति फ्रेम सैकड़ों बार भरने वाले टैक्स्ट को धीमा किया जा सकता है, क्योंकि रैस्टराइजिंग फोंट महंगा है और कोई भी ब्राउज़र जिसे मैं कैशिंग के उपयोग के बारे में नहीं जानता हूं। इसका मतलब यह है कि जब आप एक ही अक्षर को सौ बार एक ही सेटिंग्स के साथ रेंडर करते हैं, तो यह एक सौ बार री-राइज़ हो जाएगा। प्रदर्शन आप एक छिपा हुआ कैनवास पर प्रत्येक रंग के साथ प्रत्येक अक्षर के रास्टराज़ उपस्थिति कैश सकता है बढ़ाने के लिए और उसके बाद इन छिपे हुए का उपयोग कर कैनवस आकर्षित context.drawImage । एक कैनवास से दूसरे में कॉपी करना आमतौर पर फ़ॉन्ट रैस्टोरेशन की तुलना में बहुत तेज होता है।

मैं वर्तमान में कैनवास का उपयोग करके 2d गेम विकसित कर रहा हूं, और ध्यान दिया कि सबसे बड़ा एफपीएस खाने वाला फ़ॉन्ट ड्राइंग था। जब मैंने rasterized पाठ के लिए कैश जोड़ा, तो इसने प्रदर्शन में बहुत सुधार किया।


बिटमैप फोंट सच पाठ आउटपुट भी हैं! मैं उन्हें हर समय एक टर्मिनल में उपयोग करता हूं। इसके अलावा, यदि कोई कैनवास तेज है, तो StackExchange का टेक्स्ट कैनवास आधारित क्यों नहीं है?
एको

लानत है, अब मैं उसके लिए एक पुस्तकालय लिखना चाहता हूं।
फिलीपींस

@Anko टर्मिनल! = वेब ब्राउज़र। आप वास्तव में किस पाठ का प्रतिपादन कर रहे हैं?
फिलिप

1
Anko का कहना है कि जैसे बिटमैप वाले फॉन्ट सच-टेक्स्ट होते हैं, वह उन्हें अपने टर्मिनल में इस्तेमाल कर सकता है - और यही कारण है कि बिटमैप वाले फॉन्ट सच-टेक्स्ट हैं।
ध्रुवीय

0

ठीक है यह अंधेरे में सिर्फ एक छुरा है और मुझे नहीं पता कि यह कैसे होता है।

मूल रूप से आप उसी ट्रिक कंसोल (उर्फ टर्मिनल) का उपयोग पुराने दिनों में करते थे। सबसे पहले आप एक मोनोस्पेस फ़ॉन्ट से शुरू करते हैं। आपके पास N अक्षर वाली M लाइनें हैं। तो आप बस एक div में पाठ को डंप करें जो कि पर्याप्त चौड़ा हो (चौड़ाई: N em?) और हर N अक्षर को एक लाइन ब्रेक लगाएं; इस मामले में एक के <br/>बजाय एक \n

चाल बफर या पूरी तरह से चार या जावा स्क्रिप्ट के साथ एक बार में पूरी सामग्री को बदलने के लिए है।

यदि आप वास्तव में विशिष्ट प्राप्त करना चाहते हैं, तो आप यह सुनिश्चित करने के लिए @ फ़ॉन्ट-चेहरे का उपयोग कर सकते हैं कि आपके पास हर जगह एक ही मोनोस्पेस है।


मैंने ऐसा करने के बारे में भी सोचा था, लेकिन तब मुझे महसूस हुआ कि जब आप प्रत्येक व्यक्तिगत चरित्र के रंग और पृष्ठभूमि-रंग को नियंत्रित करना चाहते हैं तो यह एक अच्छा वास्तुशिल्प नहीं होगा।
फिलिप

0

ग्लिफ़ के संदर्भ में सोचें। इसके पीछे के अर्थ से पाठ के प्रदर्शन को कम करें। उदाहरण के लिए:

(छद्म कोड)

if (display.hitGlyph)
    glyph = Glyph.Asterisk;

display(glyph);

और फिर ग्लिफ़ एटलस को परिभाषित करने के लिए अपने अंतर्निहित कोड में, बस कुछ इस प्रकार करें:

Glyph.Asterisk = "*";

ग्लिफ़ एटलस वास्तव में विभिन्न एन्कोडिंग्स के साथ एक आस्की टेबल में एक खोज हो सकता है। यहां बिंदु केवल प्रदर्शित करने के लिए अलग करने के लिए है, जिसे प्रदर्शित किया जाना है। मैं खरोंच से एक रूपरेखा बनाने की सिफारिश करूंगा। यह आपको और अधिक स्वतंत्रता देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.