На чем рисовать игры?

Обсуждение проблем, возникающих при разработке программ для мобильных устройств.
|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

На чем рисовать игры?

Сообщение |kerish| » 08.03.2007 (Чт) 18:12

Решил сделать 2D игру для Pocket PC и задался таким вопросом: Как быстро рисовать графику?

GAPI для VB.NET вроде как только к C++ подходит.

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 08.03.2007 (Чт) 18:34

GAPI для VB.NET вроде как только к C++ подходит.

Не совсем так. gapi.dll в чистом действительно невозможно полноценно использовать из .NET - языков (есть функции, принимающие ByVal структуры, чего CF не позволяет делать), но они решаются с помощью небольшой доп. библиотечки GAPINet.dll на C++, исходники и бинарник которой должны быть в MSDN. А так очень быстрая отрисовка. Только я все же выбрал C# - с указателями проще.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.03.2007 (Чт) 19:27

Спасибо!

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 08.03.2007 (Чт) 19:58

Блин, примеры в MSDN даны на старую версию Visual Studio.
Вобщем я не пойму как ее подключить к проекту?

Через Add Reference не подключается :(

P.S. Извиняюсь если вопрос глупый, только начал изучать Visual Studio 2005.

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 08.03.2007 (Чт) 21:22

Если имеется в виду подключение gx.dll (я опечатался , назвав ее gapi.dll) и GAPINet.dll, то их к проекту подключать не надо. Через Reference не получится - это не сборки .NET, а native-библиотеки.
Нужно просто объявить необходимые функции как API-вызовы.
Пример (извиняюсь за мой C#)
Код: Выделить всё
using System;
using System.Runtime.InteropServices;

namespace FastGraphics
{
   internal static unsafe class GXLib
   {
      [Flags]
      public enum DispFlags : int
      {
         Default = 0x0000,
         Fullscreen = 0x0001,
         NormalKeys = 0x0002,
         LandscapeKeys = 0x0003,
         Landscape = 0x0008,
      }

      [Flags]
      public enum ColorFormat : uint
      {
         _null = 0,
         Landscape = 0x0008,
         Palette = 0x0010,
         Direct = 0x0020,
         Direct555 = 0x0040,
         Direct565 = 0x0080,
         Direct888 = 0x0100,
         Direct444 = 0x0200,
         DirectInverted = 0x0400,
      }

      [StructLayout(LayoutKind.Sequential)]
      public struct DisplayProperties
      {
         public int cxWidth;
         public int cyHeight;         // notice lack of 'th' in the word height.
         public int cbxPitch;          // number of bytes to move right one x pixel - can be negative.
         public int cbyPitch;          // number of bytes to move down one y pixel - can be negative.
         public int cBPP;              // # of bits in each pixel
         public ColorFormat ffFormat;         // format flags.
      }

      [StructLayout(LayoutKind.Sequential)]
      public struct KeyList
      {
         public short vkUp;             // key for up
         public Point ptUp;             // x,y position of key/button.  Not on screen but in screen coordinates.
         public short vkDown;
         public Point ptDown;
         public short vkLeft;
         public Point ptLeft;
         public short vkRight;
         public Point ptRight;
         public short vkA;
         public Point ptA;
         public short vkB;
         public Point ptB;
         public short vkC;
         public Point ptC;
         public short vkStart;
         public Point ptStart;
      }

      [DllImport("gapinet.dll", EntryPoint = "GXGetDisplayProperties")]
      extern public static void GetDisplayProperties(ref DisplayProperties displayProps);

      [DllImport("gapinet.dll", EntryPoint = "GXGetDefaultKeys")]
      extern public static void GXGetDefaultKeys(ref KeyList keyList, int iOptions);

      [DllImport("gx.dll", EntryPoint = "#6")]
      public static extern DisplayProperties GetDisplayProperties();

      [DllImport("gx.dll", EntryPoint = "#8")]
      public static extern int OpenDisplay(IntPtr hwnd, DispFlags flags);

      [DllImport("gx.dll", EntryPoint = "#2")]
      public static extern int CloseDisplay();

      [DllImport("gx.dll", EntryPoint = "#1")]
      public static extern void* BeginDraw();

      [DllImport("gx.dll", EntryPoint = "#4")]
      public static extern int EndDraw();

      [DllImport("gx.dll", EntryPoint = "#9")]
      public static extern int OpenInput();

      [DllImport("gx.dll", EntryPoint = "#3")]
      public static extern int CloseInput();

      [DllImport("gx.dll", EntryPoint = "#5")]
      public static extern KeyList GetDefaultKeys(int options);

      [DllImport("gx.dll", EntryPoint = "#12")]
      public static extern int Suspend();

      [DllImport("gx.dll", EntryPoint = "#10")]
      public static extern int Resume();

      [DllImport("gx.dll", EntryPoint = "#7")]
      public static extern bool IsDisplayDRAMBuffer();

      [DllImport("gx.dll", EntryPoint = "#11")]
      public static extern int SetViewport(int top, int height, int reserved1, int reserved2);
   }
}

Однако, если требуется отладка на эмуляторе, целесообразно добавить эти библиотеки в проект как обычные файлы, и указать, что требуется их копирование в Output Directory. gx.dll как правило в системе присутствует, но все программы что я видел, на это не полагаются.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.03.2007 (Чт) 23:02

Вроде бы на мобильных устройствах присутствует свой DirectX. Почему бы не писать на нём?
Изображение

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 09.03.2007 (Пт) 1:09

Вроде бы на мобильных устройствах присутствует свой DirectX. Почему бы не писать на нём?

Что-то такое вроде и есть, но примеров/SDK/приложений с его поддержкой не встречал (хотя и не искал специально), к тому же для 2D-приложений меня вполне устраивает прямая запись в кадровый буфер. Альфа-блендинг, клиппинг, прозрачность, поддержка изображений PNG 32bpp (в CF System.Drawing.Bitmap не поддерживает альфа-канал) - свое, скорость приемлема. gx.dll применяется достаточно широко в игровых приложениях, может ситуация изменится с массовым внедрением аппаратных ускорителей графики для мобильных устройств, если оно вообще будет. У меня все равно такого нет и не планируется. Если есть ссылки на статьи/примеры по Mobile DirectX - посмотрю. Выудить из MSDN поиском что-нибудь дельное не получается.

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 09.03.2007 (Пт) 1:50

mad_Max А на VB примера объявления у тебя нет?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.03.2007 (Пт) 2:18

Ну если из этого сам перевести не можешь... :roll:
http://bbs.vbstreets.ru/viewtopic.php?p=6643614#6643614
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 22.03.2007 (Чт) 18:45

Полазив некоторое время по инету, выяснил, что мелкомягкие уже сделали для нас Managed-переходник к GAPI. Я слил исходник на C# и скомпилил в DLL. Архив с 3-мя библиотеками (gx.dll, GAPINet.dll и GXGraphics.dll) прилагается. Их надо будет копировать в папку с exe(или сказать студии сделать это). GXGraphics надо подключить через Add reference.
Вот код, на 2-ом FW, который просто заполняет экран неким цветом.
Код: Выделить всё
Imports GXGraphicsLibrary
Public Class Form1
    Private gx As GXGraphics
    Protected Overrides Sub OnPaintBackground(ByVal e As System.Windows.Forms.PaintEventArgs)
        'MyBase.OnPaintBackground(e)
    End Sub
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        'MyBase.OnPaint(e)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Show()
        Me.ControlBox = False
        Me.Menu = Nothing
        Me.WindowState = FormWindowState.Maximized
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        gx = New GXGraphics(Me, GXGraphicsLibrary.GXGraphics.DisplayBufferModes.kDoubleBuffer)
        If gx.Inititialized = False Then
            MsgBox("Initialization failed.", MsgBoxStyle.Critical, "Error")
        End If
        gx.SetDrawModes(GXGraphics.DrawFlags.kModeNoBoundsChecking)
        Dim rc As New Rectangle
        rc.Width = gx.ScreenWidth
        rc.Height = gx.ScreenHeight
        gx.BeginDraw()
        gx.FillRect1(rc, Color.FromArgb(200, 120, 12))
        gx.EndDraw()
    End Sub
End Class


Теперь вопрос: можно ли как-то совместно с gapi использовать System.Drawing?
Вложения
GAPI.rar
(10.01 Кб) Скачиваний: 304
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 22.03.2007 (Чт) 19:32

Оказалось, что выложенная мною библа - далеко не полный пример. Слил более поздние, за исключением того, что использует коммерчекую библу и пересобрал. Все DLL из архива должны лежать рядом с прогой. Подключать GXSound, GXInput и GXGraphics.
Вложения
GAPI.rar
(29.81 Кб) Скачиваний: 338
Изображение

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 24.03.2007 (Сб) 15:14

Теперь вопрос: можно ли как-то совместно с gapi использовать System.Drawing?

Вообще-то смотря для чего. gapi по сути, дает только указатель на видеобуфер. Как его использовать - уже дело пользователя. System.Drawing же может использоваться для отрисовки чего-либо (в Bitmap например) с помощью простых методов (DrawLine и проч). Для скоростной отрисовки этого битмапа на экран как раз и можно применить gapi (делаем LockBits, получаем указатель на данные битмапа и делаем CopyMemory в указатель, данный BeginDraw из gapi [не всегда применимо, т.к. смещение до следующего пиксела на экране может быть в принципе любым]; заодно и двойная буферизация получается). Проблема в том, что в Compact Framework System.Drawing достаточно сильно порезано (например, я не смог загрузить и отрисовать нормально png с альфаканалом - 32bppARGB нету), поэтому я предпочел проигнорировать System.Drawing и написать свои классы для изображения, формата png, bmp и проч.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 24.03.2007 (Сб) 18:36

По идее, можно написать библиотеку-переходник к этим трём библам. Также, она, в случае запуска под Win32 будет реализовывать аналогичный функционал при помощи DX7(там ещё оставался DirectDraw). Таким образом, можно будет написать кросс-платформенную игрушку, в которой одни и теже бинарники работают под разными платформами.

+Как изменить ориентацию экрана для конкретного окна? Неужели придётся делать поворот спрайтов при отрисовке, или менять системные настройки?
Изображение

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 24.03.2007 (Сб) 22:06

Как изменить ориентацию экрана для конкретного окна

Разумеется, придется поворачивать спрайты при отрисовке, но тут ничего страшного. В коде на C# выше приведена структура DisplayProperties, которая содержит поля cbyPitch и cbxPitch (смещения до след. пикселя по вертикали и горизонтали).
Если, например, у нас портретная ориентация, то BeginDraw возвратит указатель на левый верхний угол буфера, cbxPitch = 2, cbyPitch = 240*2 (все условно, теоретически может быть и не так). Чтобы повернуть экран, добавляем смещение к указателю, полученному BeginDraw (нужно перевести его в левый нижний угол - прибавить width * (height - 1) пикселей, учитывая правильные исходные смещения по горизонтали и вертикали). Далее делаем cbxPitch = -width * 2 (они в байтах, цветовой режим как правило 16bpp 555 или 565), а cbyPitch = 1 * 2. Поскольку при отрисовке на экран мы обязаны использовать эти смещения для переходов по горизонтали и вертикали, а не просто прибавлять 2 при переходе к следующему пикселу, ориентация экрана будет изменена на ландшафтную (не забываем переворачивать x и y нажатий стилуса, т.к. система не будет знать, что мы реально используем ландшафтную ориентацию).
Следует учитывать, что если ориентация уже выставлена ландшафтная (выставлена в настройках КПК), мы уже будем получать правильные указатель на первый пиксель и смещения.
Можно конечно программно заставить систему сменить ориентацию экрана, но это не будет работать для систем < WM2003SE.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 01.04.2007 (Вс) 19:52

А разве на WM2002 и ранее вообще как-то ставится CF? Я пробовал - меня послали.
Изображение

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 02.04.2007 (Пн) 8:14

про CF 1.1
MSDN писал(а):.NET Compact Framework requires a minimum of Windows CE.NET (Windows CE version 4.1 for the released version of the .NET Compact Framework) with two exceptions: Microsoft Pocket PC, Microsoft Pocket PC 2002, and Microsoft Pocket PC 2002 Phone Edition support the .NET Compact Framework. Smartphone 2002 does not support the .NET Compact Framework; however, Smartphone 2003 does.

про CF 2.0
MSDN писал(а):Windows Mobile 2003 for Pocket PC
Windows Mobile 2003 for Pocket PC SE
Windows Mobile Version 5.0 software for Pocket PCs
Windows Mobile Version 5.0 software for Smartphone
Windows CE 5.0

т.е. на WM2002 не поставить CF2.0. Но под систему < WM2003SE попадает и WM2003, у которого есть определенные проблемы с поворотом экрана (в системе просто нет такой настройки, приходится использовать сторонние утилиты, официально не поддерживаемые).

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 02.04.2007 (Пн) 9:04

Вопрос: у многих ли стоит <WM2003SE?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.04.2007 (Пн) 13:10

У меня, например.
Изображение

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 02.04.2007 (Пн) 19:12

у многих ли стоит <WM2003SE?

На мой взгляд, WM2003 слишком распространена, чтобы сбрасывать ее со счетов и лишать поддержки.
P.S. У меня кстати тоже WM2003.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.04.2007 (Вт) 17:25

Ясно. В принципе, можно сделать поворот битмапа на 90 градусов при его загрузке, а затем, при прорисовке менять X и Y местами.
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 23.04.2007 (Пн) 18:59

Небольшая просьба к владельцам КПК:
1. Скачать архив.
2. Скопировать файлы на устройство.
3. Запустить.
4. Если запустилось, то дождаться завершения и запостить на форум данные из MsgBox и данные о железе и ОС.
4. Если не запустилось, то запостить сюда данные о железе и ОС.

Add: сорри, забыл саму ссыль :oops:
Ссылка на архив
Изображение


Вернуться в Visual Basic для мобильных устройств

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList