Список форумов форум

форум "Шахтеры Космоса"

Здрасьте!
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Chipmunk (физ. двиг.)

 
Начать новую тему   Ответить на тему    Список форумов форум "Шахтеры Космоса" -> Маленькие игры и программы
Предыдущая тема :: Следующая тема  
Автор Сообщение
AndyLy

цитировать



Репутация: +2    

Зарегистрирован: 26.10.2010
Сообщения: 198

СообщениеДобавлено: Пн Авг 22, 2011 7:55 am    Заголовок сообщения: Chipmunk (физ. двиг.) Ответить с цитатой

Это собственно не игра, а мои эксперименты при изучении.
В общем побаловался я с врапером для Chipmunk. Тяжко дается понимание, но сам двиг если разобраться простой.
Оф.сайт движка Chipmunk:
http://chipmunk-physics.net/

вот небольшой пример, что я смог сделать немного поняв основы:

_________________


Последний раз редактировалось: AndyLy (Ср Фев 06, 2013 10:44 am), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Вт Сен 27, 2011 2:18 pm    Заголовок сообщения: Ответить с цитатой

Я так понял движок основан на системе импульсов.
Когда я начал программировать свои полигоны то понял что из них надо делать не только определение коллизий, но и прикрутить движок. Глядя в интеренет можно найти много всяких учебников и так далее. Я стал изучать это все. Очень сложно. Все завязано на векторах. Вектор силы, вектор скорости. В общем надо разбираться. Жаль только, что пока что не нашел хороших примеров. В основном примеры видел на делфи, а читаю его я не очень....

AndyLy
Может сделаем физ движок основанный на импульсах? Полезно для развития.
Я уже эти полигоны написал вдоль и поперек. Особенно удобно это делать через Map а не через связанный список. Очень мощная штука. Мне понравилось. Для игр не заменима.
Почитав интернет я понял как правильно выталкивать объект один из другого. Но пока что правильно не реализовал. Запутался в коде.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndyLy

цитировать



Репутация: +2    

Зарегистрирован: 26.10.2010
Сообщения: 198

СообщениеДобавлено: Вт Сен 27, 2011 6:30 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Может сделаем физ движок основанный на импульсах?

Ну ты немного не по адресу: как я уже неоднократно заявлял: в математике я ноль.
Chipmunk кстати тоже завязан на векторах.
Написать движок очень сложная задача. Автор Chipmunk, умный парень, пишет его черт знает сколько и до сих пор не сделал финалку.
Я его сейчас потихоньку изучаю, там дебри такие жуть. Я имею ввиду сам двиг не код. Всякие ограничители, слои, группы, моменты сил тела...
Дело еще в том, что коллизии- это только часть движка, есть еще всяческие силы действующие на тело (гравитация, трение..), плюс расчеты свойств тела (эластичность, масса..).
В общем не думаю, что это хорошая идея, писать двиг.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Вт Сен 27, 2011 10:43 pm    Заголовок сообщения: Ответить с цитатой

ты можешь мне написать пример ?
А то у немя код что дан для примера не понятен. Если не трудно то напиши такой пример. Платформа и шар который может по ней передвигаться.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndyLy

цитировать



Репутация: +2    

Зарегистрирован: 26.10.2010
Сообщения: 198

СообщениеДобавлено: Ср Сен 28, 2011 2:58 am    Заголовок сообщения: Ответить с цитатой

Не особо заморачиваясь, на основе примера :
Код:
XIncludeFile "include\Chipmunk4PB_v0.4.pbi"
Global *space.cpSpace
Global *staticBody.cpBody, *mybody.cpBody
Global ticks, offset.cpVect
Global NewList myContact.cpVect()
Global NewList myContact1.cpVect()
Procedure DrawPolyShape(*poly.cpPolyShape)
  Protected *verts.cpVect=*poly\verts
  Protected *last.cpVect
  Protected v.cpVect
  Protected first.cpVect
  Protected last.cpVect
 
  *last=*verts+SizeOf(cpVect)*(*poly\numVerts-1)
  cpvrotate(v, *last, *poly\shape\body\rot)
  cpvadd(v, v, *poly\shape\body\p)
  cpv(last, v\x, v\y)
 
  For i=0 To *poly\numVerts-1
    cpvrotate(v, *verts, *poly\shape\body\rot)
    cpvadd(v, v, *poly\shape\body\p)
    LineXY(last\x, last\y, v\x, v\y, RGB(0, 0, 0))
    cpv(last, v\x, v\y)
    *verts+SizeOf(cpVect)
  Next
  Circle(*poly\shape\body\p\x, *poly\shape\body\p\y, 2,  #Red)
EndProcedure
Procedure DrawCircleShape(*circle.cpCircleShape)
  Protected x=*circle\tc\x
  Protected y=*circle\tc\y
  Protected r.f=*circle\r
  Protected a.f=*circle\shape\body\a
  Circle(x, y, r,#Blue)
  LineXY(x, y, x+Cos(a)*r, y+Sin(a)*r,#Green)
EndProcedure
Procedure DrawSegmentShape(*seg.cpSegmentShape)
  Protected a.cpVect
  Protected b.cpVect
 
  cpvrotate(a, *seg\a, *seg\shape\body\rot)
  cpvrotate(b, *seg\b, *seg\shape\body\rot)
  cpvadd(a, a, *seg\shape\body\p)
  cpvadd(b, b, *seg\shape\body\p)
 
  LineXY(a\x, a\y, b\x, b\y, RGB(0, 0, 0))
EndProcedure
ProcedureC DrawShape(*shape.cpShape, *datas)
  Select *shape\klass\type
    Case #CP_CIRCLE_SHAPE
      DrawCircleShape(*shape)
    Case #CP_SEGMENT_SHAPE
      DrawSegmentShape(*shape)
    Case #CP_POLY_SHAPE
      DrawPolyShape(*shape)
  EndSelect
EndProcedure
ProcedureC DrawCollisions()
  ForEach myContact()
    Circle(myContact()\x, myContact()\y, 2, #Blue)
  Next
  ClearList(myContact())
  ForEach myContact1()
    Circle(myContact1()\x, myContact1()\y, 2, #Green)
  Next
  ClearList(myContact1())
EndProcedure
ProcedureC FixBodyPositions(*body.cpBody, *datas)
  ;check if object is offscreen
  If *body\data <10>500 Or *body\p\x>680 Or *body\p\x<20>=1000: GetFPS_FPS=GetFPS_Count: GetFPS_Count=0: GetFPS_Start+1000: EndIf: ProcedureReturn GetFPS_FPS
EndProcedure
Procedure InitObjects()
  Protected *shape.cpShape
  Protected *body.cpBody
  Protected i, j
  Protected offset.cpVect
  Protected stagger.f
 
  cpInitChipmunk()
  cpResetShapeIdCounter()
 
  ;{/// PHYSIC ENVIRONMENT
  *staticBody=cpBodyNew(#INFINITY, #INFINITY)
 
  *space=cpSpaceNew()
  *space\iterations=10
  *space\damping = 0.3
  cpv(*space\gravity, 0, 100)
  cpSpaceResizeStaticHash(*space, 30.0, 10)
  cpSpaceResizeActiveHash(*space, 20.0, 10)
  ;}

; шарик (динамическое тело)
   moment=cpMomentForCircle(1,0,24,cpv(offset,0,0)) ; тело масса=1, внутр.рад=0, внешн.рад=40
  *mybody=cpBodyNew(1,moment); тело масса=1
   cpSpaceAddBody(*space,*mybody); добавляем тело в пространство
   *mybody\p\x=350: *mybody\p\y=200 ; устанавливаем координаты тела
   *shape=cpCircleShapeNew(*mybody,24,cpv(offset,0,0)) ; создаем форму для тела
   *shape\e=2 ; эластичность
   *shape\U=0.05 ; трение
   *shape\collision_type=1 ; тип коллизии
   cpSpaceAddShape(*space, *shape) ; добавляем форму в пространство

; платформа (статическое тело)
   *body=cpBodyNewStatic()
   *body\p\x=300: *body\p\y=400
   *shape=cpBoxShapeNew(*body, 300,50)
   *shape\e=0.2
   *shape\U=0.05
   *shape\collision_type = 0
   cpSpaceAddShape(*space, *shape)

EndProcedure

Procedure MoveObjects()
  ticks+1
  Protected steps.f=1.0
  Protected dt.f=1.0/60.0/steps
  Protected i
  For i=0 To steps
    cpSpaceStep(*space, dt)
    cpSpaceEachBody(*space, @FixBodyPositions(), #Null)
  Next   
EndProcedure
Procedure DrawObjects()
  ClearScreen(RGB(255, 255, 255))
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Outlined)
  cpSpaceHashEach(*space\activeShapes, @DrawShape(), #Null)
  cpSpaceHashEach(*space\staticShapes, @DrawShape(), #Null)
  DrawCollisions()
  StopDrawing()
  FlipBuffers()   
EndProcedure
Procedure FreeObjects()
  cpSpaceFree(*space)
  cpBodyFree(*staticBody)
EndProcedure

InitSprite()
InitKeyboard()
InitObjects()
;/ ---------------------------------------------------------------------------------------------------------------------
ProcedureC col_preSolve(*arb.cpArbiter, *space.cpSpace, *pData)
  AddElement(myContact())
  cpArbiterGetPoint(myContact(),*arb, 0)
  ProcedureReturn #True
EndProcedure

ProcedureC col_preSolve1(*arb.cpArbiter, *space.cpSpace, *pData)
  AddElement(myContact1())
  cpArbiterGetPoint(myContact1(),*arb, 0)
  ProcedureReturn #True
EndProcedure

cpSpaceAddCollisionHandler(*space, 0, 1, #Null, @col_preSolve(), #Null, #Null, #Null)
cpSpaceAddCollisionHandler(*space, 0, 0, #Null, @col_preSolve1(), #Null, #Null, #Null)
;/ ---------------------------------------------------------------------------------------------------------------------

OpenWindow(100, 0, 0, 640, 480, "Chipmunk4PB CollisionsHandler Demo", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(100), 0, 0, 640, 480, 0, 0, #PB_Screen_WaitSynchronization )
Repeat: ClearScreen(0)
  DrawObjects()
  MoveObjects()
  ExamineKeyboard()
; стрелки влево / вправо / вверх - добавляем импульс
   If  KeyboardReleased(#PB_Key_Left): cpBodyApplyImpulse(*mybody,cpv(offset,-40,0), cpv(offset,0,0)): EndIf
   If  KeyboardReleased(#PB_Key_Right): cpBodyApplyImpulse(*mybody,cpv(offset,40,0), cpv(offset,0,0)): EndIf
   If  KeyboardReleased(#PB_Key_Up): cpBodyApplyImpulse(*mybody,cpv(offset,0,-100), cpv(offset,0,0)): EndIf
; A,D - просто сдвигаем
   If  KeyboardPushed(#PB_Key_A): *mybody\p\x-1: EndIf
   If  KeyboardPushed(#PB_Key_D): *mybody\p\x+1: EndIf

Until KeyboardPushed(#PB_Key_Escape) Or WaitWindowEvent(1)=#PB_Event_CloseWindow
FreeObjects()
End

_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Ср Сен 28, 2011 7:05 am    Заголовок сообщения: Ответить с цитатой

Буду разбираться
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Ср Сен 28, 2011 7:08 am    Заголовок сообщения: Ответить с цитатой

Спасибо
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Ср Сен 28, 2011 7:18 am    Заголовок сообщения: Ответить с цитатой

Немного не привычно после того как ты сам думал что будет показываться, а что нет. Теперь как бы ООП получается.

Надо экспериментировать однозначно, немного сути уловил, теперь возьму несколько спрайтов. Посмотрим смогу ли я правильно прикрутить
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndyLy

цитировать



Репутация: +2    

Зарегистрирован: 26.10.2010
Сообщения: 198

СообщениеДобавлено: Ср Сен 28, 2011 9:23 am    Заголовок сообщения: Ответить с цитатой

Я немного обшибся в коменте :
Цитата:
moment=cpMomentForCircle(1,0,24,cpv(offset,0,0)) ; тело масса=1, внутр.рад=0, внешн.рад=40

внешний радиус=24 , думаю ты догадался.
Цитата:
Немного не привычно после того как ты сам думал что будет показываться, а что нет. Теперь как бы ООП получается.

Честно говоря не понял о чем ты.
Цитата:
Посмотрим смогу ли я правильно прикрутить

С этим могут быть проблемы. Мне пришлось довольно таки криво прикручивать. В основном из-за полигонов.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Ср Сен 28, 2011 12:39 pm    Заголовок сообщения: Ответить с цитатой

AndyLy писал(а):
С этим могут быть проблемы. Мне пришлось довольно таки криво прикручивать. В основном из-за полигонов.

Ну... поэтому я хочу разработать свое API без всяких причуд...

В столкновениях полигонов моего движка осталось выдавить фигуру на длину нормали. Потом можно будет добавить импульс и момент вращения. Получится практически работоспособный движок. Может даже тебе пригодится.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Артём

цитировать



Репутация: 0    

Зарегистрирован: 27.11.2010
Сообщения: 20

СообщениеДобавлено: Ср Сен 28, 2011 12:40 pm    Заголовок сообщения: Ответить с цитатой

AndyLy писал(а):
Честно говоря не понял о чем ты.

По этому поводу. В движке PB Ты сам контролируешь когда показать спрайт, а когда нет. А тут получается конвеер. По сути похоже, но различия все же есть.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndyLy

цитировать



Репутация: +2    

Зарегистрирован: 26.10.2010
Сообщения: 198

СообщениеДобавлено: Ср Сен 28, 2011 3:57 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Получится практически работоспособный движок. Может даже тебе пригодится.

Интересно будет посмотреть. "Пощупаю" обязательно.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Смеется Улыбка Smile
Грустный Sad Surprised Shocked
Confused Cool В очках LOL
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Дополнительные смайлики

 • Добавить изображение
 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов форум "Шахтеры Космоса" -> Маленькие игры и программы Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS