Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax

Ответ
 
Опции темы
Старый 29.12.2012, 14:32   #196
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Сообщение от Randomize Посмотреть сообщение
Угол падения равен углу отражения.
Что ещё надо?
Ну так сделал. От стенок нормально работает, а вот при столкновении с палкой мячик начинает дергать и он проходит сквозь палку.
(Offline)
 
Ответить с цитированием
Старый 29.12.2012, 15:32   #197
Черный крыс
 
Сообщений: n/a
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Наоботот. Угол отражения равен углу падения.

Насчет пинг-понга - в БМаксе в комплект поставки входят еще примеры, и там присутствует пинг-понг-без-физ-двига.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (29.12.2012)
Старый 30.12.2012, 02:39   #198
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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
Черный крыс
 
Сообщений: n/a
Ответ: Вопрос-Ответ (для новичков 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)
Старый 30.12.2012, 06:42   #200
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Спасибо, только как этот код использовать? Хотя бы семпл приложил.
(Offline)
 
Ответить с цитированием
Старый 30.12.2012, 16:41   #201
Черный крыс
 
Сообщений: n/a
Ответ: Вопрос-Ответ (для новичков 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 (30.12.2012)
Старый 09.01.2013, 19:22   #202
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Помогите проблемку решить.
Написал я парсер файлов для файлов с настройками. По дефолту все данные в String. И вот вопрос: как автоматом переводить данные под нужный тип данных ведь переменные могут быть и Int и Float?
(Offline)
 
Ответить с цитированием
Старый 09.01.2013, 21:37   #203
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений
(для 6,853 пользователей)
Ответ: Вопрос-Ответ (для новичков 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
(Online)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (10.01.2013)
Старый 17.03.2013, 17:07   #204
yorri
Оператор ЭВМ
 
Аватар для yorri
 
Регистрация: 06.03.2009
Сообщений: 21
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Вопрос.
Может кто подскажет (линком, функцией, библиотекой...)

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

В принципе сделал через перенос координат, но если изображение с картинкой, то получается ерунда...
Спасибо.
(Offline)
 
Ответить с цитированием
Старый 17.03.2013, 17:16   #205
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

SetImageHandle image,x,y
image - хендл вашей картинки
x,y - координаты точки, относительно которой хотите вращать картинку.
Учтите, после применения функции картинка будет рисоваться(!) также не с левого верхнего угла, а с тех координат, что вы указали.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
yorri (17.03.2013)
Старый 17.03.2013, 17:39   #206
yorri
Оператор ЭВМ
 
Аватар для yorri
 
Регистрация: 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
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

ЕМНИП, да, так как считаем от нуля.
(Offline)
 
Ответить с цитированием
Старый 17.03.2013, 22:38   #208
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

а мне кажется, таки 64\64, ибо точка поворота будет у правого нижнего пикселя + нижнего правого угла. А вообще, полезно создать папку для "тестов" - и отлаживать там всякие спорные моменты (я так отлаживал шум перлина, астар, инверс.кинематику и прочее, очень помогает при написании верных рабочих формул\функций)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nikich (17.03.2013)
Старый 17.03.2013, 22:51   #209
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

К тому же, неплохо создать папку с верными реализациями того или иного момента, дабы в будущем не проделывать одну такую же работу.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Reizel (18.03.2013)
Старый 18.03.2013, 12:38   #210
yorri
Оператор ЭВМ
 
Аватар для yorri
 
Регистрация: 06.03.2009
Сообщений: 21
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Так и сделал ))
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com