Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];

Вниз

DoCollision B DelphiX   Найти похожие ветки 

 
Аццкий_рыцарь:)   (2005-12-29 14:07) [0]

когда спрйт анимируется, то DoCollision происходит только на первом его кадре. А мне нужно что б на всех кадрах происходило колижн ХЕЛП!


 
grouzd[E]v ©   (2005-12-29 14:37) [1]

В DelphiX вообще туго с коллизиями, особенно с анимацией. Выход - отменить pixelcheck (вроде так называется) и постараться не крутить спрайты. А еще лучше - самому определять столкновения

---
... we are walking on a thin line and you better avoid the risk ...


 
Cash ©   (2005-12-29 16:01) [2]

А еще лучше - послать DelphiX помыться! :)
Сходи за Омегой лучше, эта вещь будет и быстрее и красивее и
без этих тупых наворотов с колизиями! На держи:
http://www.ericbehme.de/download/Omega_0_93.zip

А за полной инфой ходи на:
http://www.delphisanctuary.com/forums/viewtopic.php?t=4

IMHO: Omega круче!

А на http://www.mirgames.ru/article/omega
посмотри нашинскую инфу по этому вопросу.


 
JUS ©   (2005-12-29 16:57) [3]

Collision ставь вконце кода DoMovie в таком случае. это мой пример:

procedure TPlayer.DoMove(MoveCount:Integer);
begin
{код анимации}
collision;
end;

procedure TPlayer.DoCollision(Sprite:TSprite;var Done:Boolean);
begin
If Sprite is TOgon Then animate:="Dead";
end;


если у тебя не получается, напиши кусок кода с анимацией и коллизией, мне кажется что там чтото не то!

Кстати тормоза пропали при объектах больше 60?


 
JUS ©   (2005-12-29 17:02) [4]


> procedure TPlayer.DoCollision(Sprite:TSprite;var Done:Boolean);
>
> begin
> If Sprite is TOgon Then animate:="Dead";
> end;

TOgon это класс тоже {огонь}
Sprite это спрайт этого класса, т.е. TPlayer;


 
JUS ©   (2005-12-29 17:03) [5]


> Cash ©   (29.12.05 16:01) [2]


> IMHO: Omega круче!

Круче чем?


 
grouzd[E]v ©   (2005-12-29 17:18) [6]


> [2] Cash ©   (29.12.05 16:01)

Имхо и то и то лабуда полная и рулит OGL с API, но, блин, был же задан конкретный вопрос именно про DelphiX! Давайте еще ссылку google дадим. Ничего личного

---
... we are walking on a thin line and you better avoid the risk ...


 
Cash ©   (2005-12-29 17:51) [7]

grouzd[E]v ©   (29.12.05 17:18) [6]:
(а мы разве знакомы???)
Нет! До П7 тебе далеко! :)))

ИМХО: лабуда то, что все говорят, как круто кодить на API,
но никто не юзает это в полную силу!


JUS ©   (29.12.05 17:03) [5]:
Omega не лабуда, а крутая штука с названием GDK.
Сделана на DirectX 8.1, есть клон под DirectX 9.0.
Быстрее DekphiX больше чем 5 раз.
(с моей подачи разрыв можно увеличить до 20-40 раз!)

grouzd[E]v ©   (29.12.05 17:18) [6]:
Парень задал вопрос по DelphiX, первый же пост, твой, был на 100% исчерпывающим!
Но исходя из его прошлого поста, я посчитал необходимым дать совет
о смене либы!


 
grouzd[E]v ©   (2005-12-29 20:14) [8]


> grouzd[E]v ©   (29.12.05 17:18) [6]:
> (а мы разве знакомы???)
> Нет! До П7 тебе далеко! :)))

Так, на всякий... Да и причем тут П7?


> ИМХО: лабуда то, что все говорят, как круто кодить на API,
> но никто не юзает это в полную силу!

Блин, не понял ты меня - я имел ввиду что нефиг все время народ отсылать к другим библиотекам, пущай пишут на чем хотят

---
... we are walking on a thin line and you better avoid the risk ...


 
JUS ©   (2005-12-29 23:58) [9]


> grouzd[E]v ©   (29.12.05 20:14) [8]


> Блин, не понял ты меня - я имел ввиду что нефиг все время
> народ отсылать к другим библиотекам, пущай пишут на чем
> хотят

Я поддерживаю. Это правильно)


 
Аццкий_рыцарь:)   (2005-12-30 03:58) [10]

2 JUS и все :)

ща выложу, только дайте мне какой-то русский банк файлов (а то я из Украины и незнаю, развечто могу в Украине выложить) :)

насчет 60-ти спрайтов... я отменил нафик пиксельчек, и стало работать намного быстрее, но всеравно подглючивает

з.ы. буду писать эту игру на делфиХ из принципа :) а потом думаю перейти на ГЛСцен, а то директ икс сам по себе меня че-то не прет, вот Огл это весч (ИМХО)


 
Cash ©   (2005-12-30 08:27) [11]

grouzd[E]v ©   (29.12.05 20:14) [8]:
... Блин, не понял ты меня  ...
Нет, тогда я бы сказал применительно к тебе.

... нефиг все время народ отсылать к другим библиотекам ...
А я чтоли послал? Мол сказал :
"Слушай Аццкий_рыцарь:), иди ка мыться со своим DelphiX"????
Нет! я так не сказал, а если послышалось, то креститься надо! ;)

Или мож, я сказал: "Слушай Аццкий_рыцарь:), давай переходи на GLScene или Omega, или тебя здесь перестанут обслужывать" (типа это принуждение).

Нет! я так не сказал, а если послышалось, то креститься надо! ;)
А еще по воскресеньям в церковь православную ходить!
(ну мыж не знакомы, может в сенагогу? или капище?)

Аццкий_рыцарь:)   (30.12.05 03:58) [10]:
Принцип я уважаю, но не советую ему следовать в данном контексте.
DelphiX - это старая фиговина, которая нужна только для первой недели
обучения игродельства.

... потом думаю перейти на ГЛСцен ...
И опять не советую, (у меня привычка такая: все будут смотреть и
глумиться на то как чел лбом то в одну стену, то в другую,
а я это наблюдать не люблю, потаму, что знаю как это больно
и долго), про GLScene только здесь отзываются нейтрально,
в остальных местах на это уже давно забили.
OpenGL вещь мощная, мне она нравится, и знакомые мои на нем
свои творения делпют. Но после двух месяцев изучения я опять
вернулся к DirectX 8.1 (на нем стаж - 2 года).

Пробуй, но про Omega всетаки посмотри. Ее делает коллектив германцев,
а не слегка сумасщедший японец.

P.S.
 Эй, а ктонибудь знает отличие IMHO от ИМХО? (мне интересно)


 
antonn ©   (2005-12-30 08:37) [12]

Аццкий_рыцарь:)   (30.12.05 3:58) [10]
з.ы. буду писать эту игру на делфиХ из принципа :)

сделай ее на канвасе. Из принципа:)


 
JUS ©   (2005-12-30 11:32) [13]


> Аццкий_рыцарь:)   (30.12.05 03:58) [10]


> ща выложу, только дайте мне какой-то русский банк файлов
> (а то я из Украины и незнаю, развечто могу в Украине выложить)
> :)

http://www.slil.ru/
или
http://www.webFile.ru/
и т.д. :-)))


 
JUS ©   (2005-12-30 11:50) [14]


> Cash ©   (29.12.05 16:01) [2]

А как твою омегу инсталлировать? Запускаю "OmegaD7.dpk", нажимаю install,
выдаёт ошибку:
[Fatal Error] OmegaScreen.pas(53): File not found: "UseD3D8.inc"
:(


 
JUS ©   (2005-12-30 12:32) [15]


>
> > Cash ©   (29.12.05 16:01) [2]

Проинсталировал, но она вытеснела DelphiX, а я игру не доделал еще :-(

вещ конечно интересная и превосходит, это факт, но мне пока и DelphiX устраивает, потом может перейду)


 
Аццкий_рыцарь:)   (2005-12-30 13:25) [16]

воть http://slil.ru/22493013

я уже по этой гребаной игре тут писал, когда не мог рандомно монстров пускать в разные стораны :) помогите плиз и на этот раз  :)


 
Аццкий_рыцарь:)   (2005-12-30 13:27) [17]

кстати, кто может мне аргументированно обьяснить какая библиотека лучше для изучения после делфиХ ? очень прошу! только плиз без такого : "директ Х - рулит, огл - сакс " :)


 
JUS ©   (2005-12-30 13:38) [18]

Изучай DirectX - это серьёзная вещ! я так думаю, хотя сам DirectX не учил. Но знал бы его, многое бы мог без всяких DelphiX-ов и Ogl-ов:))


 
JUS ©   (2005-12-30 13:48) [19]

Зачем тебе монстров рандумно пускать? делай AI (искуственный интелект) монстрам.


 
JUS ©   (2005-12-30 13:59) [20]


> Аццкий_рыцарь:)   (30.12.05 13:25) [16]
> воть http://slil.ru/22493013
>
> я уже по этой гребаной игре тут писал, когда не мог рандомно
> монстров пускать в разные стораны :) помогите плиз и на
> этот раз  :)

Че то сервер там глючит, и не впервые, и долго качает, затем сбрасывает. твои 1.5мб приказал час ждать. Там походу сервак медленный. Залей лучше на
http://www.webFile.ru/
Я им пользовался, нормальный такой сервер.


 
Аццкий_рыцарь:)   (2005-12-30 16:15) [21]

2JUS ВЭБФАЙЛ - ТАК ВЕБФАЙЛ, КАК ПРИКАЖЕТЕ С ! :)

webfile.ru/722773


 
Кефир87 ©   (2005-12-30 16:31) [22]


> JUS ©   (30.12.05 13:38) [18]
> DelphiX-ов и Ogl-ов

Это ты штоль в одну кучу пихнул. Вот это да...

От себя могу сказать, что я изучаю OpenGL и буду продолжать это делать. Однако Direct3D тоже изучу (когда лень не будет и время). OpenGL - это стандарт! Эта библиотека должна быть на всех ОС всех известных платформ. Но настоящий про геймдевер должен знать и то и то в совершенстве.

Хватит холиворов 8)


 
grouzd[E]v ©   (2005-12-30 16:52) [23]


> [11] Cash ©   (30.12.05 08:27)

Ладно, убедил =)))

---
... we are walking on a thin line and you better avoid the risk ...


 
Cash ©   (2005-12-30 19:33) [24]

JUS ©   (30.12.05 12:32) [15]:
А как она DelphiX вытеснить смогла? 8)
Имеешь ввиду, делфя взяла, да и удалила пакет?
Дак пакет DelphiX надо еще раз перекомпилить!
У меня вон ваще все три стоят: DelphiX, Omega 93, Power Draw 3
Сначала Omega поставил, а потом остальные два. И ничего,
рядом стоят.

JUS ©   (30.12.05 13:48) [19]:
Это один из его прошлых постов. Это и есть его ИИ.

Да, еще одна вещь в сторону Omega и камень в огород DelphiX -
это то, что полазив по исходникам омеги можно понять, как на чистом
DirectX кодить! Я полазил, и как результат - у меня в проектах кроме
OmegaScreen больше от омеги ничего нет. Точнее от родной Омеги,
я уже подумываю сделать fit на омегу по своему. (уже есть некоторые
свои компоненты, они работают быстрее родных).

grouzd[E]v ©   (30.12.05 16:52) [23]:
Да не, это мне пора завязывать с кофеином и попить валерьяночки! :)))

JUS ©   (30.12.05 11:50) [14]:
Гы... Гы... Гы.... :)))
а с инсталом там рамс!
Первое: надо переместить DirectX папку из папки Omega и сказать дельфе,
что по такому то пути у нас лежит DirectX.
("Tools"->"Enviroment Options"->[Library]: добавляешь в списки
"Library Path" и "Borowsing Path" этот путь)
Второе: скопировать две длл-ки из папки DLL
(их и к проекту копировать надо, рядом с exe-шником) в папку Bin делфи.
Третье: это то, что ты уже сделал: установить пакет OmegaD7.dpk.

Кстати, делфе надо бы сказать еще, где сама омега лежит,
а то матюгнутся может.

P.S.
Не, серьезно, знаете или нет, в чем различие IMHO и ИМХО???
(это одно и то же или нет???)


 
Кефир87 ©   (2005-12-30 20:54) [25]

имхо просто не охото менять раскладку чтоп писать imho 8) А смысл я вкладываю один "In My Humble Opinion" 8)


 
Аццкий_рыцарь:)   (2005-12-30 22:01) [26]

Может кто-то все таки посмотрит на мой исходник ? :)


 
JUS ©   (2005-12-31 01:44) [27]

Посмотрю завтра, щас занят:)


 
Аццкий_рыцарь:)   (2005-12-31 01:59) [28]

:)

з.ы. КСТАТИ, МАСТЕРА, ПОЗДРАВЛЯЮ ВАС С НАСТУПАЮЩИМ НОВЫМ ГОДОМ, ЖЕЛАЮ ВАМ УДАЧИ ВО ВСЕХ ВАШИХ НАЧИНАНИЯХ, ЗДОРОВЬЯ (ЧТОБ НЕ СИДЕЛИ ЦЕЛЫМИ ДНЯМИ У МОНИТОРОВ:) ) И ВСЕГО САМОГО ХОРОШЕГО!


 
Cash ©   (2005-12-31 11:11) [29]

Кефир87 ©   (30.12.05 20:54) [25]:
Я вон пользуюсь двумя этими абривиатурами, давая родной смысл.
IMHO: In My Home Option (попробовал, рекомендую)
ИМХО: имею мнение х..н оспоришь.
Так что, иногда лучше всетаки раскладку менять, а то, не так поймцт! :)))

Аццкий_рыцарь:)   (31.12.05 01:59) [28]:
ВСЕХ НАШИНСКИХ ДЕЛЬФИНОВ С НАСТУПАЮЩИМ!

