@@ -0,0 +1,134 @@ | |||
Title: CLD: Context generation | |||
Date: 2025-03-11 00:00 | |||
Category: News | |||
Slug: cld_ctx-gen | |||
Lang: en | |||
![splash][splash] | |||
# Context generation | |||
In February I've updated the **C**ross-**l**anguage **d**ialect (CLD) translator to | |||
generate Context out of YML. The generated Contexts have already been | |||
used for the following projects: | |||
* CLD (the CLD translator generated its own Context) | |||
* LHA | |||
* PSKOV | |||
I never really took time to explain what Context is, so here's | |||
a very short explanation: Context is very close to | |||
[Store in Redux][store]. I'm afraid this is not yet the time | |||
to explain Context in detail because I don't yet have a good | |||
argument why you need Context. Once that time comes I do it. | |||
Now let's get back to the Context generation. Here's how LHA's YML for Context looks like: ([entities.yml][entities]): | |||
``` | |||
# Application state context | |||
Context: | |||
type: context | |||
fields: | |||
# Command line arguments | |||
arguments: [String] | |||
consoleOutput: String | |||
defaultDir: String | |||
didLaunch: Bool | |||
dir: String | |||
httpDefaultPort: Int | |||
httpLaunch: Bool | |||
httpPort: Int | |||
httpReply: String | |||
httpRequest: NetRequest | |||
``` | |||
CLD translator converts it to the following code in Kotlin ([entities.kt][entities-result]): | |||
``` | |||
// Application state context | |||
data class Context( | |||
// Command line arguments | |||
var arguments: Array<String> = arrayOf(), | |||
var consoleOutput: String = "", | |||
var defaultDir: String = "", | |||
var didLaunch: Boolean = false, | |||
var dir: String = "", | |||
var httpDefaultPort: Int = 0, | |||
var httpLaunch: Boolean = false, | |||
var httpPort: Int = 0, | |||
var httpReply: String = "", | |||
var httpRequest: NetRequest = NetRequest(), | |||
override var recentField: String = "", | |||
): CLDContext { | |||
override fun <T> field(name: String): T { | |||
if (name == "arguments") { | |||
return arguments as T | |||
} else if (name == "consoleOutput") { | |||
return consoleOutput as T | |||
} else if (name == "defaultDir") { | |||
return defaultDir as T | |||
} else if (name == "didLaunch") { | |||
return didLaunch as T | |||
} else if (name == "dir") { | |||
return dir as T | |||
} else if (name == "httpDefaultPort") { | |||
return httpDefaultPort as T | |||
} else if (name == "httpLaunch") { | |||
return httpLaunch as T | |||
} else if (name == "httpPort") { | |||
return httpPort as T | |||
} else if (name == "httpReply") { | |||
return httpReply as T | |||
} else if (name == "httpRequest") { | |||
return httpRequest as T | |||
} | |||
return "unknown-field-name" as T | |||
} | |||
override fun selfCopy(): CLDContext { | |||
return this.copy() | |||
} | |||
override fun setField( | |||
name: String, | |||
value: Any? | |||
) { | |||
if (name == "arguments") { | |||
arguments = value as Array<String> | |||
} else if (name == "consoleOutput") { | |||
consoleOutput = value as String | |||
} else if (name == "defaultDir") { | |||
defaultDir = value as String | |||
} else if (name == "didLaunch") { | |||
didLaunch = value as Boolean | |||
} else if (name == "dir") { | |||
dir = value as String | |||
} else if (name == "httpDefaultPort") { | |||
httpDefaultPort = value as Int | |||
} else if (name == "httpLaunch") { | |||
httpLaunch = value as Boolean | |||
} else if (name == "httpPort") { | |||
httpPort = value as Int | |||
} else if (name == "httpReply") { | |||
httpReply = value as String | |||
} else if (name == "httpRequest") { | |||
httpRequest = value as NetRequest | |||
} | |||
} | |||
} | |||
``` | |||
# March | |||
Kotlin is currently the anchor programming language of CLD. Thus, to use Kotlin, | |||
one would have to install related Java tools (Gradle, Android Studio or JVM itself). | |||
Such a requirement makes it impossible to have a web browser only development | |||
tool. And being able to code in a web browser is something I consider the | |||
key feature for code portability. | |||
That's why in March I plan to create the draft of a tool running in a web browser. | |||
[entities]: https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml | |||
[entities-result]: https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3 | |||
[splash]: ../../images/2025-03_redux-data-flow.jpg | |||
[store]: https://redux.js.org/introduction/getting-started#basic-example |
@@ -0,0 +1,168 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta charset="utf-8"> | |||
<head> | |||
<link rel="stylesheet" href="../../style.css"> | |||
</head> | |||
<body> | |||
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script> | |||
<div id="header"> | |||
<div class="header2"> | |||
<div class="menu"> | |||
<a href="../../en/news/index.html">News</a> | |||
<a href="../../en/game/index.html">Games</a> | |||
<a href="../../en/tool/index.html">Tools</a> | |||
<a href="../../en/page/about.html">About</a> | |||
</div> | |||
<div id="lang"> | |||
<a href="../../en/news/cld_ctx-gen.html">EN</a> | |||
<a href="../../ru/news/cld_ctx-gen.html">RU</a> | |||
</div> | |||
<div class="clear"></div> | |||
</div> | |||
</div> | |||
<h3 class="left_item_title">In the news...</h3> | |||
<center> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="cld_ctx-gen.html">CLD: Context generation</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2025-03-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2025-03_redux-data-flow.jpg" alt="splash" /></p> | |||
<h1 id="contextgeneration">Context generation</h1> | |||
<p>In February I've updated the <strong>C</strong>ross-<strong>l</strong>anguage <strong>d</strong>ialect (CLD) translator to | |||
generate Context out of YML. The generated Contexts have already been | |||
used for the following projects:</p> | |||
<ul> | |||
<li>CLD (the CLD translator generated its own Context)</li> | |||
<li>LHA</li> | |||
<li>PSKOV</li> | |||
</ul> | |||
<p>I never really took time to explain what Context is, so here's | |||
a very short explanation: Context is very close to | |||
<a href="https://redux.js.org/introduction/getting-started#basic-example">Store in Redux</a>. I'm afraid this is not yet the time | |||
to explain Context in detail because I don't yet have a good | |||
argument why you need Context. Once that time comes I do it.</p> | |||
<p>Now let's get back to the Context generation. Here's how LHA's YML for Context looks like: (<a href="https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml">entities.yml</a>):</p> | |||
<pre><code># Application state context | |||
Context: | |||
type: context | |||
fields: | |||
# Command line arguments | |||
arguments: [String] | |||
consoleOutput: String | |||
defaultDir: String | |||
didLaunch: Bool | |||
dir: String | |||
httpDefaultPort: Int | |||
httpLaunch: Bool | |||
httpPort: Int | |||
httpReply: String | |||
httpRequest: NetRequest | |||
</code></pre> | |||
<p>CLD translator converts it to the following code in Kotlin (<a href="https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3">entities.kt</a>):</p> | |||
<pre><code>// Application state context | |||
data class Context( | |||
// Command line arguments | |||
var arguments: Array<String> = arrayOf(), | |||
var consoleOutput: String = "", | |||
var defaultDir: String = "", | |||
var didLaunch: Boolean = false, | |||
var dir: String = "", | |||
var httpDefaultPort: Int = 0, | |||
var httpLaunch: Boolean = false, | |||
var httpPort: Int = 0, | |||
var httpReply: String = "", | |||
var httpRequest: NetRequest = NetRequest(), | |||
override var recentField: String = "", | |||
): CLDContext { | |||
override fun <T> field(name: String): T { | |||
if (name == "arguments") { | |||
return arguments as T | |||
} else if (name == "consoleOutput") { | |||
return consoleOutput as T | |||
} else if (name == "defaultDir") { | |||
return defaultDir as T | |||
} else if (name == "didLaunch") { | |||
return didLaunch as T | |||
} else if (name == "dir") { | |||
return dir as T | |||
} else if (name == "httpDefaultPort") { | |||
return httpDefaultPort as T | |||
} else if (name == "httpLaunch") { | |||
return httpLaunch as T | |||
} else if (name == "httpPort") { | |||
return httpPort as T | |||
} else if (name == "httpReply") { | |||
return httpReply as T | |||
} else if (name == "httpRequest") { | |||
return httpRequest as T | |||
} | |||
return "unknown-field-name" as T | |||
} | |||
override fun selfCopy(): CLDContext { | |||
return this.copy() | |||
} | |||
override fun setField( | |||
name: String, | |||
value: Any? | |||
) { | |||
if (name == "arguments") { | |||
arguments = value as Array<String> | |||
} else if (name == "consoleOutput") { | |||
consoleOutput = value as String | |||
} else if (name == "defaultDir") { | |||
defaultDir = value as String | |||
} else if (name == "didLaunch") { | |||
didLaunch = value as Boolean | |||
} else if (name == "dir") { | |||
dir = value as String | |||
} else if (name == "httpDefaultPort") { | |||
httpDefaultPort = value as Int | |||
} else if (name == "httpLaunch") { | |||
httpLaunch = value as Boolean | |||
} else if (name == "httpPort") { | |||
httpPort = value as Int | |||
} else if (name == "httpReply") { | |||
httpReply = value as String | |||
} else if (name == "httpRequest") { | |||
httpRequest = value as NetRequest | |||
} | |||
} | |||
} | |||
</code></pre> | |||
<h1 id="march">March</h1> | |||
<p>Kotlin is currently the anchor programming language of CLD. Thus, to use Kotlin, | |||
one would have to install related Java tools (Gradle, Android Studio or JVM itself). | |||
Such a requirement makes it impossible to have a web browser only development | |||
tool. And being able to code in a web browser is something I consider the | |||
key feature for code portability.</p> | |||
<p>That's why in March I plan to create the draft of a tool running in a web browser.</p> | |||
</div> | |||
</div> | |||
<div id="disqus_thread"></div> | |||
<script> | |||
var disqus_config = function () { | |||
this.page.url = "https://opengamestudio.org/en/news/cld_ctx-gen.html"; | |||
this.page.identifier = "cld_ctx-gen.html"; | |||
}; | |||
(function() { // DON'T EDIT BELOW THIS LINE | |||
var d = document, s = d.createElement('script'); | |||
s.src = 'https://opengamestudio.disqus.com/embed.js'; | |||
s.setAttribute('data-timestamp', +new Date()); | |||
(d.head || d.body).appendChild(s); | |||
})(); | |||
</script> | |||
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript> | |||
<div id="footer"> | |||
The site has been generated by <a href="http://opengamestudio.org/pskov">PSKOV</a> | |||
from <a href="http://github.com/ogstudio/site-opengamestudio">this source code</a>. | |||
</div> | |||
</center> | |||
</body> | |||
</html> |
@@ -25,6 +25,32 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="cld_ctx-gen.html">CLD: Context generation</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2025-03-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2025-03_redux-data-flow.jpg" alt="splash" /></p> | |||
<h1 id="contextgeneration">Context generation</h1> | |||
<p>In February I've updated the <strong>C</strong>ross-<strong>l</strong>anguage <strong>d</strong>ialect (CLD) translator to | |||
generate Context out of YML. The generated Contexts have already been | |||
used for the following projects:</p> | |||
<ul> | |||
<li>CLD (the CLD translator generated its own Context)</li> | |||
<li>LHA</li> | |||
<li>PSKOV</li> | |||
</ul> | |||
<p>I never really took time to explain what Context is, so here's | |||
a very short explanation: Context is very close to | |||
<a href="https://redux.js.org/introduction/getting-started#basic-example">Store in Redux</a>. I'm afraid this is not yet the time | |||
to explain Context in detail because I don't yet have a good. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="cld_ctx-gen.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="psk-jvm-item.html">PSKOV 2 for JVM</a> | |||
</h2> | |||
@@ -218,28 +244,8 @@ gamejam of <a href="https://dtf.ru/games/2783053-nachni-igru-ocenka-videorolikov | |||
<div class="news_item_more"> | |||
<a href="memory-gui.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-text-ui.html">"Memory" text UI</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2024-06-14 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<h1 id="memorytextui">"Memory" text UI</h1> | |||
<p>In May I implemented text UI for "Memory" game in Python. And converted it to C++ | |||
by the instrument under development.</p> | |||
<p>Game logic cycle implementation lead to the creation of a controller that manages | |||
context. Creating the controller in Python was straightforward. C++ version took | |||
some time, because the controller needs <a href="https://en.cppreference.com/w/cpp/utility/any">std::any</a>, which is part of C++17. | |||
The instrument under development is limited to C++11 in order to support OpenWrt.</p> | |||
<p>Here's how much code I wrote (in lines):. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="memory-text-ui.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 1 of 8</p> | |||
<p class="pagination_title">Page 1 of 9</p> | |||
<p> | |||
<a href="index2.html">Older »</a> | |||
</p> | |||
@@ -25,6 +25,26 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-text-ui.html">"Memory" text UI</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2024-06-14 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<h1 id="memorytextui">"Memory" text UI</h1> | |||
<p>In May I implemented text UI for "Memory" game in Python. And converted it to C++ | |||
by the instrument under development.</p> | |||
<p>Game logic cycle implementation lead to the creation of a controller that manages | |||
context. Creating the controller in Python was straightforward. C++ version took | |||
some time, because the controller needs <a href="https://en.cppreference.com/w/cpp/utility/any">std::any</a>, which is part of C++17. | |||
The instrument under development is limited to C++11 in order to support OpenWrt.</p> | |||
<p>Here's how much code I wrote (in lines):. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="memory-text-ui.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-logic.html">"Memory" game logic</a> | |||
</h2> | |||
@@ -197,25 +217,8 @@ not the hardware one. Today I can confidently say I found the necessary. . .</p> | |||
<div class="news_item_more"> | |||
<a href="teaching-to-program-2019.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">The pros and cons of restarting from scratch</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2020-01-01 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2020-01-01-ny.jpg" alt="Happy 2020" /></p> | |||
<p>Anyone, who watches our progress long enough, can say that we restarted the development from scratch plenty of times.</p> | |||
<p>Even before releasing <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>, we changed the underlying technology more than once. After that, we did it again several times, throwing away already completed features. | |||
It seems that right now we have less completed features than before the release of <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>. It's true, but not entirely.</p> | |||
<p>When <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a> was released, we had a descent looking (for that moment) open-source game, that worked under Windows and Linux. With some luck and effort it still works today, but not out of the box.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 2 of 8</p> | |||
<p class="pagination_title">Page 2 of 9</p> | |||
<p> | |||
<a href="index.html">« Newer</a> | |||
<a href="index3.html">Older »</a> | |||
@@ -25,6 +25,23 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">The pros and cons of restarting from scratch</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2020-01-01 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2020-01-01-ny.jpg" alt="Happy 2020" /></p> | |||
<p>Anyone, who watches our progress long enough, can say that we restarted the development from scratch plenty of times.</p> | |||
<p>Even before releasing <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>, we changed the underlying technology more than once. After that, we did it again several times, throwing away already completed features. | |||
It seems that right now we have less completed features than before the release of <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>. It's true, but not entirely.</p> | |||
<p>When <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a> was released, we had a descent looking (for that moment) open-source game, that worked under Windows and Linux. With some luck and effort it still works today, but not out of the box.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="on-the-way-to-durable-applications.html">On the way to durable applications</a> | |||
</h2> | |||
@@ -172,23 +189,8 @@ | |||
<div class="news_item_more"> | |||
<a href="example-driven-development.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="openscenegraph-examples.html">OpenSceneGraph cross-platform examples</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2018-04-20 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2018-04-20-openscenegraph-examples.png" alt="iOS Simulator renders a cube" /></p> | |||
<p>This article summarizes the work we did to produce the first two cross-platform OpenSceneGraph examples.</p> | |||
<p>By the time <a href="mahjong-techdemo1-gameplay.html">the first technology demonstration of OGS Mahjong 2</a> has been released, we've already had <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide/issues/4">issue request</a> (to explain how to load images with OpenSceneGraph on Android) hanging for some time. We considered creating a new tutorial for <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide">OpenSceneGraph cross-platform guide</a> at first. However, we realized that it's time-consuming and excessive for such a tiny topic (compared to what an average game has) as image loading. We decided to continue sharing our knowledge in the form of concrete examples. That's how <a href="https://github.com/OGStudio/openscenegraph-cross-platform-examples">OpenSceneGraph cross-platform examples</a> were born.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-examples.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 3 of 8</p> | |||
<p class="pagination_title">Page 3 of 9</p> | |||
<p> | |||
<a href="index2.html">« Newer</a> | |||
<a href="index4.html">Older »</a> | |||
@@ -25,6 +25,21 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="openscenegraph-examples.html">OpenSceneGraph cross-platform examples</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2018-04-20 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2018-04-20-openscenegraph-examples.png" alt="iOS Simulator renders a cube" /></p> | |||
<p>This article summarizes the work we did to produce the first two cross-platform OpenSceneGraph examples.</p> | |||
<p>By the time <a href="mahjong-techdemo1-gameplay.html">the first technology demonstration of OGS Mahjong 2</a> has been released, we've already had <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide/issues/4">issue request</a> (to explain how to load images with OpenSceneGraph on Android) hanging for some time. We considered creating a new tutorial for <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide">OpenSceneGraph cross-platform guide</a> at first. However, we realized that it's time-consuming and excessive for such a tiny topic (compared to what an average game has) as image loading. We decided to continue sharing our knowledge in the form of concrete examples. That's how <a href="https://github.com/OGStudio/openscenegraph-cross-platform-examples">OpenSceneGraph cross-platform examples</a> were born.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-examples.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="mahjong-techdemo1-gameplay.html">First techdemo of OGS Mahjong 2: Gameplay</a> | |||
</h2> | |||
@@ -174,23 +189,8 @@ | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-cross-platform-guide.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ios-tutorial.html">iOS tutorial</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2017-06-08 10:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2017-06-08-ios-refactoring.png" alt="Earth and a rocket" /></p> | |||
<p>This article describes problems we faced during the creation of iOS tutorial in May 2017.</p> | |||
<p><a href="https://twitter.com/OpenGameStudio/status/826816343433498627">This February</a> we managed to get simple model rendered under iOS in just a few days. We expected to finish iOS tutorial in no time. However, the reality reminded us: it's easy to come up with a hackish demo that works for one person, but it's hard to create a concise example that works for everyone.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="ios-tutorial.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 4 of 8</p> | |||
<p class="pagination_title">Page 4 of 9</p> | |||
<p> | |||
<a href="index3.html">« Newer</a> | |||
<a href="index5.html">Older »</a> | |||
@@ -25,6 +25,21 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ios-tutorial.html">iOS tutorial</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2017-06-08 10:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2017-06-08-ios-refactoring.png" alt="Earth and a rocket" /></p> | |||
<p>This article describes problems we faced during the creation of iOS tutorial in May 2017.</p> | |||
<p><a href="https://twitter.com/OpenGameStudio/status/826816343433498627">This February</a> we managed to get simple model rendered under iOS in just a few days. We expected to finish iOS tutorial in no time. However, the reality reminded us: it's easy to come up with a hackish demo that works for one person, but it's hard to create a concise example that works for everyone.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="ios-tutorial.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="osg-sample.html">OpenSceneGraph sample</a> | |||
</h2> | |||
@@ -162,31 +177,8 @@ | |||
<div class="news_item_more"> | |||
<a href="2016-tech-showcases.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2016-september-recap.html">September 2016 recap</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-10-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2016-10-11_september-recap.png" alt="Mahjong created during live session" /></p> | |||
<p>This article explains September 2016 live session stages: draft, rehearsal, live session itself, and publishing.</p> | |||
<p>Even though live session takes only a few hours, we devote a whole month to prepare for it. Let's have a look at live session stages in detail.</p> | |||
<ol> | |||
<li><p><strong>Draft.</strong> Game creation for the first time.</p> | |||
<p>Purposes:</p> | |||
<ul> | |||
<li>test our technologies and fix major bugs;</li> | |||
<li>discover usability issues to fix in the next development iteration;</li> | |||
<li>list exact steps to reproduce the game later;. . .</li></ul></li> | |||
</ol> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2016-september-recap.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 5 of 8</p> | |||
<p class="pagination_title">Page 5 of 9</p> | |||
<p> | |||
<a href="index4.html">« Newer</a> | |||
<a href="index6.html">Older »</a> | |||
@@ -25,6 +25,29 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2016-september-recap.html">September 2016 recap</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-10-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2016-10-11_september-recap.png" alt="Mahjong created during live session" /></p> | |||
<p>This article explains September 2016 live session stages: draft, rehearsal, live session itself, and publishing.</p> | |||
<p>Even though live session takes only a few hours, we devote a whole month to prepare for it. Let's have a look at live session stages in detail.</p> | |||
<ol> | |||
<li><p><strong>Draft.</strong> Game creation for the first time.</p> | |||
<p>Purposes:</p> | |||
<ul> | |||
<li>test our technologies and fix major bugs;</li> | |||
<li>discover usability issues to fix in the next development iteration;</li> | |||
<li>list exact steps to reproduce the game later;. . .</li></ul></li> | |||
</ol> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2016-september-recap.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ogs-editor-0.10.html">OGS Editor 0.10 and live session materials</a> | |||
</h2> | |||
@@ -158,22 +181,8 @@ It's time to create simple Mahjong solitaire game. | |||
<div class="news_item_more"> | |||
<a href="ogs-editor-0.9.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-announcement.html">Live session: 28 May 2016</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-05-17 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>We're glad to annouce that the <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> session will take place on <a title="Local time" href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=Open+Game+Studio+May+live+session&iso=20160528T12&p1=37&ah=3">28 May 2016 at 12:00 CEST</a>. Join us! | |||
. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="may-live-session-announcement.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 6 of 8</p> | |||
<p class="pagination_title">Page 6 of 9</p> | |||
<p> | |||
<a href="index5.html">« Newer</a> | |||
<a href="index7.html">Older »</a> | |||
@@ -25,6 +25,20 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-announcement.html">Live session: 28 May 2016</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-05-17 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>We're glad to annouce that the <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> session will take place on <a title="Local time" href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=Open+Game+Studio+May+live+session&iso=20160528T12&p1=37&ah=3">28 May 2016 at 12:00 CEST</a>. Join us! | |||
. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="may-live-session-announcement.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-decision.html">May live session (Editor 0.9)</a> | |||
</h2> | |||
@@ -151,26 +165,8 @@ | |||
<div class="news_item_more"> | |||
<a href="livesession-editor-07.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="soon-game-creation-editor-07.html">SOON: Creating a simple game live (Editor 0.7)</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2015-11-02 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>As we have promised, we are ready to give you Editor 0.7 which is capable of creating the complete test chamber. However, after recreating the test chamber ourselves, it became clear that:</p> | |||
<ol> | |||
<li>it takes more than 8 hours to recreate it (too long)</li> | |||
<li>it's inappropriate to be presented in the form of an article (too boring)</li> | |||
</ol> | |||
<p>Therefore we decided to hold a live session at <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> SOON to show you how to create a simple <a title="Whac-a-mole" href="http://google.com/search?q=whac+a+mole">whac-a-mole like game</a> from scratch.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="soon-game-creation-editor-07.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 7 of 8</p> | |||
<p class="pagination_title">Page 7 of 9</p> | |||
<p> | |||
<a href="index6.html">« Newer</a> | |||
<a href="index8.html">Older »</a> | |||
@@ -25,6 +25,24 @@ | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="soon-game-creation-editor-07.html">SOON: Creating a simple game live (Editor 0.7)</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2015-11-02 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>As we have promised, we are ready to give you Editor 0.7 which is capable of creating the complete test chamber. However, after recreating the test chamber ourselves, it became clear that:</p> | |||
<ol> | |||
<li>it takes more than 8 hours to recreate it (too long)</li> | |||
<li>it's inappropriate to be presented in the form of an article (too boring)</li> | |||
</ol> | |||
<p>Therefore we decided to hold a live session at <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> SOON to show you how to create a simple <a title="Whac-a-mole" href="http://google.com/search?q=whac+a+mole">whac-a-mole like game</a> from scratch.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="soon-game-creation-editor-07.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="bye-desura-hello-humblebundle.html">Desura no more, hello Humble Bundle Widget</a> | |||
</h2> | |||
@@ -169,26 +187,11 @@ | |||
<div class="news_item_more"> | |||
<a href="user-servey-finish-promise.html">Continue reading</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2014-another-year-passed.html">And another year has passed</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2014-12-31 12:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Hello!</p> | |||
<p>So, this year comes to the end. There were very little publications from us during this year. We haven't stopped working, but right now our work is in the phase, when we have nothing to show. And the spare time of the team members is rarely more then 30-40 hours a month.</p> | |||
<p>But our work continues. And you can find out some details in the new <a href="exaggerated-expectations.html">article from our programmer Michael Kapelko</a>.</p> | |||
<p>. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2014-another-year-passed.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 8 of 8</p> | |||
<p class="pagination_title">Page 8 of 9</p> | |||
<p> | |||
<a href="index7.html">« Newer</a> | |||
<a href="index9.html">Older »</a> | |||
</p> | |||
<div id="footer"> | |||
@@ -0,0 +1,55 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta charset="utf-8"> | |||
<head> | |||
<link rel="stylesheet" href="../../style.css"> | |||
</head> | |||
<body> | |||
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script> | |||
<div id="header"> | |||
<div class="header2"> | |||
<div class="menu"> | |||
<a href="../../en/news/index.html">News</a> | |||
<a href="../../en/game/index.html">Games</a> | |||
<a href="../../en/tool/index.html">Tools</a> | |||
<a href="../../en/page/about.html">About</a> | |||
</div> | |||
<div id="lang"> | |||
<a href="../../en/news/index9.html">EN</a> | |||
<a href="../../ru/news/index9.html">RU</a> | |||
</div> | |||
<div class="clear"></div> | |||
</div> | |||
</div> | |||
<center> | |||
<h1>News</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2014-another-year-passed.html">And another year has passed</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2014-12-31 12:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Hello!</p> | |||
<p>So, this year comes to the end. There were very little publications from us during this year. We haven't stopped working, but right now our work is in the phase, when we have nothing to show. And the spare time of the team members is rarely more then 30-40 hours a month.</p> | |||
<p>But our work continues. And you can find out some details in the new <a href="exaggerated-expectations.html">article from our programmer Michael Kapelko</a>.</p> | |||
<p>. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2014-another-year-passed.html">Continue reading</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Page 9 of 9</p> | |||
<p> | |||
<a href="index8.html">« Newer</a> | |||
</p> | |||
<div id="footer"> | |||
The site has been generated by <a href="http://opengamestudio.org/pskov">PSKOV</a> | |||
from <a href="http://github.com/ogstudio/site-opengamestudio">this source code</a>. | |||
</div> | |||
</center> | |||
</body> | |||
</html> |
@@ -0,0 +1,137 @@ | |||
Title: CLD: Генерация контекста | |||
Date: 2025-03-11 00:00 | |||
Category: News | |||
Slug: cld_ctx-gen | |||
Lang: ru | |||
![splash][splash] | |||
# Генерация контекста | |||
В феврале доработал транслятор Межъязыкового диалекта | |||
(**C**ross-**l**anguage **d**ialect) (CLD) до генерации | |||
Контекста на основе описания в YML. Сгенерированные Контексты уже использованы | |||
в следующих проектах: | |||
* CLD (транслятор CLD генерирует свой собственный Контекст) | |||
* LHA | |||
* PSKOV | |||
Доселе я никогда прежде не тратил время на объяснение сути Контекста, поэтому | |||
сейчас самое время для очень краткого описания: Контекст очень близок | |||
к понятию [Store в Redux][store]. К сожалению, на этом месте пояснение заканчиваю, | |||
т.к. без каких-либо весомых доказательств пользы Контекста не готов | |||
обосновывать его применимость. Как только придёт таковое время, так я сразу | |||
расскажу детали. | |||
Теперь вернёмся к генерации Контекста. Вот как выглядит YML Контекста в проекте LHA | |||
([entities.yml][entities]): | |||
``` | |||
# Application state context | |||
Context: | |||
type: context | |||
fields: | |||
# Command line arguments | |||
arguments: [String] | |||
consoleOutput: String | |||
defaultDir: String | |||
didLaunch: Bool | |||
dir: String | |||
httpDefaultPort: Int | |||
httpLaunch: Bool | |||
httpPort: Int | |||
httpReply: String | |||
httpRequest: NetRequest | |||
``` | |||
Транслятор CLD преобразует его в следующий код на Kotlin ([entities.kt][entities-result]): | |||
``` | |||
// Application state context | |||
data class Context( | |||
// Command line arguments | |||
var arguments: Array<String> = arrayOf(), | |||
var consoleOutput: String = "", | |||
var defaultDir: String = "", | |||
var didLaunch: Boolean = false, | |||
var dir: String = "", | |||
var httpDefaultPort: Int = 0, | |||
var httpLaunch: Boolean = false, | |||
var httpPort: Int = 0, | |||
var httpReply: String = "", | |||
var httpRequest: NetRequest = NetRequest(), | |||
override var recentField: String = "", | |||
): CLDContext { | |||
override fun <T> field(name: String): T { | |||
if (name == "arguments") { | |||
return arguments as T | |||
} else if (name == "consoleOutput") { | |||
return consoleOutput as T | |||
} else if (name == "defaultDir") { | |||
return defaultDir as T | |||
} else if (name == "didLaunch") { | |||
return didLaunch as T | |||
} else if (name == "dir") { | |||
return dir as T | |||
} else if (name == "httpDefaultPort") { | |||
return httpDefaultPort as T | |||
} else if (name == "httpLaunch") { | |||
return httpLaunch as T | |||
} else if (name == "httpPort") { | |||
return httpPort as T | |||
} else if (name == "httpReply") { | |||
return httpReply as T | |||
} else if (name == "httpRequest") { | |||
return httpRequest as T | |||
} | |||
return "unknown-field-name" as T | |||
} | |||
override fun selfCopy(): CLDContext { | |||
return this.copy() | |||
} | |||
override fun setField( | |||
name: String, | |||
value: Any? | |||
) { | |||
if (name == "arguments") { | |||
arguments = value as Array<String> | |||
} else if (name == "consoleOutput") { | |||
consoleOutput = value as String | |||
} else if (name == "defaultDir") { | |||
defaultDir = value as String | |||
} else if (name == "didLaunch") { | |||
didLaunch = value as Boolean | |||
} else if (name == "dir") { | |||
dir = value as String | |||
} else if (name == "httpDefaultPort") { | |||
httpDefaultPort = value as Int | |||
} else if (name == "httpLaunch") { | |||
httpLaunch = value as Boolean | |||
} else if (name == "httpPort") { | |||
httpPort = value as Int | |||
} else if (name == "httpReply") { | |||
httpReply = value as String | |||
} else if (name == "httpRequest") { | |||
httpRequest = value as NetRequest | |||
} | |||
} | |||
} | |||
``` | |||
# Март | |||
На текущий момент Kotlin является якорным языком CLD. Для использования | |||
Kotlin необходимо установить соответствующие инструменты Java (Gradle, | |||
Android Studio либо сама JVM). Такое требование делает создание инструмента | |||
разработки чисто для браузера невозможным. Однако, я считаю работу инструмента | |||
разработки в браузере ключевой особенностью для достижения портируемости кода. | |||
Поэтому в марте я планирую создать заготовку инструмента, работающего в браузере. | |||
[entities]: https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml | |||
[entities-result]: https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3 | |||
[splash]: ../../images/2025-03_redux-data-flow.jpg | |||
[store]: https://redux.js.org/introduction/getting-started#basic-example |
@@ -0,0 +1,171 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta charset="utf-8"> | |||
<head> | |||
<link rel="stylesheet" href="../../style.css"> | |||
</head> | |||
<body> | |||
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script> | |||
<div id="header"> | |||
<div class="header2"> | |||
<div class="menu"> | |||
<a href="../../ru/news/index.html">Новости</a> | |||
<a href="../../ru/game/index.html">Игры</a> | |||
<a href="../../ru/tool/index.html">Инструменты</a> | |||
<a href="../../ru/page/about.html">О нас</a> | |||
</div> | |||
<div id="lang"> | |||
<a href="../../en/news/cld_ctx-gen.html">EN</a> | |||
<a href="../../ru/news/cld_ctx-gen.html">RU</a> | |||
</div> | |||
<div class="clear"></div> | |||
</div> | |||
</div> | |||
<h3 class="left_item_title">В новостях...</h3> | |||
<center> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="cld_ctx-gen.html">CLD: Генерация контекста</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2025-03-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2025-03_redux-data-flow.jpg" alt="splash" /></p> | |||
<h1 id="">Генерация контекста</h1> | |||
<p>В феврале доработал транслятор Межъязыкового диалекта | |||
(<strong>C</strong>ross-<strong>l</strong>anguage <strong>d</strong>ialect) (CLD) до генерации | |||
Контекста на основе описания в YML. Сгенерированные Контексты уже использованы | |||
в следующих проектах:</p> | |||
<ul> | |||
<li>CLD (транслятор CLD генерирует свой собственный Контекст)</li> | |||
<li>LHA</li> | |||
<li>PSKOV</li> | |||
</ul> | |||
<p>Доселе я никогда прежде не тратил время на объяснение сути Контекста, поэтому | |||
сейчас самое время для очень краткого описания: Контекст очень близок | |||
к понятию <a href="https://redux.js.org/introduction/getting-started#basic-example">Store в Redux</a>. К сожалению, на этом месте пояснение заканчиваю, | |||
т.к. без каких-либо весомых доказательств пользы Контекста не готов | |||
обосновывать его применимость. Как только придёт таковое время, так я сразу | |||
расскажу детали.</p> | |||
<p>Теперь вернёмся к генерации Контекста. Вот как выглядит YML Контекста в проекте LHA | |||
(<a href="https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml">entities.yml</a>):</p> | |||
<pre><code># Application state context | |||
Context: | |||
type: context | |||
fields: | |||
# Command line arguments | |||
arguments: [String] | |||
consoleOutput: String | |||
defaultDir: String | |||
didLaunch: Bool | |||
dir: String | |||
httpDefaultPort: Int | |||
httpLaunch: Bool | |||
httpPort: Int | |||
httpReply: String | |||
httpRequest: NetRequest | |||
</code></pre> | |||
<p>Транслятор CLD преобразует его в следующий код на Kotlin (<a href="https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3">entities.kt</a>):</p> | |||
<pre><code>// Application state context | |||
data class Context( | |||
// Command line arguments | |||
var arguments: Array<String> = arrayOf(), | |||
var consoleOutput: String = "", | |||
var defaultDir: String = "", | |||
var didLaunch: Boolean = false, | |||
var dir: String = "", | |||
var httpDefaultPort: Int = 0, | |||
var httpLaunch: Boolean = false, | |||
var httpPort: Int = 0, | |||
var httpReply: String = "", | |||
var httpRequest: NetRequest = NetRequest(), | |||
override var recentField: String = "", | |||
): CLDContext { | |||
override fun <T> field(name: String): T { | |||
if (name == "arguments") { | |||
return arguments as T | |||
} else if (name == "consoleOutput") { | |||
return consoleOutput as T | |||
} else if (name == "defaultDir") { | |||
return defaultDir as T | |||
} else if (name == "didLaunch") { | |||
return didLaunch as T | |||
} else if (name == "dir") { | |||
return dir as T | |||
} else if (name == "httpDefaultPort") { | |||
return httpDefaultPort as T | |||
} else if (name == "httpLaunch") { | |||
return httpLaunch as T | |||
} else if (name == "httpPort") { | |||
return httpPort as T | |||
} else if (name == "httpReply") { | |||
return httpReply as T | |||
} else if (name == "httpRequest") { | |||
return httpRequest as T | |||
} | |||
return "unknown-field-name" as T | |||
} | |||
override fun selfCopy(): CLDContext { | |||
return this.copy() | |||
} | |||
override fun setField( | |||
name: String, | |||
value: Any? | |||
) { | |||
if (name == "arguments") { | |||
arguments = value as Array<String> | |||
} else if (name == "consoleOutput") { | |||
consoleOutput = value as String | |||
} else if (name == "defaultDir") { | |||
defaultDir = value as String | |||
} else if (name == "didLaunch") { | |||
didLaunch = value as Boolean | |||
} else if (name == "dir") { | |||
dir = value as String | |||
} else if (name == "httpDefaultPort") { | |||
httpDefaultPort = value as Int | |||
} else if (name == "httpLaunch") { | |||
httpLaunch = value as Boolean | |||
} else if (name == "httpPort") { | |||
httpPort = value as Int | |||
} else if (name == "httpReply") { | |||
httpReply = value as String | |||
} else if (name == "httpRequest") { | |||
httpRequest = value as NetRequest | |||
} | |||
} | |||
} | |||
</code></pre> | |||
<h1 id="-1">Март</h1> | |||
<p>На текущий момент Kotlin является якорным языком CLD. Для использования | |||
Kotlin необходимо установить соответствующие инструменты Java (Gradle, | |||
Android Studio либо сама JVM). Такое требование делает создание инструмента | |||
разработки чисто для браузера невозможным. Однако, я считаю работу инструмента | |||
разработки в браузере ключевой особенностью для достижения портируемости кода.</p> | |||
<p>Поэтому в марте я планирую создать заготовку инструмента, работающего в браузере.</p> | |||
</div> | |||
</div> | |||
<div id="disqus_thread"></div> | |||
<script> | |||
var disqus_config = function () { | |||
this.page.url = "https://opengamestudio.org/ru/news/cld_ctx-gen.html"; | |||
this.page.identifier = "cld_ctx-gen.html"; | |||
}; | |||
(function() { // DON'T EDIT BELOW THIS LINE | |||
var d = document, s = d.createElement('script'); | |||
s.src = 'https://opengamestudio.disqus.com/embed.js'; | |||
s.setAttribute('data-timestamp', +new Date()); | |||
(d.head || d.body).appendChild(s); | |||
})(); | |||
</script> | |||
<noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript> | |||
<div id="footer"> | |||
Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a> | |||
из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>. | |||
</div> | |||
</center> | |||
</body> | |||
</html> |
@@ -0,0 +1,168 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta charset="utf-8"> | |||
<head> | |||
<link rel="stylesheet" href="../../style.css"> | |||
</head> | |||
<body> | |||
<script data-goatcounter="https://services.opengamestudio.org:443/count" async src="//services.opengamestudio.org:443/count.js"></script> | |||
<div id="header"> | |||
<div class="header2"> | |||
<div class="menu"> | |||
<a href="../../ru/news/index.html">Новости</a> | |||
<a href="../../ru/game/index.html">Игры</a> | |||
<a href="../../ru/tool/index.html">Инструменты</a> | |||
<a href="../../ru/page/about.html">О нас</a> | |||
</div> | |||
<div id="lang"> | |||
<a href="../../en/news/ctx-gen.html">EN</a> | |||
<a href="../../ru/news/ctx-gen.html">RU</a> | |||
</div> | |||
<div class="clear"></div> | |||
</div> | |||
</div> | |||
<h3 class="left_item_title">В новостях...</h3> | |||
<center> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ctx-gen.html">Генерация Контекста из YML</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2025-03-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/??.png" alt="splash" /></p> | |||
<h1 id="">Генерация Контекста</h1> | |||
<p>В феврале доработал конвертер межъязыкового диалекта для генерации | |||
Контекста на основе описания в YML и уже применил его для проектов | |||
Local Host Access, самого конвертера, ПСКОВа.</p> | |||
<p>Если очень кратко, то Контекст представляет из себя полное состояние | |||
приложения, по сути аналог <a href="https://redux.js.org/introduction/getting-started#basic-example">store в Redux</a>.</p> | |||
<p>Для примера возьмём описание Контекста из Local Host Access | |||
(<a href="https://github.com/OGStudio/local-host-access/blob/main/cld/entities.yml">entities.yml</a>):</p> | |||
<pre><code># Application state context | |||
Context: | |||
type: context | |||
fields: | |||
# Command line arguments | |||
arguments: [String] | |||
consoleOutput: String | |||
defaultDir: String | |||
didLaunch: Bool | |||
dir: String | |||
httpDefaultPort: Int | |||
httpLaunch: Bool | |||
httpPort: Int | |||
httpReply: String | |||
httpRequest: NetRequest | |||
</code></pre> | |||
<p>Конвертер преобразует его в следующий код на Kotlin (<a href="https://github.com/OGStudio/local-host-access/blob/main/src/entities.kt#L3">entities.kt</a>):</p> | |||
<pre><code>// Application state context | |||
data class Context( | |||
// Command line arguments | |||
var arguments: Array<String> = arrayOf(), | |||
var consoleOutput: String = "", | |||
var defaultDir: String = "", | |||
var didLaunch: Boolean = false, | |||
var dir: String = "", | |||
var httpDefaultPort: Int = 0, | |||
var httpLaunch: Boolean = false, | |||
var httpPort: Int = 0, | |||
var httpReply: String = "", | |||
var httpRequest: NetRequest = NetRequest(), | |||
override var recentField: String = "", | |||
): CLDContext { | |||
override fun <T> field(name: String): T { | |||
if (name == "arguments") { | |||
return arguments as T | |||
} else if (name == "consoleOutput") { | |||
return consoleOutput as T | |||
} else if (name == "defaultDir") { | |||
return defaultDir as T | |||
} else if (name == "didLaunch") { | |||
return didLaunch as T | |||
} else if (name == "dir") { | |||
return dir as T | |||
} else if (name == "httpDefaultPort") { | |||
return httpDefaultPort as T | |||
} else if (name == "httpLaunch") { | |||
return httpLaunch as T | |||
} else if (name == "httpPort") { | |||
return httpPort as T | |||
} else if (name == "httpReply") { | |||
return httpReply as T | |||
} else if (name == "httpRequest") { | |||
return httpRequest as T | |||
} | |||
return "unknown-field-name" as T | |||
} | |||
override fun selfCopy(): CLDContext { | |||
return this.copy() | |||
} | |||
override fun setField( | |||
name: String, | |||
value: Any? | |||
) { | |||
if (name == "arguments") { | |||
arguments = value as Array<String> | |||
} else if (name == "consoleOutput") { | |||
consoleOutput = value as String | |||
} else if (name == "defaultDir") { | |||
defaultDir = value as String | |||
} else if (name == "didLaunch") { | |||
didLaunch = value as Boolean | |||
} else if (name == "dir") { | |||
dir = value as String | |||
} else if (name == "httpDefaultPort") { | |||
httpDefaultPort = value as Int | |||
} else if (name == "httpLaunch") { | |||
httpLaunch = value as Boolean | |||
} else if (name == "httpPort") { | |||
httpPort = value as Int | |||
} else if (name == "httpReply") { | |||
httpReply = value as String | |||
} else if (name == "httpRequest") { | |||
httpRequest = value as NetRequest | |||
} | |||
} | |||
} | |||
</code></pre> | |||
<h1 id="-1">Проблемы</h1> | |||
<p>Тем не менее, на текущий момент ощутил огромный минус Котлина для | |||
проекта CLD - необходимость оригинального компилятора Котлин, т.к. | |||
без него я не могу валидировать код. Могу транслировать, но не валидировать. | |||
Выходит, я не смогу написать чисто браузерный транслятор, чтобы в браузере | |||
писать Котлин, а он чтобы мне выдавал, скажем, Питон, т.к. в этом случае | |||
я в браузере не могу проверить ни Котлин, ни Питон.</p> | |||
<p>Поэтому в марте я рассмотрю возможность использования всё-таки чистого | |||
JavaScript в качестве якорного языка для CLD, хоть в JS и не строгой типизации, | |||
зато браузер уже содержит компилятор JS. | |||
А типы можно комментом ведь написать!</p> | |||
<h1 id="-2">Март</h1> | |||
<p>В марте начну создание нового инструмента для решения своих | |||
хобби-задач на основе Isomorphic-Git.</p> | |||
</div> | |||
</div> | |||
<div id="disqus_thread"></div> | |||
<script> | |||
var disqus_config = function () { | |||
this.page.url = "https://opengamestudio.org/ru/news/ctx-gen.html"; | |||
this.page.identifier = "ctx-gen.html"; | |||
}; | |||
(function() { // DON'T EDIT BELOW THIS LINE | |||
var d = document, s = d.createElement('script'); | |||
s.src = 'https://opengamestudio.disqus.com/embed.js'; | |||
s.setAttribute('data-timestamp', +new Date()); | |||
(d.head || d.body).appendChild(s); | |||
})(); | |||
</script> | |||
<noscript>Пожалуйста, включите JavaScript для просмотра <a href="https://disqus.com/?ref_noscript">комментариев на платформе Disqus.</a></noscript> | |||
<div id="footer"> | |||
Сайт сгенерирован <a href="http://opengamestudio.org/pskov/ru">ПСКОВОМ</a> | |||
из <a href="http://github.com/ogstudio/site-opengamestudio">этого исходного кода</a>. | |||
</div> | |||
</center> | |||
</body> | |||
</html> |
@@ -25,6 +25,32 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="cld_ctx-gen.html">CLD: Генерация контекста</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2025-03-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2025-03_redux-data-flow.jpg" alt="splash" /></p> | |||
<h1 id="">Генерация контекста</h1> | |||
<p>В феврале доработал транслятор Межъязыкового диалекта | |||
(<strong>C</strong>ross-<strong>l</strong>anguage <strong>d</strong>ialect) (CLD) до генерации | |||
Контекста на основе описания в YML. Сгенерированные Контексты уже использованы | |||
в следующих проектах:</p> | |||
<ul> | |||
<li>CLD (транслятор CLD генерирует свой собственный Контекст)</li> | |||
<li>LHA</li> | |||
<li>PSKOV</li> | |||
</ul> | |||
<p>Доселе я никогда прежде не тратил время на объяснение сути Контекста, поэтому | |||
сейчас самое время для очень краткого описания: Контекст очень близок | |||
к понятию <a href="https://redux.js.org/introduction/getting-started#basic-example">Store в Redux</a>. К сожалению, на этом месте пояснение заканчиваю,. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="cld_ctx-gen.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="psk-jvm-item.html">ПСКОВ 2 на JVM</a> | |||
</h2> | |||
@@ -204,27 +230,8 @@ Python в JavaScript. Этого не произошло, потому что п | |||
<div class="news_item_more"> | |||
<a href="memory-gui.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-text-ui.html">Текстовый интерфейс «Памяти»</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2024-06-14 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<h1 id="">Текстовый интерфейс «Памяти»</h1> | |||
<p>В мае реализовал текстовый интерфейс игры «Память» на Python. В C++ перевёл инструментом.</p> | |||
<p>Реализация логического игрового цикла привела к появлению контроллера, управляющего | |||
контекстом. Создание контроллера на Python прошло без происшествий, а вот с версией | |||
для C++ пришлось помучиться. Мучения были вызваны тем, что контроллер использует | |||
<a href="https://en.cppreference.com/w/cpp/utility/any">std::any</a> из C++17, а инструмент ограничен C++11 с целью поддержки OpenWrt.</p> | |||
<p>Что касается объёма кода, то картина получилась следующей (в строках):. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="memory-text-ui.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 1 из 8</p> | |||
<p class="pagination_title">Страница 1 из 9</p> | |||
<p> | |||
<a href="index2.html">Старее »</a> | |||
</p> | |||
@@ -25,6 +25,25 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-text-ui.html">Текстовый интерфейс «Памяти»</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2024-06-14 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<h1 id="">Текстовый интерфейс «Памяти»</h1> | |||
<p>В мае реализовал текстовый интерфейс игры «Память» на Python. В C++ перевёл инструментом.</p> | |||
<p>Реализация логического игрового цикла привела к появлению контроллера, управляющего | |||
контекстом. Создание контроллера на Python прошло без происшествий, а вот с версией | |||
для C++ пришлось помучиться. Мучения были вызваны тем, что контроллер использует | |||
<a href="https://en.cppreference.com/w/cpp/utility/any">std::any</a> из C++17, а инструмент ограничен C++11 с целью поддержки OpenWrt.</p> | |||
<p>Что касается объёма кода, то картина получилась следующей (в строках):. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="memory-text-ui.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="memory-logic.html">Игровая логика «Памяти»</a> | |||
</h2> | |||
@@ -197,25 +216,8 @@ Ubuntu Edge</a>. Особенностью продукта должна была | |||
<div class="news_item_more"> | |||
<a href="teaching-to-program-2019.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Минусы и плюсы начинания с начала</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2020-01-01 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2020-01-01-ny.jpg" alt="Happy 2020" /></p> | |||
<p>Любой, кто следит за нашим прогрессом достаточно долго, может сказать, что мы много раз перезапускали разработку с нуля.</p> | |||
<p>Еще до выпуска <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a> мы несколько раз меняли технологии "под капотом". После релиза мы неоднократно делали это снова, отбрасывая уже готовые решения. | |||
Может показаться, что сейчас у нас меньше готового, чем перед выходом <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>. Это правда, но не совсем.</p> | |||
<p>Когда вышел <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>, у нас была приятно выглядящая (на тот момент) игра с открытым исходным кодом, которая работала под Windows и Linux. С некоторой удачей и усилием в нее можно поиграть и сегодня, но уже не "из коробки".. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 2 из 8</p> | |||
<p class="pagination_title">Страница 2 из 9</p> | |||
<p> | |||
<a href="index.html">« Новее</a> | |||
<a href="index3.html">Старее »</a> | |||
@@ -25,6 +25,23 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Минусы и плюсы начинания с начала</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2020-01-01 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2020-01-01-ny.jpg" alt="Happy 2020" /></p> | |||
<p>Любой, кто следит за нашим прогрессом достаточно долго, может сказать, что мы много раз перезапускали разработку с нуля.</p> | |||
<p>Еще до выпуска <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a> мы несколько раз меняли технологии "под капотом". После релиза мы неоднократно делали это снова, отбрасывая уже готовые решения. | |||
Может показаться, что сейчас у нас меньше готового, чем перед выходом <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>. Это правда, но не совсем.</p> | |||
<p>Когда вышел <a href="../game/ogs-mahjong-1.html">"OGS Mahjong"</a>, у нас была приятно выглядящая (на тот момент) игра с открытым исходным кодом, которая работала под Windows и Linux. С некоторой удачей и усилием в нее можно поиграть и сегодня, но уже не "из коробки".. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="the-pros-and-cons-of-restarting-from-scratch.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="on-the-way-to-durable-applications.html">На пути к долговечным приложениям</a> | |||
</h2> | |||
@@ -171,23 +188,8 @@ | |||
<div class="news_item_more"> | |||
<a href="example-driven-development.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="openscenegraph-examples.html">Кросс-платформенные примеры OpenSceneGraph</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2018-04-20 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2018-04-20-openscenegraph-examples.png" alt="iOS Simulator отображает куб" /></p> | |||
<p>Эта статья резюмирует создание первых двух кросс-платформенных примеров OpenSceneGraph.</p> | |||
<p>К тому времени, как мы выпустили <a href="mahjong-techdemo1-gameplay.html">первую техническую демонстрацию OGS Mahjong 2</a>, нас уже дожидался <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide/issues/4">запрос на описание работы с изображениями</a> в OpenSceneGraph на Android. Сначала мы рассматривали возможность создания нового самоучителя для <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide">кросс-платформенного руководства OpenSceneGraph</a>, но позже мы оценили необходимые трудозатраты и посчитали их излишними для освещения такой небольшой темы (по сравнению с тем, что умеет средняя игра) как загрузка изображений. Мы решили продолжить делиться нашими знаниями в виде конкретных примеров. Так на свет появились <a href="https://github.com/OGStudio/openscenegraph-cross-platform-examples">кросс-платформенные примеры OpenSceneGraph</a>.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-examples.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 3 из 8</p> | |||
<p class="pagination_title">Страница 3 из 9</p> | |||
<p> | |||
<a href="index2.html">« Новее</a> | |||
<a href="index4.html">Старее »</a> | |||
@@ -25,6 +25,21 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="openscenegraph-examples.html">Кросс-платформенные примеры OpenSceneGraph</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2018-04-20 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2018-04-20-openscenegraph-examples.png" alt="iOS Simulator отображает куб" /></p> | |||
<p>Эта статья резюмирует создание первых двух кросс-платформенных примеров OpenSceneGraph.</p> | |||
<p>К тому времени, как мы выпустили <a href="mahjong-techdemo1-gameplay.html">первую техническую демонстрацию OGS Mahjong 2</a>, нас уже дожидался <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide/issues/4">запрос на описание работы с изображениями</a> в OpenSceneGraph на Android. Сначала мы рассматривали возможность создания нового самоучителя для <a href="https://github.com/OGStudio/openscenegraph-cross-platform-guide">кросс-платформенного руководства OpenSceneGraph</a>, но позже мы оценили необходимые трудозатраты и посчитали их излишними для освещения такой небольшой темы (по сравнению с тем, что умеет средняя игра) как загрузка изображений. Мы решили продолжить делиться нашими знаниями в виде конкретных примеров. Так на свет появились <a href="https://github.com/OGStudio/openscenegraph-cross-platform-examples">кросс-платформенные примеры OpenSceneGraph</a>.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-examples.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="mahjong-techdemo1-gameplay.html">Первая технодемка OGS Mahjong 2: Игровая механика</a> | |||
</h2> | |||
@@ -171,23 +186,8 @@ | |||
<div class="news_item_more"> | |||
<a href="openscenegraph-cross-platform-guide.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ios-tutorial.html">Самоучитель iOS</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2017-06-08 10:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2017-06-08-ios-refactoring.png" alt="Земля и ракета" /></p> | |||
<p>Эта статья описывает проблемы, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.</p> | |||
<p><a href="https://twitter.com/OpenGameStudio/status/826816343433498627">В феврале</a> мы сумели отобразить простую модель под iOS за считанные дни. Это дало нам уверенность, что самоучитель для iOS мы сделаем столь же быстро. Тем не менее, реальность напомнила нам о простой вещи: быстро сделать можно лишь поделку на коленке, работающую только у самого разработчика; над логически связанным примером, работающим у всех, придётся попотеть.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="ios-tutorial.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 4 из 8</p> | |||
<p class="pagination_title">Страница 4 из 9</p> | |||
<p> | |||
<a href="index3.html">« Новее</a> | |||
<a href="index5.html">Старее »</a> | |||
@@ -25,6 +25,21 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ios-tutorial.html">Самоучитель iOS</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2017-06-08 10:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2017-06-08-ios-refactoring.png" alt="Земля и ракета" /></p> | |||
<p>Эта статья описывает проблемы, с которыми мы столкнулись во время создания самоучителя для iOS в мае 2017.</p> | |||
<p><a href="https://twitter.com/OpenGameStudio/status/826816343433498627">В феврале</a> мы сумели отобразить простую модель под iOS за считанные дни. Это дало нам уверенность, что самоучитель для iOS мы сделаем столь же быстро. Тем не менее, реальность напомнила нам о простой вещи: быстро сделать можно лишь поделку на коленке, работающую только у самого разработчика; над логически связанным примером, работающим у всех, придётся попотеть.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="ios-tutorial.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="osg-sample.html">Приложение OpenSceneGraph</a> | |||
</h2> | |||
@@ -162,30 +177,8 @@ | |||
<div class="news_item_more"> | |||
<a href="2016-tech-showcases.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2016-september-recap.html">Сентябрь 2016 кратко</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-10-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2016-10-11_september-recap.png" alt="Маджонг, созданный в прямом эфире" /></p> | |||
<p>Эта статья описывает стадии по подготовке и проведению прямого эфира сентября 2016: черновик, репетиция, прямой эфир и публикация.</p> | |||
<p>Несмотря на то, что сам прямой эфир длится лишь несколько часов, мы готовимся к нему целый месяц. Рассмотрим каждую стадию прямого эфира подробнее.</p> | |||
<ol> | |||
<li><p><strong>Черновик.</strong> Создание игры в первый раз.</p> | |||
<p>Цели:</p> | |||
<ul> | |||
<li>проверить наши технологии и исправить основные ошибки;</li> | |||
<li>узнать о неудобствах использования технологий, чтобы исправить их в следующей итерации разработки;. . .</li></ul></li> | |||
</ol> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2016-september-recap.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 5 из 8</p> | |||
<p class="pagination_title">Страница 5 из 9</p> | |||
<p> | |||
<a href="index4.html">« Новее</a> | |||
<a href="index6.html">Старее »</a> | |||
@@ -25,6 +25,28 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2016-september-recap.html">Сентябрь 2016 кратко</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-10-11 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p><img src="../../images/2016-10-11_september-recap.png" alt="Маджонг, созданный в прямом эфире" /></p> | |||
<p>Эта статья описывает стадии по подготовке и проведению прямого эфира сентября 2016: черновик, репетиция, прямой эфир и публикация.</p> | |||
<p>Несмотря на то, что сам прямой эфир длится лишь несколько часов, мы готовимся к нему целый месяц. Рассмотрим каждую стадию прямого эфира подробнее.</p> | |||
<ol> | |||
<li><p><strong>Черновик.</strong> Создание игры в первый раз.</p> | |||
<p>Цели:</p> | |||
<ul> | |||
<li>проверить наши технологии и исправить основные ошибки;</li> | |||
<li>узнать о неудобствах использования технологий, чтобы исправить их в следующей итерации разработки;. . .</li></ul></li> | |||
</ol> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2016-september-recap.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="ogs-editor-0.10.html">OGS Editor 0.10 и материалы прямого эфира</a> | |||
</h2> | |||
@@ -158,22 +180,8 @@ | |||
<div class="news_item_more"> | |||
<a href="ogs-editor-0.9.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-announcement.html">Прямой эфир: 28 мая 2016</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-05-17 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Мы рады сообщить, что трансляция <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> состоится <a href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=%D0%9C%D0%B0%D0%B9%D1%81%D0%BA%D0%B8%D0%B9+%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B9+%D1%8D%D1%84%D0%B8%D1%80+Open+Game+Studio&iso=20160528T13&p1=166&ah=3">28 мая 2016 в 13:00 MSK</a>. Присоединяйтесь! | |||
. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="may-live-session-announcement.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 6 из 8</p> | |||
<p class="pagination_title">Страница 6 из 9</p> | |||
<p> | |||
<a href="index5.html">« Новее</a> | |||
<a href="index7.html">Старее »</a> | |||
@@ -25,6 +25,20 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-announcement.html">Прямой эфир: 28 мая 2016</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2016-05-17 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Мы рады сообщить, что трансляция <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> состоится <a href="http://www.timeanddate.com/worldclock/fixedtime.html?msg=%D0%9C%D0%B0%D0%B9%D1%81%D0%BA%D0%B8%D0%B9+%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B9+%D1%8D%D1%84%D0%B8%D1%80+Open+Game+Studio&iso=20160528T13&p1=166&ah=3">28 мая 2016 в 13:00 MSK</a>. Присоединяйтесь! | |||
. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="may-live-session-announcement.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="may-live-session-decision.html">Майский прямой эфир (Редактор 0.9)</a> | |||
</h2> | |||
@@ -149,26 +163,8 @@ | |||
<div class="news_item_more"> | |||
<a href="livesession-editor-07.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="soon-game-creation-editor-07.html">СКОРО: Создание простой игры в прямом эфире (Редактор 0.7)</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2015-11-02 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Как и было обещано, мы готовы предоставить вам Редактор 0.7, с помощью которого можно создать тестовый цех. Тем не менее, после воссоздания цеха стало ясно, что:</p> | |||
<ol> | |||
<li>это занимает более 8 часов (слишком долго)</li> | |||
<li>описание в виде статьи не подходит по формату (слишком скучно)</li> | |||
</ol> | |||
<p>Поэтому мы решили провести прямую трансляцию на <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> СКОРО, чтобы показать, как создать простую <a title="Whac-a-mole" href="http://google.com/search?q=whac+a+mole">игру типа "поймай крота"</a> с нуля.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="soon-game-creation-editor-07.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 7 из 8</p> | |||
<p class="pagination_title">Страница 7 из 9</p> | |||
<p> | |||
<a href="index6.html">« Новее</a> | |||
<a href="index8.html">Старее »</a> | |||
@@ -25,6 +25,24 @@ | |||
<h1>Новости</h1> | |||
<div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="soon-game-creation-editor-07.html">СКОРО: Создание простой игры в прямом эфире (Редактор 0.7)</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2015-11-02 00:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Как и было обещано, мы готовы предоставить вам Редактор 0.7, с помощью которого можно создать тестовый цех. Тем не менее, после воссоздания цеха стало ясно, что:</p> | |||
<ol> | |||
<li>это занимает более 8 часов (слишком долго)</li> | |||
<li>описание в виде статьи не подходит по формату (слишком скучно)</li> | |||
</ol> | |||
<p>Поэтому мы решили провести прямую трансляцию на <a title="LiveCoding" href="https://www.livecoding.tv/kornerr">LiveCoding</a> СКОРО, чтобы показать, как создать простую <a title="Whac-a-mole" href="http://google.com/search?q=whac+a+mole">игру типа "поймай крота"</a> с нуля.. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="soon-game-creation-editor-07.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="bye-desura-hello-humblebundle.html">Прощай, Desura. Здравствуй, Humble Bundle Widget</a> | |||
</h2> | |||
@@ -164,26 +182,11 @@ | |||
<div class="news_item_more"> | |||
<a href="user-servey-finish-promise.html">Читать далее</a> | |||
</div> | |||
</div><div class="news_item"> | |||
<h2 class="news_item_title"> | |||
<a href="2014-another-year-passed.html">И вот прошел еще один год</a> | |||
</h2> | |||
<p class="news_item_date"> | |||
2014-12-31 12:00 | |||
</p> | |||
<div class="news_item_contents"> | |||
<p>Привет.</p> | |||
<p>Подходит к концу год, в течение которого мы разместили на сайте рекордно малое количество новостей. Мы не прекратили разработку, однако пока она находится в фазе "показывать нечего", а свободного времени, которое можно уделять проекту, у каждого из его участников сейчас найдется редко больше чем 30-40 часов в месяц.</p> | |||
<p>Но работа продвигается, и подробнее о ней расскажет <a href="exaggerated-expectations.html">статья нашего программиста Михаила Капелько</a>.</p> | |||
<p>. . .</p> | |||
</div> | |||
<div class="news_item_more"> | |||
<a href="2014-another-year-passed.html">Читать далее</a> | |||
</div> | |||
</div> | |||
<p class="pagination_title">Страница 8 из 8</p> | |||
<p class="pagination_title">Страница 8 из 9</p> | |||
<p> | |||
<a href="index7.html">« Новее</a> | |||
<a href="index9.html">Старее »</a> | |||
</p> | |||
<div id="footer"> | |||