1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Пишу Арканоид, нужна помощь в математике

Тема в разделе "Мастерская", создана пользователем Solmyr, 1 фев 2008.

  1. Solmyr

    Solmyr

    Регистрация:
    25 июл 2007
    Сообщения:
    100
    Делается совершенно по фану, для себя, ну и коллег развлечь =) Пишу в недружелюбной среде C/SIDE (MBS ?Navision). Вопросов по кодингу нет, а вот с математикой (геометрией) у меня явные пробелы, которые нужно восполнить. В принципе, игра уже готова, мячик летает, отражается от препятствий, которые исчезают по прошествии заданного кол-ва отражений от них. Но, работает оно криво и глючно, выражается это нередкими пролетами мячика сквозь препятствия, или отражение не от препятствия, а на некотором расстоянии от него.

    Во первых, как оно работает:

    Есть мячик, который являет собой объект Shape, с типом Oval, с координатами X и Y,
    и параметрами Width и Height = 330, что является радиусом.

    Есть переменные:
    SpeedFactor - фактор скорости
    DisPlaceX - смещение мячика по оси X
    DisPlaceY - смещение мячика по оси Y

    SpeedFactor = модуль(DisPlaceX) + модуль(DisPlaceY)

    Движение мячика реализовано через таймер(OnTimer), и выглядит:
    BallX = BallX + DisPlaceX
    BallY = BallY + DisPlaceY
    Что ознаает, постоянное изменение координат мячика на величины DisPlaceX и DisPlaceY.

    Ноль системы координат находится в верхнем левом углу.
    Ось X направлена вправо.
    Ось Y - вниз.

    Отражение от стенок проблем не вызвало и работает четко, просто меняется знак одного из DisPlace'ов.

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

    Выглядит оно так:
    Если мячик ударился в левую половину платформы, то отразится он влево (откуда бы не прилетел), если в правую - отразится вправо. Чем ближе к краю платформы произошло столкновение - тем меньше будет угол между платформой и вектором мячика (грубо говоря, если ударился в самый край - полетит почти паралельно оси X, если в центр - почти паралельно оси Y).

    Не совсем уверен в корректности такого варианта, посоветуйте плз, как правильно должно работать отражение от платформы?

    Отражение от препятствий. Смысл сводится к определению пересечения отрезка образованного (BallX,BallY) и (BallX + n,BallY + n), с каждой из сторон препятствия (n - константа, у нее меняется только знак, в зависимости от проверяемой стороны препятствия и направления мячика). Так-же, возможен вариант, когда мячик задевает за препятствие краем, центр мячика с препятствием не пересечется. Для этого я делаю точно такую-же проверку, только прибавляю/отнимаю от координат центра - значение радиуса, что бы сместить
    проверяемый отрезок. Например, если мячик летит снизу вверх, в лево, я делаю две проверки: пересечение отрезков:
    A(BallX,BallY) B(BallX - n,BallY - n) и правую вертикальную сторону препятствия. (A1,B1)
    и
    A(BallX - R,BallY + R) B(BallX - R - n,BallY + R - n) и правую вертикальную сторону препятствия. (A1,B1)

    В случае, если пересечение произошло - меняем знак DisPlaceX или DisPlaceY, в зависимости от того, с какой стороной было пересечение и откуда двигался мячик.

    Реализация:

    Определение пересечения корректно работать не хочет. Хз, или ошибка в моем методе, или метод изначально неправильный... :unknw:
     
  2.  
  3. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    34.670
    Solmyr, хм, бред какой-то. Нужно смотреть пересечение отрезка (b_x, b_y, b_x + R*n_x, b_y + R*n_y) с препятствием, где n - единичный вектор по скорости движения шарика.
    Что касается отражение от биты - то имхо надо делать по законам физики, то есть вводить массу биты и массу шарика (отбалды, но масса биты >> массы шарика) и при столкновении все элементарно определяется по формулам 6го класса школы.

    Добавлено через 1 минуту
    Вообще такие вопросы лучше в кодерский уголок.
     
    Последнее редактирование: 1 фев 2008
    kreol нравится это.
  4. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Solmyr, угол отражение равен углу падения. По модулю, причем угол надо отсчитывать относительно оси Y.
     
    kreol нравится это.
  5. kulguy Дабл Арчвайл

    kulguy

    Регистрация:
    12 сен 2007
    Сообщения:
    376
    Я так думаю - угол падения = углу отражения, если мячик попадет в середину, если ближе к левому краю - меньше угол, если к правому краю - больше угол.
     
    Solmyr нравится это.
  6. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Да не, тут логичней как Dimouse сказал, ввести массу, тогда у шарика и рокетки появятся импульс, ускорение и угол будет зависить уже от скорости шарика в момент удара... Было бы интересно поглядеть :)
     
  7. Solmyr

    Solmyr

    Регистрация:
    25 июл 2007
    Сообщения:
    100
    Dimouse, как я говорил, у меня некоторые пробелы в математическом образовании. К сожалению, понятие "единичный вектор" в их числе.

    Насколько я понял твой вариант (для наглядности нарисовал) - мы будем проверять пересечение отрезка AB с EF. В первом случае этого хватит. Во втором - нет, нужна проверка пересечения CD с EF. У меня эта проверка реализована, но, работает все-равно не корректно (не проверка, а игра в целом).

    Насчет законов физики - плиз ткните носом в конкретные формулы для даного случая. Я плохо помню, чем занимался в шестом класе, но похоже не тем, чем нужно :)

    Low_Pressure, так у меня работает отражение от обычных стен. Можно без проблем реализовать тот же принцип и в случае с платформой, но тогда будет не интересно играть. Нужно дать игроку возможность послать мяч в правильном направлении, подставляя ту или иную часть платформы. Или, убрать нафик платформу, и сделать дно отражающим. Будет такой себе дзен арканоид... Созерцательный :)

    kulguy, несимметрично получится, если к левому краю меньше угол, а к правому больше.
     

    Вложения:

    • ark1.JPG
      ark1.JPG
      Размер файла:
      10,1 КБ
      Просмотров:
      576
  8. Low_Pressure Titanium Helmet of Musicianship owner

    Low_Pressure

    Legacy

    Регистрация:
    1 окт 2005
    Сообщения:
    8.667
    Solmyr, сделай ракетку закругленной :) Тогда отсчитывать угол падения надо будет не от оси y, а от радиуса в точке касания.

    Это конечно не значит, что она должна быть идеально круглой формы. Можно ее сделать овальной, при этом на экране отображать только верхнюю половину овала.
     

    Вложения:

    Последнее редактирование: 1 фев 2008
    Solmyr нравится это.
  9. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    34.670
    Solmyr, да, я похоже что сказал немного неправильно, но в случае маленького шарика, должно быть незаметно.

    Добавлено через 3 минуты
    Хм, ударяться он должен с радиусом, перпендикулярным препятствию. То есть надо точно найти вектор перпендикулярный стенке (допустим x, направлен наружу) и смотреть пересечение (b_x,b_y,b_x-R*x_x,b_y-R*x_y) со стенкой.
     
    Последнее редактирование: 1 фев 2008
    Solmyr нравится это.
  10. E.Q.

    E.Q.

    Регистрация:
    24 авг 2006
    Сообщения:
    452
    Solmyr, советую ознакомиться с даным туториалом. Хотя он написан для Флеша, но думаю не будет проблем с понятием кода.

    http://www.tonypa.pri.ee/vectors/tut07.html
    Здесь очень подробно описываются векторы, но сама ссылка ведет на одну из частей, с которых как раз начинается описание взаимодействия окружностей с прямыми. Еще там имеется описание столкновения окружности с улом, так что можно будет сделать отскок шарика от блоков более реалистичным.

    Туториал, к сожалению не закончем и кончается на рассмотрении взаимодействия окружности с дугой, как раз, что советовал Low_Pressure.
     
    Solmyr нравится это.
  11. Solmyr

    Solmyr

    Регистрация:
    25 июл 2007
    Сообщения:
    100
    Low_Pressure, да, именно так я и планировал изначально. Но, незнание формул помешало мне сделать нормальную реализацию.
    E.Q., очень похоже, что это именно то что нужно! Спасибо :)
     
  12. kulguy Дабл Арчвайл

    kulguy

    Регистрация:
    12 сен 2007
    Сообщения:
    376
    Solmyr, пусть x будет длина перпендикуляра AO в середину ракетки BC (O принадлежит BC, В-левый край, C-правый край).
    Y будет угол относительно середины (<A).
    Если шар попадает в середину, то y=90, у=90-arccos BC/AB, если шар попадет в левую часть и Y=90+arccos BC/AB - если в правую.
    Тогда угол отражения = |Y-90| - если шар летит слева, а если справа - все наоборот.

    Добавлено через 2 часа 44 минуты
    Вот еще исходник для арканоида на бейсике (qbasic, basica), посмотри, разберись
    Arcaniod v 0.95 beta
    10.02.2002

    10 N=14: DEFM N+1: VAC: N=14: S=0: A=1: L=0
    15 FOR I=0 TO 6: DRAW N+1,I:NEXT I
    20 FOR I=0 TO N: IF RAN#<0.5 THEN 40
    30 Z(I)=1:DRAW I,6: L=L+1
    40 NEXT I
    50 FOR I=0 TO 4: DRAW I,0: NEXT I: C=0: Y=1: X=2
    60 FOR I=0 TO 60: GOSUB 260: DRAWC X,Y: X=C+2: DRAW X,Y
    70 IF K=4 THEN 80: NEXT I
    80 DRAWC X,Y
    90 GOTO 90+10*A
    100 X=X+1: Y=Y+1: GOTO 140
    110 X=X+1: Y=Y-1: GOTO 140
    120 X=X-1: Y=Y+1: GOTO 140
    130 X=X-: Y=Y-1
    140 IF X<0; X=0: A=A-2
    150 IF X>N; X=N: A=A+2
    160 IF Y=6; A=A+1
    170 IF Y=0 THEN 390
    180 DRAW X,Y: IF Y=\5 THEN 190 =\ - НЕ РАВНО
    182 IF A=1; GOSUB 300
    185 IF A=3; GOSUB 300
    190 IF Y=\1 THEN 250
    200 IF C-X>0 THEN 250
    202 IF C-X<=-4 THEN 250
    205 A=A-1
    250 FOR I=0 TO 3: GOSUB 260: NEXT I
    255 GOTO 80
    260 K=ASCI KEY: IF K=54 THEN 290
    270 IF K=\52; RETURN
    280 C=C-1:IF C=-1; C=0
    285 DRAWC C+4,0: DRAW C,0: RETURN
    290 C=C+1: IF C=N-2; C=N-3
    295 DRAWC C-1,0: DRAW C+3,0: RETURN
    300 IF Z(X)=1 THEN 330
    305 IF Z(X-1)=1; IF A=3 THEN 320
    307 IF Z(X+1)=0; RETURN
    310 IF A=1; A=4: Z(X+1)=0: DRAWC X+1,6: GOTO 340
    315 RETURN
    320 A=2: Z(X-1)=0: DRAWC X-1,6: GOTO 340
    330 A=A+1: Z(X)=0: DRAWC X,6
    340 S=S+10: CSR 9,: PRINT S;:IF S=L*10 THEN 370
    360 RETURN
    370 PRINT "YOU WIN"
    380 END
    390 PRINT "YOU LOSE"
    Тока эта красота для микрокалькулятора электроника мк-85, взято с mk85.narod.ru
     
    Последнее редактирование: 2 фев 2008
    Vladar, kreol и Solmyr нравится это.
  13. kreol Старший офицер Чёрной Гвардии

    kreol

    Администратор

    Регистрация:
    2 июл 2007
    Сообщения:
    112.513
    Ты прямо мне как будто детство вернул, золотое время, когда изумительную игру можно было самому сделать за полчаса, а за три - маленький шедевр (типа "Погони" или "Ханойской башни")...) Спасибо!)
     
    Lav-ka нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление