forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Глупый вопрос (http://forum.boolean.name/showthread.php?t=7640)

Randomize 06.03.2009 16:09

Ответ: Глупый вопрос
 
HolyDel, ты мысли читаешь.
Да игра типа кримсона будет.
По кровище типа кримсона, а жанр - стратегия.
Естественно от танка следы. От взрыва воронка.
От металла осколки. Из пушки гильзы.
От людей следы.Из врагов кравища.

dimanche13 06.03.2009 17:22

Ответ: Глупый вопрос
 
Цитата:

Сообщение от HolyDel (Сообщение 99754)
В играх потипу кримсоланда (в играх другого типа, где крови мало, я не вижу смысла запекать ее в текстуру) именно ТЫСЯЧИ монстров. Там каждую секунду 10-20 убийств монстров (если не больше). Там в прямом смысле - моря крови :)

Допустим убивать 10 монстров в секунду, что маловероятно, тока если из гранатомета их валить. И держаться в таком темпе 10 минут(мне б за 10 минут надоело), то набежало бы 6000 объектов. причем один по любасу наслоится на другой, и будет такая кровавая каша, что если убирать первых убитых монстраков, которые лежат под пятью слоями новых, никто и не заметит. Я так и делал в своем кримсоне, без всякого рендера в текстуру. Правда там и убийств в секунду было не 10... :-D

HolyDel 06.03.2009 21:29

Ответ: Глупый вопрос
 
dimanche13, хм. ты прав.

вот я сделал через рендер в текстуру:
http://forum.boolean.name/showpost.p...&postcount=483

dimanche13 06.03.2009 23:22

Ответ: Глупый вопрос
 
давно, кстати, слежу за Sigel. Вот все кричат Xors да Xors, у тебя вроде не хуже выходит. Хотел покрутить, но не нашел информации ни о фьючерсах, ни о том что сделано, ни о том что планируется, ни сравнительных тестов с другими движками, а это не есть гуд...

NitE 07.03.2009 00:22

Ответ: Глупый вопрос
 
dimanche13, движок-то может и лучше но кодить на С++ не все гаразды - ктомуже уж для цпп точно есть движки лучше сигела и любого другого на этом форуме...

HolyDel 07.03.2009 19:38

Ответ: Глупый вопрос
 

Цитата:

ни сравнительных тестов с другими движками
начало положено:
http://forum.boolean.name/showthread...newpost&t=7937

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

фичелист давно есть в основной теме:
http://forum.boolean.name/showpost.p...&postcount=422

вот справки путевой нет, да.

Randomize 11.03.2009 07:14

Ответ: Глупый вопрос
 
Вложений: 2
BlitzMax хочет меня убить.
Изображение в оконном режиме трансперентится а в фуллскрине нет.
Из опробываного мной:

PHP код:

SetMaskColor(255,0,255)

image.mask_r=255
image
.mask_g=0
image
.mask_b=255

Флаг картинке
: MASKED_IMAGE 

