Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/516: Рейтинг темы: голосов - 516, средняя оценка - 5.00
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168

Создание игры(2d)

12.05.2009, 21:08. Показов 100682. Ответов 423
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно идея такого создать нечто на подобиe ->
http://www.newgrounds.com/portal/view/494301

Буду сюда задвать свои вопросы,думаю всем кто будет увлечён создание игры тоже будет интресно)

Otaka,этот задний буфер замещает собой background плюс курсор оставляет на неём свои артефакты,как его очищать,да так чтоб ещё и background у нас был.

________________________________________ ________________________________________ _________________________
Основные моменты
Вычисление угла поворота персонажа в зависимости от положения курсора мыши
То же
Поворот изображения(тут еще как смещать точку поворота)
Делаем пули
Все еще непонятки с пулями
Начинаем вычисление коллизий
Идея про то, как это должно быть
Как это должно быть реализовано
Как повернуть массив точек(регион)?
А тут код(в нем есть глюк. Потом есть исправленная версия)
Находим столкновение региона и линии. Исправленная версия столкновения регионов
Как это должно выглядеть в принципе?
Начинается долгое обсуждение того как делать редактор уровней
...
...
Первый вариант редактора
Снова эти пули
Функция которая бьет изображения на мелкие куски(тайлы)
Версия редактора
Загрузка сохранение
Еще версия
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2009, 21:08
Ответы с готовыми решениями:

Создание игры
Извините за очередную тему подобного рода, но все же не могу не спросить: Мечтаю о создании игры, пусть и очень простой.. Сейчас для меня...

Создание игры
Доброго времени суток! Лабораторная работа - сделать игру. Есть идея. Нужны любые советы, коментарии, пожелания и критика. Спасибо! ...

Создание игры
Люди есть у кого нибудь исходники игры на подобие игр от ALAWAR, что бы разобрать и поучиться на этом примере? Или подскажите где можно...

423
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.02.2010, 09:49
Студворк — интернет-сервис помощи студентам
Ктулх, ты чего-нибудь интересного уже сделал?
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
17.02.2010, 21:39  [ТС]
Пока нет, всё интересное у black-eye.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.02.2010, 00:49
Цитата Сообщение от black-eye Посмотреть сообщение
Итак, сделал, чтоб нпс ходил по координатам
А можно ещё модуль vcl60.bpl?
Хотя лучше компилять так, чтобы всё это хозяйство статически прилинковывалось
0
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
18.02.2010, 20:19
Вот
Вложения
Тип файла: rar движение нпс.rar (663.3 Кб, 76 просмотров)
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
19.03.2010, 23:11
на 22 пути она зависает
1
18 / 18 / 1
Регистрация: 24.09.2009
Сообщений: 98
20.03.2010, 00:11
??? У меня работает, хотя... Смотря какой ты там путь проложил))) Это ж, самая первая версия) Глюк только у тебя есть... Пока у тебя)
0
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
20.03.2010, 00:47
ну я не знаю, проверял 2 раза, считал
до этого натыкал, бац, повисло... решил проверить)

мне ксати как раз похожее нужно, сделать чтобы машина поворачивала на 90 градусов плавно, мб отсюда пойму как...
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
24.03.2010, 00:55  [ТС]
Возрождаем тему из пепла -поехали!

Я думаю многие из вас слышали о Альфа-наложении.
|-------------------------------------------------------------------------------------------------------
А кто не слышал тому поясняю: Начиная с Windows 98, Microsoft предложила разработчикам программного обеспечения новую методику графического вывода - альфа-наложение (alpha blending). Суть её заключается в том, что итоговый пиксел приёмной поверхности представляется суммой пикселов источника и приёмника, которые предварительно умножены на определённые коэффициенты. Особенно наглядно математические формулы альфа-наложения выглядят для графических поверхностей с 24 или 32-кодировкой цвета. В этом случае, как известно, пиксел содержит полную информацию о своём цвете и описывается 3 или 4 байтами соответственно. Первые три байта содержат значения интенсивностей голубого, зелёного и красного цветов. Об информации, содержащейся в четвёртом байте, будет сказано позже.

В общем виде альфа-наложение вычисляется по следующим формулам:

Приём.Blue=alpha* Источн.Blue+(1-alpha)* Приём.Blue
Приём.Green=alpha* Источн.Green+(1-alpha)* Приём.Green
Приём.Red=alpha* Источн.Red+(1-alpha)* Приём.Red
Приём.alpha=alpha* Источн.alpha+(1-alpha)* Приём.alpha




В итоге мы имеем эффект что первое изображение накладывается на второе с какой то прозрачностью.
Как например у меня(солнышко):