Аццкий_рыцарь:)   (30.12.05 22:01) [26]:
Давай, после нового года.


 
Аццкий_рыцарь:)   (2006-01-03 01:25) [30]

Вот тут начитавшись ваших хороших откликов в сторону ГЛСцен, решил забросить ДелфиХ и Начать долбить ГЛСцен :) Кстати на сайте www.glscene.ru рассказывается про 3Д графику, а там есть про 2Д? потому что я толком еще 2Д и незнаю, а с 3Д я сразу "загнусь"


 
Аццкий_рыцарь:)   (2006-01-03 02:41) [31]

Вообще-то полазив по инету, понял что ГЛСцен для 3Д сделан, так что если вы мне поможете усовершенствовать игру чтоб спрайты не глючили,и коллизия происходила на всех кадрах, буду ОЧЕНЬ вам благодарен! ибо это последние две проблемы, которые я не могу решить сам. А дальше разберусь :) НАДЕЮСЬ НА ВАШУ ПОМОЩЬ


 
Cash ©   (2006-01-03 08:37) [32]

Аццкий_рыцарь:)   (03.01.06 02:41) [31]:
А ты видать все посты читать не любишь!!!!
Я же вторым постом отписал, то, что гораздо лучше DelphiX.
На Омеге еще и 3D сделать можно, это самый лучший GDK из
всех, мной увиденных!

А на DelphiX с этими двумя проблемами тебе не справиться.
Переписать коллизию будет если не трудно, то очень трудно.
(сам пытался переписать, после чего забросил DelphiX подальше)

А спрайты будут вести себя так, как их напишут. Напишут с глюкама,
спрайты будут глючить.
Вон там есть еще несколько ответов по Омеге.
http://delphimaster.net/view/9-1132021552/

-------------------------------
Забудь DelphiX, он для обучения. Переходи на Omega, она для развития!


 
JUS ©   (2006-01-03 13:20) [33]


> Cash ©   (03.01.06 08:37) [32]


> Забудь DelphiX, он для обучения. Переходи на Omega, она
> для развития!

Cash, тебе же было сказано


> grouzd[E]v ©   (29.12.05 20:14) [8]


> Блин, не понял ты меня - я имел ввиду что нефиг все время
> народ отсылать к другим библиотекам, пущай пишут на чем
> хотят


И если ты так решил что DelphiX для обучения, это еще не значит что она для обучения. Для обучения чего???) Библиотека есть библиотека, при чём тут для обучения. Можно подумать что её создали специально для обучения:)))


 
JUS ©   (2006-01-03 13:36) [34]


> Аццкий_рыцарь:)

Ты наверное раньше бейсик изучал?
Щас смотрел твой код, забудь про goto, очень может запутать, пытайся обходиться без goto. И еще код трудно читать с этим goto. Можно все проще написать и компактнее. И ограничение хоть есть у монстров? Я запустил "игру", вышел на 10 мин., пришел, а их наверное 100тыс. на экране образовалось в одной куче вокруг меня и все чето хотят.)


 
Cash ©   (2006-01-03 17:54) [35]

JUS ©   (03.01.06 13:20) [33]:
... Можно подумать что её создали специально  ...
Нет, когда Хируоки ее содавал, DirectX7 был крутой штукой.
Создана эта либа не для обучения, а для того, чтобы показать
какой этот япошка крутой! Потом ее предназначение стало - обучать.
Обучать, как спрайты делать, как - коллизии создавать, как из
программного кода сделать вируальный мирочек.
"НИЧЕГО БОЛЕЕ МЕНЕЕ ПУТНОГО НА НЕЙ НЕ СДЕЛАЕШЬ!" (это не мои слова!)
Изучив проект GDK Omega и при наличии неисскуственного разума
можно легко и непринужденно понять, как делать вещи на DirectX 8.1
и выше. (8.1 или 7, для меня выбор уже очевиден)
Не, начинал я тоже с DelphiX, но - две недели, не больше,
стало понятно, и на ум пришло это изречение (большими буквами).
Crimson Land, тот вообще писался на VC++ 6,
(могу дать полный отчет проги "UnPackFx",
которая умеет определять компилятор).

Cash, тебе же было сказано
> grouzd[E]v ©   (29.12.05 20:14) [8]

Ага, пмню :)))
Ща, еще кофеинчику приму, и постараюсь что нибудь ответить еще :D :D :D

---------------------------------------------
Да ну, мне вообще маленько по**** кто на чем пишет,
мое дело дать совет или рекомендацию. :)))
---------------------------------------------
Хотелось бы мне отсылать других податьше,
да яб тогда вообще в каждом поте говорил:
"Бросайте этот **** Delphi!, он для обучния!
Переходите на VC++ 7, она для развития" :)))
(типа это в рифму с прошлым) :)))


 
JUS ©   (2006-01-03 18:07) [36]

Тебе дай волю, так ты можеш до х** наговорить


 
JUS ©   (2006-01-03 18:16) [37]

Ну в принципе ты прав что омега круче, я не отрицаю. Но раз делфиХ для обучения, пускай он научится сначала на ней спрайты крутить и коллизю. Кстати хоть и директХ7, то все равно для начала хватит, пусть хоть одну игрушку сделает на делфиХ, чем прыгать из крайности в крайность. И на ДиректХ5 игрушки типа варкрафта и др. были интересные. Для начала ему много не надо. И такой движек потянет, если код будет грамотный. А когда закончит писать, то может к тому времени этот японец, как там его, выпустит DelphiX с DirectX9. и будет круче омеги:-)))


 
Аццкий_рыцарь:)   (2006-01-03 18:58) [38]

2JUS в самом деле я кодил с самого начала на ВБ :)

Так что, никак нельзя седать что б не глючила игра? :((( И с коллизиями тож ниче не сделаешь?


 
Аццкий_рыцарь:)   (2006-01-03 19:06) [39]

Кстати, оно почему-то само, только количество спрайтов стает больше сорока, снижает ФПС до 50 ... возникает смутное сомнение, что это делается специально спрайт енжином делфиХ. Наверное цыфру сорок можно изменить если покопаться?


 
Cash ©   (2006-01-03 19:20) [40]

JUS ©   (03.01.06 18:07) [36]:
Это точно!!! :D
JUS ©   (03.01.06 18:16) [37]:
Коллега, мы нашли общий язык. Респект!

Аццкий_рыцарь:)   (03.01.06 18:58) [38]:
Сорри, я не могу посмотреть твой код, дела.... сессия....
ботанничество короче! :)))
В замен goto можно использовать while цыкл, или, если
пыть по ближе к goto, использовать repeat.
Если что, могу пояснить - как.

Мож, у тебя из за goto все рамсы со спрайтами? Мож, конечно, и нет.

А от глючности со столкновениями можно избавиться написанием
своей процедурки обработки столкновений, на приметивах.
Если что, то и это объясню.

А япошку этого завут (который DelphiX сделал, если я правильно помню) Хируоки Хори (Hiroyuki Hori). Этакий fo kso (fo kusotore) из японии


 
Аццкий_рыцарь:)   (2006-01-03 20:26) [41]

Эээээ со столкновениями я с горем пополам разобрался  (вырубил пиксельчек и зделал колижн при столкновениях рамок спрайтов, а рамки сделал "вакурат" прикасающимися к изображению спрайтов)

НО ВОТ С ГЛЮКАМИ! билна наверное  этот Хируоки Хори специально сделал чтоб после вывода больше 40 спрайтов, ФПС падали


 
Аццкий_рыцарь:)   (2006-01-03 22:14) [42]

О! тут удалось сохранить примерно 90 фпс при выводе где-то 70 спрайтов! я в свойствах спрайта монстра поставил systemmemory=true.


 
Cash ©   (2006-01-04 12:59) [43]

Аццкий_рыцарь:)   (03.01.06 22:14) [42]:
Ага, есть такое. Поставь у DxDraw.Options параметр doSystemMemory
в true, при большом количестве спрайтов это облегчает работу,
т. е. поднимает FPS.
А еще, ижели в полноэкранном режиме, и графика вся в 256 цветах,
то поставь 256 цветов в свойствах DxDraw тоже(DxDraw.Display.BitCount).
Так же, если в полноэкранном режиме, в DxDraw.Options поставь:
doWaitVBlank -> false
doCenter -> false
doDirectX7Mode -> false
doRetainedMode -> true

Если производительность будет падать, попробуй вариации этих параметров.
Бывало, у меня при выводе 700 спрайтов FPS составляло 89 - 92.
Это с такими настройками.

Аццкий_рыцарь:)   (03.01.06 20:26) [41]:
А от goto избавился?


 
JUS ©   (2006-01-04 14:41) [44]

Используй For

чтоб добавить ещё капельку производительности напиши код в Form1.onActivate или как уж там

DoubleBuffered:=True;

помоему так.))


> Cash ©   (04.01.06 12:59) [43]

Respect)))


 
Аццкий_рыцарь:)   (2006-01-04 21:09) [45]

немного помогло :)

ну-с с глюками как бы разорался :) пасиба!

меня еще одна проблемка волнует... а можно на DXDrav рисовать? через канвас? мне надо чтоб картинка мертвого монстра рисовалась на спрайте бекграунда. Это можно сделать?


 
JUS ©   (2006-01-04 21:16) [46]


> Аццкий_рыцарь:)   (03.01.06 20:26) [41]
> Эээээ со столкновениями я с горем пополам разобрался  (вырубил
> пиксельчек и зделал колижн при столкновениях рамок спрайтов,
>  а рамки сделал "вакурат" прикасающимися к изображению спрайтов)
>
> НО ВОТ С ГЛЮКАМИ! билна наверное  этот Хируоки Хори специально
> сделал чтоб после вывода больше 40 спрайтов, ФПС падали

1.Какие еще рамки "вакурат"? Ты делай чтоб размеры спрайта были равны размеру самого спрайта(они вымерятся автоматически) ниче подгонять в аккурат не надо.
Width := Image.Width;
Height :=Image.Height;
2. ниче подобного, я ж тебе писал в другой ветке как надо спрайты выводить, у меня на экране >700 спрайтов и всё ок. И не используй этот goto. Создай массив скажем для 100 монстров, пускай они где хотят там и появляются, это ты сам сделаеш, и выводи как я писал тебе, в другой ветке.
Выводи из массива через For.
Вот ссылка на прошлую ветку
http://delphimaster.net/view/9-1132021552/

Monstr:array[0..99] of TMonstr;
fMonstr:integer;

...
В каком нибудь таймере поставь создание монстров
For i:=0 to 99 do begin
  begin
fMonstr:=fMonstr+1;
Monstr[fMonstr]:=TMonstr.Create(DXSpriteEngine.Engine);
Monstr[fMonstr].Image:=DXImageList.Items.Find("Primer");
Monstr[fMonstr].Width:=Monstr[fMonstr].Image.Width;
Monstr[fMonstr].Height:=Monstr[fMonstr].Image.Height;
Monstr[fMonstr].X:=XX;
Monstr[fMonstr].Y:=YY;
Monstr[fMonstr].Z:=ZZ;
end;


Если монстра завалил, то fMonstr:=fMonstr-1;
Если fMonstr:=100 или больше то не создает.
Тока не забывай после его гибели отчищать память или будут тормоза.

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


 
JUS ©   (2006-01-04 21:21) [47]


> Аццкий_рыцарь:)   (04.01.06 21:09) [45]
> немного помогло :)
>
> ну-с с глюками как бы разорался :) пасиба!
>
> меня еще одна проблемка волнует... а можно на DXDrav рисовать?
>  через канвас? мне надо чтоб картинка мертвого монстра рисовалась
> на спрайте бекграунда. Это можно сделать?

Рисуй так же как на канве, тока че там писать надо не помню, вроде...
Form1.DXDraw1.Surface.Canvas ... а дальше думаю разберешся
А нафига тебе там рисовать на канве, нарисуй этого скелета в BMP и загрузи спрайт (будет как фон), только Z поставь меньше чем у всех своих монстров и др.


 
Cash ©   (2006-01-04 21:37) [48]

Аццкий_рыцарь:)   (04.01.06 21:09) [45]:
Да. Берешь DxDraw.Surface.Canvas (по моему),
и делаешь с ним что хошчь! Даже текст выводи!

JUS ©   (04.01.06 21:16) [46]:
... Выводи из массива через For. ...
Поправлю, маленечко!, не через for, он медленный, а через while!
(заменяй все for на while, а goto на repeat, выиграешь
в производительности!)

Аналог цыкла for на манер while:

while i < Need do begin
 <Чёнибудь делаем>
 inc(i);
end;


Аналог goto на манер repeat:

// тут без титула не обойтись
Label
 m;
begin
m:
 <Чёнибудь делаем>
 if i < Need then goto m;
end;

// а так это на repeat выглядит
begin
 repeat
   <Чёнибудь делаем>
 until i >= Need; // замечу, что именно >=, потаму, как (not (>=)) = <.
end;


 
cyborg ©   (2006-01-05 09:57) [49]

>>[43] Cash ©   (04.01.06 12:59)
>>Ага, есть такое. Поставь у DxDraw.Options параметр doSystemMemory
>>в true, при большом количестве спрайтов это облегчает работу,
>>т. е. поднимает FPS.

Наоборот снижает. Прибавление будет лишь в тех случаях, когда используются пиксельное столкновение, отображение с поворотом или с прозрачностью.


 
Аццкий_рыцарь:)   (2006-01-05 22:37) [50]

2cyborg разве когда включить пиксельное столкновение, то повысится производительность? О_о

Кстати, у меня goto  использовалось не для повторения какой-то процедуры, а для пропускания одельной части кода


 
JUS ©   (2006-01-06 00:04) [51]


> Кстати, у меня goto  использовалось не для повторения какой-
> то процедуры, а для пропускания одельной части кода

Ну и не правильно все равно. для этого можно использовать условие if, если чё то пропускать такой то код.
> 2cyborg разве когда включить пиксельное столкновение, то
> повысится производительность? О_о

нет, ты не правильно понял


 
Аццкий_рыцарь:)   (2006-01-06 02:37) [52]

2JUS ААААААААА! Я СОЗДАЛ МАСИВОМ! И, КОГДА Я ВЫВОЖУ ДАЖЕ 200 СПРАЙТОВ, ТО ФПС ~ 65 !!! ААА! КАК Я РАД! АА! ПАСИБА!


 
Аццкий_рыцарь:)   (2006-01-06 04:49) [53]

Я пытался через канвас выводить, но когда монстряка рисуешь на бекграунде, то он выводится и сразу же пропадает... наверное это из-за того, что дроу постоянно обновляет поверхность для рисования... И как мне быть? :(

Кстати, я не хочу чтоб этот мертвый монстряк был спрайтом (так я уже сделал), потому что еще один спрайти не пойдет на пользу производительности.


 
Cash ©   (2006-01-06 09:02) [54]

Аццкий_рыцарь:)   (05.01.06 22:37) [50]:
Как уже заметил коллега JUS, используй if, организовывай нужную
часть кода, как блок подпрограммы внутри if оператора.

Аццкий_рыцарь:)   (06.01.06 04:49) [53]:
Ну дак, тыж каждый раз перерисовываешь все пространство.

... потому что еще один спрайти не пойдет на пользу ...
Так, прошу прошения, а постоянные вычищения памяти и
следующие за ними выделения пойдут, скажешь, на пользу?

Пускай у твоего спрайта будет два состояния, первое:
хорошенький такой бодринький монстрячок, который
весело так бегает за юзером и наровит типнуть за ******. :)))
Второе состояние монстряка - это когда злой дядя юзер
шмальнул из своей валыны по этому веселому монстрячку,
и тот обидился и решил сдохнуть, тобиш лежил и не шивелится. :)))
(прикольно получилось) :D
А когда приходит время добавить еще одного монстрячка, то
мы берем самого залежавшегося, меняем ему состояние на
живое, и ставим по другим координатам.

Вот это будет выигрыш в производительности!


 
Аццкий_рыцарь:)   (2006-01-06 15:20) [55]

2Cash ОДНАКО!


 
JUS ©   (2006-01-06 21:27) [56]


> Аццкий_рыцарь:)   (06.01.06 15:20) [55]
> 2Cash ОДНАКО!

ААААА сразу что, не догадался? Чем больше анимированных спрайтов выводиш сразу, тем больше тормоза. Обычные спрайты почти не тормозят. И я тебе говорил, что память надо отчищать, тебе по***.


> Аццкий_рыцарь:)   (06.01.06 02:37) [52]
> 2JUS ААААААААА! Я СОЗДАЛ МАСИВОМ! И, КОГДА Я ВЫВОЖУ ДАЖЕ
> 200 СПРАЙТОВ, ТО ФПС ~ 65 !!! ААА! КАК Я РАД! АА! ПАСИБА!
>

Что такое ААААААААААА ;-(
Всё правильно делаеш(почти). А 65 ФПС, че мало? убавь таймер и ускорь скорость анимации и фпс будет более-менее постоянной. Ваще и 35-ти хватило бы, как минимум.


 
JUS ©   (2006-01-06 21:29) [57]


> Что такое ААААААААААА ;-(
> Всё правильно делаеш(почти). А 65 ФПС, че мало? убавь таймер
> и ускорь скорость анимации и фпс будет более-менее постоянной.
>  Ваще и 35-ти хватило бы, как минимум.

Там чёто еще помоему надо сделать или нет, поправьте если я не прав!


 
Аццкий_рыцарь:)   (2006-01-06 21:43) [58]

2JUS АААААА - это эмоции :)

а у самого спрайта есть канвас? можно на image спрайта рисовать?


 
Аццкий_рыцарь:)   (2006-01-06 22:45) [59]

Вот смотрите, например я хочу чтоб по клику на кнопку поверх имеющегося image спрайта grass рисовалось то, что находится в DXDIB1.DIB:

procedure TForm1.DXDraw1FinalizeSurface(Sender: TObject);
begin
FSurface.Free; FSurface := nil;
end;

procedure TForm1.DXDraw1InitializeSurface(Sender: TObject);
begin
FSurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
end;

procedure TForm1.DXDraw1RestoreSurface(Sender: TObject);
begin
 FSurface.LoadFromGraphic(DXDIB1.DIB);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tgrass(sprite).Image.Draw(form1.DXDraw1.Surface, 100, 100,100 );
end;

и нифига не рисует :(

что тут неравильно?


 
Cash ©   (2006-01-07 09:34) [60]

Аццкий_рыцарь:)   (06.01.06 22:45) [59]:
Ну, есть у тебя кнопка, ну, по клику по кнопке ты на DxDraw рисуешь
(замечу, один раз). Ну наверняк у тебя пр этом таймер работает,
который делает DxDraw.Flip.
Ты просто не успеваешь постмотреть картинку, ее перекрывают.
А если таймера нет, тогда надо по клику кнопки сказать DxDraw
дравнуться и флипнуться. :)


 
JUS ©   (2006-01-07 09:55) [61]


> Аццкий_рыцарь:)   (06.01.06 21:43) [58]
> 2JUS АААААА - это эмоции :)
>
> а у самого спрайта есть канвас? можно на image спрайта рисовать?
>

Можно. У тебя каждый раз прорисовывается спрайт, а твои рисования на спрайте рисуются один раз, ты не успеваеш рассмотреть, т.к. экран опять отчищается и рисует там опять спрайт, а твои рисульки больше не рисуются. Сделай чтоб они рисовались в DXTimer1:

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw.CanDraw then exit;
DXInput.Update;
DXDraw.Surface.Fill(0);
 DXSpriteEngine.Dead;
 DXSpriteEngine.Move(1000);
 DXSpriteEngine.Draw;
 With DXDraw.Surface.Canvas Do
   Begin
     Brush.Style := bsClear;
     Font.Color := clFuchsia;
     Font.Size := 16;
     Textout(10, 50, " FPS: " + inttostr(DXTimer.FrameRate));

<...тут рисуй...>

end;
   Release;
   end;
 DXDraw.Flip;
end;


 
JUS ©   (2006-01-07 10:05) [62]

Если ты хочеш рисовать на канве только лиш из за токо чтоб как ты думаеш сэкономить память не рисуя там спрайт(вместо рисований), то это зря. если спрайт не анимированый, то от него и тормозов практически совсем совсем никаких. и фпс не куда не упадет.

Вот, посмотри мою игру недоделку. там у меня тока в панели состояния 39 спрайтов, 3 из них анимированные.
http://www.webfile.ru/619176


 
Аццкий_рыцарь:)   (2006-01-07 15:46) [63]

ЛЮДИ! вы не очень внимательно прочитали мой последний топ! там я рисовал не на Dxdraw, а именно изменял рисунок своего спрайта, и динамически во время работы игры рисовал В нем а не НА нем. Тоесть, пусть даже поверхность обновляется, но спрайт-то будет рисоваться.  Что можете сказать поэтому поводу?


 
Cash ©   (2006-01-07 19:01) [64]

Аццкий_рыцарь:)   (07.01.06 15:46) [63]:
Ужас!!! Тебя кто этому научил ??? (Я бы этому дяде с большими ушами ...) :)))
Ну зачем такой изврат? Заготовь две картинки. Первую - живого мостра,
вторую - мертвого. Потом, при смерти монстра говори:
"Монстр.Картинка:=Мертвый", а после реанимации:
"Монстр.Картинка:=Живой".
(Не, если охота оставить PixelCheck, то согласен, надо бы рисовать,
но у меня в этой ситуяции родилась другая мысля: "все кадры
распихать по разным картинкам. А вместо анимации по кадрам
делать анимацию по картинкам.")


 
JUS ©   (2006-01-07 20:48) [65]


> Аццкий_рыцарь:)   (07.01.06 15:46) [63]

дааа уж,....эх


 
Аццкий_рыцарь:)   (2006-01-07 23:00) [66]

2Cash и 2Jus ну смотрите, если прорисовывать постояно картинку мертвого монстра в DXтаймере, это нормально с одним монстром... А если монстров 200? то постоянно надо рисовать каждого из них на DxDraw?? это ж склько координат ?!


 
JUS ©   (2006-01-07 23:31) [67]

Координаты выбирай из массива циклом.


 
Аццкий_рыцарь:)   (2006-01-07 23:44) [68]

2Jus кстати, можешь, если не сложно еще раз игру выложить? а то там архив поврежден :(


 
JUS ©   (2006-01-08 00:40) [69]


> архив поврежден :(

быть не может, ты каким раром распаковывал? я паковал, версией 3.20.
а у тебя какая?


 
JUS ©   (2006-01-08 01:10) [70]

Разместил SFX-архив (exe-шный), там точно RAR не нужен:-)
http://www.webfile.ru/732575


 
JUS ©   (2006-01-08 01:11) [71]

Кстати весит он 1.7мб


 
Аццкий_рыцарь:)   (2006-01-08 02:21) [72]

Блин, у меня проблема с инетом :(скорость 800 байт в секунду может завтра станет нормальной...


 
Cash ©   (2006-01-08 09:26) [73]

Аццкий_рыцарь:)   (07.01.06 23:00) [66]:
... монстров 200? то постоянно надо рисовать каждого  ...
Надо надо, если тебе это надо, то надо.
Так, товарищь! У тебя есть куча спрайтов. И DxSpriteEngine.
У тебя есть DxImageList. Картинки монстра в DxImageList
находится, так? Причем, и мертвого, и живого, так?
Монстров ты создаешь, и (наверное) картинку им ставишь в конструкторе,
или после создания уже говоришь:

Monster.Image:=DxImageList.Items.Find("Monster");
?
А что тебе помешает сделать два указателя на картинки для монстра?

Monster.Image:=DxImageList.Items.Find("Monster");
Monster.DeathImage:=DxImageList.Items.Find("DeathMonster");
?
Делаешь у монстра булевский флаг IsLive. И поцедуры DoMove,DoDraw и
DoCollision подчиняешь этому флагу.
(В конструкторе, естественно, флаг надо поднять)

Procedure TMonster.DoMove(MoveCount: Integer);
begin
 if IsLive then begin
   //<Живем и радуемся жизни> :)
 end;
end;

Procedure TMonster.DoDraw;
begin
 if IsLive then Image.Draw(<.....>)
 else DeathImage.Draw(<.......>);
end;

Procedure TMonster.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
 if IsLive then begin
   // <Проверяем столкновения>
 end;
end;


Как результат, тебе не надо никуда ничего рисовать.
Если спрайт мертв, то он не будет анимироваться,
процедуры DoMove и DoCollision будуть просто пролетать.
При этом ты и остальные будут видеть мертвый спрайт.
И когда надо, то не создавать нового, а снова поднять
флаг жизни (IsLive) спрайту и переместить его на новые координаты.

-----------------------------------------------------------------------------
ЗЫ: А если охота, чтоб через некоторое время все действо проходило на
горе трупов монстров, то заготовь одну большую картинку заднего фона,
рисуй на ней спрайт мертвого монстра, и делай BgImage.Restore.
тогда появится картинка мертвого на фоне всех остальных.
(Блин, и как я сразу про Restore не вспомнил, без него изменения на
битмапе недействительны)


 
JUS ©   (2006-01-08 12:02) [74]

Первый раз про Restore слышу. Поподробнее можеш?)


 
Аццкий_рыцарь:)   (2006-01-08 17:48) [75]

Что такое BgImage.restore, и с чеми его едят? О_о


 
Cash ©   (2006-01-08 19:01) [76]

JUS ©   (08.01.06 12:02) [74]:
Увидев этот пост, усомнился, что Restore есть! (для меня это норма)
Поподробнее про Restore:
С англиского я бы перевел, как "Сбросить" или "Обновить".
Есть такая вещь, называется она DxImageList.Items.LoadFromFile("");.
Кто нибудь смтрел внутрь? Там в конце в самом написано Restore;,
то есть Self{DxImageList.Items}.Reastore;! А там внутри написано:
For <bla bla bla> do Items[i].Restore;
То есть просто при загрузке файлика происходит Restore каждому
итему (Item)! А внутри самой этой Restore; всего лишь обновление
данных для вывода в формате DirectDraw; !!!! Если нарисовать
что нибудь и не вызвать Restore, ничего не произойдет!

Аццкий_рыцарь:)   (08.01.06 17:48) [75]:
BgImage - это типа (я же не знаю как это у тебя называется) твой
спрайт, который ты используешь в качестве заднего фона.
Сокращение от BackgroundImage.
Ну а про Restore я уже более или менее "не" :) понятно объяснил.


 
JUS ©   (2006-01-08 21:42) [77]


> Аццкий_рыцарь:)   (07.01.06 23:44) [68]
> 2Jus кстати, можешь, если не сложно еще раз игру выложить?
>  а то там архив поврежден :(

Ну чё скачалась? смотрел?


 
Аццкий_рыцарь:)   (2006-01-09 00:59) [78]

2 ВСЕ :)

когда прорисовываешь постоянно через ДХтаймер то приложение начинает УЖАСНО "углючить" :( фпс где-то 25. А вот если в Image спрайта рисовать... тогда делфи будет пофиг что там, а сам спрайт он без глюков рисует


 
JUS ©   (2006-01-09 01:41) [79]


> Аццкий_рыцарь:)   (09.01.06 00:59) [78]
> 2 ВСЕ :)
>
> когда прорисовываешь постоянно через ДХтаймер то приложение
> начинает УЖАСНО "углючить" :( фпс где-то 25. А вот если
> в Image спрайта рисовать... тогда делфи будет пофиг что
> там, а сам спрайт он без глюков рисует

1.Что такое ВСЕ :) ?
2.Рисовать в спрайте - извращение :)


 
Аццкий_рыцарь:)   (2006-01-09 02:13) [80]