Картинка не хочет иметь прозрачный цвет ни в какую :(
Привожу код для большей предметности вопроса:

PHP код:

Function LoadTileBase:TImage(FileName:String, TileWidth:Int, TileHeight:Int)
    
Local temp_img:TImage = LoadImage (FileName)
    
Local tilex_c:Int = (ImageWidth(temp_img) / (TileWidth + 2))
    
Local tiley_c:Int = (ImageHeight(temp_img) / (TileHeight + 2))
    
Local TileCount:Int = tilex_c * tiley_c
    Local TileBase
:TImage = CreateImage(tilewidth, tileheight, TileCount + 1, MASKEDIMAGE)
    
Local n:Int = 0
    SetColor
(255, 0, 255)
    
DrawRect 0, 0, ImageWidth(temp_img), ImageHeight(temp_img)
    
SetColor(255, 255, 255)
    
DrawImage (temp_img, 0, 0)
    For 
Local y:Int = 0 To tiley_c - 1
        
For Local x:Int = 0 To tilex_c-1
                GrabImage TileBase
, (tilewidth + 2) * x + 1, (tileheight + 2) * y + 1, n
                MaskPixmap
(LockImage(TileBase, n), 255, 0, 255)
                
UnlockImage(TileBase, n)
            
n = n + 1
        Next
    Next
    Flip
;WaitKey()
    Return 
TileBase

EndFunction 

Функция загружает набор тайлов с рамкой и ликвидирует рамку.
Легче так обьяснить:
-- До --
Вложение 5512
-- После --
Вложение 5513

Использую OpenGL драйвер * SetGraphicsDriver GLMax2DDriver()
Изображения только PNG.

И ещё один вопрос: Модуль BMPLoader по любому нуже чтоли? Без него ошибка. Картинки сохранял все фотошопом. Открывал и смотрел заголовок на каждой PNG. Неужели без него в проекте никак?

dimanche13 11.03.2009 14:18

Ответ: Глупый вопрос
 
ну во первых, для чего тебе такая функция LoadTileBase:TImage(FileName:String, TileWidth:Int, TileHeight:Int)? Просто не грузи тайлы с рамками. Для этого уже есть LoadAnimImage и с SetMaskColor - все работает, я проверял.

Randomize 12.03.2009 16:32

Ответ: Глупый вопрос
 
Вложений: 1
Цитата:

Сообщение от dimanche13 (Сообщение 100259)
ну во первых, для чего тебе такая функция LoadTileBase:TImage(FileName:String, TileWidth:Int, TileHeight:Int)? Просто не грузи тайлы с рамками. Для этого уже есть LoadAnimImage и с SetMaskColor - все работает, я проверял.

Дело в том, что рисовать очень большие файлы с большим набором тайлов бывает крайне сложно.
И я нашол решение. Ширина и высота тайла получается на 2px больше.
Между тайлами идут жирные линии отделяющие тайлы друг от друга.
Тоесть я создаю файл наполненый прямоугольниками и заполняю прямоугольник картинкой.
Просто чисто так не очень то и удобно рисовать особенно когда тайлов много и они однотипные.
Как пример прикладываю изображение:
Вложение 5524
Без рамки я бы просто умер.

dimanche13 12.03.2009 20:31

Ответ: Глупый вопрос
 
просто я не вижу необходимости разделять тайлы полосами.

Randomize 14.03.2009 16:25

Ответ: Глупый вопрос
 
Решение про накладывание изображения на изображение:

PHP код:

Graphics 800, 600

Explosion 
= LoadImage("Картинка1")
bg = LoadImage("Картинка2", DYNAMICIMAGE)


Repeat
Cls


DrawImage bg
, 0, 0
If MouseHit(1)
    
DrawToPixmap(Explosion, 0, LockImage(bg), MouseX(), MouseY())
End If

Flip
Until KeyHit
(KEY_ESCAPE)


Function 
ARGB_Alpha:Int(ARGB:Int)
 Return (
argb Shr 24) & $ff
 
'Return Int((ARGB & $FF000000:Int) / $1000000:Int) 
End Function

Function ARGB_Red:Int(ARGB:Int)
  Return (argb Shr 16) & $ff
' 
Return Int((ARGB & $00FF0000:Int) / $10000:Int)
End Function

Function 
ARGB_Green:Int(ARGB:Int)
  Return (
argb Shr 8) & $ff
' Return Int((ARGB & $0000FF00:Int) / $100:Int)
End Function

Function ARGB_Blue:Int(ARGB:Int)
 Return (argb & $ff) 
' 
Return (ARGB & $000000FF:Int)
End Function

Function 
ARGB_Color:Int(alpha:Int,red:Int,green:Int,blue:Int)
 Return (
Int(alpha * $1000000) + Int(RED * $10000) + Int(green * $100) + Int(blue)) 
End Function

Function 
DrawToPixmap(image:TImage, framenr:Int = 0, Pixmap:TPixmap, x:Int, y:Int, alpha:Float = 1.0, Multiply:Int = 1)
      
Local TempPix:TPixmap = Null
      
If framenr = 0 Then TempPix = LockImage(image)
      If 
framenr > 0 Then TempPix = LockImage(image, Framenr) 
      For 
Local i:Int = 0 To ImageWidth(image) - 1
        
For Local j:Int = 0 To ImageHeight(image) - 1
          
If x + i < pixmap.width And y + j < pixmap.Height 'And i >= x And j >= y
            Local sourcepixel:Int = ReadPixel(TempPix, i, j) 
            Local destpixel:Int = ReadPixel(pixmap, x+i,y+j)
            Local destA:Float = ARGB_Alpha(destpixel) 
            Local sourceA:Float = ARGB_Alpha(sourcepixel) * alpha
            If sourceA = 255 Then destA = 0
                Local destR:Float = ARGB_Red(destpixel)
                Local destG:Float = ARGB_Green(destpixel) 
                Local destB:Float = ARGB_Blue(destpixel) 
                Local SourceR:Float = ARGB_Red(Sourcepixel) 
                Local SourceG:Float = ARGB_Green(Sourcepixel) 
                Local SourceB:Float = ARGB_Blue(Sourcepixel) 
                    Local AlphaSum:Int = destA + sourceA
                    If multiply = 1
                        sourceR = (sourceR  * sourceA / AlphaSum) + destA / AlphaSum * (destR * destA / AlphaSum) 
                        sourceG = (sourceG  * sourceA / AlphaSum) + destA / AlphaSum * (destG * destA / AlphaSum) 
                        sourceB = (sourceB  * sourceA / AlphaSum) + destA / AlphaSum * (destB * destA / AlphaSum) 
                    Else
                        sourceR = (sourceR  * sourceA / AlphaSum) + (destR * destA / AlphaSum) 
                        sourceG = (sourceG  * sourceA / AlphaSum) + (destG * destA / AlphaSum) 
                        sourceB = (sourceB  * sourceA / AlphaSum) + (destB * destA / AlphaSum) 
                    EndIf
                    If AlphaSum > 255 Then AlphaSum = 255
                    sourcepixel = ARGB_Color(AlphaSum, SourceR, sourceG, sourceB) 
            If SourceA <> 0 Then WritePixel(Pixmap, x + i, y + j, sourcepixel)
          EndIf
        Next
      Next
      If framenr = 0 UnlockImage(image)
      If framenr > 0 UnlockImage(image, framenr)
End Function 

Этот способ ещё тормознее и без alpha канала:
PHP код:

Local e:TPixmap = LockImage(imgBlood)
    
Local p:TPixmap = LockImage(imgFloor)
    
MaskPixmap(e, 0, 0, 0)
    
p.Paste(e, MouseX(), MouseY())
    
UnlockImage(imgBlood)
    
UnlockImage(imgFloor) 

Нужели это всё, что можно сделать?
В Blitz3D подобное - расплюнуть.
Я понимаю, что тут какбы 3D-2D, но ведь SetBuffer(TextureBuffer()) в B3D есть, значит и тут чёто подобное должнобыть.
Просто я помню как я грабил экран в B3D и текстурил этим всю мапу и воду и скайбокс и юнитов. Баловался кароче :)

Randomize 17.03.2009 21:56

Ответ: Глупый вопрос
 
Нароод!? Неужели на BlitzMax тут так мало прогают?
Не верю, что никто ничего не знает про наложение картинки на картинку.

dimanche13 17.03.2009 23:35

Ответ: Глупый вопрос
 
Я же тебе написал, как это делается paste методом. Потом если тебе так нравятся эти pink-полосы, то можно загрузить картинку с pink-маской порезать на тайлы с полосами, а потом просто изменить width и height картинки, отрубив таким образом остатки полос. Ты морочаешься на пустом месте. Если я прально понял.

Randomize 18.03.2009 08:09

Ответ: Глупый вопрос
 
Не сейчас я просто хочу наложить image на image.
Оставляя Alpha-канал png изображения.
В моём случае наклаедываемого, хотя это не имеет значения.
Должен же быть в BlitzMax для этого метод. Paste просто напросто плюёт на альфа канал.
Попиксельно пробывал бррр скорость не ахти какая.

jimon 18.03.2009 09:16

Ответ: Глупый вопрос
 
Randomize
вот исходник метода Paste :
Код:

        Rem
        bbdoc: Paste a pixmap
        end rem
        Method Paste( source:TPixmap,x,y )
                For Local h=0 Until source.height
                        ConvertPixels source.PixelPtr(0,h),source.format,Self.PixelPtr(x,y+h),Self.format,source.width
                Next
        End Method

а функция ковертации пикселей
Код:

Function CopyPixels( in_buf:Byte Ptr,out_buf:Byte Ptr,format,count )
        MemCopy out_buf,in_buf,count*BytesPerPixel[format]
End Function

Function ConvertPixels( in_buf:Byte Ptr,in_format,out_buf:Byte Ptr,out_format,count )
        If in_format=out_format
                CopyPixels in_buf,out_buf,out_format,count

        Else If in_format=PF_STDFORMAT
                ConvertPixelsFromStdFormat in_buf,out_buf,out_format,count
        Else If out_format=PF_STDFORMAT
                ConvertPixelsToStdFormat in_buf,out_buf,in_format,count
        Else
                Local tmp_buf:Int[count]
                ConvertPixelsToStdFormat in_buf,tmp_buf,in_format,count
                ConvertPixelsFromStdFormat tmp_buf,out_buf,out_format,count
        EndIf
End Function

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

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


Часовой пояс GMT +4, время: 18:46.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot