|
29.12.2012, 14:32
|
#196
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Сообщение от Randomize
Угол падения равен углу отражения.
Что ещё надо?
|
Ну так сделал. От стенок нормально работает, а вот при столкновении с палкой мячик начинает дергать и он проходит сквозь палку.
|
(Offline)
|
|
29.12.2012, 15:32
|
#197
|
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Наоботот. Угол отражения равен углу падения.
Насчет пинг-понга - в БМаксе в комплект поставки входят еще примеры, и там присутствует пинг-понг-без-физ-двига.
|
|
|
Сообщение было полезно следующим пользователям:
|
|
30.12.2012, 02:39
|
#198
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Сообщение от Diablo1909
Насчет пинг-понга - в БМаксе в комплект поставки входят еще примеры, и там присутствует пинг-понг-без-физ-двига.
|
Посотрел пример оказалось что делаю практически так же. В примере используются две переменные для движения в стороны, а я использую sin, cos и угол шарика.
В общем с горем по полам сделал, но щас не могу понять как получать противоположный угол. Сделал просто angle: -angle, но работает через раз, иногда шарик пролетает сквозь ракетку либо угол тупо ставится в "0/-0" и мячик без конца летает туда-сюда, а так же пробовал angle = -angle, выходит тоже самое.
Подскажите плиз как надо.
|
(Offline)
|
|
30.12.2012, 03:54
|
#199
|
|
Ответ: Вопрос-Ответ (для новичков 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
|
|
|
Сообщение было полезно следующим пользователям:
|
|
30.12.2012, 06:42
|
#200
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Спасибо, только как этот код использовать? Хотя бы семпл приложил.
|
(Offline)
|
|
30.12.2012, 16:41
|
#201
|
|
Ответ: Вопрос-Ответ (для новичков 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
|
|
|
Сообщение было полезно следующим пользователям:
|
|
09.01.2013, 19:22
|
#202
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Помогите проблемку решить.
Написал я парсер файлов для файлов с настройками. По дефолту все данные в String. И вот вопрос: как автоматом переводить данные под нужный тип данных ведь переменные могут быть и Int и Float?
|
(Offline)
|
|
09.01.2013, 21:37
|
#203
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,358
Написано 2,472 полезных сообщений (для 6,854 пользователей)
|
Ответ: Вопрос-Ответ (для новичков 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 чтоб всякие переводы кареток да табуляторы убрать.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2013, 17:07
|
#204
|
Оператор ЭВМ
Регистрация: 06.03.2009
Сообщений: 21
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Вопрос.
Может кто подскажет (линком, функцией, библиотекой...)
Есть квадратное изображение. Нужно его поворачивать на определенный угол, но относительно не центра или верх-лево, а, например, верх-право, низ-лево, низ-право.
В принципе сделал через перенос координат, но если изображение с картинкой, то получается ерунда...
Спасибо.
|
(Offline)
|
|
17.03.2013, 17:16
|
#205
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
SetImageHandle image,x,y
image - хендл вашей картинки
x,y - координаты точки, относительно которой хотите вращать картинку.
Учтите, после применения функции картинка будет рисоваться(!) также не с левого верхнего угла, а с тех координат, что вы указали.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2013, 17:39
|
#206
|
Оператор ЭВМ
Регистрация: 06.03.2009
Сообщений: 21
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопрос-Ответ (для новичков 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
Правильно я думаю?
|
(Offline)
|
|
17.03.2013, 18:00
|
#207
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
ЕМНИП, да, так как считаем от нуля.
|
(Offline)
|
|
17.03.2013, 22:38
|
#208
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
а мне кажется, таки 64\64, ибо точка поворота будет у правого нижнего пикселя + нижнего правого угла. А вообще, полезно создать папку для "тестов" - и отлаживать там всякие спорные моменты (я так отлаживал шум перлина, астар, инверс.кинематику и прочее, очень помогает при написании верных рабочих формул\функций)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
17.03.2013, 22:51
|
#209
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
К тому же, неплохо создать папку с верными реализациями того или иного момента, дабы в будущем не проделывать одну такую же работу.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.03.2013, 12:38
|
#210
|
Оператор ЭВМ
Регистрация: 06.03.2009
Сообщений: 21
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Вопрос-Ответ (для новичков BlitzMax)
Так и сделал ))
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:11.
|