1. Означает что я обращаюсь ко всем тем, кто принимал участие в обсуждении данного топа :)
2. Почему? Кто сказал?


 
Cash ©   (2006-01-09 08:55) [81]

Аццкий_рыцарь:)   (09.01.06 02:13) [80]:
2: Это ни кто не говорил. Но это так есть!
При всем этом, такое ни кто не запрещал!


 
JUS ©   (2006-01-09 10:25) [82]


> Аццкий_рыцарь:)   (09.01.06 02:13) [80]


> 2. Почему? Кто сказал?

Это всё равно что есть суп вилкой:)


 
JUS ©   (2006-01-09 12:43) [83]


> > Аццкий_рыцарь:)   (09.01.06 00:59) [78]
> > 2 ВСЕ :)

А чё значит "2" перед "ВСЕ"?
> Аццкий_рыцарь:)   (07.01.06 23:44) [68]
> 2Jus кстати, можешь, если не сложно еще раз игру выложить?
>  а то там архив поврежден :(


И "2Jus"?


 
JUS ©   (2006-01-09 12:45) [84]

Аццкий_рыцарь:) ты ссылку то посмотрел или нет!? http://www.webfile.ru/732575


 
JUS ©   (2006-01-09 12:48) [85]

Если долго качается можеш на моём "сайте":) скачать, там быстрее.

http://www.sidorov-vadim.narod.ru

Ещё можеш редактор карт скачать и посмотреть скриншоты:)


 
Cash ©   (2006-01-09 14:18) [86]

Аццкий_рыцарь:)   (09.01.06 00:59) [78]:
... когда прорисовываешь постоянно через ДХтаймер то приложение  ...
А DxTimer вообще вещь мерзопакостная и очень нехорошая!
Найди набор Power Draw 3, бери таймер от туда.
Или, если не хоца, могу дать свой аналог для Омеги.
Установишь его (он встанет на закладку Omega), и работай
дальше!


 
Аццкий_рыцарь:)   (2006-01-09 18:44) [87]

1) Игру посмотрел :) прикольно. Внатуре много спрайтов и неглючит. Но, например если играть в мою игру 30 мин, и постоянно валить монстров, то на бекграунде надо будет постоянно  по 2000 монстров , у каждого из которых свои координаты и все остальное :(

2) 2 это типа на английсrом "to" , тоесть если дословно перевести 2Jus - To Jus - Обращаюсь к Jus :)

3) А таймер от омеги имеет все те же функции что и ДелфиХ таймер? и он будет работать так же с DXDraw?

4) Ну смотрите. Зачем мне грузить память постоянно всякими лишними монстрами, создавать трупов, если на рисунке бекграунда можно сразу нарисовать монстра 1 раз и никогда больше к нему не возвращаться?


 
Cash ©   (2006-01-10 09:44) [88]

Аццкий_рыцарь:)   (09.01.06 18:44) [87]:
3) Поправочка, мой таймер к Омеге, родной от Омеги он абсолютно другой.
Мой тоже с DxTimer-ом не родим.
Таймер, этож абсолютно левая штука. Бери хоть из закладки System,
тока он для игр негоден.
Моя переделка таймера очень похожа на PowerTimer из Power Draw 3.
У него нет interval, рисует всегда с макс. скоростью,
есть ProcessFPS, частота в секунду сробатывания события OnProcess,
то есть перемещений. три флага: CanRealTime, CanRender, CanProcess,
и три события к ним OnRealTime (раз в сек.), OmRender (макс. возм. скорость), OnProcess (ProcessFPS раз в сек.)

4) Вот и я про что говорю. Оставь монстров 200 - 250, а трупы бери и рисуй
на бэкграунде.


 
Аццкий_рыцарь:)   (2006-01-10 13:48) [89]

4) А КАК?????? МОЖЕШЬ ПОЛНЫЙ КОД НАПИСАТЬ?


 
Cash ©   (2006-01-10 16:31) [90]

Аццкий_рыцарь:)   (10.01.06 13:48) [89]:
АГА... :))) Щасссс.... :D
Нетужки, это тебе самому придется делать! А то, блин, кайфа никакого
не получишь! ;) Не помоч то, я, помогу. Но по минимуму.

- При создании игры говори:
(при этом я предпологаю, что у монстра есть поля Image и DeathImage)

 i:=0;
 while i < 250 do begin
   With TMonster.Create(DxSpriteEngine.Engine) do begin
     X := <bla bla bla>;
     Y := <bla bla bla>;
     <bla bla bla>
     Image := DxImageList.Items.Find("LiveMonster");
     DeathImage := DxImageList.Items.Find("DeathMonster");
   end;
   inc(i);
 end;


- Добавь монстру флаг жизни (смотри предыдущие помты) и
 сделай методы DoMove, DoDraw и DoCollision Монстра согласно
 этому флагу.

- Добавь монстру "тик таймер" целочисленную переменную,
 которая будет отвечать сколько монстр уже мертв. И в методе
 DoMove, когда монстр мертв (IsLive = false) увеличивай этот
 таймер.

- Если есть прикольная анимация смерти монстра, то пускай при
 смерти он ее прогонет, а на картинке заднего фона нарисуй
 последний кадр этой анимации. Думаю, ты знаешь как это сделать.
 Просто, когда монстр покажет свой последний кадр смерти, делай
 ему Visible:=false и рисуй последний кадр с последующим Restore.
 (Надеюсь, ты уже догадался, что это я бы запихал в DoMove монстра)

- Не делай внешний таймер для добавления монстра. Сделай так, чтобы
 монстр сам воскрешался по прошествии некоторого интервала времени
 (здесь как раз и поможет "тик таймер"). Когда пройдет достаточно
 времени и "тик таймер" отсчитает достаточно тиков, говори монстру
 IsLive := true;, и "тик таймер" сбрасывай в ноль.

Да, кстати! JUS прав. Запиши монстров в масив, и отрисовывай и
перемещай не через DxSpriteEngine.Move и ...Draw, а используя цыкл:

i:=0;
while i < 250 do begin
 if Monsters[i].Visible then begin
   Monsters[i].Move(MoveCount);
   Monsters[i].Draw;
 end;
 inc(i);
end;

Для записи в масив первый листинг можно переделать так:

 i:=0;
 while i < 250 do begin
   Monsters[i] := TMonster.Create(DxSpriteEngine.Engine); // <---=
   With Monsters[i] do begin // <---=
     X := <bla bla bla>;
     Y := <bla bla bla>;
     <bla bla bla>
     Image := DxImageList.Items.Find("LiveMonster");
     DeathImage := DxImageList.Items.Find("DeathMonster");
   end;
   inc(i);
 end;


 
Аццкий_рыцарь:)   (2006-01-10 21:28) [91]

2 Cash я все примерно так и делал,  просто не понимаю что такое Restore:(

это как бы дает понять приложению, что спрайт у которого стоит .restore должен постоянно прорисовываться и неудаляться? тоесть например спрайт монстра уже заново живой, а картинка с мертвым монстром рисуется постоянно на том месте где ты ей один раз задал координаты?


 
Cash ©   (2006-01-11 08:32) [92]

Аццкий_рыцарь:)   (10.01.06 21:28) [91]:
Нет, нет, нет!
Не приложению, а самой картинке, тобиш ее классу.
И не про спрайт, а про нее саму (картинку), про то, что она
как то обновлена.
Сделай так:

DxImageList.Items.Add;
With DxImageList.Items.Items[0] do begin
 // А здесь нарисуй что нибудь прямо на битмап этой картинки
end;


После этих манипуляцый попробуй вывести эту картинку:

DxImageList.Items.Items[0].Draw(0,0,0);


Она не нарисуется, потаму, что ты направил данные только на битмап!
В самой картинке предусмотрено два варианта ее хранения:
- в виде простой и понятной битматрицы,
- в виде текстуры, понятной DirectDraw устройству!!!

На поверхности DxDraw рисуются только текстуры, а не битмапы!
А чтобы перегнать картинку из битматрицы в текстуру надо сказать:

DxImageList.Items.Items[0].Restore;


Тем самым, когда Монстр проигрывает свой последний кадр анимации
и, вроде, должен застыть в этом кадре, ты ему говориш:

 if AnimPos = AnimCount then begin
   Visible := false;
   // А здесь бери, и рисуй прямо на картинку заднего фона
   // потом вызови у Restore у заднего фона, и новоотрисованное
   // изображение обновится и на текстуре.
   // А Visible ставим в false, чтоб монстр больше не отрисовывался.
 end;


 
Аццкий_рыцарь:)   (2006-01-11 22:27) [93]

Счас попробую...


 
Аццкий_рыцарь:)   (2006-01-11 23:06) [94]

вот смотри, допустим у меня спрайт-бэкграун это DxImageList1.Items.Items[2], в DXDib1.dib есть картинка мертвого монстра

мне надо нарисовать картинку DXDib1.dib поверх бэкграунда  DxImageList1.Items.Items[2] по нажатие кнопки Button1:


procedure TForm1.Button1Click(Sender: TObject);
begin
DxImageList1.Items.Add;
With DxImageList1.Items.Items[2] do begin
picture.Bitmap.Canvas.Draw(2,2,dxdib1.DIB);
end;

DxImageList1.Items.Items[2].Restore;

end;
что я не так сделал?


 
Cash ©   (2006-01-12 07:57) [95]

Аццкий_рыцарь:)   (11.01.06 23:06) [94]:
Ты что все с DxDIB извращаешься.
Для уменьшения дальности переходов по адресам я бы порекомендовал
захватить битматрицу картинки заднего фона.

var
 P: TBitMap;
begin
 P := BgImage.Picture.BitMap;
 // а потом можно рисовать на P

Если тебе охота попробовать сначала на пустом примере, то перед тем
как что то рисовать надо задать новые размеры битматрицы (Width, Height).
Потом надо задать PatternWidth и PatternHeight. А потом нарисовать и
вызвать Restore.
А если это прямо в игре не срабатывает, на той картинке, которую
ты выводишь на заднем фоне, то я просто не знаю.

 Q:
Слушай Аццкий_рыцарь:), а ты просто, на только что созданый битмап
картинку вывести могешь, примерно так:

var
 P: TBitMap;
begin
 P := TBitMap.Create;
 // Подготовь битмап и нарисуй на нем хыть прямоугольник
 // А потом сделай это.
 Form1.Canvas.CopyRect(P.Canvas.ClipRect,P.Canvas,P.Canvas.ClipRect);
 P.Free;
end;

И чтоб после этих манипуляцый на форме появилось нарисованное тобой
изображение???


 
Аццкий_рыцарь:)   (2006-01-12 15:08) [96]

Например та же ситуация с кнопкй, чтоб она рисовала DxDib на ImageList1.items.Item[2]...

Вот так что ли?



procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin
P := TBitMap.Create;

P:= DxImageList1.Items.Items[2].Picture.bitmap;
DxImageList1.Items.Add;
With DxImageList1.Items.Items[2] do begin
Form1.Canvas.CopyRect(P.Canvas.ClipRect,P.Canvas,P.Canvas.ClipRect);

p.Canvas.Draw(2,2,dxdib1.DIB);

end;

DxImageList1.Items.Items[2].Restore;

end;



че-то когда нажимаешь кнопку, то спрайт бэкграунда просто пропадает :(

блин я че-то недопонимаю. мне так обидно за это, что хочу биться головой об стенку :((


 
Cash ©   (2006-01-12 16:51) [97]

Аццкий_рыцарь:)   (12.01.06 15:08) [96]:
Не, биться об стенку незачем...., н-ну-у-у-у...., если угодно ремонт устроить... :D :D :D

Так, давай начнем с простого.
Бери Пустую форму, ставь на нее кнопку. В событии клика пиши:

var
 P: TBitMap;
begin
 P := TBitMap.Create;
 with P do begin
   Canvas.Brush.Color := clBlack;
   Canvas.Pen.Color := clRed;
   Canvas.RectAngle(5,5,95,115);
 end;
 Canvas.CopyRect(Bounds(50,50,P.Width,P.Height),P.Canvas,P.Canvas.ClipRect);
 P.Free;
end;

Как видишь по клику кнопки производится рисование на канву формы,
но не просто так, а через буфер, т. е. через битматрицу.
На форме должен появиться белый прямоугольник, внутри которого
черный квадрат с красной границей.

После компиляции, по нажатию на кнопку ничего не происходит.
Тебе вопрос: Почему?

(я пойду от простого к сложному, тогда тебе должно стать все понятно)


 
Аццкий_рыцарь:)   (2006-01-12 23:44) [98]

ээээ я непонимаю что такое CopyRect, из названия видно, что это надо копировать какой-то прямоугольник... А с чего копировать?


 
antonn ©   (2006-01-13 06:47) [99]

Cash ©   (12.01.06 16:51) [97]
т. е. через битматрицу.

ухх... :)

Аццкий_рыцарь:)   (12.01.06 23:44) [98]

Canvas.CopyRect(Bounds(50,50,P.Width,P.Height),P.Canvas,P.Canvas.ClipRect);
синим на что копировать, и в какой прямоугольник, черным откуда и из какого прямоугольника.


 
Cash ©   (2006-01-13 11:31) [100]

Аццкий_рыцарь:)   (12.01.06 23:44) [98]:
Вот из этого становится ясно, что с оборотом графики в Delphi
ты не сильно хорошо знаком. :(

TCanvas.CopyRect(DestRect: TRect; Src: TCanvas; SrcRect: TRect);
Эта процедура копирует часть канвы исходника Src, описанную
рамкой SrcRect, и вписывает эту часть в прямоугольник DestRect
собственной канвы.

Применительно к примеру [97] процедура несет смысл:
"Берем весь буфер, копируем и вставляем его по координатам [50,50]
канвы формы".

На форму это изображение не выводится потаму, что при создании буфер
не были указаны его ширина и высота. Сделай пример [97] в живую,
напиши его на Delphi. Посмотри, что это действительно так. Потом найди
некоторые сходства с проблемой в игре, они есть (даю 250% гарантии).
Потом откоректируй пример, примерно так:

... // здесь тпа var..., begin..., все рядом
 with P do begin
  Width := 100;
  Height := 150;
  Canvas.Brush.Color := clBlack;
  Canvas.Pen.Color := clRed;
  Canvas.RectAngle(5,5,95,115);
end;
... // а там все остальное

Потом запусти отредактированный пример, и посматри на выведенную
картинку (она выведется на 255%, если ты все правильно сделаешь).
Проанализировав этот пример и полученный опыт, тебе должно стать ясно,
где именно ты сделал ошибку.


 
Cash ©   (2006-01-13 11:38) [101]

А вот еще вопрос:
Ты задний фон создаешь через TBackgroundSprite?
Если нет, то попробуй.
Если да, то:
 С какими параметрами ты вызываешь SetMapSize?


 
Аццкий_рыцарь:)   (2006-01-14 00:49) [102]

О! ВОТ НАД ЧЕМ Я БЪЮСЬ! я не могу разобраться что за setmapsize и как работать с TBackgroundSprite :( Расскажи плиз про него немного, если можешь :)


 
Cash ©   (2006-01-14 11:13) [103]

[102]:
А чёб и не рассказать!!! ;)

TBackgroundSprite - класс еще раз подтверждающий крутизну этого
японского психа.
(на его сайте была фотка: козлиная бородка, бегающие глазки, очечки
дурацкие, псих одним словом :D )
Это класс заднего фона игры, в основном в нем используются следующие поля:
- X,Y: конечно положение по осям левого верхего края карты.
- Chips: масив из целых чисел, индексов картинки.
- Image: сама картинка
- MapWidth: длина векторов по X в масиве Chips.
(мутно написал, правда :), проще - это ширина масива Chips)
- MapHeight: высота масива Chips.

Сам масив Chips - это и есть вся карта.
Задать высоту и ширину этого масива можно вызвав SetMapSize(AMapWidth, AMapHeight: Integer).

Тогда карта становится такой:

SetMapSize(4,10);
+---+---+---+---+---+
|0,0|0,1|0,2|0,3|0,4|
+---+---+---+---+---+
|1,0|1,1|1,2|1,3|1,4|
+---+---+---+---+---+
|...|...|...|...|
+---+---+---+---+---+
|0,9|1,9|2,9|3,9|4,9|
+---+---+---+---+---+

И обращаться к этим элементам можно как:
<...>.Chips[x,y] := <...>;// where (0 <= x <= MapWidth) & (0 <= y <= MapHeight)

Так вот, в твоем случае (тебе же хочется рисовать на поверхности заднего
фона), SetMapSize надо вызывать с параметрами 1,1!!!
То есть твоя карта состоит из 1 элемента. При всем этом тебе понадобится
заготовить картинку заднего фона размером с экран (640х480; 800х600; ...)!
Только тогда можно будет рисовать на картинке заднего фона по нужным
координатам (ну не то чтобы можно, оно можно всегда, но тыж видел что
бывает :))) ).


 
Cash ©   (2006-01-14 11:16) [104]

Вечно я с этими примерами путаю! :)

SetMapSize(5,10);
+---+---+---+---+---+
|0,0|0,1|0,2|0,3|0,4|
+---+---+---+---+---+
|1,0|1,1|1,2|1,3|1,4|
+---+---+---+---+---+
|...|...|...|...|...|
+---+---+---+---+---+
|9,0|9,1|9,2|9,3|9,4|
+---+---+---+---+---+

Вот, так правильнее.


 
Аццкий_рыцарь:)   (2006-01-14 16:29) [105]

а класс бэкграунда так объявлять?:

type
 Tgrass = class(TBackgroundSprite)
  protected
  end;

а потом



procedure TForm1.FormCreate(Sender: TObject);

begin

with Tgrass.Create(Dxspriteengine1.Engine) do
begin
setmapsize(1,1)
x:=0;
y:=0;
image:=form1.dxImageList1.Items.Find("trava");
end;

end;



 
Cash ©   (2006-01-14 16:44) [106]

Да ну..., на кой тебе класс наследовать????
Бери прямо объект от класса TBackGroundSprite.


 
Аццкий_рыцарь:)   (2006-01-14 17:19) [107]

Это как? О_о


 
Cash ©   (2006-01-14 17:32) [108]

Аццкий_рыцарь:)   (14.01.06 17:19) [107]:
:D :D :D :D :D :D :D :D :D :D :D :D :D :D :D
Ну даешь!!!! :)


var
 BgImage: TBackgroundSprite;


И Все!!! :D :D :D :D


 
Аццкий_рыцарь:)   (2006-01-14 23:23) [109]

О! рисует на бэкграунде ! :)



procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin

p:= form1.DXImageList1.Items.Items[3].Picture.bitmap;

 with P do begin
 Width := 77;
 Height := 77;
 Canvas.Brush.Color := clBlack;
 Canvas.Pen.Color := clRed;

canvas.Draw(0,0,dxdib1.DIB);
 end;

 form1.DXImageList1.Items.Items[3].Restore;

end;



только оно стирает полностью всю картинку бэкграунда, и рисует туда мертвого монстра :( а надо чтоб рисовало просто поверх. Как это сделать?


 
Аццкий_рыцарь:)   (2006-01-15 00:41) [110]

и еще...

мне надо чтоб фон у картинки был прозрачным, но у dxdib есть только transparent, a transparent color нету :( я пытался вместо canvas.Draw(0,0,dxdib1.DIB) ставить canvas.Draw(0,0,form1.DXImageList1.Items.Items[4].Picture.bitmap)  (в DXImageList1.Items.Items[4] я посавил такую же картинку как и в dib1 ) но рисуется вместо монстра белый квадра :( блин !что тут не так?


 
antonn ©   (2006-01-15 06:10) [111]

если нужно скопировать битмап на битмап(не на канвас) с "прозрачным цветом", могу дать процедурку, она побыстрее, чем canvas.Draw()


 
Cash ©   (2006-01-15 09:15) [112]

Аццкий_рыцарь:)   (14.01.06 23:23) [109]:
ыыыыы.... :)))
Конечно рисует, но вот зря ты бэкграунду размеры меняешь!
Их же менять надо, когда утебя картинка новая.
А на бэкграунде у тебя уже есть картинка, и должна она,
по моему, быть большой. И размеры бэкграунда вроде должны
быть под размер экрана.

antonn ©   (15.01.06 06:10) [111]:
Выкладывай!
Хотя... есть BrushCopy. Аццкий_рыцарь:), посмотри в хелпе по этой
процедуре.
TCanvas.BrushCopy(<...>)

Аццкий_рыцарь:)   (15.01.06 00:41) [110]:
Не майся ты с DxDIB, это лаг. делай все манипуляции из буфера-битмапа.
Этож проще, и я показал уже как.

Еще одно замечание: зачем тебе form1 в обработчике класса TForm1???
Если ты создашь два объекта класса TForm1, то они не будут работать!
Потаму, что ты обращаешся не к свойствам класса, а к свойствам внешнего
объекта этого класса. Проше говоря, все законы действуют только для
Form1: TForm1.
Обращайся напрямую из обработчика к свойствам класса, или, если не
помниш что да как то, используй Self для переходов по адресам.


procedure TForm1.Button1Click(Sender: TObject);
var P: TBITMAP;
begin
 p:= DXImageList1.Items.Items[3].Picture.bitmap; /// Look here
 with P do begin
   Width := 77;
   Height := 77;
   Canvas.Brush.Color := clBlack;
   Canvas.Pen.Color := clRed;
   canvas.Draw(0,0,dxdib1.DIB);
 end;
 Self.DXImageList1.Items.Items[3].Restore; /// Look here
end;


 
antonn ©   (2006-01-15 09:39) [113]

Cash ©   (15.01.06 9:15) [112]
Хотя... есть BrushCopy.

забудь о BrushCopy:) А о Canvas.Draw() так тем более:))) Это же тормоза страшенные будут.
может я неправильно ее использовал, но у меня, при clblack "прозрачном цвете", битмап копировался с белым фоном. Единственное преимущество у этой функции - она может менять размер "выводного" битмапа, растягивая его, нпмр.
Вот, в 3,5 раза быстрее, чем BrushCopy(замерял через QueryPerformanceCounter после 1000 копирований битмапа 128х128):
_B_in - копируемый битмап,
_B_out - на который копируем,
_x,_y - координаты копирования копируемого (гы-гы-гы) битмапа,
trColor - прозрачный цвет.
procedure CopyTransparentBrush(var _B_in,_B_out:Tbitmap; _x,_y:integer; trColor:Tcolor);
const
 Pixels = MaxInt div SizeOf(TRGBTriple);
type
 PRGBArray = ^TRGBArray;
 TRGBArray = array[0..Pixels-1] of TRGBTriple;
var x, y, x_cor,y_cor,x_corS,y_corS: Integer; RowOut,RowIn: PRGBArray;
   rc1, bc1, gc1:byte;
begin
if (_x)>_B_out.Width-1 then exit; if (_x+_B_out.Width)<0 then exit;
if (_y)>_B_out.Height-1 then exit; if (_y+_B_out.Height)<0 then exit;
 _B_in.PixelFormat:=pf24bit; //убрать, если изначально этот формат
 _B_out.PixelFormat:=pf24bit;  //убрать, если изначально этот формат
 if _x<0 then x_corS:=abs(_x) else x_corS:=0;
 if _y<0 then y_corS:=abs(_y) else y_corS:=0;
 if (_x+_B_in.Width)>_B_out.Width then x_cor:=_x+_B_in.Width-_B_out.Width else x_cor:=0;
 if (_y+_B_in.Height)>_B_out.Height then y_cor:=_y+_B_in.Height-_B_out.Height else y_cor:=0;
 rc1:=GetRValue(trColor); gc1:=GetGValue(trColor); bc1:=GetBValue(trColor);
 for y:=y_corS to _B_in.Height-1-y_cor do begin
    RowOut:= _B_out.ScanLine[y+_y];
    RowIn:= _B_in.ScanLine[y];
   for x:=x_corS to _B_in.Width-1-x_cor do
    if not((RowIn[x].rgbtRed=rc1)and(RowIn[x].rgbtGreen=gc1)and(RowIn[x].rgbtBlue=bc1)) then begin
         RowOut[x+_x]:=RowIn[x];
   end;
 end
end;


 
antonn ©   (2006-01-15 09:40) [114]

да, забыл сказать:
канвас - рулез!

:)


 
Cash ©   (2006-01-15 10:44) [115]

antonn ©   (15.01.06 09:40) [114]:
Whaaatsuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuup!!!!! :)))

antonn ©   (15.01.06 09:39) [113]:
Эту процедуру сам писал? Форматирование текста ужасное. :)
Переформатировав под сбя понял, что, наверное, ты всетаки
неправильно использовал BrushCopy.
Двойной, вложеный for это самоубийство в плане быстродействия.
А в другом, пока я прознал про BrushCopy, делел именно так! ;)
(только с заменой for на while)


 
Аццкий_рыцарь:)   (2006-01-15 11:10) [116]

antonn

УЖОС! :) я пока разберусь с твоей процедурой, то мои волсы станут седые :)

Cash

так как работает BrashCopy? и как сделать чтоб фон картинки мертвого монстра был прозрачным? и где ты показывал как записать битмап в буфер? :)


 
Cash ©   (2006-01-15 11:31) [117]

Аццкий_рыцарь:)   (15.01.06 11:10) [116]:
Самое главное в нашем деле - не торопиться.
Торопишся, внимательнее изучай изложенную здесь информацию!
Пример из [97] и далее. Переделай его под себя.

Слушай, а мож я тебе дам русскую справку по Делфе,
недоделанная и для D4, но тебе поможет.
У меня еще есть англиская - по DelphiX, если шариш в
буржуйском, там все понятнее понятного написано.


 
antonn ©   (2006-01-15 11:54) [118]

Cash ©   (15.01.06 10:44) [115]
Эту процедуру сам писал?

угу:)
могу еще ужаснее показать:
http://kladovka.net.ru/index.cgi?pid=list&rid=252

> Форматирование текста ужасное.

я старался:)))
у меня поле с кодом не такое большое, чтобы размашисто писать, поэтому я привык писать сжато, мне то понятно:)

> Двойной, вложеный for это самоубийство в плане
>быстродействия.
> А в другом, пока я прознал про BrushCopy, делел именно
>так! ;)
> (только с заменой for на while)

это самоубийсво работает быстрее, у меня по крайней мере:)

Аццкий_рыцарь:)   (15.01.06 11:10) [116]
УЖОС! :) я пока разберусь с твоей процедурой, то мои волсы станут седые :)

:]

В общем так я сравнивал:
на форме 2 Timage, в одном картинка 128х128 с черным "прозрачным цветом", на другом другая картинка (около 300х200). Делал 3 вызова нижеприведенного кода, из них брал усредненное. Сначала с BrushCopy, потом CopyTransparentBrush (только без var в передаче параметров).

var
Divisor:Int64; T1:Int64; i,X,ii:integer; TotalTime :Extended; iii:integer;
begin
if QueryPerformanceFrequency(Divisor) then
begin
   QueryPerformanceCounter(T1);
   TotalTime := T1;

  for iii:=0 to 199 do
  // Image2.Picture.Bitmap.Canvas.BrushCopy( rect(0,0,Image1.Width,Image1.Height),Image1.Picture.Bitmap,rect(0,0,Image1.Width,Image1.Height),clblack ); //0.142
   CopyTransparentBrush( Image1.Picture.Bitmap,Image2.Picture.Bitmap,10,20,clblack ); //0,041
 
   QueryPerformanceCounter(T1);
   TotalTime:=(T1-TotalTime)/Divisor;
   caption:=floattostr(TotalTime);
