purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 3:28 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Немного о движении в 2D
СообщениеДобавлено: Пн янв 30, 2012 2:59 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
В общем у многих в том числе и у меня возникают вопросы, а именно...

Движется объект, а ему на пути стоит стена, надо в нее упереться раз, второе это двигаться вдоль стены, при этом не проникая во внутрь и не останавливаться....

Немного мучений и 2д движение готово, вот можно посмотреть в пример кода, конечно пример не оптимизирован, но суть и принцип понятны....

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
InitSprite()
InitKeyboard()
 
 
OpenWindow(0,0,0,800,600,"Как бы физика")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
Structure tob
  x.l
  y.l
 
  w.l
  h.l
 
  type.l
  id.l
  speedx.l
  speedy.l
EndStructure
 
Global NewList tob.tob()
Global NewList ctob.tob()
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
 
  If x1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1<x2 And x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If y1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If y1+h1>=y2 And y1<= y2+h2
    p+1
  EndIf
   
  If p>=3
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure
 
Procedure addToB(type, x, y, w, h)
 
  AddElement(tob())
  With tob()
    tob()\type=type
    tob()\x=x
    tob()\y=y
    tob()\w=w
    tob()\h=h
    tob()\id=Random(1000000)
  EndWith
   
EndProcedure
 
Procedure DrawTob()
  StartDrawing(ScreenOutput())
  ForEach tob()
    Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(106, 135, 232))
  Next
  StopDrawing()
EndProcedure
 
Procedure ProcToB()
  ClearList(ctob())
  ForEach tob()
    If tob()\type=1
      If KeyboardPushed(#PB_Key_Up)     : tob()\speedy=-1 : EndIf
      If KeyboardPushed(#PB_Key_Down)   : tob()\speedy=1  : EndIf
      If KeyboardPushed(#PB_Key_Left)   : tob()\speedx=-1 : EndIf
      If KeyboardPushed(#PB_Key_Right)  : tob()\speedx=1  : EndIf
 
    EndIf
  Next
  CopyList(tob(), ctob())
  ForEach tob()
    ForEach ctob()
      If tob()\id<>ctob()\id
        If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedx=0
        EndIf
        If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedy=0
        EndIf
      EndIf
    Next
  Next
  ForEach tob()
    tob()\x+tob()\speedx
    tob()\y+tob()\speedy
  Next
 ClearList(ctob())
EndProcedure
 
 
For i=0 To 20
  addToB(0,Random(700),Random(600),Random(80)+20,Random(80)+20)
Next
 
 
addToB(1,100,100,20,20)
 
Repeat
  event=WaitWindowEvent(10)
  FlipBuffers()
  ClearScreen(0)
 
  ExamineKeyboard()
 
  DrawTob()
 
  ProcToB()
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End


_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 30, 2012 3:01 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
кстати
Цитата:
CopyList(tob(), ctob())


это сделано для удобства перебора объектов)

еще я сделал одну глупость.....
Цитата:
tob()\id=Random(1000000)


иногда то рандом может быть одинков... но тут не сам код важен, а принципиальная схема...

_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн янв 30, 2012 10:41 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2286
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Годный пример. Добавил возможность телепорта от краев игрового поля в противоположные.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
InitSprite()
InitKeyboard()
 
 
OpenWindow(0,0,0,800,600,"Как бы физика")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
Structure tob
  x.l
  y.l
 
  w.l
  h.l
 
  type.l
  id.l
  speedx.l
  speedy.l
EndStructure
 
Global NewList tob.tob()
Global NewList ctob.tob()
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
 
  If x1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1<x2 And x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If y1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If y1+h1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If p>=3
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure
 
Procedure addToB(type, x, y, w, h)
 
  AddElement(tob())
  With tob()
    tob()\type=type
    tob()\x=x
    tob()\y=y
    tob()\w=w
    tob()\h=h
    tob()\id=Random(1000000)
  EndWith
   
EndProcedure
 
Procedure DrawTob()
  StartDrawing(ScreenOutput())
  ForEach tob()
    If tob()\x < 0
      tob()\x = 800 - 20
    ElseIf tob()\x > 800 - 20
      tob()\x = 0
    ElseIf tob()\y < 0
      tob()\y = 600 - 20
    ElseIf tob()\y > 600 - 20
      tob()\y = 0
    EndIf
    Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(106, 135, 232))
  Next
  StopDrawing()
 
EndProcedure
 
Procedure ProcToB()
  ClearList(ctob())
  ForEach tob()
    If tob()\type=1
      If KeyboardPushed(#PB_Key_Up)     : tob()\speedy=-1 : EndIf
      If KeyboardPushed(#PB_Key_Down)   : tob()\speedy=1  : EndIf
      If KeyboardPushed(#PB_Key_Left)   : tob()\speedx=-1 : EndIf
      If KeyboardPushed(#PB_Key_Right)  : tob()\speedx=1  : EndIf
 
    EndIf
  Next
  CopyList(tob(), ctob())
  ForEach tob()
    ForEach ctob()
      If tob()\id<>ctob()\id
        If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedx=0
        EndIf
        If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedy=0
        EndIf
      EndIf
    Next
  Next
  ForEach tob()
    tob()\x+tob()\speedx
    tob()\y+tob()\speedy
  Next
 ClearList(ctob())
EndProcedure
 
 
For i=0 To 20
  addToB(0,Random(700),Random(600),Random(80)+20,Random(80)+20)
Next
 
 
addToB(1,100,100,20,20)
 
Repeat
  event=WaitWindowEvent(10)
  FlipBuffers()
  ClearScreen(0)
 
  ExamineKeyboard()
 
  DrawTob()
 
  ProcToB()
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End


_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 31, 2012 8:49 am 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
немного с физикой

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
InitSprite()
InitKeyboard()
 
 
OpenWindow(0,0,0,800,600,"Как бы физика")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
Structure tob
  x.f
  y.f
 
  w.l
  h.l
 
  type.l
  id.l
  speedx.f
  speedy.f
EndStructure
 
Global NewList tob.tob()
Global NewList ctob.tob()
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
 
  If x1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1<x2 And x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If y1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If y1+h1>=y2 And y1<= y2+h2
    p+1
  EndIf
   
  If p>=3
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure
 
Procedure addToB(type, x, y, w, h)
 
  AddElement(tob())
  With tob()
    tob()\type=type
    tob()\x=x
    tob()\y=y
    tob()\w=w
    tob()\h=h
    tob()\id=Random(1000000)
  EndWith
   
EndProcedure
 
Procedure DrawTob()
  StartDrawing(ScreenOutput())
  ForEach tob()
    If tob()\x < 0
       tob()\x = 800 - 20
     ElseIf tob()\x > 800 - 20
       tob()\x = 0
     ElseIf tob()\y < 0
       tob()\y = 600 - 20
     ElseIf tob()\y > 600 - 20
       tob()\y = 0
     EndIf
    Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(106, 135, 232))
  Next
  StopDrawing()
EndProcedure
 
Procedure ProcToB()
  ClearList(ctob())
  ForEach tob()
    If tob()\type=1
      If KeyboardPushed(#PB_Key_Up)     : tob()\speedy-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Down)   : tob()\speedy+0.1  : EndIf
      If KeyboardPushed(#PB_Key_Left)   : tob()\speedx-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Right)  : tob()\speedx+0.1  : EndIf
      tob()\speedy+0.05
      If tob()\speedx>2: tob()\speedx=2 : EndIf
      If tob()\speedx<-2: tob()\speedx=-2 : EndIf
      If tob()\speedy>2: tob()\speedy=2 : EndIf
      If tob()\speedy<-2: tob()\speedy=-2 : EndIf
     
    EndIf
  Next
 
  CopyList(tob(), ctob())
  ForEach tob()
  ForEach ctob()
      If tob()\id<>ctob()\id
        If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedx*-1/2
          tx=1
        EndIf
        If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
          tob()\speedy*-1/2
          ty=1
        EndIf
      EndIf
    Next
  Next
 
  ForEach tob()
    tob()\x+tob()\speedx
    tob()\y+tob()\speedy
  Next
 ClearList(ctob())
EndProcedure
 
 
For i=0 To 30
  addToB(0,Random(700),Random(600),Random(20)+20,Random(20)+20)
Next
 
 
addToB(1,100,100,20,20)
 
Repeat
  event=WaitWindowEvent(1)
  FlipBuffers()
  ClearScreen(0)
 
  ExamineKeyboard()
 
  DrawTob()
 
  ProcToB()
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End


_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 31, 2012 1:56 pm 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Колесико изменяет упругость
ЛКМ - добавить квадратик

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
InitSprite()
InitMouse()
InitKeyboard()
 
 
OpenWindow(0,0,0,800,600,"Как бы физика")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
Structure tob
  x.f
  y.f
 
  w.l
  h.l
 
  type.l
  id.l
  speedx.f
  speedy.f
EndStructure
 
Global NewList tob.tob()
Global NewList ctob.tob()
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
 
  If x1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1<x2 And x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If y1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If y1+h1>=y2 And y1<= y2+h2
    p+1
  EndIf
   
  If p>=3
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure
 
Procedure addToB(type, x, y, w, h)
 
  AddElement(tob())
  With tob()
    tob()\type=type
    tob()\x=x
    tob()\y=y
    tob()\w=w
    tob()\h=h
    tob()\id=Random(1000000)
  EndWith
   
EndProcedure
 
Procedure DrawTob()
  StartDrawing(ScreenOutput())
  ForEach tob()
    If tob()\x < 0
       tob()\x = 800 - 20
     ElseIf tob()\x > 800 - 20
       tob()\x = 0
     ElseIf tob()\y < 0
       tob()\y = 600 - 20
     ElseIf tob()\y > 600 - 20
       tob()\y = 0
     EndIf
    Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(106, 135, 232))
  Next
  StopDrawing()
EndProcedure
Global inst.f=2
Procedure ProcToB()
  ClearList(ctob())
  ForEach tob()
    If tob()\type=1
      If KeyboardPushed(#PB_Key_Up)     : tob()\speedy-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Down)   : tob()\speedy+0.1  : EndIf
      If KeyboardPushed(#PB_Key_Left)   : tob()\speedx-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Right)  : tob()\speedx+0.1  : EndIf
      tob()\speedy+0.05
      If tob()\speedx>2: tob()\speedx=2 : EndIf
      If tob()\speedx<-2: tob()\speedx=-2 : EndIf
      If tob()\speedy>2: tob()\speedy=2 : EndIf
      If tob()\speedy<-2: tob()\speedy=-2 : EndIf
     
    EndIf
  Next
 
  CopyList(tob(), ctob())
  ForEach tob()
  ForEach ctob()
      If tob()\id<>ctob()\id
        If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedx*-1/inst.f
          tx=1
        EndIf
        If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
          tob()\speedy*-1/inst.f
          ty=1
        EndIf
      EndIf
    Next
  Next
 
  ForEach tob()
    tob()\x+tob()\speedx
    tob()\y+tob()\speedy
  Next
 ClearList(ctob())
EndProcedure
 
 
; For i=0 To 50
;   addToB(0,Random(700),Random(600),Random(20)+20,Random(20)+20)
; Next
 
 
addToB(1,100,100,20,20)
 
Repeat
  event=WaitWindowEvent(1)
  FlipBuffers()
  ClearScreen(0)
 
  ExamineKeyboard()
  ExamineMouse()
 
  DrawTob()
 
  StartDrawing(ScreenOutput())
  Circle(MouseX(), MouseY(),4,$FFFF)
  DrawText(0,0,StrF(inst,2))
  StopDrawing()
 
  inst+MouseWheel()/10
 
  If MouseButton(1) And mb=0
    addToB(0,MouseX(), MouseY(), 20,20)
    mb=1
  EndIf
 
  If MouseButton(1)=0 : mb=0 : EndIf
 
  ProcToB()
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End


_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 01, 2012 10:39 am 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
вот еще немного с физикой сцена )))

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
InitSprite()
InitMouse()
InitKeyboard()
 
 
OpenWindow(0,0,0,800,600,"Как бы физика")
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
Structure tob
  x.f
  y.f
 
  w.l
  h.l
 
  type.l
  id.l
  speedx.f
  speedy.f
EndStructure
 
Global NewList tob.tob()
Global NewList ctob.tob()
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
 
  If x1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If x1<x2 And x1+w1>=x2 And x1<= x2+w2
    p+1
  EndIf
 
  If y1>=y2 And y1<= y2+h2
    p+1
  EndIf
 
  If y1+h1>=y2 And y1<= y2+h2
    p+1
  EndIf
   
  If p>=3
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure
 
Procedure addToB(type, x, y, w, h)
 
  AddElement(tob())
  With tob()
    tob()\type=type
    tob()\x=x
    tob()\y=y
    tob()\w=w
    tob()\h=h
    tob()\id=Random(1000000)
  EndWith
   
EndProcedure
 
Procedure DrawTob()
  StartDrawing(ScreenOutput())
  ForEach tob()
    If tob()\x+tob()\speedx < 0
       tob()\speedx*-1
     ElseIf tob()\x+tob()\speedx > 800 - 20
       tob()\speedx*-1
     ElseIf tob()\y+tob()\speedy < 0
       tob()\speedy*-1
     ElseIf tob()\y+tob()\speedy > 600 - 20
       tob()\speedy*-1
     EndIf
     If tob()\type=0
       Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(106, 135, 232))
     EndIf
     If tob()\type=1
       Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(45, 75, 171))
       Box(tob()\x+2, tob()\y+2, tob()\w-4, tob()\h-4, RGB(28, 160, 144))
     EndIf
  Next
  StopDrawing()
EndProcedure
Global inst.f=2
Procedure ProcToB()
  ClearList(ctob())
  ForEach tob()
    If tob()\type=1
      If KeyboardPushed(#PB_Key_Up)     : tob()\speedy-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Down)   : tob()\speedy+0.1  : EndIf
      If KeyboardPushed(#PB_Key_Left)   : tob()\speedx-0.1 : EndIf
      If KeyboardPushed(#PB_Key_Right)  : tob()\speedx+0.1  : EndIf
      tob()\speedy+0.05
      If tob()\speedx>2: tob()\speedx=2 : EndIf
      If tob()\speedx<-2: tob()\speedx=-2 : EndIf
      If tob()\speedy>2: tob()\speedy=2 : EndIf
      If tob()\speedy<-2: tob()\speedy=-2 : EndIf
     
    EndIf
  Next
 
  CopyList(tob(), ctob())
  For i=0 To ListSize(tob())-1
    SelectElement(tob(),i)
    If tob()\type=1
    For j=0 To ListSize(ctob())-1
      SelectElement(ctob(),j)
      If tob()\id<>ctob()\id
        If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
          tob()\speedx*-1/inst.f
          tx=1
        EndIf
        If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
          tob()\speedy*-1/inst.f
          ty=1
        EndIf
      EndIf
    Next
    EndIf
  Next
 
  ForEach tob()
    tob()\x+tob()\speedx
    tob()\y+tob()\speedy
  Next
 ClearList(ctob())
EndProcedure
 
 
For i=0 To 800 Step 40
  addToB(0,i,500+Cos(i*| style="color: #924B72;">#PI/180)*20,40,40)
Next
 
For i=25 To 750 Step 25
  For y=1 To 50 Step 25
addToB(1,i,y,20,20)
Next
Next
 
Repeat
  event=WaitWindowEvent(1)
  FlipBuffers()
  ClearScreen(0)
 
  ExamineKeyboard()
  ExamineMouse()
 
  DrawTob()
 
  StartDrawing(ScreenOutput())
  Circle(MouseX(), MouseY(),4,$FFFF)
  DrawText(0,0,StrF(inst,2))
  StopDrawing()
 
  inst+MouseWheel()/10
 
  If MouseButton(1) And mb=0
    addToB(0,MouseX(), MouseY(), 20,20)
    mb=1
  EndIf
 
  If MouseButton(1)=0 : mb=0 : EndIf
 
  ProcToB()
 
  If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
    q=1
  EndIf
 
Until q=1
End


_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 01, 2012 10:50 am 
Не в сети
профессор

Зарегистрирован: Вс окт 25, 2009 5:48 pm
Сообщений: 263
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Классные примеры Артем, мне понравились, особенно от Янв 31, 2012 9:49 am


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 01, 2012 11:06 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2286
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Артём, а как уровень скольжения изменить? И интересно, почему квадрат может менять позицию когда находится внутри другого, статичного квадрата?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 01, 2012 11:40 am 
Не в сети
GameC@Soft
Аватар пользователя

Зарегистрирован: Сб сен 22, 2007 12:45 pm
Сообщений: 1084
Откуда: Я из лесу вышел, и сразу зашел, в босоножках дырявых и взлядом ночным.
Благодарил (а): 1 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
это потому что нет массы и трения, а ходят внутри друг друга еще потому что изменяется вектор движения. На основе этого "движка" можно легко написать игру средней сложности) даже тот же платформер можно сделать, лабиринты, бродилки и др....

Насчет скольжения, надо смотреть на вектор скорости, потом смотреть есть ли касание, а потом изменять скорость вдоль движения в зависимости от коф. трения и массы если масса есть....

_________________
"Самый большой глюк в PureBasic - это твоя голова...." (с) Артем
Мой сайт: http://feelzone.org.ua/


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс мар 04, 2012 7:24 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Артём писал(а):
На основе этого "движка" можно легко написать игру средней сложности) даже тот же платформер можно сделать, лабиринты, бродилки и др....

Изображение


Изображение

_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 06, 2012 8:00 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добавил подвижную платформу и возможность передвигать объекты:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
 InitSprite()  
 InitKeyboard()
 
 
 OpenWindow(0,0,0,800,600,"Как бы физика")
 OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
 
 Structure tob
   x.f
   y.f
   
   w.l
   h.l
   
   type.l
   id.l
   speedx.f
   speedy.f
   shag.f ;запрет/разрешение движения ящика при касании с друг.объктами
   xmin.f;ограничение движения платформы
   xmax.f;ограничение движения платформы
 EndStructure
 
 Global NewList tob.tob()
 Global NewList ctob.tob()
 
 
Procedure CIB(x1, y1, w1, h1, x2, y2, w2, h2)
   
   If x1>=x2 And x1<= x2+w2
     p+1
   EndIf
   
   If x1+w1>=x2 And x1<= x2+w2
     p+1
   EndIf
   
   If x1<x2 And x1+w1>=x2 And x1<= x2+w2
     p+1
   EndIf
   
   If y1>=y2 And y1<= y2+h2
     p+1
   EndIf
   
   If y1+h1>=y2 And y1<= y2+h2
     p+1
   EndIf
     
   If p>=3
     ProcedureReturn 1
   Else
     ProcedureReturn 0
   EndIf
   
 EndProcedure
 
Procedure addToB(type, x, y, w, h,xmin,xmax)
   
   AddElement(tob())
   With tob()
     tob()\type=type
     tob()\x=x
     tob()\y=y
     tob()\w=w
     tob()\h=h
     tob()\id=Random(1000000)
     tob()\xmin=xmin
     tob()\xmax=xmax
   EndWith
     
EndProcedure
 
Procedure DrawTob()
   StartDrawing(ScreenOutput())
   
   Box(0,0,800,600,RGB(26,26,26))
   
   For x=0 To 800 Step 32
     For y=0 To 600 Step 32
       LineXY(x,0,x,600, RGB(43, 43, 43))    
       LineXY(0,y,800,y, RGB(43, 43, 43))
     Next
   Next
 
   
   ForEach tob()
     If tob()\x+tob()\speedx < 0
        tob()\speedx*-1
      ElseIf tob()\x+tob()\speedx > 800 - 20
        tob()\speedx*-1
      ElseIf tob()\y+tob()\speedy < 0
        tob()\speedy*-1
      ElseIf tob()\y+tob()\speedy > 600 - 20
        tob()\speedy*-1
      EndIf
     
      If tob()\type=0
        Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(127, 229, 127))        
        Box(tob()\x+1, tob()\y+1, tob()\w-2, tob()\h-2, RGB(67, 108, 67))
          For x=1 To tob()\w Step 32
            For y=1 To tob()\h Step 32
             Box(tob()\x+x-1, tob()\y, 1, tob()\h, RGB(127, 229, 127))
             Box(tob()\x, tob()\y+y-1, tob()\w, 1, RGB(127, 229, 127))  ;RGB(71, 119, 71)
            Next
          Next
        EndIf
       
      If tob()\type=1
        Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(253, 173, 201))
        Box(tob()\x+1, tob()\y+1, tob()\w-2, tob()\h-2, RGB(140, 114, 114))
      EndIf  
       
      If tob()\type=2
        Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(153, 153, 153))
        Box(tob()\x+1, tob()\y+1, tob()\w-2, tob()\h-2, RGB(77, 77, 77))
      EndIf
     
      If tob()\type=3
        Box(tob()\x, tob()\y, tob()\w, tob()\h, RGB(198, 185, 103))
        Box(tob()\x+1, tob()\y+1, tob()\w-2, tob()\h-2, RGB(72, 68, 45))
      EndIf
     
    Next
    DrawText(10,10,"START", RGB(200,200,200),RGB(26, 26, 26))
    DrawText(700,520,"FINISH", RGB(200,200,200),RGB(26, 26, 26))
   StopDrawing()
 EndProcedure
 
Procedure ProcToB()
  Static direct=1 ;скорость героя и платформы совпадает
  Static spid_heroi  ;скорость героя на платформе при нажатии клав
  ClearList(ctob())
   ForEach tob()
     
 
   ;*********герой*********************************************  
    If tob()\type=1 ;
   
      If KeyboardPushed(#PB_Key_Up)
        If tob()\speedy=0.0 :
          tob()\speedy=-10 :  
        EndIf
      EndIf
       
       
       If KeyboardPushed(#PB_Key_Down)   : tob()\speedy+0.1  :EndIf
       If KeyboardPushed(#PB_Key_Left)   : tob()\speedx-0.1  :spid_heroi=-1: EndIf
       If KeyboardPushed(#PB_Key_Right)  : tob()\speedx+0.1  :spid_heroi=1: EndIf
       
       
      If KeyboardPushed(#PB_Key_Right)=0 And KeyboardPushed(#PB_Key_Left)=0
        If tob()\speedx>0 : tob()\speedx=0 : EndIf
        If tob()\speedx<0 : tob()\speedx=0 : EndIf
        spid_heroi=0 ;скорость героя на платформе
      EndIf
       
       tob()\speedy+0.9
       If tob()\speedx>4: tob()\speedx=4 : EndIf
       If tob()\speedx<-4: tob()\speedx=-4 : EndIf
       If tob()\speedy>5: tob()\speedy=5 : EndIf
       If tob()\speedy<-10: tob()\speedy=-10 : EndIf
       
     EndIf
 ;*********движущиеся платформа**********************************  
    If tob()\type=3
       direct=tob()\speedx
       If tob()\x>tob()\xmax ;ограничение движения платформы
         tob()\speedx=-2
       ElseIf tob()\x<tob()\xmin ;ограничение движения платформы
         tob()\speedx=2    
       EndIf
     EndIf  
 ;***********ящик********************************  
   If tob()\type=2
       tob()\speedy+0.8
       If tob()\speedx>3: tob()\speedx=3 : EndIf
       If tob()\speedx<-3: tob()\speedx=-3 : EndIf
       If tob()\speedy>5: tob()\speedy=5 : EndIf
       If tob()\speedy<-5: tob()\speedy=-5 : EndIf  
     EndIf
   Next
 ;***********обработка столкновения герой**************************************  
  CopyList(tob(), ctob())
   For i=0 To ListSize(tob())-1
     SelectElement(tob(),i)
     If tob()\type=1
     For j=0 To ListSize(ctob())-1
       SelectElement(ctob(),j)
       If tob()\id<>ctob()\id
         
         If  ctob()\type=3 ; совпадение ггероя и дв/платформы
          If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
           tob()\speedx=direct+spid_heroi ; результат скорости героя
          EndIf
         Else
          If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
           tob()\speedx=0
          EndIf
         EndIf
         
         
         If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
           If tob()\speedy=-9.10000038146973:tob()\speedy*-1:Else:tob()\speedy=0:EndIf ;косание героя нижней части платформы
         EndIf
       EndIf
     Next
   EndIf
   
 ;***********обработка столкновения ящик**************************************
   If tob()\type=2
     For j=0 To ListSize(ctob())-1
       SelectElement(ctob(),j)
       If tob()\id<>ctob()\id
         
         If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x,ctob()\y, ctob()\w, ctob()\h)
           tob()\speedx=0
           tob()\shag= 1 ; запрет движения ящика при касании с друг.объктами
         EndIf  
         
         If ctob()\type=1 And tob()\shag= 0; проверяем только при касании с героем
           
           If ctob()\speedx=0 Or ctob()\speedy<>0.0 ; остановка движения ящика при остановке героя
             tob()\speedx=0
           EndIf
           
           If cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x+1,ctob()\y, ctob()\w, ctob()\h)
             tob()\speedx=1  ; при касании с героем движение ящика в право
           ElseIf cib(tob()\x+tob()\speedx,tob()\y, tob()\w, tob()\h, ctob()\x-1,ctob()\y, ctob()\w, ctob()\h)
             tob()\speedx=-1 ; при касании с героем движение ящика в лево
           EndIf
           
         EndIf
         
         
         If cib(tob()\x,tob()\y+tob()\speedy, tob()\w, tob()\h, ctob()\x, ctob()\y, ctob()\w, ctob()\h)
           tob()\speedy=0 ; по вертикали
         EndIf
 
       EndIf
     Next
   EndIf
 ;******************************************************
   Next
   
   ForEach tob()
     tob()\x+tob()\speedx
     tob()\y+tob()\speedy
   Next
   ClearList(ctob())
 
 EndProcedure
 
 
 ;type=0 - не подвижная платформа
 ;type=1 - наш герой
 ;type=2 - передвигаемый объект (ящик)
 ;type=3 - подвижная платформа
 
 ;addToB(type,x,y,Width,Height,Xmin,Xmax)
 
 ;Xmin и Xmax - ограничение толбко для подвижной платформы по х
 
 
;{------платформа-----------------
 addToB(0,0,32*3,32*2,32,0,0)
 addToB(0,32*5,32*0,32*1,32*2,0,0)
 
 addToB(0,0,32*6,32,32,0,0)
 addToB(0,0,32*7,288,32,0,0)
 addToB(0,32*7,32*5,64,64,0,0)
 
 addToB(0,32*10,32*4,32*4,32,0,0)
 addToB(0,32*15,32*4,32*8,32,0,0)
 addToB(0,32*10,32*5,32*13,64,0,0)
 
 addToB(0,0,32*12,32*13,32,0,0)
 addToB(0,32*15,32*12,32*10,32,0,0)
 
 addToB(0,32*11,32*10,64,64,0,0)
 addToB(0,32*15,32*10,64,64,0,0)
 addToB(0,32*21,32*11,32,32,0,0)
 addToB(0,32*5,32*11,32,32,0,0)
 addToB(0,32*18,32*17,32*7,32,0,0)
 addToB(0,32*0,32*17,32*7,32,0,0)
;}-----------------------------
 
 
   addToB(1,32*0,32*0,29,31,0,0) ;герой
   
   addToB(2,32*3,32,29,31,0,0)  ;ящик
   addToB(2,32*16,0,29,31,0,0)  ;ящик
   addToB(2,32*20,0,29,31,0,0)  ;ящик
   
   
   addToB(3,32*2,32*15,32*4,32,100,600)  ;движущиеся платформа
 Repeat
   event=WaitWindowEvent(1)
   FlipBuffers()
   ClearScreen(0)
   ExamineKeyboard()
   
   
   DrawTob()
 
   ProcToB()
   
   If event=#WM_CLOSE Or KeyboardPushed(#PB_Key_Escape)
     q=1
   EndIf
   
 Until q=1
 End



Изображение

Осталось добавить спрайты и анимацию:

Изображение

_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 06, 2012 9:13 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6384
Благодарил (а): 20 раз.
Поблагодарили: 198 раз.
Пункты репутации: 48
mirashic писал(а):
Добавил подвижную платформу и возможность передвигать объекты:

Нормально вышло, поиграл как в детстве. Правда, иногда проваливается герой под платформу, в месте где подвижная и неподвижная платформы сходятся и если прыгнуть между ними.

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 12, 2013 12:09 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1701
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
есть ли пример расчета следующей координаты при передвижении объекта по вектору? точней если известен угол.

например:

объект стоит в координатах 100х100
если двигать вниз, то здесь понятно 100х100+1+1+1+1
если вправо 100+1+1+1х100
если под углом 45 градусов (получается вверх и вправо) тоже понятно 100+1+1+1х100-1-1-1 (впрочем не совсем, так как будет двигатся в 2 раза быстрее :) надо видимо +0.5 вместо +1)
а вот коим образом производить перерасчет на каждый угол? типа 5 градусов? или 10?

есть у меня мысль использовать десятичные знаки после запятой. в моем случае шаг 5 градусов. предположим на 45 шаг 0.5. с 0 до 45 9 ступенек. 0.5/9 = 0.0555
в итоге при 5 градусах будет x + 0.0555 x y - 0.945
правильно ли? :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 12, 2013 12:28 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пт окт 31, 2008 4:49 pm
Сообщений: 717
Благодарил (а): 1 раз.
Поблагодарили: 4 раз.
Пункты репутации: 0
Можешь попробовать использовать мою гениальную процедуру:
Код:
1
2
3
Procedure Move(*CurX, *CurY,Angle.f,Speed.f)
   PokeF(*CurX,PeekF(*CurX)+Sin(Angle*0.01745)*Speed): PokeF(*CurY,PeekF(*CurY)-Cos(Angle*0.01745)*Speed)
  EndProcedure


*CurX, *CurY - ссылки на переменные координаты объекта, то есть : Move(@x,@y,45,0.02)
П.с. Да, координаты должны быть float.

_________________
мой форум http://spaceminers.mybb2.ru
Dungeon Raider (Ogre). Game video: http://www.youtube.com/watch?v=ZlhBgPJhAxI


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 12, 2013 12:36 am 
Не в сети
профессор

Зарегистрирован: Пт фев 20, 2009 12:57 pm
Сообщений: 1701
Откуда: Алматы
Благодарил (а): 15 раз.
Поблагодарили: 46 раз.
Пункты репутации: 5
а для тех кто в танке коим образом получить обычные циферки? не понимаю я что за float :)

и это только для одного направления от 0 до 90, или охватывает все 360 градусов? параметр Speed шикарный. я сейчас притормаживаю количество срабатываний нажатий клавиатурных стрелок добавив счетчик, что немного не удобно - а здесь одним параметром все решается :)

***

так... один вроде нашелся Result.f = ValF(String$)
и вроде второй Result$ = StrF(Value.f [, NbDecimal])

ну попробуем.


Последний раз редактировалось SereZa Вт мар 12, 2013 12:53 am, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB