Updated examples to work with 1.1
[qml-box2d:qml-box2d-folibis.git] / examples / weld / main.qml
1 import QtQuick 2.2
2 import Box2D 1.1
3
4 Rectangle {
5     width: 800
6     height: 600
7     id: global
8     property int hz: 0
9
10     Component {
11         id: ballComponent
12         Body {
13             id: box
14             width: 20
15             height:20
16             sleepingAllowed: true
17                         bodyType: Body.Dynamic;
18             fixtures: Circle {
19                 radius: parent.width / 2
20                 anchors.centerIn: parent
21                 density: 0.1
22                 friction: 0.3
23                 restitution: 0.5
24             }
25             Rectangle {
26                 radius: parent.width / 2
27                 border.color: "blue"
28                 color: "#EFEFEF"
29                 width: parent.width
30                 height: parent.height
31             }
32         }
33     }
34     Component {
35         id: linkComponent
36         Body {
37             width: 20
38             height: 20
39                         z: 1
40             bodyType: Body.Dynamic
41             fixtures: Box {
42                 anchors.fill: parent
43                 density: 0.2
44                 friction: 0.3
45             }
46             Rectangle {
47                 anchors.fill: parent
48                 border.color: "#DEDEDE"
49                 color: "#44A51C"
50             }
51         }
52     }
53
54     Component {
55         id: linkJoint
56         WeldJoint {
57             dampingRatio: 0.5
58             frequencyHz: global.hz
59         }
60     }
61
62     World {
63         id: world
64         anchors.fill: parent
65         function createBranch(base,count) {
66             var prevLink = base;
67             var angle = Math.random() * 10 - 5;
68             for(var i = 0;i < count;i ++) {
69                 var newLink = linkComponent.createObject(world);
70                 newLink.width = 20;
71                 newLink.height = 3 + count - i;
72                 if(count % 2) {
73                     newLink.x = prevLink.x + prevLink.width;
74                     newLink.y = prevLink.y - (prevLink.height / 2);
75                 }
76                 else {
77                     newLink.x = prevLink.x - newLink.width;
78                     newLink.y = prevLink.y - (prevLink.height / 2);
79                 }
80                 var newJoint = linkJoint.createObject(world);
81                 newJoint.world = world;
82                 if(count % 2) {
83                     newJoint.localAnchorA = Qt.point(prevLink.width,prevLink.height / 2);
84                     newJoint.localAnchorB = Qt.point(0,newLink.height / 2);
85                 }
86                 else {
87                     newJoint.localAnchorA = Qt.point(0,prevLink.height / 2);
88                     newJoint.localAnchorB = Qt.point(newLink.width,newLink.height / 2);
89                 }
90                 newJoint.referenceAngle = angle;
91                 newJoint.bodyA = prevLink;
92                 newJoint.bodyB = newLink;
93                 prevLink = newLink;
94             }
95         }
96
97         onInitialized: {
98             var prevLink = bodyA;
99             for(var i = 0;i < 10;i ++) {
100                 var newLink = linkComponent.createObject(world);
101                 newLink.x = 350 + i * 3;
102                 newLink.y = 500 - (i * 40);
103                 newLink.width = 20 - i * 1.5;
104                 newLink.height = 40;
105                 var newJoint = linkJoint.createObject(world);
106                 newJoint.world = world;
107                 if(i == 0) newJoint.localAnchorA = Qt.point(bodyA.width / 2,0);
108                 else newJoint.localAnchorA = Qt.point(newLink.width / 2,0);
109                 newJoint.localAnchorB = Qt.point(newLink.width / 2,newLink.height);
110                 newJoint.bodyA = prevLink;
111                 newJoint.bodyB = newLink;
112                 prevLink = newLink;
113                 createBranch(newLink,10 - i);
114             }
115         }
116
117         Body {
118             id: ground
119             height: 40
120             bodyType: Body.Static
121             anchors {
122                 left: parent.left
123                 right: parent.right
124                 bottom: parent.bottom
125             }
126             fixtures: Box {
127                 anchors.fill: parent
128                 friction: 1
129                 density: 1
130             }
131             Rectangle {
132                 anchors.fill: parent
133                 color: "#DEDEDE"
134             }
135         }
136         Wall {
137             id: topWall
138             height: 40
139             anchors {
140                 left: parent.left
141                 right: parent.right
142                 top: parent.top
143             }
144         }
145
146         Wall {
147             id: leftWall
148             width: 40
149             anchors {
150                 left: parent.left
151                 top: parent.top
152                 bottom: parent.bottom
153                 bottomMargin: 40
154             }
155         }
156
157         Wall {
158             id: rightWall
159             width: 40
160             anchors {
161                 right: parent.right
162                 top: parent.top
163                 bottom: parent.bottom
164                 bottomMargin: 40
165             }
166
167         }
168
169         Body {
170             id: bodyA
171             bodyType: Body.Static
172             width: 100
173             height: 20
174             x: 300
175             y: 540
176             fixtures: Box {
177                 anchors.fill: parent
178             }
179             Rectangle {
180                 anchors.fill: parent
181                 color: "black"
182             }
183         }
184
185         Rectangle {
186             id: debugButton
187             x: 50
188             y: 50
189             width: 120
190             height: 30
191             Text {
192                 id: debugButtonText
193                 text: "Debug view: off"
194                 anchors.centerIn: parent
195             }
196             color: "#DEDEDE"
197             border.color: "#999"
198             radius: 5
199             MouseArea {
200                 anchors.fill: parent
201                 onClicked: {
202                     debugDraw.visible = !debugDraw.visible;
203                     debugButtonText.text = debugDraw.visible ? "Debug view: on" : "Debug view: off";
204                 }
205             }
206         }
207         Rectangle {
208             id: crazyButton
209             x: 180
210             y: 50
211             width: 70
212             height: 30
213             Text {
214                 text: "Get crazy"
215                 anchors.centerIn: parent
216             }
217             color: "#DEDEDE"
218             border.color: "#999"
219             radius: 5
220             MouseArea {
221                 anchors.fill: parent
222                 onClicked: {
223                     if(global.hz == 0) {
224                         global.hz = 60;
225                         crazyButton.color = "#999";
226                     }
227                     else {
228                         global.hz = 0;
229                         crazyButton.color = "#DEDEDE";
230                     }
231                 }
232             }
233         }
234
235         DebugDraw {
236             id: debugDraw
237             anchors.fill: parent
238             world: world
239             opacity: 1
240             visible: false
241                         z: 10
242         }
243
244         Timer {
245             id: ballsTimer
246             interval: 1000
247             running: true
248             repeat: true
249             onTriggered: {
250                 var newBox = ballComponent.createObject(world);
251                 newBox.x = 40 + (Math.random() * world.width - 80);
252                 newBox.y = 50;
253             }
254         }
255     }
256 }