Страница: 1 |
Страница: 1 |
Вопрос: Сглаживание и курсоры
Добавлено: 13.04.06 07:20
Автор вопроса: ChemistN1 | Web-сайт:
У меня тут скопилось 3 вопроса:
1) Какой командой задается сглаживание текстур в DirectX8? В DirectX7 это .SetTextureQuality, в 8ом же как ни искал, не нашел.
2) Как сделать нормальные полноценные курсоры. Если файл .cur, то он становится черно-белым, если ico - то точка нажимания (hot spot) у нее посередине.
3) :( Почему когда я нажимаю "Поиск" в форуме, у меня либо дисконнект, либо ошибка загрузки? Ничего найти невозможно :[.
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 14.04.06 22:42
1. ?
Microsoft® Visual Basic® applications should set the current texture filtering method by calling the Direct3DDevice8.SetTextureStageState method. Set the value of the first parameter to the integer index number (0-7) of the texture for which you are selecting a texture filtering method. Pass CONST_D3DTEXTUREMAGFILTER, CONST_D3DTEXTUREMINFILTER, or CONST_D3DTEXTUREMIPFILTER for the second parameter to set the magnification, minification, or mipmapping filter. Set the third parameter to the value from
CONST_D3DTEXTUREFILTERTYPE to set the magnification, minification, or mipmapping filter.
' which govern how textures get blended together (in the case of multiple
' textures) and lighting information. In this case, we are modulating
' (blending) our texture with the diffuse color of the vertices.
g_D3DDevice.SetTexture 0, g_Texture
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
g_D3DDevice.SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
g_D3DDevice.SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE
2. Фиг знает, у меня таких проблем нет.
3. Сайт модернизируется, не все еше работает.
Номер ответа: 2
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #2
Добавлено: 14.04.06 23:04
1. Понятия не имею.
2. Если нужно нарисовать обычного типа цветную стрелку, только с дизайном, то я решал эту проблему так: я рисовал айкон 16х16 а потом втыкал его в нижний правый угол стандартного размера 32х32, получалось, что центральный хот-спот попадает как-раз на конец стрелки... Но вообще хорошо, если кто расскажет решение этой проблемы...
3. У самого ошибки - терпеть и больше ничего...
Номер ответа: 3
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #3
Добавлено: 14.04.06 23:45
1. Ну я же написал)
Если вольно перевести.
Каждый тип фильтрации текстуры имеет преимущества и недостатки. Например, линейная фильтрация текстуры может привести к зубчатым граням...
Фильтрация с mipmaps обычно дает лучшие результаты, особенно когда объединена с анизотропной фильтрацией. Однако, это требует больше памяти ...
Режимы фильтрации текстуры устанавливаются вызывая метод Direct3DDevice8. SetTextureStageStat. Установите значение первого параметра от 0 до 7 с параметром CONST_D3DTEXTUREMAGFILTER , CONST_D3DTEXTUREMINFILTER, или CONST_D3DTEXTUREMIPFILTER для второго параметра,
чтобы установить улучшение качества, minification, или фильтр mipmapping.
Установите третий параметр в значение CONST_D3DTEXTUREFILTERTYPE, чтобы установить улучшение качества, minification, или фильтр mipmapping.
Номер ответа: 4
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #4
Добавлено: 16.04.06 07:52
To Vito:
Ладно, буду разбираться, но по-моему, тут все команды для мультитекстурированных объектов, а мипмапинг мне вообще не нужен - у меня все обьекты на известной фиксированной дальности находятся, поэтому в ухудшении текстур с расстоянием не нуждаются (на них уже оптимальная текстура натянута).
To Nj:
Сам так раньше делал, проблема в том, что 16х16 - это не курсор, а издевательство - его практически не видно. По-моему, единственное рациональное решение проблемы - делать собственный курсор (то бишь перехватывать, итд), но это геморрой страшный, делать ужас как не хочется.
А вообще эта проблема с курсором настолько меня задолбала - надоело каждый раз придумывать способы ее решения - то курсор черно-белым сделаешь, внутри черным, по краям - инвертированным, довольно красиво получается, то ico нарисуешь в виде прицела - чтоб хотспот был посередине, то ico 20x20 в нижнем правом углу. По-моему, это одно из самых слабых мест бейсика - мелочь, а бесит страшно.
Номер ответа: 5
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #5
Добавлено: 16.04.06 13:39
УРААА! НАШЕЛ!
g_D3DDevice.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR
g_D3DDevice.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR
g_D3DDevice.SetTextureStageState 0, D3DTSS_MIPFILTER, D3DTEXF_POINT
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 16.04.06 13:40
Если это VB.NET, то что тебе мешает курсор сделать из png или gif'a ?
Номер ответа: 7
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #7
Добавлено: 16.04.06 14:15
Это VB6, и ничто не убедит перейти с него на .NET.
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 16.04.06 17:40
Из содержания топика и вопроса не совсем понятно, о каком из языков шла речь. Вот я и высказал свое предположение
А тебя кто то убеждал или уговаривал? Наслаждайся всемиуважаемым и горячолюбимым VB6!! В том числе и работой с курсорами.. ))
Номер ответа: 9
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #9
Добавлено: 16.04.06 20:35
Угу, зато проги весят 20 кило вместо 2 метров, не требуют кучу библиотек и запускаются на любом компьютере. Но это к слову.
В общем, проблема решена, жаль что тут опять мне не помогли. Вот на вбстритс форум так форум - там чуть что не слишком сложное спросишь, все, бан обеспечен.
Номер ответа: 10
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #10
Добавлено: 17.04.06 00:03
Насчет курсора - я в больших проектах делаю полностью свой графический интерфейс, отображая картинку на форму через байтовый массив. И курсор тоже через него делаю, задав в качестве MouseIcon пустую иконку, чтобы скрыть системный курсор мыши. А со своим возможностей куда больше - можно и размер любой сделать, и цвета любые, и эффекты вроде сглаживания с линейной интерполяцией перемещения. Область применения такого подхода, правда, довольно ограничена.
Номер ответа: 11
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #11
Добавлено: 17.04.06 23:15
эээ, слушай, дай ссылку туда (на тему твою), если не сложно, или опиши вкратце - ты решил, а я нет!
2 Страшный Сон
Нет ли у тебя примера кода (ну если не жалко (если жалко - пойму)) про отображения курсора через байтовый массив. Или ссылка, где почиатать-посмотреть.
Номер ответа: 12
Автор ответа:
ChemistN1
Вопросов: 7
Ответов: 43
Web-сайт:
Профиль | | #12
Добавлено: 18.04.06 19:38
эээ, слушай, дай ссылку туда (на тему твою), если не сложно, или опиши вкратце - ты решил, а я нет!
Ну как сказать, что решена... Просто плюнул на все и сделал 21х16 курсор - вполне приличного размера, но хотспот у него на 4 пикселя ниже - в принципе, незаметно. И геморроя с байтовыми массивами нет.
Номер ответа: 13
Автор ответа:
Страшный Сон
Вопросов: 46
Ответов: 848
Профиль | | #13
Добавлено: 19.04.06 20:56
Четыре пикселя - это слишком много...
Могу выдрать кусок. Но никто, кроме меня, ничего в нем не поймет. Вот главная процедура отображения курсора (подпроцедуры придержу у себя):
Dim Buf&1), Papi As POINTAPI, I&
If lebopt_MOUSEINTERPOLATION Then
Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
Else
Buf(1) = 0
End If
If lebCURSORMODE = 4 Then ' Cursor Wrapping
GetCursorPos Papi
If FULLSCREEN Then
If MP.Y >= 599 Then
SetCursorPos Papi.X, 598
lebPPOINTERY = lebPPOINTERY - 598
GetCursorPos MP
MP.X = MP.X - LEBuildW.Left / Screen.TwipsPerPixelX
MP.Y = 599 - (MP.Y - LEBuildW.Top / Screen.TwipsPerPixelY)
PMP.Y = MP.Y
End If
If MP.Y <= 0 Then
SetCursorPos Papi.X, 1
lebPPOINTERY = lebPPOINTERY + 598
GetCursorPos MP
MP.X = MP.X - LEBuildW.Left / Screen.TwipsPerPixelX
MP.Y = 599 - (MP.Y - LEBuildW.Top / Screen.TwipsPerPixelY)
PMP.Y = MP.Y
End If
Else
If Papi.Y <= 0 Then
SetCursorPos Papi.X, Int(Screen.Height / Screen.TwipsPerPixelY) - 2
lebPPOINTERY = lebPPOINTERY - Int(Screen.Height / Screen.TwipsPerPixelY) + 2
GetCursorPos MP
MP.X = MP.X - LEBuildW.Left / Screen.TwipsPerPixelX
MP.Y = 599 - (MP.Y - LEBuildW.Top / Screen.TwipsPerPixelY)
PMP.Y = MP.Y
End If
If Papi.Y >= Int(Screen.Height / Screen.TwipsPerPixelY) - 1 Then
SetCursorPos Papi.X, 1
lebPPOINTERY = lebPPOINTERY + Int(Screen.Height / Screen.TwipsPerPixelY) - 2
GetCursorPos MP
MP.X = MP.X - LEBuildW.Left / Screen.TwipsPerPixelX
MP.Y = 599 - (MP.Y - LEBuildW.Top / Screen.TwipsPerPixelY)
PMP.Y = MP.Y
End If
End If
End If
Select Case lebCURSORMODE
Case 0
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X + 3, MP.Y - 26, 0, 488, 17, 24
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X, MP.Y - 23, 0, 488, 17, 24, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))), Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 23, 0, 488, 17, 24, lebCURSORCOL, Buf(0)
Next I
End If
Case 1
Buf(0) = 0
Select Case lebCurrentTool
Case 17 To 19
'
Case Else
If SpriteSel > -1 And lebSELECTIONMODE = 0 Then
If lebSelectedSPRITES(SpriteSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
ElseIf VertexSel > -1 And lebSELECTIONMODE = 1 Then
If lebSelectedVERTICES(VertexSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
ElseIf SectorSel > -1 And lebSELECTIONMODE = 3 Then
If lebSelectedSECTORS(SectorSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
ElseIf WallSel > -1 And lebSELECTIONMODE = 4 Then
If lebSelectedWALLS(WallSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
ElseIf lebSELECTIONMODE = 5 Then
If VertexSel > -1 Then
If lebSelectedVERTICES(VertexSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
ElseIf SpriteSel > -1 Then
If lebSelectedSPRITES(SpriteSel) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
End If
End If
If lebkCTRL Then
If lebSELECTIONMODE = 0 And lebSelectCntSPRITES <> 0 Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
ElseIf lebSELECTIONMODE = 1 And lebSelectCntVERTICES <> 0 Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
ElseIf lebSELECTIONMODE = 3 And lebSelectCntSECTORS <> 0 Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
ElseIf lebSELECTIONMODE = 4 And lebSelectCntLOOPS <> 0 Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
ElseIf lebSELECTIONMODE = 5 And (lebSelectCntVERTICES <> 0 Or lebSelectCntSPRITES <> 0) Then
Select Case lebGENERICEDITMODE
Case 1
Buf(0) = 1
Case 2
Buf(0) = 2
Case 3
Buf(0) = 3
End Select
End If
End If
End Select
Select Case Buf(0)
Case 0
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X - 9, MP.Y - 15, 18, 487, 25, 25
If Buf(1) = 0 Then
 isplayPict MP.X - 12, MP.Y - 12, 18, 487, 25, 25, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 12, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 12, 18, 487, 25, 25, lebCURSORCOL, Buf(0)
Next I
End If
Case 1
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X - 9, MP.Y - 15, 18, 461, 25, 25
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X - 12, MP.Y - 12, 18, 461, 25, 25, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 12, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 12, 18, 461, 25, 25, lebCURSORCOL, Buf(0)
Next I
End If
Case 2
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X - 9, MP.Y - 12, 18, 441, 25, 19
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X - 12, MP.Y - 9, 18, 441, 25, 19, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 12, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 9, 18, 441, 25, 19, lebCURSORCOL, Buf(0)
Next I
End If
Case 3
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X - 9, MP.Y - 15, 18, 415, 25, 25
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X - 12, MP.Y - 12, 18, 415, 25, 25, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 12, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 12, 18, 415, 25, 25, lebCURSORCOL, Buf(0)
Next I
End If
End Select
Case 2
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X + 3, MP.Y - 26, 44, 488, 21, 24
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X, MP.Y - 23, 44, 488, 21, 24, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))), Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 23, 44, 488, 21, 24, lebCURSORCOL, Buf(0)
Next I
End If
Case 3
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X, MP.Y - 11, 0, 470, 7, 17
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X - 3, MP.Y - 8, 0, 470, 7, 17, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 3, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 8, 0, 470, 7, 17, lebCURSORCOL, Buf(0)
Next I
End If
Case 4
If lebopt_MOUSEPOINTERSHADOW Then DisplayShadow MP.X, MP.Y - 11, 0, 470, 7, 17
'Buf(1) = Int(Sqr((PMP.X - MP.X) * (PMP.X - MP.X) + (PMP.Y - MP.Y) * (PMP.Y - MP.Y)))
If Buf(1) = 0 Then
 isplayPict MP.X - 8, MP.Y - 8, 0, 452, 17, 17, lebCURSORCOL
Else
Select Case Buf(1)
Case 1 To 4
Buf(0) = 3
Case 5 To 32
Buf(0) = 2
Case Else
Buf(0) = 1
End Select
For I = 0 To Buf(1) Step 4
 isplayPictT Int(NumPerc(PMP.X, MP.X, I / Buf(1))) - 8, Int(NumPerc(PMP.Y, MP.Y, I / Buf(1))) - 8, 0, 452, 17, 17, lebCURSORCOL, Buf(0)
Next I
End If
End Select
End Sub
Номер ответа: 14
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #14
Добавлено: 21.04.06 18:30
2.
API рулят.
Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GCL_HCURSOR = (-12)
Option Explicit
Private Sub Command1_Click()
SetCursor "C:\WINDOWS\Cursors\3dgarro.cur"
End Sub
Private Sub SetCursor(ByRef FileName As String)
Dim hCursor As Long
hCursor = LoadCursorFromFile(FileName)
SetClassLong Me.hwnd, GCL_HCURSOR, hCursor
End Sub
Private Sub Command2_Click()
SetCursor "C:\WINDOWS\Cursors\wagtail.ani"
End Sub
Номер ответа: 15
Автор ответа:
Nj
ICQ: 223663115
Вопросов: 21
Ответов: 285
Профиль | | #15
Добавлено: 24.04.06 13:13
2 Страшный Сон - сэнкс, видно что ты старался для своей программы , код можно было бы разобрать, если бы стало ясно откуда что берется - имена типов, функций и процедур (которые ты придержал - уважаю авторское право) - Один вопрос - эта процедурка когда вызывается? при движении курсора или еще когда?
2 Victor сэнкс, очень интересно, буду использовать, если разберусь
2 ChemistN1 - попробуй что сказал Victor