<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Per aspera ad astra</title>
	<atom:link href="http://gltrinix.ru/feed" rel="self" type="application/rss+xml" />
	<link>http://gltrinix.ru</link>
	<description>myworld := tworld.create; while life do myworld.update; myworld.free;</description>
	<lastBuildDate>Tue, 21 Feb 2012 15:45:55 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Введение в Java</title>
		<link>http://gltrinix.ru/1188</link>
		<comments>http://gltrinix.ru/1188#comments</comments>
		<pubDate>Tue, 21 Feb 2012 15:45:55 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1188</guid>
		<description><![CDATA[Продолжаем цикл статей по краткому введению в различные языки программирования. Прежде, чем приступить к изучению этой статьи рекомендую налить себе чашечку горячего кофе. Сегодня я опишу основные моменты по оформлению java-кода. Испытал влияние Objective-C, Ада 83, Object Pascal, UCSD Pascal, Oberon, C++, C#, Smalltalk, Eiffel, Mesa, Modula-3, Generic Java Структура программы («Hello world») Типы данных [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2012/02/java_logo.gif" rel="lightbox[1188]"><img src="http://gltrinix.ru/wp-content/uploads/2012/02/java_logo-139x150.gif" alt="" title="java logo" width="139" height="150" class="alignright size-medium wp-image-1189" /></a>Продолжаем цикл статей по краткому введению в различные языки программирования. Прежде, чем приступить к изучению этой статьи рекомендую налить себе чашечку горячего кофе. Сегодня я опишу основные моменты по оформлению java-кода.<br />
<span id="more-1188"></span></p>
<h2>Испытал влияние</h2>
<p>Objective-C, Ада 83, Object Pascal, UCSD Pascal, Oberon, C++, C#, Smalltalk, Eiffel, Mesa, Modula-3, Generic Java</p>
<h2>Структура программы («Hello world»)</h2>
<pre class="brush: java; title: ; notranslate">
public class HelloWorld {
    public static void main(String[] args) {
        final double Pi = 3.14;  // объявление константы
        String s = “Hello world!”;  // объявление строковой переменной
        System.out.println(s);  // вывод строки на экран
    }
}</pre>
<h2>Типы данных</h2>
<table width="100%" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="50%">Целые:</p>
<p>- byte (-128..+127)</p>
<p>- short (-32768..+32767)</p>
<p>- int (-2147483648..+2147483647)</p>
<p>- long (-263 .. +263-1)</p>
<p>- char (0..65535)</td>
<td valign="top" width="100%">Дробные:</p>
<p>- float (32 bit)</p>
<p>- double (64 bit)</td>
</tr>
<tr>
<td valign="top" width="50%">Строки:</p>
<p>- String</td>
<td valign="top" width="100%">Логические:</p>
<p>- boolean</td>
</tr>
</tbody>
</table>
<h2>Массивы</h2>
<pre class="brush: java; title: ; notranslate">int a[]; // создаем массив
int[] b; // создаем массив
a = new int[10]; // задаем количество элементов в массиве
b = new int[]{4,5}; // массив с заданными элементами</pre>
<pre class="brush: java; title: ; notranslate">int a[] = new int[10][20]; // создаем новый массив
a = null; // убираем ссылку на массив
System.gc(); // освобождаем память</pre>
<p>Вместо динамических массивов используют списки. Пример использования см. в ООП.</p>
<h2>Условия</h2>
<p>&gt;, &lt;, ==, &lt;&gt;, &#038;&#038;, ||, !=</p>
<pre class="brush: java; title: ; notranslate">if (условие) операция; else операция;</pre>
<pre class="brush: java; title: ; notranslate">if (условие)
{
	операции;
}
else
{
	операции;
}</pre>
<pre class="brush: java; title: ; notranslate">switch (оператор)
{
	case значение1: операция;
	case значение2: операция;
	default: операция;
}</pre>
<h2>Циклы</h2>
<pre class="brush: java; title: ; notranslate">for (начальное_условие; конечное условие; изменение)
{
	операции;
}</pre>
<pre class="brush: java; title: ; notranslate">for (int i = 0; i &lt; 10; i++) операция;
for (int i = 0; i &lt; 15; i += 1.5) операция;</pre>
<pre class="brush: java; title: ; notranslate">while (условие)
{
	операции;
}</pre>
<pre class="brush: java; title: ; notranslate">do
{
	операции;
}
while (условие);</pre>
<pre class="brush: java; title: ; notranslate">for (переменная: конейнер) { операции };</pre>
<h2>Указатели</h2>
<p>Их нет. Используем ссылки.</p>
<pre class="brush: java; title: ; notranslate">int a; // инициализируем переменную
Integer c; // создаем ссылку
c = new Integer(); // инициализируем ее
c = a; // ссылаемся на нее</pre>
<h2>Списки</h2>
<pre class="brush: java; title: ; notranslate">ArrayList&lt;String&gt; l = new ArrayList&lt;String&gt;();
l.add(&quot;Per aspera&quot;);
l.add(&quot;ad astra&quot;);</pre>
<pre class="brush: java; title: ; notranslate">ArrayList l = new ArrayList();
list.add(3);
list.add(new Boolean(&quot;True&quot;));
list.add(&quot;Per aspera ad astra&quot;);</pre>
<h2>ООП</h2>
<pre class="brush: java; title: ; notranslate">import java.util.ArrayList;

class MyClass extends Object {
	private MyClass MyC;
	private int fX;
	public ArrayList&lt;Integer&gt; fY = new ArrayList&lt;Integer&gt;();

	public boolean Clear() {
		boolean b = true;
		try {
			fX = 0;
			if (!(fY.isEmpty())) fY.clear();
		}
		catch (Exception e) {
			System.out.println(&quot;Clear error: &quot; + e.getMessage());
			b = false;
		}
		finally {
			return b;
		}
	}

	MyClass(){ fX=0; } // конструктор
	MyClass(int arg){ fX=arg; } // конструктор 

	protected void finalize(){ Clear(); } // деструктор
}

public class HelloJava {

	//---------------------------------------
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyClass MC = new MyClass();
		String s = &quot;&quot;;

		for (int i=0; i&lt;10; i++) MC.fY.add(i);	

		for (int buf: MC.fY) s += buf + &quot; &quot;;
		System.out.println(s);

		if (MC.Clear()) System.out.println(&quot;ok&quot;); else System.out.println(&quot;Err&quot;);

		s = &quot;&quot;;
		for (int buf: MC.fY) s += buf + &quot; &quot;;
		System.out.println(s);

		MC.finalize();
		MC = null;
	}

}</pre>
<p>Аттрибуты в классах:</p>
<pre class="brush: java; title: ; notranslate">static a = 5; // может быть доступен через имя класса
final class MyClass {} // не может иметь потомков
final static void Clear(); // нельзя переопределить, доступ через имя класса</pre>
<p>Контроль типов:</p>
<pre class="brush: java; title: ; notranslate">if (Obj.getClass() == MyClass) { }</pre>
<h2>Интерфейсы</h2>
<p>Все данные внутри интерфейсы &#8212; константы (<em>final</em>).</p>
<pre class="brush: java; title: ; notranslate">interface MyInterface {
	float Pi=3.14;
	void Method(int arg) {};
}; </pre>
<h2>Перечисления</h2>
<pre class="brush: java; title: ; notranslate">public enum Months {
	Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec;

	boolean isWinter() {
		return this==Dec || this==Jan || this==Feb;
	}
}</pre>
<p>Вывод всех значений:</p>
<pre class="brush: java; title: ; notranslate">for (Months buf: Months.values()) System.out.println(buf);</pre>
<p>Пример использования:</p>
<pre class="brush: java; title: ; notranslate">Months MMM = Feb;
if (MMM.isWinter) System.out.println(&quot;На улице холод, а дома хорошо.&quot;);</pre>
<h2>Пакеты</h2>
<p>Своеобразная область имен. Содержит в себе классы. Доступ к public-классу может производится через имя пакета или при импорте (import) пакета.</p>
<pre class="brush: java; title: ; notranslate">package SomePackAge;

public class MySomeClass { }</pre>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1188/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Введение в Delphi</title>
		<link>http://gltrinix.ru/1139</link>
		<comments>http://gltrinix.ru/1139#comments</comments>
		<pubDate>Sat, 18 Feb 2012 23:13:07 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1139</guid>
		<description><![CDATA[Сегодня начинаю серию статей по краткому введению в различные языки программирования. В идеале хотел поместить таблицей все данные по ЯПам в одну статью, но шрифт придется уменьшать до микроскопических размеров. По окончанию цикла в конце каждой статьи я размещу итоговую таблицу сравнения в различных форматах. В статьях будут рассмотрены: схожесть с другими языками, структура программы, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2012/02/Delphi.jpg" rel="lightbox[1139]"><img src="http://gltrinix.ru/wp-content/uploads/2012/02/Delphi-150x150.jpg" alt="" title="Delphi" width="150" height="150" class="alignright size-medium wp-image-1170" /></a>Сегодня начинаю серию статей по краткому введению в различные языки программирования. В идеале хотел поместить таблицей все данные по ЯПам в одну статью, но шрифт придется уменьшать до микроскопических размеров. По окончанию цикла в конце каждой статьи я размещу итоговую таблицу сравнения в различных форматах.</p>
<p>В статьях будут рассмотрены: схожесть с другими языками, структура программы, используемые типы данных, массивы, условные операторы, циклы, указатели, записи, списки и ООП. В основном будет представлен рабочий код. Подразумевается знание языка программирования (любого).</p>
<p>Начнем с Delphi.<br />
<span id="more-1139"></span></p>
<h2>Испытал влияние</h2>
<p>Object Pascal</p>
<h2>Структура программы («Hello world»)</h2>
<pre class="brush: delphi; title: ; notranslate">program Helloworld; //название программы
uses Windows; // используемые исходники
{$APPTYPE CONSOLE}//директива компилятору о создании консольного приложения
const pi = 3.14; // объявление константы
var s: string; // объявление переменной
begin
  s := ‘Hello, world!’; // присвоение значения переменной
  writeln(s); //вывод сообщения “Hello, world!”
end. //конец программы</pre>
<h2>Типы данных</h2>
<table width="100%" border="1" cellspacing="0" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="50%">Целые:</p>
<p>- Shortint (-128..+127)</p>
<p>- Smallint (-32768..+32767)</p>
<p>- Integer (-2147483648..+2147483647)</p>
<p>- Int64 (-2<sup>63</sup> .. +2<sup>63</sup>-1)</p>
<p>- Byte (0..255)</p>
<p>- Word(0..65535)</p>
<p>- Cardianl (0..4294967295)</td>
<td valign="top" width="100%">Дробные:</p>
<p>- Real (5*10<sup>-324</sup>..1.7*10<sup>308</sup>)</p>
<p>- Real48 (2.9*10<sup>-39</sup>..1.7*10<sup>38</sup>)</p>
<p>- Single (1.5*10<sup>-45</sup>..3.4*10<sup>38</sup>)</p>
<p>- Double (5*10<sup>-324</sup>..1.7*10<sup>308</sup>)</p>
<p>- Extended (3.6*10<sup>-4951</sup>..1.1*10<sup>4951</sup>-1)</p>
<p>- Comp (-2<sup>63</sup>..2<sup>63</sup>-1)</p>
<p>- Currency (922337203685477.5807)</td>
</tr>
<tr>
<td valign="top" width="50%">Строки:</p>
<p>- String (до 2 ГБ)</p>
<p>- Char</p>
<p>- PChar</td>
<td valign="top" width="100%">Логические:</p>
<p>- boolean</td>
</tr>
</tbody>
</table>
<h2>Массивы</h2>
<pre class="brush: delphi; title: ; notranslate">{имя}: array[{нижний индекс}..{верхний индекс}] of {тип};</pre>
<pre class="brush: delphi; title: ; notranslate">b: array[1..5] of integer;
c: array[0..9,0..2] of real;</pre>
<p>Пример использования динамических массивов см. в ООП.</p>
<h2>Условия</h2>
<p>&gt;, &lt;, =, &lt;&gt;, AND, OR, NOT</p>
<pre class="brush: delphi; title: ; notranslate">if {условие} then {операция} else {операция};</pre>
<pre class="brush: delphi; title: ; notranslate">if {условие} then begin
  {операция1};
  {операция2};
end else begin
  {операция1};
  {операция2};
end;</pre>
<pre class="brush: delphi; title: ; notranslate">case {оператор} of
  {значение1}: {операция};
  {значение2}: {операция};
else {операция};</pre>
<pre class="brush: delphi; title: ; notranslate">case {оператор} of
  {значение1}: begin
    {операции};
  end;
  {значение2}: begin
    {операции};
  end;
else begin
  {операции};
  end;
end;</pre>
<h2>Циклы</h2>
<pre class="brush: delphi; title: ; notranslate">for {переменная} := {начальное значение} to/downto {конечное значение} do
begin
  {операции};
end;</pre>
<pre class="brush: delphi; title: ; notranslate">for i := 10 downto 1 do {операция};</pre>
<pre class="brush: delphi; title: ; notranslate">while {условие} do begin
  {операции};
end;</pre>
<pre class="brush: delphi; title: ; notranslate">repeat
  {операции};
until {условие};</pre>
<pre class="brush: delphi; title: ; notranslate">for {переменная} in {конейнер} do {операция}; // Delphi 2005 и выше</pre>
<h2>Указатели</h2>
<pre class="brush: delphi; title: ; notranslate">var
  P: Pointer;
  I: Integer;
begin
  P := @I;
end;</pre>
<p>Типизированные указатели</p>
<pre class="brush: delphi; title: ; notranslate">var P: ^Integer;
  I: Integer;
begin
  P := @I; // P := Addr(I);
  P^ := 5; // I := 5;
end;</pre>
<h2>Записи</h2>
<pre class="brush: delphi; title: ; notranslate">type
  TCoords = record
    X,Y: Real;
  end;

var
  MyCoors = TCoords;
  CoordsFile = File of TCoords;</pre>
<p>Записи с вариантами</p>
<pre class="brush: delphi; title: ; notranslate">type
  TCoordsType = (cPoints, cPolar);
  TCoords = record
    case CoordsType: TCoordsType of
      cPoints: (
        X, Y: Real;
      );
      cPolar: (
        P: Real;
        Angle: Single;
      );
    end;
  end;</pre>
<p>Упакованные записи</p>
<pre class="brush: delphi; title: ; notranslate">type
  TMyCoords = packed record
    X,Y: Real;
  end;</pre>
<h2>Списки</h2>
<p>Вариант 1. На основе TList:</p>
<pre class="brush: delphi; title: ; notranslate">
var
  MyList: TList;
begin
  MyList := TList.Create;
end;</pre>
<p>Вариант 2. На основе записей:</p>
<pre class="brush: delphi; title: ; notranslate">type
  TPMyListOfCoords = ^TMyListOfCoords; // указатель на переменную

  TMyListOfCoords = record
    X, Y: Real;
    next: TPMyListOfCoords; // указатель на следующий элемент списка
  end;

var
  head: TPMyListOfCoords; // указатель на первый элемент списка</pre>
<h2>ООП</h2>
<pre class="brush: delphi; title: ; notranslate">program OOPExample;

{$APPTYPE CONSOLE}

uses
  {$IF RTLVersion &gt;= 23}  // для Delphi XE2 и выше
    System.SysUtils, Vcl.Dialogs;
  {$ELSE}                 // для остальных
    SysUtils, Dialogs;
  {$IFEND}

type
  TShowMsg = procedure (const Msg: string) of object; // процедурный тип

type
  TMyClass = class ;

  TMyNewClass = class of TMyClass; // метакласс

  TMyClass = class(TObject)  // объявление класса-наследника TObject
  private
    fX: integer;
    fY: array of integer; // динамический массив
    fShowMsg: TShowMsg;
    fMyC: TMyClass;
  protected
    procedure SetX(const val: integer);
  public
    function Clear: boolean;
    destructor Destroy;
    constructor Create(const n: integer = 0);
  published
    property X: integer read fX write SetX; // свойство класса
    property ShowMsg: TShowMsg read fShowMsg write fShowMsg;
  end;

var
  MC: TMyClass;

procedure TMyClass.SetX(const val: integer);
begin
  if fX &lt;&gt; val then fX := val;
end;

function TMyClass.Clear: boolean;
var i: integer; //локальная переменная
begin
  Result := True;
  try
    fX := 0;
    for i := 0 to Length(fY)-1 do fY[i] := 0; //пример for..in
  except
    //on E: Exception do ShowMessage(E.ClassName + ' ошибка: ' + E.Message);
    Result := False;
  end;
end;

destructor TMyClass.Destroy;
begin
  inherited Destroy;  // выполняем все операции класса-предка и добавляем свои
  SetLength(fY, 0);
end;

constructor TMyClass.Create(const n: integer = 0);
begin         // не наследуем конструктор от предка
  fX := 0;
  SetLength(fY, n);
end;

var
  s: string;
  buf: integer;

begin
  MC := TMyClass.Create(5);

  MC.fY[2] := 7;
  MC.X := 5;

  for buf in MC.fY do s := s + IntToStr(buf) + ' ';
  ShowMessage(s);

  if MC.Clear then ShowMessage('ok') else ShowMessage('Err');

  s := '';
  for buf in MC.fY do s := s + IntToStr(buf) + ' ';
  ShowMessage(s);

  MC.Destroy;
  if MC &lt;&gt; nil then MC := nil;
end.
</pre>
<p>Динамический абстрактный метод, виртуальный метод, перекрытие метода:</p>
<pre class="brush: delphi; title: ; notranslate">procedure Clear; dynamic; abstract;
procedure Clear; virtual;
procedure Clear; override;</pre>
<p>Контроль и преобразование типов:</p>
<pre class="brush: delphi; title: ; notranslate"> if Obj is TMyClass then ..
with Obj as TMyClass do .. // with TMyClass(Obj) do ..</pre>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1139/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Руководство Box2D на Delphi. Часть 2. Hello, World!</title>
		<link>http://gltrinix.ru/1120</link>
		<comments>http://gltrinix.ru/1120#comments</comments>
		<pubDate>Fri, 21 Oct 2011 08:27:01 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Box2D]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1120</guid>
		<description><![CDATA[Продолжение перевода официального мануала. На этот раз будет подробно разобрано демонстрационное приложение Simple, которое идет в дистрибутиве с Box2D. Ознакомимся с работой этого движка уже на практике. Так как tigrojop (ы! ), перевел только половину этой главы, то и мне пришлось потрудится в этот раз. Проект Simple (версия С++ называется &#171;Hello World&#187;, прим. gltrinix) можно [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/10/b2d_icon_m2.png" rel="lightbox[1120]"><img class="alignright size-full wp-image-1121" title="Box2D на Delphi. Просто." src="http://gltrinix.ru/wp-content/uploads/2011/10/b2d_icon_m2.png" alt="" width="102" height="102" /></a>Продолжение перевода официального мануала. На этот раз будет подробно разобрано демонстрационное приложение Simple, которое идет в дистрибутиве с Box2D. Ознакомимся с работой этого движка уже на практике. Так как tigrojop (ы! <img src='http://gltrinix.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), перевел только половину этой главы, то и мне пришлось потрудится в этот раз.<span id="more-1120"></span></p>
<p>Проект <strong>Simple</strong> (<em>версия С++ называется &#171;Hello World&#187;, прим. gltrinix</em>) можно найти в дистрибутиве <strong>Box2D</strong>. Программа создает большое тело земли и маленькое динамическое тело (<em>«ground box» и «dynamic box» соответственно – оба имеют форму бокса, т.е. прямоугольника – прим. перев. tigrojop</em>). Этот код не содержит графики. Только текстовый вывод &#8212; изменение координат динамического тела с течением времени.</p>
<p>Это хороший пример для того, чтобы увидеть как <strong>Box2D</strong> работает.</p>
<h2>Создание физического мира</h2>
<p>Каждая программа <strong>Box2D</strong> начинается с создания объекта типа <strong>Tb2World</strong>. <strong>Tb2World</strong> &#8212; концентратор физики, который управляет памятью, объектами, и моделированием. Вы можете выделить ресурсы под физический мир в стеке, &#171;куче&#187;, или секции данных. Решать вам.</p>
<p>Создать мир <strong>Box2D</strong> легко. Во-первых, мы определяем вектор силы тяжести (<em>вектор гравитации, gravity vector</em>). Также мы говорим миру, что тела будут засыпать, когда они останавливаются. Спящее тело не требует никакого моделирования (<em>а соответственно, потребляется меньше ресурсов &#8212; прим. перев. tigrojop</em>).</p>
<pre class="brush: delphi; title: ; notranslate">var
  world   : Tb2World;
  gravity : TVector2;
  doSleep : boolean;
  ...
begin
  SetValue(gravity, 0, -10);
  doSleep := True;
  ...</pre>
<p>Теперь мы создаем сам объект мира. Отметьте, что мы создаем мир в стеке, таким образом, мир должен остаться в области видимости.</p>
<pre class="brush: delphi; title: ; notranslate">  ...
  world := Tb2World.Create(gravity, doSleep);
  ...</pre>
<p>Итак, теперь у нас есть наш физический мир, давайте добавим в него объекты.</p>
<h2>Создание тела земли (ground box)</h2>
<p>Для создания <strong>тел</strong> используйте следующие шаги:</p>
<ol>
<li>Определите тело с помощью <strong>позиции</strong> (position), свойства <strong>затухания (торможения?)</strong> (dumping), и т.д.</li>
<li>Используйте объект мира, чтобы создать <strong>тело</strong>.</li>
<li>Определите <strong>крепление(ия)</strong> (fixtures) с помощью <strong>фигуры</strong> (shape), <strong>трения</strong> (friction), <strong>плотности</strong> (density), и т.д.</li>
<li>Создайте <strong>крепление(ия)</strong> на <strong>теле</strong>.</li>
</ol>
<p>В шаге №1 нам нужно создать <strong>определение тела</strong> (body definition). В <strong>определении тела</strong> мы указываем начальную позицию тела земли.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  groundDef : Tb2BodyDef;
  ...
begin
  ...
  groundDef := Tb2BodyDef.Create;
  SetValue(groundDef.position, 0, -10);
  ...</pre>
<p>В шаге №2, чтобы создать тело земли, <strong>определение тела</strong> передается объекту мира. Объект мира не сохраняет ссылку на <strong>определение тела</strong>. Тело земли создается как статическое (static) тело. Статические тела не сталкиваются с другими статическими телами и неподвижны. <strong>Box2D</strong> решает, что тело статично, когда у тела нулевая масса. У тел нулевая масса по умолчанию; поэтому они статичны по умолчанию.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  groundBody : Tb2Body;
  ...
begin
  ...
  groundBody := world.CreateBody(groundDef);
  ...</pre>
<p>В шаге №3 создаем полигон (многоугольник) земли. Мы используем ярлык (<em>короткий способ создания – прим. перев. tigrojop</em>) <strong>SetAsBox</strong>, чтобы сформировать полигон земли в виде прямоугольной фигуры, центр которой совпадает с центром (<em>его координаты мы указали в <strong>определении тела</strong> – прим. перев. tigrojop</em>) родительского тела.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  groundShapeDef : Tb2PolygonShape;
  ...
begin
  ...
  groundShapeDef := Tb2PolygonShape.Create;
  groundShapeDef.SetAsBox(50.0, 10.0);
  ...</pre>
<p><a href="http://gltrinix.ru/wp-content/uploads/2011/10/box2d_offset.png" rel="lightbox[1120]"><img class="alignright size-full wp-image-1122" title="Длина и высота прямоугольника в Box2D" src="http://gltrinix.ru/wp-content/uploads/2011/10/box2d_offset.png" alt="" width="300" height="200" /></a>Функция <strong>SetAsBox</strong> в качестве параметров принимает полуширину и полувысоту прямоугольника. Таким образом, в нашем случае тело земли будет 100 единиц в ширину (ось X) и 20 единиц в высоту (ось Y). <strong>Box2D</strong> настроен на метры, килограммы и секунды. Поэтому, можно полагать, что размеры указываются в метрах. <strong>Box2D</strong> работает лучше всего, когда размеры примерно равны размерам типичных объектов реального мира. Например, бочка приблизительно высотой в 1 метр. Из-за ограничений арифметики с плавающей точкой, использование <strong>Box2D</strong> для моделирования перемещения ледников или частиц пыли не будет показателем блистательности вашего ума.</p>
<p>В шаге №4 мы заканчиваем создание тела земли, создавая <strong>крепление</strong> (fixture) при помощи <strong>фигуры</strong> (shape). Для этого шага у нас есть ярлык (короткий способ). Сейчас у нас нет необходимости менять параметры по умолчанию для свойств материала крепления, поэтому можно передать <strong>фигуру</strong> (shape) непосредственно <strong>телу</strong> без создания <strong>определения крепления</strong> (fixture definition). Позже мы увидим, как использовать <strong>определение крепления</strong> (fixture definition) для настройки свойств материала.</p>
<pre class="brush: delphi; title: ; notranslate">  ...
  groundBody.CreateFixture(groundShapeDef, 0.0);
  ...</pre>
<p><strong>Box2D</strong> не хранит ссылку на <strong>фигуру</strong> (shape). Он клонирует данные в новый <strong>b2Shape</strong> объект.</p>
<p>Отметьте, что каждое <strong>крепление</strong> (fixture) должно иметь родительское <strong>тело</strong>, даже <strong>крепления</strong>, которые статичны. Однако, можно присоединить несколько статических <strong>креплений</strong> к единственному статическому <strong>телу</strong>. Это требование для статических тел нужно, чтобы сделать код <strong>Box2D</strong> внутренне более универсальным, сокращая количество потенциальных ошибок.</p>
<p>Выше вы могли заметить некоторый шаблон в именовании. Большинство типов <strong>Box2D</strong> снабжается префиксом <strong>b2</strong>. Это делается, чтобы уменьшить вероятность для конфликтов имен с вашим кодом.</p>
<h2>Создание динамического тела</h2>
<p>Итак, у нас есть тело земли. Мы можем использовать тот же самый метод, чтобы создать динамическое тело. Главное отличие, помимо размеров, то, что мы должны установить свойства массы динамического тела.</p>
<p>Сначала мы создаем тело, используя метод <strong>CreateBody</strong>. По умолчанию тела статичны, поэтому, первым делом мы должны установить <strong>b2BodyType</strong>, чтобы сделать тело динамическим.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  bodyDef : Tb2BodyDef;
  body    : Tb2Body;
  ...
begin
  ...
  bodyDef.bodyType := b2_dynamicBody;
  SetValue(bodyDef.position, 0.0, 4.0);
  body := world.CreateBody(bodyDef);
  ...</pre>
<blockquote><p><strong>Внимание</strong></p>
<p>Следует установить тип тела в b2_dynamicBody, если вы хотите, чтобы тело перемещалось, когда к нему применяются силы.</p></blockquote>
<p>Затем мы создаем и присоединяем фигуру полигона (многоугольника), используя <strong>определение крепления</strong> (fixture definition). Сначала мы создаем фигуру (<em>в виде прямоугольника, используя для этого метод <strong>SetAsBox</strong> – прим. перев. tigrojop</em>):</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  shapeDef: Tb2PolygonShape;
  ...
begin
  ...
  shapeDef := Tb2PolygonShape.Create;
  shapeDef.SetAsBox(1.0, 1.0);
  ...</pre>
<p>А затем мы создаем <strong>определение крепления</strong> (fixture definition), используя фигуру прямоугольника (dynamicBox). Заметьте, что мы устанавливаем <strong>плотность</strong> (density) в 1. По умолчанию плотность равна нулю. Кроме того, <strong>трение</strong> (friction) устанавливается в 0.3.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  fd: Tb2FixtureDef;
  ...
begin
  ...
  fd := Tb2FixtureDef.Create;
  fd.shape := shapeDef;
  fd.density := 1.0;
  fd.friction := 0.3;
  ...</pre>
<p>Используя <strong>определение крепления</strong> (fixture definition) мы можем теперь создать само <strong>крепление</strong> (fixture). Это автоматически обновит массу тела. Можно добавить столько креплений к телу, сколько хотите. Каждое крепление будет влиять на окончательную массу тела (<em>я так понимаю, что масса крепления вычисляется из площади фигуры и плотности – прим. перев. tigrojop</em>).</p>
<pre class="brush: delphi; title: ; notranslate">  ...
  body.CreateFixture(fd);
  ...</pre>
<p>На этом инициализация заканчивается. И сейчас мы готовы начать моделирование.</p>
<h2>Моделирование мира</h2>
<p>Мы создали тело земли и динамическое тело. Теперь проверим законы Ньютона на практике. Но прежде, чем приступить к этому, необходимо узнать еще пару вещей о <strong>Box2D</strong>.</p>
<p><strong>Box2D</strong> использует вычислительный алгоритм, называемый <strong>интегратором</strong> (integrator). <strong>Интеграторы</strong> вычисляют значения физических величин (инерцию, позицию и др.) в дискретные моменты времени. Это как если бы на страницах своей школьной тетради вы изобразили движущегося человека в каждый момент времени, а потом быстро перелистали все страницы, заставив его двигаться. Таким образом, мы должны выбрать такой <strong>временной шаг</strong> (time step) для <strong>Box2D</strong>, чтобы дискретность событий была незаметна глазу. Обычно этот <strong>шаг</strong> для игровых физических движков равен 60 Гц или 1/60 секунды. Вы можете использовать и другие значения (<em>будьте готовы, что на экране может начаться подергивание объектов или их прохождение друг через друга &#8212; прим. gltrinix</em>). Если величина <strong>шага</strong> не будет постоянной, то мы будем получать различные результаты, что затруднит процесс отладки. Из-за этого не рекомендуется привязывать <strong>временной шаг</strong> (times step) к частоте кадров. А теперь установим <strong>шаг времени</strong> (time step).</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  timeStep: Float;
  ...
begin
  ...
  timeStep := 1.0 / 60.0;
  ...</pre>
<p>В дополнение к <strong>интегратору</strong> <strong>Box2D</strong> использует <strong>решатель ограничений</strong> (constraint solver). <strong>Решатель ограничений</strong> производит расчеты всех <strong>ограничений</strong> (constraints) в моделируемом мире, по одному за раз. Если <strong>ограничение</strong> только одно, то расчет будет идеальным. Однако, когда происходит обработка одного <strong>ограничения</strong>, то могут нарушиться другие. Чтобы избежать этого, необходимо рассчитать все <strong>ограничения</strong> (constraints) несколько раз.</p>
<p><strong>Решатель ограничений </strong>(constraint solver) выполняет 2 функции (phases): <strong>расчет скорости</strong> (velocity phase) и <strong>расчет позиции</strong> (position phase). При <strong>расчете скорости</strong> решатель вычисляет все <strong>импульсы</strong> (impulses), приложенные к <strong>телам</strong> (body), необходимые для их правильного перемещения. При <strong>расчете позиции</strong> решатель регулирует положение <strong>тел</strong> для предотвращения их проникновения друг в друга и разрыва <strong>соединений</strong> (joint). Каждый этап имеет свое <strong>число повторений</strong> или <strong>итераций</strong> (iteration count). Кроме того, расчет позиции может закончиться до достижения своего <strong>числа повторений</strong>, если погрешность вычислений будет достаточно мала.</p>
<p>Рекомендуемое количество <strong>итераций</strong> <strong>скоростей</strong> и <strong>позиций</strong> в <strong>Box2D</strong> равно 10. Вы можете менять это значение по своему усмотрению, просто имейте в виду, что это компромисс между скоростью и точностью. Использование меньшего числа <strong>итераций</strong> увеличивает производительность за счет уменьшения точности. Аналогично, задав большое число <strong>повторений</strong> расчетов, вы уменьшите производительность, зато увеличите качество моделирования физического мира. Для нашего примера нам нет нужды использовать много <strong>итераций</strong>. Именно поэтому мы выбрали такое их количество.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  viterations, piterations: Int32;
  ...
begin
  ...
  viterations := 6;
  piterations := 2;
  ...</pre>
<blockquote><p><strong>Внимание</strong></p>
<p>Шаг по времени (time step) и число итераций (iteration count) не связаны друг с другом. Может быть такое, что за один и тот же шаг времени произойдет несколько итераций, а через некоторое время &#8212; только одна.</p></blockquote>
<p>Теперь мы готовы приступить к моделированию. В вашей игре цикл моделирования физики может быть объединен с вашим игровым циклом. В каждом проходе цикла игры вызывайте <strong>b2World.Step</strong>. Одного вызова, как правило, достаточно; это зависит от установленной частоты кадров и <strong>временным шагом</strong> (time step) физики. После этого следует вызвать <strong>b2World.ClearForces</strong>, чтобы очистить все <strong>силы</strong> (forces), которые были применены к <strong>телам</strong> (bodies).</p>
<p>Программа <strong>Simple</strong> устроена простейшим способом, в ней нет никакого вывода графики. Вместо этого код выводит позицию и ориентацию динамического <strong>тела</strong> в список (TListBox). Вот моделируется цикл, который имитирует 60 <strong>временных шагов</strong> (time step) в течение 1 секунды виртуального времени.</p>
<pre class="brush: delphi; title: ; notranslate">var
  ...
  i        : Integer;
  position : TVector2;
  angle    : Float;
begin
  ...
  ListBox1.Items.BeginUpdate;
  for i := 0 to 59 do
  begin
    world.Step(timeStep, viterations, piterations);
    world.ClearForces;
    position := body.GetPosition;
    angle := body.GetAngle;
    ListBox1.Items.Add(Format('%d  x: %f  y: %f  a: %f', [i, position.x, position.y, angle]));
  end;
  ListBox1.Items.EndUpdate;
  ...</pre>
<p>На выходе мы получаем координаты и ориентацию подающего динамического <strong>тела</strong> на землю. Должно получиться примерно следующее:</p>
<pre class="brush: delphi; title: ; notranslate">0.00 4.00 0.00
0.00 3.99 0.00
0.00 3.98 0.00
...
0.00 1.25 0.00
0.00 1.13 0.00
0.00 1.01 0.00</pre>
<h2>Освобождение памяти</h2>
<p>Когда мир удаляется вызовом <strong>b2World.Free</strong>, вся память, зарезервированная для <strong>тел</strong> (body), <strong>креплений</strong> (fixtures) и <strong>соединений</strong> (joints), освобождается. Это сделано, чтобы вам не пришлось вручную удалять каждый объект из памяти. Тем не менее, указатели на эти объекты все еще необходимо <strong>обнулить</strong> (nil).</p>
<p><strong>Демо TestBed</strong></p>
<p>Когда вы разберетесь в примере <strong>Simple</strong>, вам следует обратить внимание на пример <strong>TestBed</strong>. Это приложение представляет собой <strong>фреймворк</strong> (framework) по тестированию юнитов и созданию новых демонстрационных приложений. Вот некоторые из доступных возможностей:</p>
<ul>
<li>Камера с управляемыми панорамой и масштабом.</li>
<li>Динамические тела можно передвигать простым удерживанием курсора на них.</li>
<li>Расширенный набор тестов.</li>
<li>Специальный графический интерфейс для выбранных тестов, настройка параметров моделирования, опции отладки и отрисовки.</li>
<li>Пауза и пошаговое выполнение моделирования.</li>
<li>Вывод текста.</li>
</ul>
<p><center><a href="http://gltrinix.ru/wp-content/uploads/2011/10/box2d2.0.0_testbed.gif" rel="lightbox[1120]"><img class="alignnone size-full wp-image-1123" title="Пример TestBed Box2d версии 2.0.0" src="http://gltrinix.ru/wp-content/uploads/2011/10/box2d2.0.0_testbed.gif" alt="" width="559" height="501" /></a></center>В <strong>TestBed</strong> приведено множество примеров использования <strong>Box2D</strong>. Я рекомендую вас внимательно изучить все эти примеры, чтобы научиться использовать <strong>Box2D</strong>.</p>
<blockquote><p><strong>Внимание</strong></p>
<p>TestBed написан с использованием библиотек FreeGLUT и GLUI и не является частью Box2D. Box2D не выводит графику и не зависит от нее. Как видно из примера Simple, вам нет нужды использовать графичесий движок при работе с Box2D.</p></blockquote>
<h2>Ссылки:</h2>
<p>[1] <a href="http://tigrojop.ru/files/translate/box2d/box2d-manual-2.1.0-rus.html">Оригинальная страница перевода</a></p>
<p>[2] <a href="http://box2d.org/manual.html">Оригинальный мануал </a></p>
<p>[3] <a href="http://sourceforge.net/projects/box2d-delphi/">Страница Box2D Delphi на sourceforge </a></p>
<p>[4] <a href="http://code.google.com/p/box2d-delphi/">Страница Box2D Delphi на google code </a></p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1120/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Руководство Box2D на Delphi. Часть 1. Введение.</title>
		<link>http://gltrinix.ru/1091</link>
		<comments>http://gltrinix.ru/1091#comments</comments>
		<pubDate>Wed, 19 Oct 2011 21:49:46 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Box2D]]></category>
		<category><![CDATA[Delphi]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1091</guid>
		<description><![CDATA[Эта статья является переводом официального мануала версии 2.1.0, взятым -отсюда-, и содержит в себе базовые понятия и структуру этого физического движка. Все примеры переведены на язык программирования Delphi и адаптированы к соответствующему порту Box2D, сам перевод был несколько дополнен мной. Что такое Box2D Box2D &#8212; это библиотека, которая моделирует физическое поведение твердых тел в двумерном [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/10/b2d_icon_m1.png" rel="lightbox[1091]"><img class="alignright size-full wp-image-1118" title="Box2D на Delphi. Введение." src="http://gltrinix.ru/wp-content/uploads/2011/10/b2d_icon_m1.png" alt="" width="102" height="102" /></a>Эта статья является переводом официального мануала версии 2.1.0, взятым <a href="http://tigrojop.ru/files/translate/box2d/box2d-manual-2.1.0-rus.html">-отсюда-</a>, и содержит в себе базовые понятия и структуру этого физического движка. Все примеры переведены на язык программирования Delphi и адаптированы к соответствующему порту Box2D, сам перевод был несколько дополнен мной.<span id="more-1091"></span></p>
<h2>Что такое Box2D</h2>
<p><strong>Box2D</strong> &#8212; это библиотека, которая моделирует физическое поведение твердых тел в двумерном пространстве. Программисты могут использовать ее в своих играх, чтобы сделать движения объектов правдоподобными, а мир игры более интерактивным. С игровой точки зрения, физический движок &#8212; всего лишь система для процедурной анимации.</p>
<p><strong>Box2D</strong> написан на портируемом C++. Имена большинства типов, определенных в <strong>Box2D</strong>, начинаются с префикса &#171;<strong>b2</strong>&#171;. Мы надеемся, этого достаточно, чтобы избежать конфликтов имен с вашим игровым движком.</p>
<h2>Предпосылки</h2>
<p>В этом руководстве предполагается, что вы знакомы с основными понятиями физики, такими как: масса, сила, вращающий момент, и импульсы. В противном случае, пожалуйста, ознакомьтесь сначала с уроками Криса Хэкера (Chris Hecker) и Дэвида Бэраффа (David Baraff) (поищите в Google эти имена). Вам не нужно понимать их уроки до мельчайших деталей, но они проделали хорошую работу по объяснению фундаментальных физических понятий, знание которых поможет вам при использовании <strong>Box2D</strong>.</p>
<p>Википедия (http://ru.wikipedia.org и http://wikipedia.org) также является хорошим источником знаний по физике и математике. До некоторой степени она более полезна, чем Google, так как содержит  тщательно подобранную информацию.</p>
<p><strong>Box2D</strong> был создан как часть учебника по физике (physics tutorial) на Конференции Разработчиков Игр (Game Developer Conference). Вы можете получить эти учебники в разделе «download» на сайте box2d.org.</p>
<p>Ожидается, что у вас есть опыт программирования. <strong>Box2D</strong> не должен быть вашим первым проектом. Вам необходимо знать, что такое компилирование, линковка и отладка приложения.</p>
<blockquote><p><strong>Внимание</strong></p>
<p>Box2D не должен быть вашим первым проектом по программированию. Пожалуйста, изучите язык программирования, на котором собираетесь работать, компилирование, линковку, и отладку приложений прежде, чем начнете работать с Box2D. В сети есть много ресурсов для этого.</p></blockquote>
<h2>Об этом руководстве</h2>
<p>Оригинальное руководство охватывает большую часть <strong>API Box2D</strong> (API – Application Programming Interface &#8212; интерфейс прикладного программирования). Однако, в нем освещены не все аспекты этого движка. Вам стоит посмотреть демонстрационное приложение <strong>TestBed</strong>, включенное в <strong>Box2D</strong>, чтобы лучше разобраться во всех тонкостях движка. Кроме того, базовый код движка на С++ имеет комментарии в формате <a href="http://ru.wikipedia.org/wiki/Doxygen">Doxygen</a>, что облегчает создание документации в формате <strong>HTML</strong>.</p>
<h2>Обратная связь и сообщения об ошибках</h2>
<p>Если у вас есть замечания или предложения о чем-либо связанном с <strong>Box2D</strong>, пожалуйста, оставьте комментарий на форуме. Форум – это хорошее место также и для дискуссий сообщества.</p>
<p>Проблемы и ошибки <strong>Box2D</strong> отслеживаются с использованием проекта <strong>Google Code</strong>. Это отличный способ для отслеживания проблем и гарантирует, что ваша проблема не будет потеряна в глубинах форумов.</p>
<blockquote><p>Список проблем можно найти здесь: http://code.google.com/p/box2d/</p></blockquote>
<p>Для гарантии, что ваша проблема будет решена, вы можете помочь в ее решении, предоставив достаточные для этого данные. Пример, сделанный по типу <strong>TestBed</strong>, который воспроизводит проблему, идеален.</p>
<h2>Основные понятия</h2>
<p>Box2D работает с несколькими базовыми объектами. Здесь мы только кратко опишем эти объекты, а более подробные описания дадим позже.</p>
<p><span style="text-decoration: underline;"><em>Фигура (shape)</em></span></p>
<p>Плоская геометрическая фигура, такая как <strong>окружность</strong> (circle) или <strong>многоугольник</strong> (polygon).</p>
<p><span style="text-decoration: underline;"><em>Твердое тело (rigid body)</em></span></p>
<p>Предмет, состоящий из материала настолько прочного, что расстояние между любыми двумя точками этого предмета является постоянным при любых условиях. Предмет, прочный как алмаз. В дальнейшем, для удобства, мы будем использовать термин «тело» (body), вместо «твердое тело» (rigid body).</p>
<p><span style="text-decoration: underline;"><em>Крепление (fixture)</em></span></p>
<p>«Крепление» привязывает <strong>фигуру</strong> (shape) к <strong>телу</strong> (body) и добавляет свойства материала, такие как: <strong>плотность</strong> (density), <strong>трение</strong> (friction) и <strong>упругость</strong> (restitution).</p>
<p><span style="text-decoration: underline;"><em>Ограничение (constraint)</em></span></p>
<p>«Ограничение» – это физическое соединение, которое ограничивает свободу перемещения и/или вращения тел. На плоскости тело имеет 3 степени свободы (движение по вертикали и горизонтали, и вращение). Если мы возьмем тело и прикрепим его булавкой к стене, то мы ограничим движения тела стеной. В данном случае тело сможет только вращаться вокруг булавки, таким образом «ограничение» удалило 2 степени свободы тела.</p>
<p><span style="text-decoration: underline;"><em>Контактное ограничение (contact constraint)</em></span></p>
<p>Специальное «ограничение», предназначенное для предотвращения проникновения твердых тел друг в друга, а также моделирования трения и упругости. Вам не придется создавать такие ограничения; они создаются <strong>Box2D</strong> автоматически.</p>
<p><span style="text-decoration: underline;"><em>Соединение (joint)</em></span></p>
<p>«Соединение» – это ограничение, используемое для скрепления вместе двух и более тел. <strong>Box2D</strong> поддерживает несколько типов соединений: «болтовое» (revolute), «призматическое» (prismatic), «жесткий отрезок» (distance), и другие. Некоторые соединения могут иметь <strong>ограничители</strong> (limits) и <strong>мускулы</strong> (motors).</p>
<p><span style="text-decoration: underline;"><em>Ограничитель соединения (joint limit)</em></span></p>
<p>«Ограничитель соединения» ограничивает диапазон движения соединения. Например, человеческое колено или локоть могут двигаться только в определенном диапазоне углов.</p>
<p><span style="text-decoration: underline;"><em>Мускул соединения (joint motor)</em></span></p>
<p>«Мускул соединения» управляет движением соединенных тел согласно степеням свободы соединения. Например, вы можете использовать <strong>мускул</strong>, чтобы управлять вращением колена.</p>
<p><span style="text-decoration: underline;"><em>Мир (world)</em></span></p>
<p>Физический мир включает в себя все <strong>тела</strong> (bodies), <strong>крепления</strong> (fixtures) и <strong>ограничения</strong> (constraints), которые взаимодействуют друг с другом. <strong>Box2D</strong> поддерживает создание нескольких миров, но обычно в этом нет необходимости или это нежелательно.</p>
<h2>Модули</h2>
<p><strong><a href="http://gltrinix.ru/wp-content/uploads/2011/10/image001.png" rel="lightbox[1091]"><img class="alignright size-full wp-image-1092" title="Взаимодействие модулей в Box2D" src="http://gltrinix.ru/wp-content/uploads/2011/10/image001.png" alt="" width="231" height="244" /></a>Box2D</strong> состоит из трёх модулей: <strong>Общий модуль</strong> (Common Module), <strong>Модуль столкновений</strong> (Collision Module) и <strong>Модуль динамики</strong> (Dynamics Module). Модуль «Common» содержит код для создания объектов и выделения памяти для них (allocation) математические функции и настройки. Модуль «Collision» определяет <strong>фигуры</strong> (shapes), <strong>общую фазу</strong> (broad-phase) и функции/запросы столкновений. Модуль «Dynamics» обеспечивает мир моделирования, <strong>тела</strong> (bodies), <strong>крепления</strong> (fixtures) и <strong>соединения</strong> (joints).</p>
<h2>Единицы измерения</h2>
<p>Так как <strong>Box2D</strong> работает с числами с плавающей точкой, то необходимо заранее определить допустимые размеры и отклонения от них, чтобы <strong>Box2D</strong> работал хорошо. <strong>Box2D</strong> настроен на работу в системе измерений <strong>СИ</strong> (метры-килограммы-секунды). В частности, <strong>Box2D</strong> был настроен, чтобы работать хорошо с перемещением объектов размерами от 0.1 до 10 метров, то есть от стаканов до автобусов. Статичные объекты без проблем могут быть больше 50 метров.</p>
<p><strong>Box2D</strong> является двумерным физическим движком, поэтому заманчиво использовать пиксели в качестве единиц измерения. К сожалению, это приведет к плохому моделированию и, возможно, странному поведению. Объект в 200 пикселей был бы воспринят <strong>Box2D</strong> как 45-ти этажное здание. Вообразите попытку смоделировать движение высотного здания движком, который был настроен на работу с куклами и бочками.</p>
<blockquote><p><strong>Внимание</strong></p>
<p>Box2D настроен на работу в системе СИ. Используйте размеры движущихся объектов в пределах от 0.1 до 10 метров. Вам будет нужно использовать масштабирование при выводе результата в графическом виде. Испытательный стенд (testbed) Box2D делает масштабирование, используя OpenGL viewport transform.</p></blockquote>
<p>Лучше думать о телах <strong>Box2D</strong> как о движущихся рекламных щитах, на которые вы прикрепляете свои иллюстрации. Рекламный щит может двигаться в координатной системе использующей метры в качестве единиц измерения, но вы можете перевести их (метры) в пиксели, используя обычный коэффициент масштабирования. Затем вы уже можете использовать эти значения в пикселях, чтобы задать координаты спрайтам,  и т.д.</p>
<p>Углы в <strong>Box2D</strong> измеряются в радианах. Вращение тела устанавливается <strong>в радианах</strong> и может расти неограниченно. Нормализуйте углы ваших тел, если величина угла станет слишком большой (используйте b2Body.SetAngle).</p>
<h2>Фабрики и определения (Factories and Definitions)</h2>
<p>Управление памятью играет центральную роль в конструкции <strong>Box2D API</strong>. Так, когда вы создаете <strong>b2Body</strong> или <strong>b2Joint</strong>, вы должны вызвать методы-фабрики объекта <strong>b2World</strong>. Вы никогда не должны пытаться выделить ресурсы под объекты этих типов другим способом.</p>
<p>Есть методы создания:</p>
<pre class="brush: delphi; title: ; notranslate">var
  b2Body  : Tb2Body;
  b2Joint : Tb2Joint;
begin
  b2Body := b2World.CreateBody (b2BodyDef );
  b2Joint:= b2World.CreateJoint(b2JointDef);
end;</pre>
<p>И есть соответствующие методы уничтожения:</p>
<pre class="brush: delphi; title: ; notranslate">begin
  b2World.DestroyBody (b2Body );
  b2World.DestroyJoint(b2Joint);
end;</pre>
<p>Когда вы создаете <strong>тело</strong> (body) или <strong>соединение</strong> (joint), вы должны обеспечить их <strong>определение</strong> (definition). Эти определения содержат всю информацию, нужную для создания <strong>тела</strong> или <strong>соединения</strong>. При использовании этого подхода мы можем предотвратить конструкционные ошибки, сохранить число параметров функции маленьким, обеспечить разумные значения по умолчанию, и сократить количество средств доступа.</p>
<p>Так как <strong>крепления</strong> (fixtures) должны быть частью <strong>тела</strong> (body), они создаются и уничтожаются с использованием метода-фабрики объекта <strong>b2Body</strong>:</p>
<pre class="brush: delphi; title: ; notranslate">var
  b2Fixture : Tb2Fixture;
begin
  b2Fixture := b2Body.CreateFixture(b2FixtureDef);
  b2Body.DestroyFixture(b2Fixture);
end;</pre>
<p>Есть также &#171;ярлык&#187;, чтобы создать <strong>крепление</strong> с использованием непосредственно <strong>фигуры</strong> (shape) и <strong>плотности</strong> (density).</p>
<pre class="brush: delphi; title: ; notranslate">  b2Fixture := b2Body.CreateFixture(b2Shape, density);</pre>
<p>Фабрики не сохраняют ссылки на <strong>определения</strong> (definitions). Таким образом, вы можете создать <strong>определения</strong> в стеке и сохранить их во временных ресурсах.</p>
<h2>Пользовательские данные (User Data)</h2>
<p>Классы <strong>b2Fixture</strong>, <strong>b2Body</strong>, и <strong>b2Joint</strong> позволяют сохранить указатель на какие-то другие данные в виде указателя на произвольный тип. Это удобно, когда при использовании объектов <strong>Box2D</strong> необходимо задавать соответствующие им «игровые» объекты.</p>
<p>Например, часто этот указатель хранит ссылку на соответствующий «игровой объект», который в свою очередь содержит ссылку на физическое тело. Получается своеобразная циклическая ссылка, когда, имея игровой объект, можно получить указатель на физическое тело и, наоборот, имея тело получить указатель на игровой объект.</p>
<pre class="brush: delphi; title: ; notranslate">var
  actor  : TGameActor;
  bodyDef: b2BodyDef;
begin
  actor := GameCreateActor();
  bodyDef.userData = actor;
  actor.body := box2Dworld.CreateBody(bodyDef);
end;</pre>
<p>Вот некоторые примеры случаев, в которых вам могут потребоваться пользовательские данные:</p>
<ul>
<li>Применение повреждения к игровому объекту после столкновения.</li>
<li>Выполнение заданного сценарием события, если персонаж попал в определенную ограничивающую область (axis-aligned box, или Axis-Aligned Bounding Box &#8212; AABB &#8212; прямоугольник со сторонами, параллельными осям координат в мировой системе; при вращении объекта AABB изменяет свои размеры, но всегда остается ориентированным по осям координат &#8212; прим. перев. tigrojop).</li>
<li>Уведомление игровых объектов о разрыве соединения между физическими объектами.</li>
</ul>
<p>Следует помнить, что указатель на данные можно использовать по своему усмотрению и хранить в нем все что угодно, но при его использовании следует быть осторожным. Например, если в этом указателе хранится ссылка на игровой объект, то и в остальных объектах должна храниться ссылка того же типа, иначе, может произойти исключительная ситуация при попытке приведения типа указателя.</p>
<h2>Ссылки:</h2>
<p>[1] <a href="http://tigrojop.ru/files/translate/box2d/box2d-manual-2.1.0-rus.html">Оригинальная страница перевода.</a></p>
<p>[2] <a href="http://box2d.org/manual.html">Оригинальный мануал.</a></p>
<p>[3] <a href="http://sourceforge.net/projects/box2d-delphi/">Страница Box2D Delphi на sourceforge.</a></p>
<p>[4] <a href="http://code.google.com/p/box2d-delphi/">Страница Box2D Delphi на google code.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1091/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Knytt Stories</title>
		<link>http://gltrinix.ru/1063</link>
		<comments>http://gltrinix.ru/1063#comments</comments>
		<pubDate>Tue, 18 Oct 2011 08:12:49 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[Игры]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1063</guid>
		<description><![CDATA[Knytt Stories это платформер, в котором каждый уровень &#8212; ваше маленькое личное приключение. В игре удивляет все: логичность, простота, графика, сюжет, эмоции, управление&#8230; даже окно самой игры &#8212; и то стремится выйти за рамки повседневного. С умилением пройдя основной сюжет, я установил дополнительные уровни и поигрался с редактором карт, который весьма недурно сделан. Не знаю, [...]]]></description>
			<content:encoded><![CDATA[<p><center><a href="http://gltrinix.ru/wp-content/uploads/2011/10/KnyttStories_scr1.png" rel="lightbox[1063]"><img class="size-full wp-image-1065 alignnone" title="Knytt Stories - платформер, где каждый уровень - маленькое приключение" src="http://gltrinix.ru/wp-content/uploads/2011/10/KnyttStories_scr1.png" alt="" width="600" height="100" /></a></center>Knytt Stories это платформер, в котором каждый уровень &#8212; ваше маленькое личное приключение. В игре удивляет все: логичность, простота, графика, сюжет, эмоции, управление&#8230; даже окно самой игры &#8212; и то стремится выйти за рамки повседневного. С умилением пройдя основной сюжет, я установил дополнительные уровни и поигрался с редактором карт, который весьма недурно сделан.</p>
<p>Не знаю, какие слова можно подобрать для этого чуда, но поиграть в него вы должны обязательно! Тем более, что игра бесплатна.<span id="more-1063"></span></p>
<p>Игра запускается на всех окошках, начиная с Windows 2000, а также на DS в качестве хоумбрю приложения.</p>
<p>Официальная страница- <a href="http://nifflas.ni2.se/?page=Knytt+Stories">ссылка</a>.</p>
<p>Архив уровней &#8212; <a href="http://knyttlevels.com/">ссылка</a>.</p>
<p>Советую обратить внимание и на другие игры Nifflas&#8217;a.</p>
<p><center><a href="http://gltrinix.ru/wp-content/uploads/2011/10/KnyttStories_scr4.png" rel="lightbox[1063]"><img class="size-full wp-image-1066 alignnone" title="Knytt Stories - платформер, где каждый уровень - маленькое приключение" src="http://gltrinix.ru/wp-content/uploads/2011/10/KnyttStories_scr4.png" alt="" width="600" height="100" /></a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1063/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Введение в PHP. Часть 2.</title>
		<link>http://gltrinix.ru/1043</link>
		<comments>http://gltrinix.ru/1043#comments</comments>
		<pubDate>Thu, 06 Oct 2011 06:00:40 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1043</guid>
		<description><![CDATA[Продолжение (и окончание) шпаргалки по основам PHP. Массивы, ассоциативные массивы, функции, передача параметров, работа с файлами и mysql. Часть 1 &#124; Часть 2 Оглавление. Часть 1. Сервер на домашнем ПК Структура языка Переменные Условие IF .. ELSE Условие SWITCH .. CASE Цикл FOR Оглавление. Часть 2. Массивы Встроенные функции Собственные функции Передача параметров скрипту извне [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/10/peluche-php.jpg" rel="lightbox[1043]"><img class="alignright size-thumbnail wp-image-1055" title="php" src="http://gltrinix.ru/wp-content/uploads/2011/10/peluche-php-400x200.jpg" alt="" width="320" height="160" /></a>Продолжение (и окончание) шпаргалки по основам PHP.</p>
<p>Массивы, ассоциативные массивы, функции, передача параметров, работа с файлами и mysql.</p>
<p><a href="http://gltrinix.ru/1009">Часть 1</a> <strong>|</strong> <a href="http://gltrinix.ru/1043">Часть 2</a></p>
<p><span id="more-1043"></span></p>
<table width="100%" border="1">
<tbody>
<tr>
<td valign="top" width="50%"><strong>Оглавление. Часть 1.</strong><br />
<a href="http://gltrinix.ru/1009#server">Сервер на домашнем ПК</a><br />
<a href="http://gltrinix.ru/1009#structure">Структура языка</a><br />
<a href="http://gltrinix.ru/1009#variables">Переменные</a><br />
<a href="http://gltrinix.ru/1009#ifelse">Условие IF .. ELSE</a><br />
<a href="http://gltrinix.ru/1009#switch">Условие SWITCH .. CASE</a><br />
<a href="http://gltrinix.ru/1009#for">Цикл FOR</a></td>
<td valign="top" width="50%"><strong>Оглавление. Часть 2.</strong><br />
<a href="http://gltrinix.ru/1043#arrays">Массивы</a><br />
<a href="http://gltrinix.ru/1043#innerfunc">Встроенные функции</a><br />
<a href="http://gltrinix.ru/1043#functions">Собственные функции</a><br />
<a href="http://gltrinix.ru/1043#request">Передача параметров скрипту извне</a><br />
<a href="http://gltrinix.ru/1043#files">Работа с файлами</a><br />
<a href="http://gltrinix.ru/1043#db">Работа с БД</a><br />
<a href="http://gltrinix.ru/1043#oop">ООП</a></td>
</tr>
</tbody>
</table>
<p><strong>Массивы<a name="arrays"></a></strong><br />
Массивы в языке такие же универсальные, как и переменные. Любую переменную мы можем превратить в массив. Массив состоит из ключа и значения:<br />
<em>$имя_массива[ключ] = значение;</em><br />
Ключ может быть записан как числом, так и строкой независимо от других ключей (ассоциативный массив.) Значение может быть как числом, так и строкой независимо от других значений.<br />
Массив может быть объявлен следующими способами:</p>
<pre class="brush: php; title: ; notranslate">
    // Так рекомендуется объявлять массив, хотя можете пользоваться и другими способами
    $a = array ();
    // Здесь ключи назначаются возрастающим числом, т.е. 1, 2, 3, 4...
    $a = array (36.6, 3, 6, 55, &quot;морозко&quot;);
    // Здесь ключи назначаем мы сами
    $a = array (
        4 =&gt; 2,
        5 =&gt; 5,
        6 =&gt; 'креведко',
        'iam' =&gt; 'хороший',
        'purr' =&gt; 3
    );
    // Здесь массив объявляется автоматически
    $a[3] = 'новый массив с заполненным ключом 3';
    // А так ключ массива автоматически присвоит себе самое большое числовое значение, если до этого были числовые ключи
    $a[] = 'новый элемент массива';
</pre>
<p>Чтобы создать многомерный массив, просто объявите новый массив в элементе нашего:</p>
<pre class="brush: php; title: ; notranslate">
    $a = array (
        'green' =&gt; 'зеленый',
        'apple' =&gt; array (1, 4, 5, 7),
    );
    echo $a['apple'][3] . &quot;&lt;br&gt;&quot;;
</pre>
<p>Если вы хотите без цикла наглядно посмотреть содержимое массива, то выведите его следующим образом:</p>
<pre class="brush: php; title: ; notranslate">
    echo &quot;&lt;pre&gt;&quot;;
    print_r ($a);
    echo &quot;&lt;/pre&gt;&quot;;
</pre>
<p>Чтобы пройтись по всем элементам цикла используется конструкция <em>FOREACH</em>:</p>
<pre class="brush: php; title: ; notranslate">
    foreach ($a as $key=&gt;$one) {
        echo &quot;Для ключа $key значение $one &lt;br&gt;&quot;;
    }
</pre>
<p><strong>Встроенные функции<a name="innerfunc"></a></strong><br />
Здесь я перечислю функции php, которые надо знать в обязательном порядке, остальные можно посмотреть в специализированных справочниках.</p>
<pre class="brush: php; title: ; notranslate">
include ('имя_файла.php'); // позволяет обращаться к функциям указанного файла
require ('имя_файла.php'); // тоже, что и include, только сообщает об ошибке при отсутствии файла
require_once ('имя_файла.php'); // самая безопасная структура вызова файла, не вызывает ошибки при отсутствии файла, а просто продолжает работу
isset ($a); // возвращает true, если переменная существует
unset ($a); // уничтожает переменную $a и очищает память
rand (1,20); // возвращает случайно число в заданной области
die (); // заканчивает работу всего скрипта с выводом текста внутри скобок
exit (); // тоже, что и die
break; // заканчивает выполнение текущего цикла FOR или FOREACH
'\n\r' // внутри текста переносит последующий текст на новую строку
</pre>
<p><strong>Собственные функции<a name="functions"></a></strong></p>
<pre class="brush: php; title: ; notranslate">
    function myfunc ($a, &amp;$b, $c = &quot;&lt;br&gt;&quot;) {
        global $d;
        echo $a . $b . $d . $c;
        return 5 + 2;
    }
    $a += myfunc(&quot;word&quot;, $b);
</pre>
<p>Разбираемся:<br />
<em>$c = &#171;&lt;br&gt;&#187;</em> &#8212; установка переменной значения по умолчанию, если она не будет передана при вызове функции.<br />
<em>&amp;$b</em> &#8212; передаем функции глобальную переменную и любое действие над ней внутри функции отразится на ее содержании в самом скрипте.<br />
<em>global $d;</em> &#8212; возможность внутри функции обращаться и изменять глобальную переменную <em>$d</em>. Если бы мы этого не сделали, то внутри функции создалась бы локальная переменная <em>$d</em>, не связанная с глобальной.<br />
<em>return 5+2;</em> &#8212; результат, который функция возвращает. Опционально.</p>
<p><strong>Передача параметров скрипту извне<a name="request"></a></strong><br />
Если в командной строке мы видим что-то вроде: <em>http://mysite.ru/index.php?firstname=Ivan&amp;lastname=Ivanod&amp;page=5</em>, то это означает, что скрипту передаются 3 переменные (firstname, lastname, page) с заданными параметрами (Ivan, Ivanov, 5).<br />
Чтобы принять эти переменные необходимо обратиться к системному глобальному массиву <em>$_REQUEST</em>:</p>
<pre class="brush: php; title: ; notranslate">    $name = $_REQUEST['firstname'] . &quot; &quot; . $_REQUEST['lastname'];</pre>
<p>Переменные можно передавать явно (через адресную строку) &#8212; это метод <em>GET</em> и скрыто &#8212; методом <em>POST</em>. <em>POST</em> скрывает передаваемые данные, что позволяет передавать огромные тексты, без набора их в адресной строке.<br />
Доступ к этим переменным может быть получен через массив <em>$_REQUEST</em> либо через массивы <em>$_GET</em> и <em>$_POST</em>.<br />
Чтобы сделать &#171;кнопку&#187;, которая передавала какие-нибудь данные скрипту со страницы надо погуглить &#171;HTML формы&#187;.</p>
<p><strong>Работа с файлами<a name="files"></a></strong><br />
Основные функции при работе с файлами:</p>
<pre class="brush: php; title: ; notranslate">file_get_contents (имя_файла); // возвращает содержимое файла в виде текста
file (); // текстовый файл в массив (по строкам)
file_exists (); // существует ли файл
fopen (имя, режим); // открывает файл и возвращает fp
fread (fp, число байт); // читает данные
sfeek (fp, позиция, [направление]); // смещает указатель
fwrite (fp, переменная); // запись в файл
fclose (fp); // закрывает файл</pre>
<p><strong>Работа с БД<a name="db"></a></strong><br />
Объяснять, что такое базы данных я не буду. Если коротко &#8212; это таблицы. Каждый столбец в таблице имеет свое название и хранит определенный тип данных (строка, текст, длинный текст, числа с плавающей точкой, целое, байт, слово, автоинкремент и пр.) Автоинкремент &#8212; при каждой новой записи значение поля будет увеличено на 1.<br />
В таблице можно назначит главное поле (другие названия &#8212; ключевое поле, идентификатор, id, primary key.) Оно может быть как числом (например, порядковый номер), так и строкой &#8212; главное, чтобы содержимое каждого элемента было уникальным во всем столбце. При добавлении строки в таблицу БД с id, который уже есть в таблице &#8212; новая запись добавлена не будет.<br />
Каждая таблица должна иметь свое имя. Желательно использовать префиксы, если одна БД будет использоваться несколькими несвязанными приложениями.<br />
При работе с MySQL следует ознакомиться с запросами (query) к этой БД (описаны в документации по MySQL.) Например, строка <em>&#171;SELECT * FROM my_table&#187;</em> выделит для работы все данные из таблицы <em>my_table</em>.<br />
Пример работы с БД:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
    /* Соединение, выбор БД */
    $link = mysql_connect (&quot;mysql_host&quot;, &quot;mysql_user&quot;, &quot;mysql_password&quot;)
        or die (&quot;Could not connect&quot;);
    print &quot;Connected successfully&quot;;
    mysql_select_db (&quot;my_database&quot;) or die (&quot;Could not select database&quot;);

    /* Выполнение SQL query */
    $query = &quot;SELECT * FROM my_table&quot;;
    $result = mysql_query ($query) or die (&quot;Query failed&quot;);

    /* Печать результатов в HTML */
    print &quot;&lt;table&gt;\n&quot;;
    while ( $line = mysql_fetch_array ($result, MYSQL_ASSOC) ) {
        print &quot;\t&lt;tr&gt;\n&quot;;
        foreach ($line as $col_value) {
            print &quot;\t\t&lt;td&gt;$col_value&lt;/td&gt;\n&quot;;
        }
        print &quot;\t&lt;/tr&gt;\n&quot;;
    }
    print &quot;&lt;/table&gt;\n&quot;;

    /* Освобождение resultset */
    mysql_free_result ($result);

    /* Закрытие соединения */
    mysql_close ($link);
?&gt;
</pre>
<p><strong>ООП<a name="oop"></a></strong><br />
Работа с ООП требуется при написании больших проектов на php. Я не стану рассматривать эту часть в моей статье (если не наберется желающих.) Думаю, что для большинство, посетивших мой сайт, напишет максимум несколько скриптов на php, но никак не какой-нибудь фреймворк.</p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1043/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Введение в PHP. Часть 1.</title>
		<link>http://gltrinix.ru/1009</link>
		<comments>http://gltrinix.ru/1009#comments</comments>
		<pubDate>Tue, 04 Oct 2011 05:49:46 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=1009</guid>
		<description><![CDATA[Сделаю небольшой экскурс по ознакомлению с данным языком. Статья рассчитана на тех, кто уже программирует на одном из языков, знает HTML, умеет пользоваться справочниками. В общем, уровень Advanced. =) Я не пишу новый учебник или копипастю старые &#8212; это просто шпаргалка по php для тех, кто хочет написать пару скриптов для бытовых задач. Канал не [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/10/SPHP.jpg" rel="lightbox[1009]"><img class="alignright size-large wp-image-1010" title="PHP" src="http://gltrinix.ru/wp-content/uploads/2011/10/SPHP-300x200.jpg" alt="" width="300" height="200" /></a>Сделаю небольшой экскурс по ознакомлению с данным языком. Статья рассчитана на тех, кто уже программирует на одном из языков, знает HTML, умеет пользоваться справочниками. В общем, уровень Advanced. =)</p>
<p>Я не пишу новый учебник или копипастю старые &#8212; это просто шпаргалка по php для тех, кто хочет написать пару скриптов для бытовых задач.</p>
<p>Канал не выдержал передачу всей статьи целиком, поэтому я разбил ее на 2 части.</p>
<p><a href="http://gltrinix.ru/1009">Часть 1</a> <strong>|</strong> <a href="http://gltrinix.ru/1043">Часть 2</a><br />
<span id="more-1009"></span></p>
<table width="100%" border="1">
<tbody>
<tr>
<td valign="top" width="50%"><strong>Оглавление. Часть 1.</strong><br />
<a href="http://gltrinix.ru/1009#server">Сервер на домашнем ПК</a><br />
<a href="http://gltrinix.ru/1009#structure">Структура языка</a><br />
<a href="http://gltrinix.ru/1009#variables">Переменные</a><br />
<a href="http://gltrinix.ru/1009#ifelse">Условие IF .. ELSE</a><br />
<a href="http://gltrinix.ru/1009#switch">Условие SWITCH .. CASE</a><br />
<a href="http://gltrinix.ru/1009#for">Цикл FOR</a></td>
<td valign="top" width="50%"><strong>Оглавление. Часть 2.</strong><br />
<a href="http://gltrinix.ru/1043#arrays">Массивы</a><br />
<a href="http://gltrinix.ru/1043#innerfunc">Встроенные функции</a><br />
<a href="http://gltrinix.ru/1043#functions">Собственные функции</a><br />
<a href="http://gltrinix.ru/1043#request">Передача параметров скрипту извне</a><br />
<a href="http://gltrinix.ru/1043#files">Работа с файлами</a><br />
<a href="http://gltrinix.ru/1043#db">Работа с БД</a><br />
<a href="http://gltrinix.ru/1043#oop">ООП</a></td>
</tr>
</tbody>
</table>
<p><strong>Сервер на домашнем ПК<a name="server"></a></strong><br />
Устанавливаем <em>Denwer</em>. Заходим в <em>C:\WebServers\denwer</em> (если не указали иного при установке) и запускаем <em>Run.exe</em>.<br />
Чтобы добавить сайты заходим в <em>C:\WebServers\home</em> и создаем папку с именем сайта (например, <em>mysite.ru</em>), а в ней папку <em>www</em>. Чтобы создать поддомен создаем рядом с <em>www</em> папку с именем поддомена. Перезапускаем <em>Denwer</em>.<br />
Включаем браузер и вводим <em>localhost</em> для проверки правильности установки и запуска денвера. Вводим в адресной строке адрес своего сайта и работаем с ним. Поддерживаются PHP, CGI, Apache, MySQL и прочие вкусности.</p>
<p><strong>Структура языка<a name="structure"></a></strong><br />
Скрипт должен находится в файле с расширением <em>*.php</em>, если иного не указано в настройках сервера.<br />
Скрипт может находиться внутри HTML-кода и должен находиться внутри конструкции <em>&lt;?php <span style="text-decoration: underline;">код </span> ?&gt;</em>. Иногда используют конструкцию <em>&lt;? <span style="text-decoration: underline;">код</span> ?&gt;</em>, но некоторые хостеры ее не поддерживают.<br />
Если весь php-файл состоит только из скрипта, то в первой строчке достаточно написать <em>&lt;?php</em>, а закрывать скрипт не обязательно.<br />
Каждое действие заканчивается точкой с зяпятой <em>;</em>.<br />
Запущенный скрипт увидеть/скачать с браузера нельзя, только HTML-код, который скрипт генерирует.<br />
Комментарии пишутся либо после двойного слеша <em>//</em>, либо внутри структуры <em>/* */</em>.</p>
<p><strong>Переменные<a name="variables"></a></strong><br />
Переменная может быть объявлена в любом месте кода. Для этого достаточно написать переменную и произвести ей присвоение данных. Никакого типизированного объявления не требуется. Любая переменная в любой момент времени может хранить любой тип данных. Имя переменной обязательно начинается со знака доллара <em>$</em>. Первый символ после <em>$</em> может быть либо латинской буквой, либо знаком подчеркивания <em>_</em>, после этого в названии переменной можно использовать цифры.<br />
<span style="text-decoration: underline;">Примеры:</span></p>
<pre class="brush: php; title: ; notranslate">
$a = 2;             // Объявляем переменную $a целого типа,
$a = '&lt;b&gt;Жирная строка&lt;/b&gt;    // уже строкового,
&lt;br&gt;';
$a = 2.5;             // а теперь вещественного.
</pre>
<p>При работе с переменными удобно использовать структуры <em>++</em> (увеличение числа на 1,) <em>&#8212;</em> (уменьшение на 1,) <em>.</em> (слияние строк,) <em>+=</em> (сложение с числом,) <em>-=</em> (вычитание числа.)<br />
<span style="text-decoration: underline;">Примеры:</span></p>
<pre class="brush: php; title: ; notranslate">
$a = 4; // Объявили переменную $a и присвоили ей значение 4 целого типа
$a++;   // теперь $a равно 5
$a--;   // $a равно 4
$a += 6;// $a равно 10
$a -= 5;// $a равно 5
$b = 'Строка'; // Объявили строковую переменную $b и присвоили ей значение &quot;Строка&quot;
$b .= ' ' . $a; // теперь переменная $b содержит в себе строчку &quot;Строка 5&quot;
</pre>
<p>Вывод данных осуществляется через функцию <em>echo</em> (эхо);<br />
<span style="text-decoration: underline;">Примеры:</span></p>
<pre class="brush: php; title: ; notranslate">
echo &quot;&lt;p color='red'&gt;Это параграф красного цвета&lt;/p&gt;&lt;br&gt;&quot;;
echo $b . &quot;&lt;br&gt;&quot;;
echo $a . $b . &quot;&lt;br&gt;&quot;;
</pre>
<p>Текст выводить можно как в одинарных, так и в двойных кавычках. Существенную разницу между ними можно понять <span style="text-decoration: underline;">по примеру:</span></p>
<pre class="brush: php; title: ; notranslate">
echo &quot;$a&quot;; // выведется содержимое переменной $a
echo '$a'; // выведется название переменной
echo 'Переменная $a равна ' . &quot;$a&quot;;
</pre>
<p>Что делать если внутри &#171;&#187; надо вывести двойную кавычку или наоборот? <span style="text-decoration: underline;">Ответ:</span></p>
<pre class="brush: php; title: ; notranslate">
echo &quot;Буква \&quot;В\&quot; - третья буква русского алфавита&quot;;
echo 'Буква \'В\' - третья буква русского алфавита';
</pre>
<p><strong>Условие IF .. ELSE<a name="ifelse"></a></strong><br />
Общая конструкция выглядит так:</p>
<pre class="brush: php; title: ; notranslate">
if (эти скобки обязательны) {
 код;
} else {
 код;
}
</pre>
<p>Но можно и так:</p>
<pre class="brush: php; title: ; notranslate">
if (условие) {
 код;
}
</pre>
<p>Обозначения операторов:<br />
&#171;И&#187; &#8212; <em>&amp;&amp;</em><br />
&#171;ИЛИ&#187; &#8212; <em>||</em><br />
&#171;РАВНО&#187; -<em> ==</em><br />
&#171;НЕ РАВНО&#187; -<em> !=</em><br />
&#171;НЕ&#187; -<em> !</em><br />
<span style="text-decoration: underline;">Пример:</span></p>
<pre class="brush: php; title: ; notranslate">
if (($a != 5) &amp;&amp; ($a == $a) &amp;&amp; (!($a != $a))) {
 echo 'Переменная $a не равна 5 &lt;br&gt;';
} else {
 echo 'Переменная $a равна 5';
}
</pre>
<p><strong>Условие SWITCH .. CASE<a name="switch"></a></strong><br />
Думаю, что здесь хватит простого примера и пояснения к нему.<br />
<span style="text-decoration: underline;">Пример:</span></p>
<pre class="brush: php; title: ; notranslate">
$d = 'Петя';
switch ($d) {
 case 'Петя':
 echo 'Петров';
 echo '&lt;br&gt;';
 break;
 case 'Иван':
 echo 'Иванов';
 echo '&lt;br&gt;'
 break;
 default:
 echo 'Нет данных';
 echo '&lt;br&gt;';
}
</pre>
<p>После каждого <em>case</em> следует значение с которым будет сравниваться переменная. Код после двоеточия будет выполняться до <em>break</em>. Если ни одно из значений не совпало с переменной, то выполнится код после <em>default</em>, коли таковой имеется.</p>
<p><strong>Цикл FOR<a name="for"></a></strong><br />
Здесь тоже все просто.<br />
<span style="text-decoration: underline;">Пример:</span></p>
<pre class="brush: php; title: ; notranslate">
echo &quot;&lt;table border=1&gt;&quot;;
for ($i=0; $i&lt;10; $i++) {
 echo &quot;&lt;tr&gt;&quot;;
 echo &quot;&lt;td&gt;$i&lt;/td&gt;&quot;;
 echo &quot;&lt;td&gt;&quot; . $i*$i . &quot;&lt;/td&gt;&quot;;
 echo &quot;&lt;td&gt;&quot; . $i*$i*$i . &quot;&lt;/td&gt;&quot;;
 echo &quot;&lt;/tr&gt;&quot;;
}
echo &quot;&lt;/table&gt;i = $i&lt;br&gt;&quot;;
</pre>
<p>В этом примере мы построили таблицу с 3 столбцами и 10 строками. В первом столбце написаны числа от 0 до 9, во втором их квадраты, в третьем &#8212; кубы. <em>$i=0</em> &#8212; объявление переменной цикла и придание ей начального значения. <em>$i&lt;10</em> &#8212; условие, при нарушении которого цикл будет завершен. <em>$i++</em> &#8212; закон изменения переменной цикла.</p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/1009/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Головоломка Эйнштейна</title>
		<link>http://gltrinix.ru/978</link>
		<comments>http://gltrinix.ru/978#comments</comments>
		<pubDate>Tue, 02 Aug 2011 11:23:45 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[Игры]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=978</guid>
		<description><![CDATA[Решил в свой блог вдохнуть чуть больше жизни и создать в нем новый раздел, в котором я буду делать небольшие обзоры на понравившиеся мне игры или команды разработчиков. Преимущество отдаю, разумеется, инди-индустрии. Недавно наткнулся на один заброшенный проект Einstain &#8212; &#171;Головоломка Эйнштейна&#187;. Сама игра является ремейком &#171;Sherlock&#187;, а корни ведет к загадке, которую якобы Альберт [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/08/sherlock-dos.png" rel="lightbox[978]"><img class="alignright size-large wp-image-977" title="Та самая игра Sherlock 1991 года" src="http://gltrinix.ru/wp-content/uploads/2011/08/sherlock-dos-300x164.png" alt="" width="300" height="164" /></a> Решил в свой блог вдохнуть чуть больше жизни и создать в нем новый раздел, в котором я буду делать небольшие обзоры на понравившиеся мне игры или команды разработчиков. Преимущество отдаю, разумеется, инди-индустрии.</p>
<p>Недавно наткнулся на один заброшенный проект Einstain &#8212; &#171;Головоломка Эйнштейна&#187;. Сама игра является ремейком &#171;Sherlock&#187;, а корни ведет к загадке, которую якобы Альберт Эйнштейн придумал в детстве. Он удтверждал, что эту головоломку в уме, без подручных средств, может решить лишь 2% населения планеты. Каждому студенту желающему пойти к нему в аспирантуру загадка являлась вступительным экзаменом. К сожалению, каких-либо документальных доказательств этому нигде нет. Да и сама головоломка не очень сложная, за исключением одного &#171;но&#187; &#8212; в среднем в голове необходимо держать связи между 5 различных объектов.<span id="more-978"></span></p>
<p>Героя этого топика написала студия Flowix Games. Она написала генератор головоломок той самой загадки Эйнштейна. Наткнулся я на сие чудо совершенно случайно &#8212; устанавливая игры из репозитория Linux Mint. Изучив правила, нажал на кнопку &#171;Новая игра&#187; и, через 24 минуты, я испытал настоящее удовольствие от своего мозгового штурма. Не могу понять почему, но это удовольствие я испытываю до сих пор по окончанию каждой партии (игра уже стоит на моем КПК.) Интерфейс игры удобен, не вызывает отвращения, правила расписаны понятным языком, геймплей реиграбелен. Что еще нужно? Конечно меряться письками! Кидайте свои результаты и впечатления от игры. Программистам и математикам посвящается.</p>
<p>Владельцы Ubuntu и Mint могут поискать сие чудо в репозитории, а виндузятники и яблокофилы могут скачать игру с <a href="http://games.flowix.com">сайта разработчиков</a>. Любители Windows Mobile и PalmOS могут попробовать эту же игру от студии Mobirate, остальным консольщикам могу лишь предложить заэмулировать оригинал через DOS-BOX.</p>
<p style="text-align: center;"><a href="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_flowix.jpg" rel="lightbox[978]"><img class="alignnone size-medium wp-image-976" title="Игра студии Flowix" src="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_flowix-150x112.jpg" alt="" width="150" height="112" /></a> <a href="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_gltri.jpg" rel="lightbox[978]"><img class="alignnone size-medium wp-image-974" title="Моя скромная таблица лидеров - я совершенствуюсь" src="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_gltri-150x112.jpg" alt="" width="150" height="112" /></a> <a href="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_mobirate.jpg" rel="lightbox[978]"><img class="alignnone size-medium wp-image-975" title="Игра от студии Mobirate" src="http://gltrinix.ru/wp-content/uploads/2011/08/einstain_mobirate-112x150.jpg" alt="" width="112" height="150" /></a></p>
<h6 style="text-align: left;">Картинка игры от Mobirate была взята с сайта 4pda.ru, а оригинального Sherlock &#8212; с mobygames.com</h6>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/978/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>glContest #13 &#8212; Пишем онлайн-синхронизацию топа</title>
		<link>http://gltrinix.ru/964</link>
		<comments>http://gltrinix.ru/964#comments</comments>
		<pubDate>Fri, 24 Jun 2011 18:28:41 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[glContest #13]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=964</guid>
		<description><![CDATA[Положение дел: Интро: 70% Меню: 65% GUI: 50% HUD: 0% Геймплей: 40% Звуки: 0% 23/06/2011 &#8212; Рисовал вручную кнопочки в меню. Это нудно и долго: подбирал стиль, правил вручную пиксели, правил прозрачность, автоматизировал загрузку кнопок, их местоположение, фон меню&#8230; И все это для 29 текстур (9 кнопок + 2 фоновых изображения.) Теперь надо сделать систему [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/06/topic_logo.png" rel="lightbox[964]"><img class="alignright size-full wp-image-966" title="Онлайн синхронизация между Delphi и php" src="http://gltrinix.ru/wp-content/uploads/2011/06/topic_logo.png" alt="" width="250" height="150" /></a>Положение дел:<br />
Интро: 70%<br />
Меню: 65%<br />
GUI: 50%<br />
HUD: 0%<br />
Геймплей: 40%<br />
Звуки: 0%</p>
<p><span id="more-964"></span><em><strong>23/06/2011</strong></em> &#8212; Рисовал вручную кнопочки в меню. Это нудно и долго: подбирал стиль, правил вручную пиксели, правил прозрачность, автоматизировал загрузку кнопок, их местоположение, фон меню&#8230; И все это для 29 текстур (9 кнопок + 2 фоновых изображения.) Теперь надо сделать систему состояний для них и обработку нажатий. Что получилось:</p>
<p style="text-align: center;"><a href="http://gltrinix.ru/wp-content/uploads/2011/06/game_menu.jpg" rel="lightbox[964]"><img class="size-thumbnail wp-image-965  aligncenter" title="Игровое меню. Альфа-версия" src="http://gltrinix.ru/wp-content/uploads/2011/06/game_menu-505x200.jpg" alt="" width="505" height="200" /></a></p>
<p><strong><em>24/06/2011</em></strong> &#8212; Сегодня я добавил себе проблем &#8212; надо будет делать еще 1 кнопку для меню с названием &#171;Обновить&#187;. А все потому, что написал простой php-скрипт для онлайн-обновления таблицы лидеров.<br />
Собственно скрипт умеет делать пока что 2 вещи: обрабатывать данные и выводить их.<br />
<strong>Обработку</strong> данных условно разделим на 3 части:<br />
Делаем проверку на одновременное получение GET-методом четырех переменных: названия игры, имя игрока, количество очков в игре, версию игры и объединяем их в 1 строку, разделив пробелом и добавив переход на следующую строку в конце. Далее открываем файл с предыдущими результатами (если таковой имеется), копируем каждую строчку в массив и добавляем новую. После этого удаляем повторяющиеся элементы, сортируем в обратном порядке и сбрасываем указатель.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
  if ((isset($_GET[gamename]))AND(isset($_GET[player]))AND(isset($_GET[points]))AND(isset($_GET[version]))) {
    $b = $_GET[points].&quot; &quot;.$_GET[version].&quot; &quot;.$_GET[player].&quot;\r\n&quot;;
    if (file_exists (&quot;$_GET[gamename].res&quot;)) { $a = file(&quot;$_GET[gamename].res&quot;); }
    if (isset($a)) { array_push ($a, $b); } else { $a = array ($b); }
    $a = array_unique($a);
    rsort($a); reset($a);</pre>
<p>Теперь создаем/перезаписываем файл &lt;название_игры.res&gt; с этими строками для хранения.</p>
<pre class="brush: php; title: ; notranslate">.   $fp = fopen (&quot;$_GET[gamename].res&quot;, 'w');
    if (isset ($a[10])) {
      for ($i=0; $i&lt;10; $i++) { fwrite ($fp, $a[i]); }
    } else {
      foreach ($a as $one) { fwrite ($fp, $one); }
    }
    fclose ($fp);</pre>
<p>Вроде бы и все, что еще для жизни надо? Но я же ленивый и не хочу в Delphi парсить строки, поэтому создаю еще один файл &lt;название_игры.lazy&gt;, в который веду запись результатов следующим образом:<br />
&lt;Очки1&gt;<br />
&lt;Версия1&gt;<br />
&lt;Игрок1&gt;</p>
<p>&lt;Очки2&gt;<br />
&#8230;</p>
<pre class="brush: php; title: ; notranslate">    unset($b);
    $fp = fopen (&quot;$_GET[gamename].res&quot;, 'w');
    if (isset ($a[10])) {
      for ($i=0; $i&lt;10; $i++) { $b = explode (&quot; &quot;, $a); fwrite ($fp, $b[0].&quot;\r\n&quot;); fwrite ($fp, $b[1].&quot;\r\n&quot;); fwrite ($fp, $b[2].&quot;\r\n&quot;); }
    } else {
      foreach ($a as $one) { $b = explode (&quot; &quot;, $one); fwrite ($fp, $b[0].&quot;\r\n&quot;); fwrite ($fp, $b[1].&quot;\r\n&quot;); fwrite ($fp, $b[2].&quot;\r\n&quot;); }
    }
    fclose ($fp);
  }
?&gt;</pre>
<p>В итоге нам необходимо послать запрос вида: http://gltrinix.ru/games_sync.php?gamename=glcontest13&amp;player=gltrinix&amp;points=100500&amp;version=0.9<br />
На выходе получаем 2 файла:</p>
<table width="100%" border="1">
<tbody>
<tr>
<td>glcontest13.res</td>
<td>glcontest13.lazy</td>
</tr>
<tr>
<td>160 1.3 gltrinix<br />
150 1.4 gltrinix<br />
145 1.4 gltrinix<br />
140 1.3 gamer</td>
<td>160<br />
1.3<br />
gltrinix150<br />
1.4<br />
gltrinix145<br />
1.4<br />
gltrinix</p>
<p>140<br />
1.3<br />
gamer</td>
</tr>
</tbody>
</table>
<p>На стороне клиента скачиваем glcontest13.lazy, обновляем таблицу лидеров, удаляем его. А можно, вместо записи в файлы, сразу вывести в браузер текст вида glcontest13.lazy и считать его. <img src='http://gltrinix.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Онлайн-хранилище сделали, теперь еще и <strong>вывести</strong> это на сайте в красивом виде надо. Тут проще.</p>
<pre class="brush: php; title: ; notranslate">&lt;?php
  if ((isset($_GET[gamename]))AND($_GET[do]==&quot;show&quot;)) {
    if (file_exists (&quot;$_GET[gamename].lazy&quot;)) { $a = file(&quot;$_GET[gamename].lazy&quot;); }
    if (!isset($a)) { $a = array (&quot;Пока ничего нет&quot;); }
    echo &quot;&lt;table border=1 width=100%&gt;&lt;tr&gt;&lt;td width=80%&gt;Игрок&lt;/td&gt;&lt;td&gt;Очки&lt;/td&gt;&lt;td&gt;Версия&lt;/td&gt;&lt;/tr&gt;&quot;;
    if (isset($a[10])) {
      for ($i=0; $i&lt;10; $i++) {
        $b = explode (&quot; &quot;, $a[i]);
        echo &quot;&lt;tr&gt;&lt;td&gt;$b[2]&lt;/td&gt;&lt;td&gt;$b[0]&lt;/td&gt;&lt;td&gt;$b[1]&lt;/td&gt;&lt;/tr&gt;&quot;;
      }
    } else {
      foreach($a as $one) {
        $b = explode (&quot; &quot;, $one);
        echo &quot;&lt;tr&gt;&lt;td&gt;$b[2]&lt;/td&gt;&lt;td&gt;$b[0]&lt;/td&gt;&lt;td&gt;$b[1]&lt;/td&gt;&lt;/tr&gt;&quot;;
      }
    }
    echo &quot;&lt;/table&gt;&quot;;
  }
?&gt;</pre>
<p>Посылаем запрос вида: http://gltrinix.ru/games_sync.php?gamename=glcontest13&amp;do=show<br />
На выходе получаем красивую табличку:</p>
<table style="text-align: left;" width="100%" border="1">
<tbody>
<tr>
<td width="80%">Игрок</td>
<td>Очки</td>
<td>Версия</td>
</tr>
<tr>
<td>gltrinix</td>
<td>160</td>
<td>1.3</td>
</tr>
<tr>
<td>gltrinix</td>
<td>150</td>
<td>1.4</td>
</tr>
<tr>
<td>gltrinix</td>
<td>145</td>
<td>1.4</td>
</tr>
<tr>
<td>gamer</td>
<td>140</td>
<td>1.3</td>
</tr>
</tbody>
</table>
<p>Не знаю, успею ли все довести до конца&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/964/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>glContest #13 &#8212; Как дела?</title>
		<link>http://gltrinix.ru/956</link>
		<comments>http://gltrinix.ru/956#comments</comments>
		<pubDate>Wed, 22 Jun 2011 15:35:44 +0000</pubDate>
		<dc:creator>gltrinix</dc:creator>
				<category><![CDATA[GameDev]]></category>
		<category><![CDATA[glContest #13]]></category>

		<guid isPermaLink="false">http://gltrinix.ru/?p=956</guid>
		<description><![CDATA[19/06/2011 &#8212; Приехал с Иркутска. Весь на нервах. Отдыхаю. 20/06/2011 &#8212; Задумался, что пора бы уже и начать делать игру. Отложу желание на будущее. 21/06/2011 &#8212; Хотел сделать просто красивую игру. Очень слабую в геймплее, но красивую с точки зрения статической картинки. Создал карту памяти (можно посмотреть ниже), начал обработку кистей и фонов с девианарта. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gltrinix.ru/wp-content/uploads/2011/06/glcontest13_logo.png" rel="lightbox[956]"><img class="alignright size-full wp-image-955" title="glcontest13_logo" src="http://gltrinix.ru/wp-content/uploads/2011/06/glcontest13_logo.png" alt="" width="191" height="192" /></a><strong><em>19/06/2011</em></strong> &#8212; Приехал с Иркутска. Весь на нервах. Отдыхаю.</p>
<p><strong><em>20/06/2011</em></strong> &#8212; Задумался, что пора бы уже и начать делать игру. Отложу желание на будущее.</p>
<p><strong><em>21/06/2011</em></strong> &#8212; Хотел сделать просто красивую игру. Очень слабую в геймплее, но красивую с точки зрения статической картинки. Создал карту памяти (можно посмотреть ниже), начал обработку кистей и фонов с девианарта. Потом понял, что ЭТО, несмотря на графику, полнейший УГ в плане геймплея. Для исправления ситуации можно сделать сюжет, карту компании (как в Space Invaders Extreme), мини-игры (пинг-понг, тамагочи), таблицу рейтинга и систему наград. Однако, слишком уж много получится работы.  Надо думать&#8230;<span id="more-956"></span></p>
<p style="text-align: center;"><a href="http://gltrinix.ru/wp-content/uploads/2011/06/glContest13_01.jpeg" rel="lightbox[956]"><img class="alignnone size-thumbnail wp-image-960" title="glContest13 - первый вариант" src="http://gltrinix.ru/wp-content/uploads/2011/06/glContest13_01-505x200.jpg" alt="" width="505" height="200" /></a></p>
<p>p.s. Еще поработал над концепцией своей надстройки AveCore (gleangine). В общем-то ничего сложного, но сколько часов надо потратить на простой набор кода и построения ООП. Хочется отложить в долгий ящик. Особенно, кроссплатформ.</p>
<p style="text-align: center;"><a href="http://gltrinix.ru/wp-content/uploads/2011/06/AveEngine_01.jpeg" rel="lightbox[956]"><img class="size-thumbnail wp-image-959 aligncenter" title="AveEngine первые наброски" src="http://gltrinix.ru/wp-content/uploads/2011/06/AveEngine_01-505x200.jpg" alt="" width="505" height="200" /></a></p>
<p>p.s.s. Может просто забить на этот конкурс и движок. Хочу отдыхать, я очень устал, а последний месяц уничтожил все мои нервы.</p>
<p><strong><em>22/06/2011</em></strong> &#8212; Все нах. Начинаю сначала. Жанр тот же, гейплей ураган, графика УГ.</p>
<p>Все текстуры решил рисовать в paint&#8217;e. Пикселарт так сказать. Начал с врагов. 32х32 пиксела. Нарисовал красную диагональ, чтобы удобнее было отрисовывать круги. Градиент серый с шагом яркости 20. На выходе получились точки, закрашивать полутонами не стал &#8212; так даже лучше смотрится. Уменьшил масштаб до 100% &#8212; краев почти не видно, поэтому с тем же шагом расставил красный градиент в этих точках. Прозрачным будет f000000 цвет.</p>
<p style="text-align: center;"><a href="http://gltrinix.ru/wp-content/uploads/2011/06/01.png" rel="lightbox[956]"><img class="size-medium wp-image-953 alignnone" title="Шаг 1. Серый градиент." src="http://gltrinix.ru/wp-content/uploads/2011/06/01-150x90.png" alt="" width="150" height="90" /> </a><a href="http://gltrinix.ru/wp-content/uploads/2011/06/02.png" rel="lightbox[956]"><img class="size-medium wp-image-954 alignnone" title="Шаг 2. Красный градиент." src="http://gltrinix.ru/wp-content/uploads/2011/06/02-150x95.png" alt="" width="150" height="95" /></a></p>
<p style="text-align: left;">Дабы на черном фоне enemys можно было лучше увидеть, то я добавил обратный красный градиент. При полевых испытаниях выяснилось, что этого недостаточно (для спрайтов 8х8 пикселов), поэтому открыл изображение в Paint.NET и поигрался с кривыми, добавив много красного. А игрок светло пурпурный. Контраст!</p>
<p style="text-align: left;">Для новой игры ассоциативную карту еще не рисовал.</p>
<p>Благодаря Alt+Tab пишу сюда (в блокнот) как в твиттер.</p>
<p>Приступил к кодингу, переделывая свой код с 10 конкурса (стратегии.) Код ужасен, try .. except&#8217;ы отсутствуют, какой-то процедурно-ООП подход, отсутствует система игровых состояний.</p>
<p>Код движка надо писать с нуля. Почти все исправил, удалил лишнее. Все равно надо переписывать. Но т.к. работает и так, то оставлю до лучших времен. Вот такой я ленивый.</p>
<p>Итог на сегодня:</p>
<ul>
<li>Система состояний, удален мусор.</li>
<li>Минимальный геймплей (враги и герой двигаются, касания обрабатываются).</li>
<li>Нарисовал врагов, персонажа, помехи.</li>
<li>Итоговый вариант врагов несколько изменен от первоначального (что на скринах.)</li>
</ul>
<p>Какие инструменты я использую в разработке игры:</p>
<ul>
<li>Turbo Delphi Explorer;</li>
<li>GLScene;</li>
<li>Brain, eyes, 2 hands;</li>
<li>Notepad (для заметок);</li>
<li>Paint, Paint.NET, GIMP;</li>
<li>FreeMind.</li>
</ul>
<p>Весь арт делаю в paint. Paint.NET нужен для быстрой обработки (замена цвета, hue, saturation.) В GIMP&#8217;е буду делать GUI, иконки и лого. GLScene должен подойти любой &#8212; ничего сверхестественного не использую. С Explorer версией Turbo Delphi проблем нет &#8212; все работает runtime. Ну и FreeMind для оцифровки карт памяти.</p>
<p>До сих пор не знаю, доведу ли работу до конца. Текущий прогресс:</p>
<p>Интро: 70%</p>
<p>Меню: 50%</p>
<p>GUI: 10%</p>
<p>HUD: 0%</p>
<p>Геймплей: 40%</p>
<p>Звуки: 0%</p>
]]></content:encoded>
			<wfw:commentRss>http://gltrinix.ru/956/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