end;


где я неправильно испрользовал BrushCopy?


 
Cash ©   (2006-01-15 13:47) [119]

antonn ©   (15.01.06 11:54) [118]:
... я старался:))) ...
Видел бы ты мой первый метод выравнивания текста.
Я щас этого прочитать не могу. Даже переформатировать на новый лад! :)

... где я неправильно испрользовал BrushCopy? ...
Ну, а как можно ошибиться в одной процедуре? Все вроде нормально,
но тыж говорил о нарушении цвета (про белый фон). Я это имел в виду.


 
antonn ©   (2006-01-15 13:55) [120]

Cash ©   (15.01.06 13:47) [119]
Ну, а как можно ошибиться в одной процедуре? Все вроде нормально,
но тыж говорил о нарушении цвета (про белый фон). Я это имел в виду.

вот после приведенного кода (даже без цикла), вместо "прозрачного цвета" - белый фон.


 
Cash ©   (2006-01-15 15:18) [121]

Хм-м-м-м, BrushCopy копирует часть канвы с заменой указанного цвета.
Она не предпологает прозрачности, но помоему, ее можно реализовать
используя в качестве цвета-заменителя clNone.
Я не уверен только.


 
antonn ©   (2006-01-15 16:09) [122]

Cash ©   (15.01.06 15:18) [121]
короче мне лень было эксперементировать, все равно мой код быстрее:)


 
antonn ©   (2006-01-15 16:14) [123]

хо-хо-хо, я выставил св-во браша канваса "приемника" в bsclear, и копирование стало "прозрачным", но и тормознутей:) теперь мой код в 4,39 раза быстрее:)))


 
Cash ©   (2006-01-15 16:35) [124]

antonn ©   (15.01.06 16:09) [122]:
Лады. уболтал... :)))

antonn ©   (15.01.06 16:14) [123]:
Прикольно. 8)

Тык шта Аццкий_рыцарь:), антохину процедуру на вооружение и
дай мыло, я туда флудону двумя хелп-файлами. :)))


 
Cash ©   (2006-01-15 16:48) [125]

А с другой стороны...., зачем мыло, на Help для DelphiX качай с WebFile:
http://webfile.ru/747112


 
Аццкий_рыцарь:)   (2006-01-16 09:08) [126]

2Cash та у мну две книги по делфе:) одна 4 см толщиной, другая 6, но там как всегда нифига нужного нет :( Если можешь то кинь русскую справку, а то с буржуями не сильно дружу


 
Cash ©   (2006-01-16 14:52) [127]

Аццкий_рыцарь:)   (16.01.06 09:08) [126]:
А зря! ;)
Сразу проглядываюся пробклы знаний от недочитанной (или недопонятой)
родной дельфийской справки! :) (эка я завернул :D )
Русский хелп весит 1.4 мега. Я попробую, но гарантировать не смогу.

В близжайшее время дам еще одну ссылку с webfile.


 
Аццкий_рыцарь:)   (2006-01-17 16:38) [128]

Извените, конечно за оффтоп... Но мне стало смешно, когда я посмотрев вновь на свою тему, и прочитав заново все посты тут :) начинали с Collision, а тут уже и канвас попер вовсю, и чего только нет! :)))  

Надобно бы модерам переименовать тему как -то типа : "обсуждение написания аркад" :)))


 
antonn ©   (2006-01-17 17:05) [129]

ненадо ничего менять, канвас рулит:)
а вообще, нормальная ветка, почти по существу:)))


 
Аццкий_рыцарь:)   (2006-01-17 17:18) [130]

Эту ветку можно скопировать в блокнот и назвать FAQ по DelphiX :)


 
antonn ©   (2006-01-17 17:21) [131]

зачем в блокнот, можно в хтмл, там форматирование лучше (а вообще у меня в клиенте она, поэтому пофиг:))


 
Аццкий_рыцарь:)   (2006-01-17 23:49) [132]

ээээ давайте вернемся к нашим (вернее моим) баранам :) что нужно писать в brushcopy??? вот что пишется про него :
canvas.brushcopy(const Dest : TRect; Bitmap : TBitmap ; const source : TRect; color: TColor );

1) const Dest : TRect - (Dest мне кажется это от английского "Destination", тоесть "пункт назначения") наверное сдесь надо показать в какой прямоугольник копировать, но почему-то, когда я там пишу form1.DXImageList1.Items.Items[3].Picture.bitmap (это бекграунд), то пишет:[Error] Unit1.pas(240): Incompatible types: "TRect" and "TBitmap" . а как мне превратить TBitmap B TRect ??

2) Bitmap: TBitmap - это я ваще непонимаю что такое О_о

3) const source: TRect - ( "source" это на буржуйском "источник") это наверное типа в какой прямоугольник копировать всю бадягу, но пишет тоже что типы несовместимы :( тоже незнаю как превратить TBitmap B TRect :(

4) color: TColor - ну, я кажись понял, что это transparent color

снова прошу вашей помощи :)


 
Аццкий_рыцарь:)   (2006-01-18 00:39) [133]

Вот что у меня вышло (вернее не вышло) :

DXImageList1.Items.Items[4].Picture.bitmap - монстр
DXImageList1.Items.Items[3].Picture.bitmap - бэкграунд



procedure TForm1.Button1Click(Sender: TObject);
var P,a: TBITMAP;
begin

a:= DXImageList1.Items.Items[4].Picture.bitmap;

p:= DXImageList1.Items.Items[3].Picture.bitmap;

 with P do begin
 Width := 77;
 Height := 77;
 Canvas.Brush.Color := clBlack;
 Canvas.Pen.Color := clRed;

canvas.BrushCopy(p.Canvas.ClipRect,a,a.Canvas.ClipRect,clWhite );

 end;
 form1.DXImageList1.Items.Items[4].Restore;
 form1.DXImageList1.Items.Items[3].Restore;

end;



когда нажимаю кнопку, то бэкграунд исчезает, а в левом верхнем углу появляется квадрат 77 х 77 белого света (это не тот белый что я выставил в Brush Copy, там хоть какой не напиши всеравно белым стает)

что я тут не так делаю? пробовал убырать строку form1.DXImageList1.Items.Items[4].Restore; - ВАЩЕ НИКАКОГО ЭФФЕКТА :(


 
antonn ©   (2006-01-18 05:33) [134]

Аццкий_рыцарь:)   (18.01.06 0:39) [133]
что я выставил в Brush Copy, там хоть какой не напиши всеравно белым стает)

перед отрисовкой делай у нужного канваса canvas.brush.style:=bsclear;


 
Аццкий_рыцарь:)   (2006-01-18 09:55) [135]

canvas.brush.style:=bsclear;

непомогло :(

я, конечно, понимаю что канвас рулит, но меня он скоро до смерти зарулит :)


 
Cash ©   (2006-01-18 10:30) [136]

Аццкий_рыцарь:)   (18.01.06 09:55) [135]:
А ты у бэкграунда выставил этот атрибут?
В [123] (проикольный номер 8)) antonn написал, что поставил его у
приемника (у бэкграунда тобиш).


 
Cash ©   (2006-01-18 11:04) [137]

Аццкий_рыцарь:)   (18.01.06 00:39) [133]:
ы-ы-ы-ы-ы-ы-ы-ы-ы-ы... :)))
Что я тут увидел.... :)

...vas.BrushCopy(p.Canvas.ClipRect,a,a.Canvas.ClipRect,clWhite );

Практически ты заменяешь весь бэкграунд на картинку из "a"!

...opy(p.Canvas.ClipRect,a...
Это не верно, тебе надо взять так:
Bounds(x,y,a.Width,a.Height)

Это означает, что ты вставляешь картинку с исходными размерами и по
координатам X и Y.

После этой замены должен появляться белый прямоугольник по тем самым
координатам.

гы-гы-гы-гы-гы-гы-гы..., а что я еще увидел!!! 8)

with P do begin
 Width := 77;
 Height := 77;
 Canvas.Brush.Color := clBlack;
 Canvas.Pen.Color := clRed;
 canvas.BrushCopy(p.Canvas.ClipRect,a,a.Canvas.ClipRect,clWhite );
end;

Это ты чтож делаешь то??? 8)
- Береш свой бэкграунд, и внаглую меняешь ему размеры! 8)
Именно по этому бэкграунд у тебя и становится размером 77х77.
У тебяж картинка бэкграунда есть, и рисуется! Дак оставь ее размеры
в покое (Тобиш, картинка уже инициализирована и второй раз это
делать уже не стоит, графику потеряешь)! :)
А вот насчет кисти и ручки - цвета им лучше поставить в clNone,
чтоб лишних всяких штучек не рисовать.

Посмотри сюда:

procedure TForm1.Button1Click(Sender: TObject);
var
 P,a: TBITMAP;
 tc: TColor; // <---=
 br: TRect; // <---=
begin
 a:= DXImageList1.Items.Items[4].Picture.bitmap;
 p:= DXImageList1.Items.Items[3].Picture.bitmap;
 tc := DXImageList1.Items.Items[4].TransparentColor; // <---=
 br := Bounds(82,50,a.Width,a.Height); // <---=
 with P do begin
   Canvas.Brush.Color := clNone; // <---=
   Canvas.Pen.Color := clNone; // <---=
   Canvas.Brush.Style:=bsClear; // <---=
   Canvas.BrushCopy(br,a,a.Canvas.ClipRect,tc); // <---=
 end;
 form1.DXImageList1.Items.Items[3].Restore; // <---=
end;


Символом  // <---= я показал, что я изменил.

(Вот если бы товарищи дизайнеры форума поставилиб тегу code шрифт
"Courier New" с 10-м размером, я думаю код выглядел бы более внятно.)


 
Аццкий_рыцарь:)   (2006-01-18 11:18) [138]

Я вставил твой код и после нажатия на кнопку фон просто пропадает и стает черным  :((


 
Cash ©   (2006-01-18 13:17) [139]

Аццкий_рыцарь:)   (18.01.06 11:18) [138]:
А-а-а-а-а-Р-р-р-р-р-р-р-р-р-р-р-р.... Как же я всетаки ненавижу
DephiX! Блин, ну какой нормальный человек будет орудовать с объектом
TGraphic???! Там же все через эту самую .... TGraphics и делается!
8( 8( 8( 8(
Вот, что мне удалось поправить, выводит на 100%!

procedure TForm1.Button1Click(Sender: TObject);
var
 p,a: TBitMap; //два буфера - бэк и то, что на бэк выводится
 r: TGraphic; // руки бы ему оторвать - это то, куда рисовать будем
 t: TColor; // цвет, которые прозрачный для "a" картинки
 b: TRect; // рамка, куда будем рисовать
begin
 p := TBitMap.Create;
 a := TBitMap.Create;
 r := DXImageList.Items.Items[0].Picture.Graphic; // определяем, куда потом рисовать
 // Задаем размеры буферов (опашливать не сметь! :))
 p.Width := r.Width;
 p.Height := r.Height;
 p.Canvas.Draw(0,0,r);
 with a do begin
   Width := DXImageList.Items.Items[1].Picture.Graphic.Width;
   Height := DXImageList.Items.Items[1].Picture.Graphic.Height;
   Canvas.Draw(0,0,DXImageList.Items.Items[1].Picture.Graphic);
 end;
 // узнаем, какой цвет у нас - transparent
 t := DXImageList.Items.Items[1].TransparentColor;
 // делаем рамочку, куда рисовать
 b := bounds(10,10,32,32);
 // говорим, что transparent будет не рисоваться
 with p.Canvas do begin
   Brush.Style := bsClear;
 end;
 // и наконец, рисуем картинку
 p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
 // после чего, передаем ее в результат
 r.Assign(p);
 // и обновляем текстуру
 DXImageList.Items.Items[0].Restore;
 // надо не забыть уничтожить буферы
 a.Free;
 p.Free;
end;


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


 
Cash ©   (2006-01-18 13:24) [140]

Забыл!!!
Найди те места, где задаются размеры картинок и поправь их для себя.
Первое - это там, где задается b - рамка, куда рисовать.
Второе - смени индексы картинок в DXImageList,
с моих (0 - бэкграунд, 1 - труп) на свои.


 
Аццкий_рыцарь:)   (2006-01-18 13:24) [141]

я, конечно не любитль copy->paste :) но этот код у меня нет желания сидеть и разбирать :)) так что... copy->paste->смотрим, что вышло :)


 
Cash ©   (2006-01-18 13:26) [142]

Cash ©   (18.01.06 13:24) [140]
Аццкий_рыцарь:)   (18.01.06 13:24) [141]

Они бы еще сотые доли выводилиб!
:D :D :D :D :D :D :D :D :D :D :D :D :D


 
Аццкий_рыцарь:)   (2006-01-18 13:30) [143]

О! рисует, сволочь :)

но, блин, внатуре, тормозит :(

а нельзя что б без тормозов? ты вспомни про битву за производительность выше в этой теме :)

вообще-то, когда я рисовал из dxDIB, то там графа хранится в как TGraphic...

можно как-то с этим сделать и чтоб без глюков?


 
Cash ©   (2006-01-18 13:34) [144]

Аццкий_рыцарь:)   (18.01.06 13:30) [143]:
А ты что, на каждом кадре ее вызываешь???? *)
Эта вещь вызываться должна только один раз, только тогда,
когда приспичило чёнить порисовать на бэк-е.


 
Аццкий_рыцарь:)   (2006-01-18 13:36) [145]

Так я ж хочу, чтоб мертвого монстра там прорисовать :)
а когда их толпа умирает... :(


 
Cash ©   (2006-01-18 13:43) [146]

Аццкий_рыцарь:)   (18.01.06 13:36) [145]:
А я тебе давно уже говорил, типа монстряк твой кгда умирая отрисовывает
свой последний кадр. Тебе на этот случай надо поставить условие, мол
если у монстра AnimIndex равен AnimCount тогда монстру Visible в false и
запустить эту процедуру для отрисовки этого монстра по его координатам.
Только один раз!!! за смерть одного монстра, иначе тормазить будеееет!!!
Толпа сдохнет, да тормоза будут, но это должно быть не слишком долго.
Кадр или два, потом FPS восстанавливается.


 
Аццкий_рыцарь:)   (2006-01-18 13:48) [147]

я так и сделал :) все, тормозов нет :) БОЛЬШОЕ СПАСИБО Cash and antonn :)
сколько раз я вам говорил спасибо ? :) аа, ща буду в игру воплощать это все! седня че-то прорвало писать её :))))


 
Cash ©   (2006-01-18 13:51) [148]

Аццкий_рыцарь:)   (18.01.06 13:48) [147]:
А... я уже и со счета сбился :)))
Если вопросы будут, задавай!


 
Аццкий_рыцарь:)   (2006-01-18 13:53) [149]

ЕЩЕ БУДУТ! :)


 
Аццкий_рыцарь:)   (2006-01-18 14:31) [150]

Вот блин. Я когда поставил в игру, то при убийстве монстра все замедляется, а потом снова идет как и шло нормально :( Что тут можно сделать?


 
Cash ©   (2006-01-18 18:29) [151]

Аццкий_рыцарь:)   (18.01.06 14:31) [150]:
Покажи, место, где обрабатывается анимация смерти и еще - где
осуществляется вызов процедурки этой.


 
Аццкий_рыцарь:)   (2006-01-18 19:21) [152]


// типа, это процедура когда монстр получает повреждения
procedure Tkozel.hit;
var
p,a: TBitMap;
r: TGraphic;
t: TColor;
b: TRect;
xpos,ypos: integer;
begin

xpos:=round(x);
ypos:=round(y);

 AnimCount := Image.PatternCount;
       AnimLooped := false;              
       AnimSpeed := 15 / 1000;
   z:=1 ;
Image := form1.dxImageList3.Items.Find("mdead");
if movego=true then
begin

p := TBitMap.Create;
a := TBitMap.Create;
r := form1.DXImageList1.Items.Items[9].Picture.Graphic;
p.Width := r.Width;
p.Height := r.Height;
p.Canvas.Draw(0,0,r);
with a do begin
  Width := form1.DXImageList3.Items.Items[9].Picture.Graphic.Width;
  Height := form1.DXImageList3.Items.Items[9].Picture.Graphic.Height;
  Canvas.Draw(0,0,form1.DXImageList3.Items.Items[9].Picture.Graphic);
end;

t := form1.DXImageList3.Items.Items[9].TransparentColor;
 b := bounds(xpos,ypos,77,77);

with p.Canvas do begin
  Brush.Style := bsClear;
end;
 p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
r.Assign(p);
 form1.DXImageList1.Items.Items[9].Restore;

a.Free;
p.Free;

x:=-50000;
y:=-50000;

animlooped:=true;
movego:=true;
end;

 end;

ну, а это, когда  файрбол сталкивается с монстром

procedure Tfireball.DoCollision(Sprite: TSprite; var Done: Boolean);

 var pos :integer;
 begin
  if Sprite is Tkozel then   // see"s if what the bullet collided with was an enemy
   begin

   if (x+15>sprite.x+40)and (x+15<sprite.x+70) then
   begin
      if (y+15>sprite.y+35) and (y+15<sprite.y+80) then
   begin

     if tkozel(sprite).movego= true then
     begin
     frags:=frags+1;
      dead;
     end;
   
   tkozel(sprite).hit;

   end;
   end;



кстати, kozel - это монстряк :) я сначала для монстра брал какого-то козерога из диаблы :)


 
Cash ©   (2006-01-18 20:56) [153]

Бр-р-р-р-р-р-р-р!!!
То,что в Hit направляешь - правилдьно, а вот то, что этот Hit на пустом
месте вызвываешь - это и есть причина твоей тормозни (блин, не твоей,
а твоей проги... во! :) )! 8)

Мне на ум приходит другая реализация:
(Помнишь про IsLive: boolean,? Кажется, что ты ее назвал movego, смотри...)

// здесь я говорю, что этот козел должен сдохнуть, точнее начать дохнуть
procedure Tfireball.DoCollision(Sprite: TSprite; var Done: Boolean);
var
 pos :integer;
begin
 if Sprite is Tkozel then begin
   if ((x+15>sprite.x+40)and(x+15<sprite.x+70))and
      ((y+15>sprite.y+35)and(y+15<sprite.y+80)) then begin
     if tkozel(sprite).movego=true then begin
       frags:=frags+1;
       dead;
       tkozel(sprite).DoDie;
     end;
   end;
 end;
end;
// это - метод козла, как умирать.
// Про DeathImage и LiveImage я тоже говорил уже,
// Сделай эти два поля в классе козла и засунь в них
// картинки мертвого и живого монстряка соответственно.
Procedure TKozel.DoDie;
begin
 Z := 1;
 Image := DeathImage;
 AnimPos:=0;
 AnimCount := Image.PatternCount;
 AnimLooped := false;
 AnimSpeed := 15/1000;
 movego:=false;  
end;
// Типа скорая реанимационная помощь! :)
Procedure TKozel.Reanimate;
begin
 Image := LiveImage;
 AnimPos:=0;
 AnimCount := Image.PatternCount;
 AnimLooped := true;
 AnimSpeed := 15/1000;
 movego:=true;
end;
// Вот так я бы сделал процедурку перемещения монстра.
Procedure TKozel.DoMove(MoveCount: Integer);
begin
 inherited DoMove(MoveCount);
 if movego then begin
   // Здесь стандартное живое состояние монстряка, сюда же
   // я бы всавил Collision, а впрочем вот, прямо щас и вставлю!
   Collision;
 end else begin
   // а здесь обработка его подыхания. Дохнет он дохнет... и под конец
   // берет и оставляет о себе память в виде фотки на бэкграунде. :)))
   if AnimPos >= (AnimCount-1) then begin
     Hit;
     Visible := false;
   end;
 end;
end;

// а теперь и сама Hit!
procedure Tkozel.hit;
var
 p,a: TBitMap;
 r: TGraphic;
 t: TColor;
 b: TRect;
begin
 p := TBitMap.Create;
 a := TBitMap.Create;
 r := Form1.DXImageList1.Items.Items[9].Picture.Graphic;
 p.Width := r.Width;
 p.Height := r.Height;
 p.Canvas.Draw(0,0,r);
 with a do begin
 // при вызове Hit мы на все 100% уверены, что текущая картинка у
 // монстряка - DeathImage, а подругому при текущем раскладе не
 // получится! Поэтому далеко не ходя берем инфу прямо из поля Image
   Width := Image.Picture.Graphic.Width;
   Height := Image.Picture.Graphic.Height;
   Canvas.Draw(0,0,Image.Picture.Graphic); // Ну это типа мы рисуем, это ясно.
   // А вот здесь по моим предположениям должно происходить
   // нахождение последниго кадра смерти. Я это только теоретически
   // просчитал, должно выводить правильно.
   Canvas.CopyRect(Bounds(0,0,77,77),a.Canvas,Bounds((AnimCount-1)*77,0,77,77));
   // А-а-а-а-а... это самое то! Надо же правильные размеры уточнить,
   // а не то тормоза будут не в квадрате, а в кубе!!!
   Width := 77;
   Height := 77;
 end;
 t := Image.TransparentColor;
 // лишние переменные скорости не добавят! я убрал две самые не нужные!
 // Round и Trunc очень похожи, только последняя округляет
 // в меньшую сторону, мне просто так нравится болше.
 b := bounds(Trunc(X),Trunc(Y),77,77);
 p.Canvas.Brush.Style := bsClear;
 p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
 r.Assign(p);
 Form1.DXImageList1.Items.Items[9].Restore;
 a.Free;
 p.Free;
end;


 
Аццкий_рыцарь:)   (2006-01-18 22:51) [154]

все сделал, но всеравно глючит когда сразу несколько монстряков умирает :(


 
Аццкий_рыцарь:)   (2006-01-18 22:57) [155]

Если бы упростить процедуру самого рисования последнего кадра... я до сих пор немогу разобраться в ней:( может что-то с буферами? (тоже просьба не опошлять :) )


 
antonn ©   (2006-01-19 05:17) [156]

Аццкий_рыцарь:)   (18.01.06 22:51) [154]
все сделал, но всеравно глючит когда сразу несколько монстряков умирает :(

а ты побольше используй Canvas.Draw:)


> Items[9].Picture.Graphic

это что за график? там битмап есть?

p := TBitMap.Create;
a := TBitMap.Create;

>p := TBitMap.Create;
>  a := TBitMap.Create;

объяви эти чуда глобально, создавай только при создании формы(или чего там...), а тут используй. Не надо их каждый раз создавать.


> r: TGraphic;

бяка...


> p.Canvas.Draw(0,0,r);

попробуй заменить на CopyTransparentBrush(r,p,0,0,clred); //clred - цвет прозрачности, какой он там у тебя?
из поста [113], вообще все Canvas.Draw позаменяй


>p.Canvas.Brush.Style := bsClear;
>  p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);

CopyTransparentBrush(a,p,b.left,b.top,t);


 
MonoLife   (2006-01-19 06:02) [157]

По всей видимости, Аццкий_рыцарь, ты лишаешься претензии на индивидуальность твоей будующией игрухи, так как содержание листинга постепенно становится коллективным! :) >... кайфа никакого
не получишь! ;)[90]

Поражаюсь терпению Cash, нравится ему все раззжевывать :) Респект ессно...
to Аццкий_рыцарь> Без примеров трудновато. Ты поищи где-нить простые примеры и описание, посмотри реализацию того-сего... Если совсем ничего не найдешь, я посмотрю у себя материал и вышлю тебе на мыло, если ты, конечно, мне его дашь :).
Вопрос к Cash:
b: TRect;
чем отличается
b := bounds(10,10,32,32); от
b := Rect(10,10,32,32); :)


 
Cash ©   (2006-01-19 08:21) [158]

MonoLife   (19.01.06 06:02) [157]:
... чем отличается ...

Отличия там в то, что Bounds возвращает рамку исходя из положения по
X и Y, а так же ширины и длины, которые задаются ы параметрах.
А Rect отдает рамочку, сформированную левой верхней и правой нижней
точками, так же указанными в параметрах.
Применительно к примеру:
bb := bounds(10,10,32,32);
br := Rect(10,10,32,32);
bb = (10,10,42,42);
br = (10,10,32,32);

antonn ©   (19.01.06 05:17) [156]:
... > r: TGraphic;
бяка... ...

И действительно бяка! Там вся работа с графикой через эту самую бяку
налажено!

Ктати точно! Надо бы эти два буфера создавать в конструкторе и
уничтожать через деструктор самого козла. Блин!!!, ну сколько памяти
тогда надо будет!

... это что за график? там битмап есть? ...
Нет там битмапа! Он хоть и присуцтвует, а никакой функции не несет!


 
Cash ©   (2006-01-19 08:47) [159]

Аццкий_рыцарь:)   (18.01.06 22:57) [155]:
Попробуем!
- Для начала перепиши оба буфера в область Private класса формы.
Думается мне, что все классы у тебя находятся в модуле с самой формой.
- Далее, надо сменить носителя процедуры Hit, измени ее название
(DrawDeath или DeathDraw или ... :)), и перепиши в разряд Public класса
формы.
- Момент 3: надо сделать отдельную картинку последнего кадра смерти
этого монстряка. (самый последний кадр размером 77х77)
- Теперь надо поправить процедурку рисования на бэк-е. (приведу в конце)
- Далее, в событии OnCreate и OnDestroy объяви создание и уничтожение
обоих буферов.
- Еще - в OnCreate в буфер кадра смерти сразу загони уже заготовленное
изображенире последнего кадра, предварительно уточнив его размеры.
- А так же, в OnCreate задай сразу размеры буферу бэк-а и помести
в него картинку.
(И так как при проходе нашей процедуры буферы уже созданы, нам нет
нужды создавать их при каждой необходимости)
- И по дконц - надо переписать вызов нашей процедуры из метода DoMove.

Все! Вроде кой какая оптимизация приведена.

А так я бы переписал эту процедуру:

procedure TForm1.DrawKozelDeath(Subj: TKozel);
var
r: TGraphic;
t: TColor;
b: TRect;
begin
r := DXImageList1.Items.Items[9].Picture.Graphic;
t := Subj.Image.TransparentColor;
b := bounds(Trunc(Subj.X),Trunc(Subj.Y),77,77);
p.Canvas.Brush.Style := bsClear;
p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
r.Assign(p);
Form1.DXImageList1.Items.Items[9].Restore;
end;


Меньше избыточных операторов - больше скорость!

У тебя кстати какой конфиг машины?


 
Cash ©   (2006-01-19 08:51) [160]

А если еще подумать, то можно и еще почикать эту процедурку.

procedure TForm1.DrawKozelDeath(Subj: TKozel);
var
  t: TColor;
  b: TRect;
begin
  t := Subj.Image.TransparentColor;
  b := bounds(Trunc(Subj.X),Trunc(Subj.Y),77,77);
  p.Canvas.Brush.Style := bsClear;
  p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
  DXImageList1.Items.Items[9]..Assign(p);
  DXImageList1.Items.Items[9].Restore;
end;


 
antonn ©   (2006-01-19 09:36) [161]

Cash ©   (19.01.06 8:21) [158]
Он хоть и присуцтвует, а никакой функции не несет!

нужно иметь битмап и работать с пикселами напрямую через scanline, тогда будет скорость (да еще и эффектов, типа прозрачности и черно-белости можно добавить).
кстати, я вот на основе работы со scanline игру на один конкурс писал:
http://an-files.narod.ru/Star_Scroller.rar (1366182 Б)
почти не тормозит на хороших компах;)


>procedure TForm1.DrawKozelDeath(Subj: TKozel);
>var
>r: TGraphic;
>t: TColor;
>b: TRect;
>begin
>r := DXImageList1.Items.Items[9].Picture.Graphic;
>t := Subj.Image.TransparentColor;
>b := bounds(Trunc(Subj.X),Trunc(Subj.Y),77,77);
>p.Canvas.Brush.Style := bsClear;
>p.Canvas.BrushCopy(b,a,a.Canvas.ClipRect,t);
>r.Assign(p);
>Form1.DXImageList1.Items.Items[9].Restore;
> end;

а "напрямую" никак? :) да и вообще, tbitmap юзай


> p.Canvas.Brush.Style := bsClear;

делается всего один раз - и хватит:)


 
Аццкий_рыцарь:)   (2006-01-19 09:47) [162]


> MonoLife   (19.01.06 06:02) [157]


понимаешь, я игру пишу не для того чтоб повыпендриваться, мол :"я крутой программер". Я пишу чтоб научиться разбираться с проблемами, возникающими при построении игр! Если б я отдельно садился без игры и начал рыть статьи по ДелфиХ, это бы заняло очень много времени. А так я сразу вижу чего плохого есть там, и как это решить :)

> Cash ©   (19.01.06 08:47) [159]


моя машина:

Athlon XP 2200+
Radeon 9600 pro
523 Mb оперативы...

мышка и клава Sven :)

ЭХ!
ща буду пытаться это все воплотить в игруху...


 
Аццкий_рыцарь:)   (2006-01-19 10:43) [163]

Cash

Теперь че-та мертвого монстряка вообще не рисует, а глючит как и раньше :(

вот что я делал :

там где Private формы вставил p,a: TBitMap;

вот насчет носителя Hit... Я че-то непойму, зачем его переименовывать? допустим пускай Hit будет DeathDraw ...

насчет картинки... Я просто  сделал пока что без анимации смерти, все image, которые были с анимацией я просто туда картинку валяющегося монстра вставил.

- вот, что я вставил в FormCreate:
p := TBitMap.Create;
a := TBitMap.Create;

- a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
p.Width := 768;
p.Height := 1024;

- B FormDestroy вставил  
a.Free;
p.Free; (кстати пишет ошибку при закрытии форми Acces violation error, тут закрадываются сомнения, насчет правильности создания мной буферов :) )

-В бывший Hit, теперь DeathDraw вставил:


procedure tform1.DeathDraw;
var
r: TGraphic;
t: TColor;
b: TRect;

begin
r := form1.DXImageList1.Items.Items[9].Picture.Graphic;
t := form1.DXImageList1.Items.Items[9].TransparentColor;
b := bounds(deadkozelX,deadkozelY,77,77);
form1.p.Canvas.Brush.Style := bsClear;
form1.p.Canvas.BrushCopy(b,form1.a,form1.a.Canvas.ClipRect,t);
r.Assign(form1.p);
Form1.DXImageList1.Items.Items[9].Restore;
end;


 
Аццкий_рыцарь:)   (2006-01-19 10:49) [164]

MoonLife

насчет примеров...

я полно статей нарыл по DelphiX, но вот про эти проблемы, которые я поднимал в этом топике НИГДЕ НИЧЕГО НЕТ:( если можешь, то вышли вот мыло : iradchenko@bigmir.net


 
Cash ©   (2006-01-19 11:26) [165]

Аццкий_рыцарь:)   (19.01.06 10:43) [163]:
... вот насчет носителя ...
Под носителем я понимаю класс, который содержит этот метод или поле.
А вопрос переименоки чисто эстетический! :)

... a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap; ...
Хм-м, ты же уже создал этот буфер. Зачем тебе его переназначать?
Ты заменишь буфер на бесполезную картинку, которая еще и пустая!
При таком переназначении ты потеряешь ранее созданый объект!
Надо было сделать так:

a.Width := 77;
a.Height := 77;
a.Canvas.Draw(0,0,dxImageList3.Items.Find("mdeadend").Picture.Graphic);

Вроде как этот "mdeadend" и есть последний кадрик анимации этого монстра?

p.Width := 1024; // ух, сделал бы лучше 800х600, тормоза еще и от этого
p.Height := 768;
p.Canvas.Draw(0,0,dxImageList3.Items.Item[9].Picture.Graphic);


 
Cash ©   (2006-01-19 11:35) [166]

Аццкий_рыцарь:)   (19.01.06 09:47) [162]:
... моя машина: ...
Ух-х-х-х-х!
Давненько наверное не грейженая.

Зацени конфиг:
Intel Celeron D360 3.0 GHz (HT+)
ATI x750Pro 128 Md PCI-Ex
1 Gb DDR2 RAM

Тота у меня эти манипуляции с перерисовкой не тормозят! :)))


 
antonn ©   (2006-01-19 11:36) [167]

Аццкий_рыцарь:)   (19.01.06 10:43) [163]
- a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
p.Width := 768;
p.Height := 1024;

матерь божья, у тебя такой здоровый битмап??? а ты на нем еще и draw()...


> -
> a:=form1.dxImageList3.Items.Find("mdeadend").Picture.Bitmap;
>p.Width := 768;
>p.Height := 1024;
>
>- B FormDestroy вставил  
> a.Free;

я бы тоже чего нибудь выдал:)

ты вообще, объясни структуру битмапов, какой для вывода, где хранатся тайлы(я так понял в DXImageList1.Items.Items[]?)


>procedure tform1.DeathDraw;
>var
>r: TGraphic;
>t: TColor;
>b: TRect;
>
>begin
> r :=
>form1.DXImageList1.Items.Items[9].Picture.Graphic;
> t :=
>form1.DXImageList1.Items.Items[9].TransparentColor;
>b := bounds(deadkozelX,deadkozelY,77,77);
>form1.p.Canvas.Brush.Style := bsClear;
>form1.p.Canvas.BrushCopy(b,form1.a,form1.a.Canvas.ClipRect,t);
>r.Assign(form1.p);
>Form1.DXImageList1.Items.Items[9].Restore;
> end;

че то тут не то...

я так понял, тебе нужно выхватить из form1.DXImageList1.Items.Items[9] картинку и скопировать ее с прозрачным цветом на большой битмап. Так? у form1.DXImageList1.Items.Items[9] есть Tbitmap, или только TGraphic?

попробуй переписать DeathDraw:

procedure tform1.DeathDraw;
begin
//на p надо вывести?
CopyTransparentBrush(form1.DXImageList1.Items.Items[9].Picture.bitmap, p,deadkozelX,deadkozelY, form1.DXImageList1.Items.Items[9].TransparentColor);
Form1.DXImageList1.Items.Items[9].Restore;
end;
//только у CopyTransparentBrush в параметрах первый var убери


 
Cash ©   (2006-01-19 11:47) [168]

antonn ©   (19.01.06 11:36) [167]:
Не учили тебя в детстве читать все посты до конца! :D :D :D
DXImageList - это типа хранилище картинок.
А выводить какраз надо на девятый индекс!
Девятку в p еще на старте запихивают, а сама процедура
рисует еще обин бтмап на p и передают его обратно в девятку.
После чего обновляют текстуру девятки.


 
antonn ©   (2006-01-19 11:57) [169]

Cash ©   (19.01.06 11:47) [168]
Девятку в p еще на старте запихивают, а сама процедура
рисует еще обин бтмап на p и передают его обратно в девятку.
После чего обновляют текстуру девятки.

мда...
короче в девятку просто смешивают ее саму и еще один битмап?
а нельзя сразу записать в девятку, без копирований еще одного битмапа на Р а потом в девятку?


 
Аццкий_рыцарь:)   (2006-01-19 12:37) [170]

antonn

пытались, но нифига неполучилось :(

кстати я тут все снова учел что написали и всеравно глючит :(

я даже r пытался поставить в OnCreate формы, но от глюков это не избавило :(


 
Shirson ©   (2006-01-19 13:05) [171]

Аццкий_рыцарь, ты это всё через DelphiX делаешь? Тогда зачем канву мучать? Или я чего-то не понимаю :)

Выложи свой код, посомтреть хочется, может чего подскажу.


 
Аццкий_рыцарь:)   (2006-01-19 13:08) [172]

Shirson на DelphiX (шоб его!), ты прав :) я ща на диалапе, еще и скорость передачи 400 байт\с :) че-то эти холода наверное натворили с проводами :) перемерзли наверное :)


 
Shirson ©   (2006-01-19 13:36) [173]

400б/с это по-взрослому :)

Ладно, тогда так.
У items, из которых стостоит DXImageLis, есть метод Draw(Alpha), который рисует картинку из этого item на поверхность.
Создаёшь дополнительную поверхность, на которой будешь "хранить" трупы.
При смерти "козла" или кого уж там, рисуешь на эту поверхность очередной труп.
В цикле таймера, копируешь кладбищенскую поверхность на главную.
Вот и всё, собственно...


 
Cash ©   (2006-01-19 13:41) [174]

antonn ©   (19.01.06 11:57) [169]:
Не, так не получится. По девятому индексу (в девятке типа) лежит
DelphiX текстура, в которой из рабочих и для канвы -
только Graphic: TGraphic! Поэтому пришла идея перебить ее буфер,
а потом работать с буфером. Вот! Елки палки, а ведь на омеге все проще,
там изначально с битмапом работа идет.

Аццкий_рыцарь:)   (19.01.06 12:37) [170]:
А вчем глюки то? Если только в медленности - можно забить, более
производительность этого кода можно повысить только с Антоновой
процедурой. А если что не то, то надо действительно посмотреть код.
А r можно вообще убрать, [160] пост.


 
Shirson ©   (2006-01-19 13:41) [175]

В конце концов, можно делать DXImageList.items.find("kozel").draw(DXImageList.items.find("Background").PatternSurfaces[0],.... и так далее


 
Cash ©   (2006-01-19 13:46) [176]

Shirson ©   (19.01.06 13:41) [175]:
Вот я тупой то а!
Полез в какието дела с канвой, когда там прямо на поверхность текстуры
штопать можно!!! И с альфой!!! И быстро!!! И главное - просто, вызвав
одну процедуру! Sorry одним словом, память дырявая! :(


 
Аццкий_рыцарь:)   (2006-01-19 13:48) [177]

Э я наверное тоже тупой... еще тупее Cash :) я че-то непойму про что был базар в 175 :)


 
Shirson ©   (2006-01-19 13:50) [178]

Cash, да ничего, бывает :)


 
Shirson ©   (2006-01-19 13:53) [179]

Аццкий_рыцарь, DXImageList это, грубо говоря, организованный набор Surface. Каждая из которых позволяет копировать себя на другую Surface, с применением всяческих эффектов, вроде прозрачности, альфа-канала, затенения и пр.
Т.к это всё Surface, можно на прямую копировать изображение из одного Item в другой.


 
Cash ©   (2006-01-19 13:54) [180]

Аццкий_рыцарь:)   (19.01.06 13:48) [177]:
Дело шло про следующую команду

procedure TForm1.DrawKozelDeath(Subj: TKozel);
begin
  Subj.Image.Draw(DXImageList1.Items.Items[9].PatternSurfaces[0],
                Subj.X,Subj.Y,Subj.AnimC ount-1);
end;


 
Shirson ©   (2006-01-19 14:00) [181]

Угу, оно самое.
PatternSurfaces[0], чтобы не вводил в заблуждение, это первая поверхность последовательности, которая организуется при раскадровке.
Т.е. если в Item грузить картинку и задавать высоту и ширину кадра, то картинка разбивается на эти кадры, для удобства анимации.
Если разбики на кадры нет, то считается что он всего один и доступ к поверхности идёт через PatternSurfaces[0].
Это так, на всякий случай. Если не понятно - не нужно забивать в голову, оставим на потом


 
Shirson ©   (2006-01-19 14:02) [182]

P.S. Cash, а тут Subj.[b]Image[/b].Draw не лишниее?


 
Cash ©   (2006-01-19 15:37) [183]

Shirson ©   (19.01.06 14:02) [182]:
Неее. Там же обработка из под формы происходит,
а сам дохлый козел (смешно получилось:) в качестве параметра.
А козел, Subj тобишь - это TAnimedSprite (по моему этот класс так
называется).


 
Shirson ©   (2006-01-19 16:33) [184]

Ааа... Я просто спрайтами не пользуюсь, поэтому меня Image и смутило.


 
Аццкий_рыцарь:)   (2006-01-19 16:38) [185]

УРЯ! пашет, как по маслу! ваще нет глюков! теперь жирок такой! на полу полно трупов буквально за 20 сеунд игры, а ты топчешся по ним :)


 
Shirson ©   (2006-01-19 17:36) [186]

Как всё просто оказывается :)


 
Cash ©   (2006-01-19 17:46) [187]

Ну вот! разобрались.
Пока эта века еще не забыа и брошена надо бы ее экземпляр на винт кинуть!
:)))


 
Аццкий_рыцарь:)   (2006-01-19 23:42) [188]

Shirson

100% !

Cash

тоже 100% :)


 
JUS ©   (2006-02-13 22:11) [189]

Jus 99% ! :)



Страницы: 1 2 3 4 5 вся ветка

Форум: "Игры";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 1.09 MB
Время: 0.049 c
2-1164184870
vitv
2006-11-22 11:41
2006.12.10
Миграция с InterBase 6.1


15-1164266454
wezzz
2006-11-23 10:20
2006.12.10
Вопрос по IIS


6-1152805949
Георгий А.
2006-07-13 19:52
2006.12.10
Как заставить перегрузиться сетевую карту


2-1164469926
Alians
2006-11-25 18:52
2006.12.10
Локальная сеть


9-1140081963
Древолаз
2006-02-16 12:26
2006.12.10
GL Scene Холм и Танк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский