forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Вопрос-Ответ (для новичков BlitzMax) (http://forum.boolean.name/showthread.php?t=13756)

Nex 29.12.2012 14:32

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Randomize (Сообщение 247843)
Угол падения равен углу отражения.
Что ещё надо?

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

Черный крыс 29.12.2012 15:32

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Наоботот. Угол отражения равен углу падения.

Насчет пинг-понга - в БМаксе в комплект поставки входят еще примеры, и там присутствует пинг-понг-без-физ-двига.

Nex 30.12.2012 02:39

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Цитата:

Сообщение от Diablo1909 (Сообщение 247848)
Насчет пинг-понга - в БМаксе в комплект поставки входят еще примеры, и там присутствует пинг-понг-без-физ-двига.

Посотрел пример оказалось что делаю практически так же. В примере используются две переменные для движения в стороны, а я использую sin, cos и угол шарика.

В общем с горем по полам сделал, но щас не могу понять как получать противоположный угол. :) Сделал просто angle: -angle, но работает через раз, иногда шарик пролетает сквозь ракетку либо угол тупо ставится в "0/-0" и мячик без конца летает туда-сюда, а так же пробовал angle = -angle, выходит тоже самое. :(
Подскажите плиз как надо. :-D

Черный крыс 30.12.2012 03:54

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

Друг, это все элементарно делается векторами. Пользуйся ->

Код:

Function Compare:Int(obj:Float2, withObj:Object)
        Local vec:Float2 = Float2(withObj)
        Local mv:Float = obj.x + obj.y
        Local vv:Float = vec.x + vec.y
        If mv < vv
                Return -True
        ElseIf mv > vv
                Return True
        Else
                Return False
        EndIf
End Function

Public

Function F2:Float2(x:Float = 0.0, y:Float = 0.0)
        Return New Float2.Create(x, y)
End Function

Global NullFloat2:Float2 = New Float2.Create()

Private

Public

Rem'
        bbdoc: Класс двухмерного вектора.
EndRem
Type Float2
        Rem'
        bbdoc: x - product.
        EndRem
        Field x:Float
       
        Rem'
        bbdoc: y - product.
        EndRem
        Field y:Float
       
        Rem'
        bbdoc: Получть угол наклона вектора.
        returns: Угол наклона в градусах.
        EndRem
        Method Create:Float2(x:Float = 0.0, y:Float = 0.0)
                Self.x = x
                Self.y = y
                Return Self
        End Method
       
        Rem'
        bbdoc: Получть угол наклона вектора.
        returns: Угол наклона в градусах.
        EndRem
        Method ForAngle:Float2(angle:Float)
                x = Cos(angle)
                y = Sin(angle)
                Return Self
        End Method
       
        Method Delete() ' destructor
                x = Null
                y = Null
        End Method
               
        Rem'
        bbdoc: Получть угол наклона вектора.
        returns: Угол наклона в градусах.
        EndRem
        Method ToAngle:Float()
                Return ATan2(y, x)
        End Method
       
        Rem'
        bbdoc: Копировать вектор.
        returns: Вектор.
        EndRem
        Method Copy:Float2()
                Return New Float2.Create(x, y)
        End Method
       
        Rem'
        bbdoc: Установить вектор.
        returns: Ничего.
        EndRem
        Method Set(x:Float = 0.0, y:Float = 0.0)
                Self.x = x
                Self.y = y
        End Method
       
        Rem'
        bbdoc: Перевернуть вектор.
        returns: Вектор.
        EndRem
        Method Reverse:Float2()
                Return New Float2.Create(- x, - y)
        End Method
       
        Rem'
        bbdoc: Прибавить вектор.
        returns: Вектор.
        EndRem
        Method Add:Float2(f2:Float2)
                Return New Float2.Create(x + f2.x, y + f2.y)
        End Method
       
        Rem'
        bbdoc: Отнять вектор.
        returns: Вектор.
        EndRem
        Method Sub:Float2(f2:Float2)
                Return New Float2.Create(x - f2.x, y - f2.y)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method Mul:Float2(f2:Float2)
                Return New Float2.Create(x * f2.x, y * f2.y)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method Div:Float2(f2:Float2)
                Return New Float2.Create(x / f2.x, y / f2.y)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method AddS:Float2(s:Float)
                Return New Float2.Create(x + s, y + s)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method SubS:Float2(s:Float)
                Return New Float2.Create(x - s, y - s)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method MulS:Float2(s:Float)
                Return New Float2.Create(x * s, y * s)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method DivS:Float2(s:Float)
                Return New Float2.Create(x / s, y / s)
        End Method
       
        Rem'
        bbdoc: Умножить вектор.
        returns: Вектор.
        EndRem
        Method AddTimeStep(f2:Float2, dt:Float)
                x:+f2.x * dt
                y:+f2.y * dt
        End Method
       
        Rem'
        bbdoc: Точка векторов.
        returns: Точку (Float).
        EndRem
        Method Dot:Float(f2:Float2)
                Return x * f2.x + y * f2.y
        End Method
       
        Rem'
        bbdoc: Пересечь вектора.
        returns: Пересечение (Float).
        EndRem
        Method Cross:Float(f2:Float2)
                Return x * f2.y - y * f2.x
        End Method
       
        Rem'
        bbdoc: Левый перпендикуляр.
        returns: Вектор.
        EndRem
        Method LPerp:Float2()
                Return New Float2.Create(- y, x)
        End Method
       
        Rem'
        bbdoc: Правый перпендикуляр.
        returns: Вектор.
        EndRem
        Method RPerp:Float2()
                Return New Float2.Create(y, - x)
        End Method
       
        Rem'
        bbdoc: Спроецировать вектор.
        returns: Вектор.
        EndRem
        Method Project:Float2(f2:Float2)
                Return f2.MulS(Dot(f2) / f2.Dot(f2))
        End Method
       
        Rem'
        bbdoc: Повернуть вектор.
        returns: Вектор.
        EndRem
        Method Rotate:Float2(f2:Float2)
                Return New Float2.Create(x * f2.x - y * f2.y, x * f2.y + y * f2.x)
        End Method
       
        Rem'
        bbdoc: Повернуть вектор в обратную сторону.
        returns: Вектор.
        EndRem
        Method UnRotate:Float2(f2:Float2)
                Return New Float2.Create(x * f2.x + y * f2.y, y * f2.x - x * f2.y)
        End Method
       
        Rem'
        bbdoc: Получть длинну вектора.
        returns: Длинна вектора.
        EndRem
        Method Length:Float()
                Return Sqr(Dot(Self))
        End Method
       
        Rem'
        bbdoc: Получить квадрат длинны вектора.
        returns: Квадрат длинны вектора.
        EndRem
        Method LengthSq:Float()
                Return Dot(Self)
        End Method
       
        Rem'
        bbdoc: Установить длинну вектора.
        returns: Вектор.
        EndRem
        Method SetLength:Float2(ln:Float)
                Local f2:Float2 = Normalize()
                f2.x:*ln
                f2.y:*ln
                Return f2
        End Method
       
        Rem'
        bbdoc: Нормализировать вектор.
        returns: Вектор.
        EndRem
        Method Normalize:Float2()
                Return MulS(1.0 / Length())
        End Method
       
        Method Compare:Int(withObject:Object)
                Return.Compare(Self, withObject)
        End Method
       
        Method ToString:String()
                Return "{x:" + String(x) + "}{y:" + String(y) + "}"
        End Method
End Type


Nex 30.12.2012 06:42

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Спасибо, только как этот код использовать? Хотя бы семпл приложил. :)

Черный крыс 30.12.2012 16:41

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Ну например нам нужно двигать точку, которая имеет скорость и направление.

Создаем 2 вектора :

1 - это сама точка ( вектор его координат )
2 - это вектор скорости и направления.

КОД:

Код:

Graphics 1024, 768

Local pos:Float2 = New Float2.Create(512, 384)
Local speed:Float = 1.0
Local dir:Float2 = New Float2.ForAngle(90)

Local drawDir:Float2 = dir.Copy()

While Not KeyHit(KEY_ESCAPE)

        If KeyDown(KEY_A)
                speed:+0.01
                speed = Min(speed, 5.0)
        End If

        If KeyDown(KEY_Z)
                speed:-0.01
                speed = Max(speed, 0.0)
        End If
       
        If KeyDown(KEY_UP)
                pos = pos.Add(dir.MulS(speed))
        End If
       
        If KeyDown(KEY_DOWN)
                pos = pos.Sub(dir.MulS(speed))
        End If
       
        If KeyDown(KEY_LEFT)
                dir = dir.Rotate(New Float2.ForAngle(- 1.0 * Max((speed / 2.0), 1.0)))
        End If
       
        If KeyDown(KEY_RIGHT)
                dir = dir.Rotate(New Float2.ForAngle(1.0 * Max((speed / 2.0), 1.0)))
        End If
       
        Cls()
       
        SetBlend(ALPHABLEND)
        SetAlpha(1.0)
        SetColor(255, 255, 255)
       
        DrawText("Speed = " + String(speed) + " (press A/Z)", 10, 10)
       
        DrawOval(pos.x - 8, pos.y - 8, 17, 17)
       
        drawDir = dir.Copy().MulS(15.0)
       
        SetColor(255, 64, 64)
        DrawLine(pos.x, pos.y, pos.x + drawDir.x, pos.y + DrawDir.y)
       
        Flip(1)
Wend

End


Nex 09.01.2013 19:22

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Помогите проблемку решить. :)
Написал я парсер файлов для файлов с настройками. По дефолту все данные в String. И вот вопрос: как автоматом переводить данные под нужный тип данных ведь переменные могут быть и Int и Float?

Randomize 09.01.2013 21:37

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
есть же:
Код:

String.FromInt()
String.FromFloat()
String.ToInt()
String.ToFloat()

Осталось добавить IsInt(str:String) и IsFloat(str:String)
где идёт тупо проверка на содержащиеся "лишние" символы.

Для инта это минус и цифры от одного до девяти.
Тут кроме тупого перебора строки пока не наткнёшься на "левый" символ ничего хитрого то и не придумаешь.

Хотя можно тупо сравнить 0 и наш стринг превращённый в инт. Блиц то не ругается. Можно прям так и писать
Код:

Local h:Int = (15 * "Здарова".ToInt())
Но это извращение!


Для флоата всё тоже самое только с точкой
String.Find поможет найти точку.

Главное перед проверкой на Int/Float делать Trim чтоб всякие переводы кареток да табуляторы убрать.

yorri 17.03.2013 17:07

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Вопрос.
Может кто подскажет (линком, функцией, библиотекой...)

Есть квадратное изображение. Нужно его поворачивать на определенный угол, но относительно не центра или верх-лево, а, например, верх-право, низ-лево, низ-право.

В принципе сделал через перенос координат, но если изображение с картинкой, то получается ерунда...
Спасибо.

Nikich 17.03.2013 17:16

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
SetImageHandle image,x,y
image - хендл вашей картинки
x,y - координаты точки, относительно которой хотите вращать картинку.
Учтите, после применения функции картинка будет рисоваться(!) также не с левого верхнего угла, а с тех координат, что вы указали.

yorri 17.03.2013 17:39

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Спасибо.
Но потом можно вернуть все на место....SetImageHandle Image,0,0
Плюс компенсировать по нужной оси размер картинки

SetImageHandle Image,0,63
SetRotation(45)
DrawImage (Image, х+200, y+64) ' +64 компенсируем
SetRotation(0)
SetImageHandle Image,0,0

Тогда еще вопрос. Отсчет ведется от 0 до ширины/высоты картинки -1, так?

То есть, если нужно повернуть относительно угла верх-право картинку 64х64, тогда SetImageHandle Image,63,63
Правильно я думаю?

Nikich 17.03.2013 18:00

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
ЕМНИП, да, так как считаем от нуля.

Reizel 17.03.2013 22:38

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
а мне кажется, таки 64\64, ибо точка поворота будет у правого нижнего пикселя + нижнего правого угла. А вообще, полезно создать папку для "тестов" - и отлаживать там всякие спорные моменты (я так отлаживал шум перлина, астар, инверс.кинематику и прочее, очень помогает при написании верных рабочих формул\функций)

Nikich 17.03.2013 22:51

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
К тому же, неплохо создать папку с верными реализациями того или иного момента, дабы в будущем не проделывать одну такую же работу.

yorri 18.03.2013 12:38

Ответ: Вопрос-Ответ (для новичков BlitzMax)
 
Так и сделал ))


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

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