Но как видите пиксели по краям не отображаются, хотя изображение квадратное, но наше солнышко у нас круглое, это происходит потому, что в свойствах картинки Img->Transparent = 1, и эти пиксели не отображаются.
Исходное изображения солнышка:
Название: 3.jpg
Просмотров: 297

Размер: 51.6 Кб

Так вот всё бы то ничего, и было бы всё прекрасно, но!
Если мы передвинем солнышко вправо, чтоб оно закрыло собой кнопку:


Происходит такая неприятная ситуация: пиксели которые не должны быть видны на экране отображаются, так как Альфа-наложение меняет их.



Я подумал, может самому по алгоритму написать функцию по Альфа-наложению пикселей и добавить туда, что если цвет пикселя = цвету пикселей, которые не надо отображать то, этот пиксель принимает
цвет пикселя кнопки, например(как в моём случае).

Но попробовав писать свой алгоритм по аналогии:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void KTAlphaBlend(HDC hdcSource, int xSource, int ySource, int wSource, 
int hSource, HDC hdcDest, TColor tColor)
{
 TColor iColor, dColor;
 for(int i=0;i<hSource;i++)
    for(int j=0;j<wSource;j++) {
        iColor = GetPixel(hdcSource,j,i);
        dColor = GetPixel(hdcDest,j,i);
        if(GetRValue(iColor) == GetRValue(tColor) && 
                   GetGValue(iColor) == GetGValue(tColor) && 
                   GetBValue(iColor) == GetBValue(tColor)) {}
         }
}
Появилась проблема в быстродействии, резко упало кол-во фпс.




Буду надеяться, что кто то сможет осилить такое кол-во букв и разобраться в проблеме, ибо тема интересная и актуальная.

Всем спасибо, что пришли.
1
говнокодер
 Аватар для sh4d°_°ff
1273 / 297 / 35
Регистрация: 31.10.2009
Сообщений: 1,432
24.03.2010, 10:59
Прочитал, осилил.. затупил, если можешь выложи исходник, покопаюсь, мб че-нить соображу =)
з.ы.: Вот в помощь...
Статья с примером по alpha-blend
Альфа-наложение.
Альфа-наложением (alpha blending) называется методика графического вывода, в которой пиксель вычисляется в виде взвешенной суммы двух пикселов (источника и приемника). Весовой коэффицент источника обычно называется альфа-коэффицентом(a). Нулевой альфа-коэффицент соответствует абсолютно прозрачным пикселам источника, а единичным – полностью непрозрачным пикселам. Т.е. представьте ситуацию: вы нарисовали два прямоугольника и один из них перекрыл другой. Теперь в том месте, где эти прямоугольники пересеклись, будет виден только тот, который был выведен последним. С помощью альфа-наложения можно было бы вывести эти прямоугольники полупрозрачными, чтобы их оба было видно. Вот об этом мы сейчас и поговорим.

Альфа-наложение относится к числу новых возможностей, появившихся в Windows 98 и Windows 2000. Вся поддержка состоит из одной структуры и одной функции.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                        typedef struct _BLENDFUNCTION {
 
                                    BYTE BlendOp;
 
                                   BYTE BlendFlags;
 
BYTE SouyrceConstantAlpha;
 
BYTE AlphaFormat;
 
                        } BLENDFUNCTION;
 
BOOL AlphaBlend(HDC hdcDesk, int nXOriginDest,int nYOriginDesk, 
 
                               int nWidthDest, int nHeightDest,
 
                               HDC hdcSrc, int nXOriginSrc int nYOriginSrc,
 
                               int nWidthSrc, int nHeightSrc,
 
                               BLENDFUNCTION blendFDunction);
Как вы сами уже, наверное, поняли, это их API – прототип. Потом я покажу, как это при помощи MFC написать. А теперь разберемся с параметрами. Для начала возьмем структуру. Поле BlendOp должно быть AC_SRC_OVER. Поле BlendFlags – 0. Поле SouyrceConstantAlpha может быть от 0 до 255, в зависимости от прозрачности. Поле AlphaFormat может быть 0, при постоянном альфа-коэффиценте, а может быть AC_SRC_ALPHA. Но мы рассмотрим только первый вариант. Теперь время пришло и для самой функции. Первые 5 параметров определяют контекст устройства и прямоугольник приемной поверхности. Прошу обратить внимание: 3 и 4 параметры это не координата, а расстояние от первой точки, которая задается 2 и 3 параметрами. Следующие 5 параметров определяют контекст устройства источника и прямоугольник. Прошу опять-таки обратить внимание на 9 и 10 параметры. И последний параметр – структура BLENDFUNCTION.

А теперь пример:

C++
1
2
3
4
5
6
7
8
9
10
11
                        CclientDC dc(this);
 
                        CBrush b(RGB(0,255,255));
 
                        dc.SelectObject(b);
 
                        dc.Rectangle(0,0,100,100);
 
                        BLENDFUNCTION blend={AC_SRC_OVER,0,255/2,0};
 
                        dc.AlphaBlend(100,100,100,100,&dc,0,0,100,100,blend);
Этот пример написан с использованием MFC. Он просто рисует квадрат (0,0,100,100), а потом этот же квадрат рисуется от 100,100 до 200,200, но уже полупрозрачным. Я думаю, смысл вам понятен. Можно было бы нарисовать еще один квадрат и потом с помощью альфа-наложения изобразить их, чтобы один из них перекрывал другого. Тогда будут видны оба прямоугольника. Но в этом не главная прелесть альфа-наложения. Если выводить в одно и тоже место какую-то фигуру, допустим с коэффициентом a равным 50, то через 5-6 выводов будет полностью непрозрачная фигура. Так можно реализовать эффект постепенного появления, что выглядит довольно эффектно. Но я думаю, вы сами с этим разберетесь, ведь это не такая сложная тема (всего же 1 функция).

Левин Антон 2002-06-07

Статья про alpha-переход

Alpha-переход используется, чтобы показать на экране α - битовый образ, который является точечным рисунком, где имеются прозрачные или полупрозрачные пиксели. В дополнение к красному, зеленому и синему каналам цвета, для каждого пикселя в α - битовом образе имеется компонент прозрачности, или как его называют α-канал. Обычно α -канал содержит столько же битов, что и канал цвета. Например, 8-разрядный α-канал может представить 256 уровней прозрачности, от 0 (полностью точечный рисунок прозрачен до 255 (полностью точечный рисунок непрозрачен).

Механизмы alpha-перехода запускаются при помощи вызова функции
AlphaBlend
Функция AlphaBlend показывает на экране точечные рисунки, которые имеют прозрачные или полупрозрачные пиксели.

Синтаксис

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL AlphaBlend(
  HDC hdcDest,                 // дескриптор целевого DC
  int nXOriginDest,            // x-коорд. левого верхнего угла
  int nYOriginDest,            // y-коорд. левого верхнего угла
  int nWidthDest,              // ширина целевого прямоугольника
  int nHeightDest,             // высота целевого прямоугольника
  HDC hdcSrc,                  // дескриптор источникового DC
  int nXOriginSrc,             // x-коорд. левого верхнего угла
  int nYOriginSrc,             // y-коорд. левого верхнего угла
  int nWidthSrc,               // ширина источникового прямоугольника
  int nHeightSrc,              // высота источникового прямоугольника
  BLENDFUNCTION blendFunction  // функция α - перехода
);

Параметры

hdcDest

[in] Дескриптор целевого контекст устройства.
nXOriginDest

[in] Устанавливает x-координату, в логических единицах измерения, левого верхнего угла целевого прямоугольника.
nYOriginDest

[in] Устанавливает y-координату, в логических единицах измерения, левого верхнего угла целевого прямоугольника.
nWidthDest

[in] Определяет ширину, в логических единицах измерения, левого верхнего угла целевого прямоугольника.
nHeightDest

[in] Определяет высоту, в логических единицах измерения, левого верхнего угла целевого прямоугольника.
hdcSrc

[in] Дескриптор исходного контекста устройства.
nXOriginSrc

[in] Устанавливает x-координату, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
nYOriginSrc

[in] Устанавливает y-координату, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
nWidthSrc

[in] Определяет ширину, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
nHeightSrc

[in] Определяет высоту, в логических единицах измерения, левого верхнего угла исходного прямоугольника.
blendFunction

[in] Устанавливает функцию alpha-перехода для исходного и целевого точечных рисунков, основное alpha-значение, которое будет применено ко всему исходный точечному рисунку и формат информации для исходного точечного рисунка. Исходная и целевая функции смешивания в настоящий момент ограничены значением AC_SRC_OVER. См. описание структур BLENDFUNCTION и EMRALPHABLEND.
Возвращаемые значения

Если функция завершается успешно, возвращаемое значение - ИСТИНА (TRUE).

Если функция завершается с ошибкой, возвращаемое значение - ЛОЖЬ (FALSE).
Замечания

Если исходный и целевой прямоугольник имеют не один и тот же размер, исходный точечный рисунок растягивается, чтобы соответствовать целевому прямоугольнику. Если используется функция SetStretchBltMode, значение iStretchMode для этой функции автоматически преобразуется в COLORONCOLOR (то есть BLACKONWHITE, WHITEONBLACK, и HALFTONE изменяются в COLORONCOLOR).

Целевые координаты преобразуются при помощи использования преобразования в текущий момент заданного для цели контексте устройства. Исходные координаты преобразуются при помощи использования преобразования в текущий момент заданного для источника контекста устройства.

Если исходный контекст устройства идентифицирует контекст устройства расширенного метафайла, происходит ошибка (и функция возвращает значение ЛОЖЬ (FALSE)),

Если целевые и исходные точечные рисунки не имеют одного и того же цветового формата, функция AlphaBlend конвертирует исходный точечный рисунок так, чтобы он соответствовал целевому точечному рисунку.

Функция AlphaBlend не поддерживает зеркалирование. Если, или ширина, или высота источника или цели имеет отрицательное значение, ее вызов завершится ошибкой.

При воспроизведении на принтере, сначала вызывается функции GetDeviceCaps с флажком SHADEBLENDCAPS, чтобы выяснить, поддерживает ли принтер режим α - перехода с функцией AlphaBlend.

Обратите внимание! на то, что это, для контекста устройства (DC) дисплея, все операции α - перехода поддерживаются, и эти флажки обозначают, ускорены ли операции.

Если источник и цель - та же самая поверхность то есть, они являются и экраном, и тем же самым точечным рисунком в памяти - и исходный и целевой прямоугольники перекрываются, происходит ошибка и функция возвращает значение ЛОЖЬ (FALSE).

Исходный прямоугольник должен располагаться полностью в пределах исходной поверхности, в противном случае происходит ошибка, и функция возвращает значение ЛОЖЬ (FALSE).

Функция AlphaBlend завершается ошибкой, если ширина или высота источника или цели - отрицательное значение.

Обратите внимание! на то, что член SourceConstantaAlpha структуры BLENDFUNCTION устанавливает значение прозрачности α, которое будет использовано на всем исходном точечном рисунке. Значение SourceConstantAlpha комбинируется с любым alpha-значением пикселя. Если SourceConstantAlpha - 0, то предполагается, что изображение является прозрачным. Устанавливайте значение SourceConstantAlpha в 255 (которое обозначает, что изображение непрозрачно) тогда, когда Вам нужно использовать только alpha-значения пикселей.
, которая ссылается на структуру
BLENDFUNCTION
Структура BLENDFUNCTION управляет плавным переходом цвета и тона, устанавливая функции сопряжения для источниковых и принимающих точечных рисунков.

C++
1
2
3
4
5
6
7
8
Синтаксис
 
typedef struct _BLENDFUNCTION {
  BYTE     BlendOp;
  BYTE     BlendFlags;
  BYTE     SourceConstantAlpha;
  BYTE     AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
Члены структуры
BlendOp
Определяет исходную операцию плавного перехода цвета и тона. В текущий момент действуют только исходный и принимающий плавный переход цвета и тона, которые были установлены в AC_SRC_OVER. Детали см. ниже в разделе Замечания.

BlendFlags
Должен быть нуль.
SourceConstantAlpha
Устанавливает α-значение прозрачности, которое будет использоваться на всем источниковом точечном рисунке. Значение SourceConstantAlpha комбинируется с любым α-значением одиночного пикселя в исходном точечном рисунке. Если Вы устанавливаете SourceConstantAlpha в 0, это предполагается, что ваше изображение является прозрачным. Устанавливайте значение SourceConstantAlpha в 255 (непрозрачный вид), если Вы хотите использовать α-значение только пикселя .

AlphaFormat
Этот член структуры управляет способом, которым интерпретируются исходные и принимающие точечные рисунки . AlphaFormat имеет ниже следующее значение.

AC_SRC_ALPHA
Этот флажок устанавливается тогда, когда точечный рисунок имеет α-канал (то есть уровень непрозрачности на пиксель). Обратите внимание! на то, что то, что интерфейсы программирования приложений (API) используют α-уровень умноженный в обратном порядке, который означает, что значения красного, зеленого и синего каналов в точечном рисунке должны быть умножены в обратном порядке на значение α-канала. Например, если значение α-канала - x, красный, зеленый и синий каналы должны быть умножены на x и разделены на 0xff до вызова.

Замечания

Когда параметр AlphaFormat - AC_SRC_ALPHA, исходный точечный рисунок должен иметь 32 бита на пиксель (bpp). Если это не так, функция AlphaBlend завершится ошибкой.

Когда параметр BlendOp - AC_SRC_OVER, исходный точечный рисунок помещается поверх принимающего точечного рисунка, базирующегося на α-значениях источниковых пикселей.

Если источниковый точечный рисунок не имеет α-значения одиночного пикселя (то есть флажок AC_SRC_ALPHA не установлен), значение SourceConstantAlpha устанавливает плавный переход цвета и тона источниковых и принимающих точечных рисунков, как показано в таблице ниже.

Dst.Red = Src.Red * (SCA/255.0) + Dst.Red * (1.0 - (SCA/255.0))
Dst.Green = Src.Green * (SCA/255.0) + Dst.Green * (1.0 - (SCA/255.0))
Dst.Blue = Src.Blue * (SCA/255.0) + Dst.Blue * (1.0 - (SCA/255.0))

Обратите внимание! на то, что тут SCA используется для SourceConstantAlpha. К тому же, SCA поделен на 255, потому что он имеет значение, которое располагается от 0 до 255.

Если принимающий точечный рисунок имеет α-канал, тогда плавный переход цвета и тона следующие.

Dst.Alpha = Src.Alpha * (SCA/255.0) + Dst.Alpha * (1.0 - (SCA/255.0))

Если исходный точечный рисунок не использует член SourceConstantAlpha (то есть он равняется 0xFF), α-уровень непрозрачности на пиксель обуславливает плавный переход цвета и тона исходного и принимающего точечных рисунков, как показано в таблице ниже.

Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue

Если принимающий точечный рисунок имеет α-канал, тогда плавный переход цвета и тона следующие.

Dest.Alpha = Src.Alpha + (1 - SrcAlpha) * Dst.Alpha

Если источник имеет, и член SourceConstantAlpha (то есть он не 0xFF), и α-уровень непрозрачности на пиксель, источник умножается в обратном порядке на SourceConstantAlpha, и тогда плавный переход цвета и тона базируется на α-уровне непрозрачности пикселя. Нижеследующая таблица показывает это.

Обратите внимание! на то, что это, SourceConstantAlpha разделен 255, потому что он имеет значение которое, располагается от 0 до 255.

Src.Red = Src.Red * SourceConstantAlpha / 255.0;
Src.Green = Src.Green * SourceConstantAlpha / 255.0;
Src.Blue = Src.Blue * SourceConstantAlpha / 255.0;
Src.Alpha = Src.Alpha * SourceConstantAlpha / 255.0;
Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue
Dst.Alpha = Src.Alpha + (1 - Src.Alpha) * Dst.Alpha


где,

Src.Red - источник красного;
Src.Green - источник зеленого;
Src.Blue - источник синего;
Src.Alpha - источник α-уровня непрозрачности;
Dst.Red - приемник красного;
Dst.Green - приемник зеленого;
Dst.Blue - приемник синего;
Dst.Alpha - приемник α-уровня непрозрачности;

.

Alpha-значения на пиксель поддерживаются только для 32 - битов на пиксель (bpp) BI_RGB. Эта формула определяется как:
C++
1
2
3
4
5
6
typedef struct {
  BYTE   Blue;
  BYTE   Green;
  BYTE   Red;
  BYTE   Alpha;
};
Точечные рисунки могут также показываться на экране с коэффициентом прозрачности, применяемым ко всему точечному рисунку. Любой растровый формат может быть показан на экране с общим константным alpha-значением при помощи установки SourceConstantAlpha в структуре BLENDFUNCTION. Общее постоянное alpha-значение имеет 256 уровней прозрачности, от 0 (весь точечный рисунок полностью прозрачен) до 255 (весь точечный рисунок полностью непрозрачен). Общее постоянное alpha-значение объединяется с alpha-значением на пиксель.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
24.03.2010, 14:47  [ТС]
Пока суть сводиться к тому, есть ли что то быстрее GetPixel()?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
24.03.2010, 19:35
Конечно же есть. Можно работать с памятью изображения напрямую через TBitmap::Scanline
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
24.03.2010, 21:21  [ТС]
А как насчёт BitBlt?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
24.03.2010, 21:28
Ты спросил, можно ли доставать значение пикселя быстрее чем это делает GetPixel, я говорю, можно. А BitBlt - это копирование одного участка рисунка в другой.
1
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
25.03.2010, 13:31  [ТС]
Отака, никак не могу врубиться в ScanLine.
Можешь написать пример, чтоб он мне значения цвета каждого пикселя изображения выдавал?

Добавлено через 26 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 PRGBTRIPLE Row;
 Image1->Picture->Bitmap->PixelFormat = pf24bit;
 for (int j = Image1->Picture->Bitmap->Height-1; j >= 0; j--)
    {
      Row = (PRGBTRIPLE)Image1->Picture->Bitmap->ScanLine[j];
      for (int i = 0; i < Image1->Picture->Bitmap->Width; i++)
         {
          Row[i].rgbtRed=255-Row[i].rgbtRed;
          Row[i].rgbtGreen=255-Row[i].rgbtGreen;
          Row[i].rgbtBlue=255-Row[i].rgbtBlue;
         }
    }
 Image1->Refresh();
Ответ на мой вопрос.

Добавлено через 21 минуту
И всё было бы хорошо.
Но всё равно фпс падает где то до 5.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 int Draw(lua_State*st)
 {
  Img->Load(pic_str);
  PRGBTRIPLE iPtr,bPtr;
  for (int i=0; i<Img->Height; i++)
  {
    iPtr = (PRGBTRIPLE)Img->ScanLine[i];
    bPtr = (PRGBTRIPLE)Back->ScanLine[i];
    for (int j=0; j<Img->Width; j++)
    {
        if(iPtr[j].rgbtRed > 50 )
            iPtr[j].rgbtRed = 110;
    }
  }
  Back->Canvas->Draw(x,y,Img);
 }
Играть не возможно, что ещё можно сделать?

А то, что Img у меня указатели играет роль?

Добавлено через 13 часов 21 минуту
C++
1
 bPtr = (PRGBTRIPLE)Back->ScanLine[i];
Проблема в этом, почему то когда он начинает считывать пиксели с Bitmap'а куда я вывожу спрайты(планеты, звёзды и.т.д) программа начинает жутко лагать.
Есть идеи?
0
 Аватар для Otaka
1857 / 714 / 55
Регистрация: 11.12.2008
Сообщений: 1,019
25.03.2010, 21:29
Я тебе так скажу. Обработка графики процессором - вещь неблагодарная. Особой скорости ты и не получишь.
Ты попробуй потягать окошки по экрану со стандартным VGA драйвером на видеокарте. Лагает тоже ужасно.
Если тебе нужна прозрачность, ты попробуй посмотреть вот эту вот функцию:TransparentBlt
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
25.03.2010, 23:55  [ТС]
Особенное спасибо, Отака, очень благодарен тебе за поддержку на протяжении всего проекта.
Ну и всему форуму конечно.

И так, пришла очередь написать ещё один большой message.

|------------------------------------------------------------------------------------------------------------

Проблема падения фпс решается, опять же каким то чудодейственным шаманским способом.
Достаточно перед тем как объявлять наш буфер, куда мы рисуем все наши объекты, просто
подгрузить любую картинку в формате bmp. Видимо Bitmap приобретает какие то не ведомые
для меня параметры.

C++
1
2
3
4
5
 Back = new Graphics::TBitmap();
 Back->LoadFromFile("GFX\\SLHelp.bmp"); //Это для ScanLine, без этой подгрузки прога жутко лагает.
 Back->Height = Form->ClientHeight;     Back->Width  = Form->ClientWidth;
 Back->Canvas->Font->Name = "Fixedsys";
 Back->Canvas->Font->Color = clBlack;
|------------------------------------------------------------------------------------------------------------

Идём дальше, следуйщей проблемой было написать собственный альфа-блендинг. Порыскав по
просторам интернета, наткнулся на китайца, который этим вопросом занялся серьёзно, и
написал алгоритм, который увеличивает скорость просчёта нашей прозрачности в 8 раз быстрее,
чем это делает MFC'шная функция.
http://www.codeguru.com/cpp/cp... php/c15989
За что ему огромнейшее спасибо.

Сама функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int Draw(lua_State*st)
 {
  Img->Load(pic_str);
  PRGBTRIPLE iPtr,bPtr;
  for (int i=0; i<Img->Height; i++)
  {
    Img->Transparent = 0;
    iPtr = (PRGBTRIPLE)Img->ScanLine[i];
    bPtr = (PRGBTRIPLE)Back->ScanLine[y+i];
    for (int j=0; j<Img->Width; j++)
    {
        if(iPtr[j].rgbtRed == 255 && iPtr[j].rgbtGreen == 0 && iPtr[j].rgbtBlue == 255) //Transparent
            iPtr[j] = bPtr[x+j];
        else
        {
            iPtr[j].rgbtRed = (iPtr[j].rgbtRed*alpha + bPtr[x+j].rgbtRed*(255-alpha))>>8;
            iPtr[j].rgbtGreen = (iPtr[j].rgbtGreen*alpha + bPtr[x+j].rgbtGreen*(255-alpha))>>8;
            iPtr[j].rgbtBlue = (iPtr[j].rgbtBlue*alpha + bPtr[x+j].rgbtBlue*(255-alpha))>>8;
        }
    }
  }
  Back->Canvas->Draw(x,y,Img);
 }
И вот результат: https://www.cyberforum.ru/atta... 1269550202
И как было(с использованием встроенной функцией AlphaBlend()): https://www.cyberforum.ru/atta... 1269381243
Ну и исходное изображение нашего подопытного солнышка: https://www.cyberforum.ru/atta... 1269381243

До следующего messag'a. (%
Миниатюры
Создание игры(2d)  
0
Задающий вопросы (%
 Аватар для KTYJIX
16 / 15 / 0
Регистрация: 09.05.2009
Сообщений: 168
26.03.2010, 12:35  [ТС]
Хехей, господа, пришёл вас порадовать (%

Используя этот алгоритм можно создавать маски для прозрачных мест.

/\------------------------------------------------------------------------------------/\

Выкладываю ещё раз код, пришлось его переделать, ввести ограничения на обработку пикселей,
ибо если картинка уходила за пределы экрана, выскакивало куча ошибок потому что пиксели
пропадали.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int Draw(lua_State*st)
 {
  Img->Load(pic_str+".bmp");
  Img->Transparent = 0;
  ExtImage*iMask = new ExtImage;
  iMask->Load(pic_str+"_Mask.bmp");
  PRGBTRIPLE iPtr,bPtr,mPtr;
 
  int hLim;
  if(y+Img->Height <= 500)
    hLim = Img->Height;
  else hLim = Img->Height - (y+Img->Height - 500);
  int hBegin;
  if(y < 0)
    hBegin = -y;
  else hBegin = 0;
 
  for (int i=hBegin; i<hLim; i++)
  {
     iPtr = (PRGBTRIPLE)Img->ScanLine[i];
     mPtr = (PRGBTRIPLE)iMask->ScanLine[i];
     bPtr = (PRGBTRIPLE)Back->ScanLine[y+i];
 
     int wLim;
     if(x+Img->Width <= 800)
        wLim = Img->Width;
     else wLim = Img->Width - (x+Img->Width - 800);
     int wBegin;
     if(x < 0)
        wBegin = -x;
     else wBegin = 0;
 
     for (int j=wBegin; j<wLim; j++)
     {
         if(iPtr[j].rgbtRed == 255 && iPtr[j].rgbtGreen == 0 && iPtr[j].rgbtBlue == 255) //Transparent
             iPtr[j] = bPtr[x+j];
         else if(mPtr[j].rgbtRed == 255 && mPtr[j].rgbtGreen == 255 && mPtr[j].rgbtBlue == 255)
         {
             iPtr[j].rgbtRed = (iPtr[j].rgbtRed*alpha + bPtr[x+j].rgbtRed*(255-alpha))>>8;
             iPtr[j].rgbtGreen = (iPtr[j].rgbtGreen*alpha + bPtr[x+j].rgbtGreen*(255-alpha))>>8;
             iPtr[j].rgbtBlue = (iPtr[j].rgbtBlue*alpha + bPtr[x+j].rgbtBlue*(255-alpha))>>8;
         }
     }
  }
  Back->Canvas->Draw(x,y,Img);
  delete iMask;
 }
И вот результат (%
Можете побаловаться в луа коде, параметры иллюминаторов лежат в Configs\UI\Script.lua
Изображения
  
Вложения
Тип файла: rar Alpha.rar (5.33 Мб, 40 просмотров)
1
 Аватар для Luntegg
8 / 8 / 1
Регистрация: 06.02.2010
Сообщений: 87
08.04.2010, 22:33
Цитата Сообщение от Otaka Посмотреть сообщение
Вот тебе процедура обнаружения столкновения прямой и региона:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
bool LineHitTest(FPoint*p1,FPoint*p2)
        {
        int l1x1=p1->x;
        int l1y1=p1->y;
        int l1x2=p2->x;
        int l1y2=p2->y;
        int tx=x-Ox;
        int ty=y-Oy;
        for(int i=0;i<count;i++)
                        {
                        int l2x1=p[i].x+tx;
                        int l2y1=p[i].y+ty;
                        int l2x2;
                        int l2y2;
                        if(i==(count-1))
                                {
                                l2x2=p[0].x;
                                l2y2=p[0].y;
                                }else
                                {
                                l2x2=p[i+1].x;
                                l2y2=p[i+1].y;
                                }
                        l2x2+=tx;
                        l2y2+=ty;
                        int v1,v2,v3,v4;
                        v1=(l2x2-l2x1)*(l1y1-l2y1)-(l2y2-l2y1)*(l1x1-l2x1);
                        v2=(l2x2-l2x1)*(l1y2-l2y1)-(l2y2-l2y1)*(l1x2-l2x1);
                        v3=(l1x2-l1x1)*(l2y1-l1y1)-(l1y2-l1y1)*(l2x1-l1x1);
                        v4=(l1x2-l1x1)*(l2y2-l1y1)-(l1y2-l1y1)*(l2x2-l1x1);
                        bool result=((v1*v2)<0)&&((v3*v4)<0);
                        if(result==true)
                                return true;
                        }
        return false;
        }
но это практически копипаст с HitTest.
Кстати, я там раньше немного затупил с HitTest, и поэтому она несовсем правильно определала некоторые ситуации. Это все последствия необдуманного копипастирования.
Вот тебе исправленная версия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
bool HitTest(CRegion*reg)
        {
        int f1x=x;
        int f1y=y;
        int f2x=reg->x;
        int f2y=reg->y;
        int distance=sqrt(((f1x-f2x)*(f1x-f2x))+((f1y-f2y)*(f1y-f2y)));
        if(distance>(reg->ConvexRadius+ConvexRadius))return false;//Дальше можно не проверять, так как объекты находятся слишком далеко друг от друга
        //Если не вышли ранее, то это значит, что у фигур пересекаются их охватывающие окружности
        //Будем проверять пересечения каждой линии
        for(int j=0;j<reg->count;j++)
                {
                int l1x1=reg->p[j].x+reg->x-reg->Ox;
                int l1y1=reg->p[j].y+reg->y-reg->Oy;
                int l1x2;
                int l1y2;
                if(j==(reg->count-1))
                        {
                        l1x2=reg->p[0].x;
                        l1y2=reg->p[0].y;
                        }else
                        {
                        l1x2=reg->p[j+1].x;
                        l1y2=reg->p[j+1].y;
                        }
                l1x2+=reg->x-reg->Ox;
                l1y2+=reg->y-reg->Oy;
                for(int i=0;i<count;i++)
                        {
                        int l2x1=p[i].x+x-Ox;
                        int l2y1=p[i].y+y-Oy;
                        int l2x2;
                        int l2y2;
                        if(i==(count-1))//Тута была ошибка
                                {
                                l2x2=p[0].x;
                                l2y2=p[0].y;
                                }else
                                {
                                l2x2=p[i+1].x;
                                l2y2=p[i+1].y;
                                }
                        l2x2+=x-Ox;
                        l2y2+=y-Oy;
                        int v1,v2,v3,v4;
                        v1=(l2x2-l2x1)*(l1y1-l2y1)-(l2y2-l2y1)*(l1x1-l2x1);
                        v2=(l2x2-l2x1)*(l1y2-l2y1)-(l2y2-l2y1)*(l1x2-l2x1);
                        v3=(l1x2-l1x1)*(l2y1-l1y1)-(l1y2-l1y1)*(l2x1-l1x1);
                        v4=(l1x2-l1x1)*(l2y2-l1y1)-(l1y2-l1y1)*(l2x2-l1x1);
                        bool result=((v1*v2)<0)&&((v3*v4)<0);
                        if(result==true)
                                return true;
                        }
                }
        return false;
        }
а можно немного описать эту функцию, а то не совсем понятно, что здесь к чему...
0
4 / 4 / 1
Регистрация: 15.04.2010
Сообщений: 134
17.05.2010, 17:16
Привет всем Ребята подскажите ка можно сделать сам рисунок немного прозрачным объекта Image!!

Добавлено через 45 минут
А вообще возможно такое сделать для Объекта Image? я знаю что форму можно делать прозрачной!!!
0
4 / 4 / 1
Регистрация: 15.04.2010
Сообщений: 134
19.05.2010, 23:56
Привет всем, ребята подскажите как можно зделать так чтобы не мегала при выползании
http://p23a.pp.ua/fgd/1.png
http://p23a.pp.ua/fgd/2.png

Добавлено через 9 минут
Цитата Сообщение от lebid Посмотреть сообщение
Привет всем, ребята подскажите как можно зделать так чтобы не мегала при выползании
http://p23a.pp.ua/fgd/1.png
http://p23a.pp.ua/fgd/2.png
не мигала картинка а чисто выползала
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2010, 23:56
Помогаю со студенческими работами здесь

Создание игры
Здравствуйте форумчане, мой вопрос состоит в том. Я молодой парень, который знает языки C++, C# и т.д. Ести небольшой интерес к созданию...

Создание игры
Добрый вечер. Начал работу над собственным проектом, и задался вопросом. (gamedev и прочие сайты перечитывал, но так ответа и не нашел....

Создание игры
Посмотрел как сейчас на коленке люди клепают инди игры под андроид\иос e.t.c. Созрел вопрос - куда двинуть, что использовать чтобы написать...

Создание игры на C++
Скажите , а можно ли создавать игры на С++? Если да , то буду рад увидеть примеры как это все реализовать и где можно. Возможно это С++...

Создание 3д игры
Извиняюсь, если такая тема уже была, не нашел. Хочу написать свою игрушку. Игрушка по типу что то gta sa. Но со своим смыслом и тп. Я готов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
380
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru