Updated examples to work with 1.1
[qml-box2d:qml-box2d-folibis.git] / examples / cannon / main.qml
1 import QtQuick 2.2
2 import QtQuick.Controls 1.1
3 import Box2D 1.1
4 import QtMultimedia 5.0
5
6 Rectangle {
7     width: 800
8     height: 600
9
10     Component {
11         id: link
12         Body {
13             width: 20
14             height: 20
15             x: 400
16                         bodyType: Body.Dynamic
17             fixtures: Circle {
18                 radius: 10
19                 anchors.centerIn: parent
20                 friction: 0.9
21                 density: 0.8
22             }
23             Rectangle {
24                 anchors.fill: parent
25                 color: "orange"
26                 radius: 10
27             }
28         }
29
30     }
31
32     Component {
33         id: linkJoint
34         RevoluteJoint {
35             world: world
36             localAnchorA: Qt.point(10, 30)
37             localAnchorB: Qt.point(10, 5)
38             collideConnected: true
39         }
40     }
41
42     Component {
43         id: ball
44         Body {
45                         width: 10
46             height: 10
47             bullet: true
48                         bodyType: Body.Dynamic
49             fixtures: Circle {
50                 radius: 5
51                 density: 0.9
52                 friction: 0.9
53                 restitution: 0.2
54             }
55             Rectangle {
56                 anchors.centerIn: parent
57                 radius: 5
58                 width: 10
59                 height: 10
60                 color: "black"
61                 smooth: true
62             }
63         }
64     }
65
66     Component {
67         id: dominoComponent
68         Body {
69             width: 10
70             height:50
71             x: 0
72             y: 510
73             bodyType: Body.Dynamic
74             fixtures: Box {
75                 anchors.fill: parent
76                 density: 1
77                 friction: 0.3
78                 restitution: 0.5
79             }
80
81             Rectangle {
82                 anchors.fill: parent
83                 color: "black"
84             }
85         }
86     }
87
88     World {
89         id: world
90         anchors.fill: parent
91
92         function createDominos() {
93             for(var i = 0;i < 5;i ++) {
94                 var newDomino = dominoComponent.createObject(world);
95                 newDomino.x = 500 + 50 * i;
96                 newDomino.y = 510
97             }
98             for(i = 0;i < 4;i ++) {
99                 newDomino = dominoComponent.createObject(world);
100                 newDomino.x = 555 + 50 * i;
101                 newDomino.y = 500
102                 newDomino.rotation = 90;
103             }
104             for(var i = 0;i < 4;i ++) {
105                 newDomino = dominoComponent.createObject(world);
106                 newDomino.x = 525 + 50 * i;
107                 newDomino.y = 450
108             }
109             for(i = 0;i < 3;i ++) {
110                 newDomino = dominoComponent.createObject(world);
111                 newDomino.x = 580 + 50 * i;
112                 newDomino.y = 440
113                 newDomino.rotation = 90;
114             }
115         }
116
117         function createChain()
118         {
119             var prev = chainAnchor;
120             for(var i = 0;i < 12;i ++)
121             {
122                 var y = 300 + i * 20 - 5;
123                 var newLink = link.createObject(world);
124                 newLink.y = y;
125                 var newJoint = linkJoint.createObject(world);
126                 newJoint.world = world;
127                 newJoint.bodyA = prev;
128                 newJoint.bodyB = newLink;
129                 prev = newLink;
130             }
131         }
132
133         onInitialized: {
134             createDominos();
135             createChain();
136         }
137
138         Body {
139             id: ground
140             height: 40
141             bodyType: Body.Static
142             anchors {
143                 left: parent.left
144                 right: parent.right
145                 bottom: parent.bottom
146             }
147             fixtures: Box {
148                 anchors.fill: parent
149                 friction: 1
150                 density: 1
151             }
152             Rectangle {
153                 anchors.fill: parent
154                 color: "#DEDEDE"
155             }
156         }
157
158         Wall {
159             id: topWall
160             height: 40
161             anchors {
162                 left: parent.left
163                 right: parent.right
164                 top: parent.top
165             }
166         }
167
168         Wall {
169             id: leftWall
170             width: 40
171             anchors {
172                 left: parent.left
173                 top: parent.top
174                 bottom: parent.bottom
175                 bottomMargin: 40
176             }
177         }
178
179         Wall {
180             id: rightWall
181             width: 40
182             anchors {
183                 right: parent.right
184                 top: parent.top
185                 bottom: parent.bottom
186                 bottomMargin: 40
187             }
188
189         }
190
191         Body {
192             id: canon
193             bodyType: Body.Dynamic
194             width: 98
195             height: 37
196             x: 150
197             y: 443
198             fixtures: Box {
199                 id: canonFixtire
200                 anchors.fill: parent
201                 density: 0.5
202             }
203             Image {
204                 source: "images/cannon.png"
205                 anchors.fill: parent
206             }
207         }
208
209         Body {
210             id: canonBase
211             bodyType: Body.Static
212             width: 130
213             height: 67
214             x: 50
215             y: 493
216             fixtures: Box {
217                 anchors.fill: parent
218                 density: 0.5
219             }
220             Image {
221                 source: "images/cannon_base.png"
222                 anchors.fill: parent
223             }
224         }
225
226         RevoluteJoint {
227             id: joint
228             world: world
229             bodyA: canonBase
230             bodyB: canon
231             localAnchorA: Qt.point(75, 18)
232             localAnchorB: Qt.point(36, 19)
233             collideConnected: false
234             motorSpeed: 0
235             enableMotor: false
236             maxMotorTorque: 100
237             enableLimit: true
238             lowerAngle: 0
239             upperAngle: -60
240         }
241
242         Body {
243             id: chainAnchor
244             width: 20
245             height: 20
246             x: 400
247             y: 230
248             bodyType: Body.Static
249             Rectangle {
250                 anchors.fill: parent
251                 color: "black"
252             }
253         }
254
255         Rectangle {
256             id: debugButton
257             x: 50
258             y: 50
259             width: 120
260             height: 30
261             Text {
262                 id: debugButtonText
263                 text: "Debug view: off"
264                 anchors.centerIn: parent
265             }
266             color: "#DEDEDE"
267             border.color: "#999"
268             radius: 5
269             MouseArea {
270                 anchors.fill: parent
271                 onClicked: {
272                     debugDraw.visible = !debugDraw.visible;
273                     debugButtonText.text = debugDraw.visible ? "Debug view: on" : "Debug view: off";
274                 }
275             }
276         }
277
278         Rectangle {
279             id: upButton
280             x: 50
281             y: 90
282             width: 50
283             height: 50
284             Text {
285                 id: upButtonText
286                 text: "up"
287                 anchors.centerIn: parent
288             }
289             color: "#DEDEDE"
290             border.color: "#999"
291             radius: 5
292             MouseArea {
293                 acceptedButtons: Qt.LeftButton
294                 anchors.fill: parent
295                 onPressed: {
296                     canonFixtire.density = 0.5;
297                     joint.motorSpeed = -15;
298                     joint.enableMotor = true;
299                     upButton.color = "#AAA";
300                     gearSound.play();
301                 }
302                 onReleased: {
303                     joint.motorSpeed = 0;
304                     upButton.color = "#DEDEDE";
305                     gearSound.stop()
306                 }
307             }
308         }
309
310         Rectangle {
311             id: downButton
312             x: 110
313             y: 90
314             width: 50
315             height: 50
316             Text {
317                 id: downButtonText
318                 text: "down"
319                 anchors.centerIn: parent
320             }
321             color: "#DEDEDE"
322             border.color: "#999"
323             radius: 5
324             MouseArea {
325                 acceptedButtons: Qt.LeftButton
326                 anchors.fill: parent
327                 onPressed: {
328                     joint.motorSpeed = 15;
329                     joint.enableMotor = true;
330                     downButton.color = "#AAA";
331                     gearSound.play();
332                 }
333                 onReleased: {
334                     joint.motorSpeed = 0;
335                     downButton.color = "#DEDEDE";
336                     gearSound.stop();
337                 }
338             }
339         }
340
341         Rectangle {
342             id: shotButton
343             x: 170
344             y: 90
345             width: 50
346             height: 50
347
348             Text {
349                 id: shotButtonText
350                 text: "shot!"
351                 anchors.centerIn: parent
352             }
353             color: "#DEDEDE"
354             border.color: "#999"
355             radius: 5
356             MouseArea {
357                 acceptedButtons: Qt.LeftButton
358                 anchors.fill: parent
359                 onClicked: {
360                     var angle = joint.getJointAngle();
361                     if(angle < 0) angle = 0;
362                     var offsetX = 65 * Math.cos(angle * Math.PI / 180);
363                     var offsetY = 65 * Math.sin(angle * Math.PI / 180);
364                     var newBall = ball.createObject(world);
365                     newBall.x = 125 + offsetX;
366                     newBall.y = 505 - offsetY;
367                     var impulse = power.value;
368                     var impulseX = impulse * Math.cos(angle * Math.PI / 180);
369                     var impulseY = impulse * Math.sin(angle * Math.PI / 180);
370                     newBall.applyLinearImpulse(Qt.point(impulseX,-impulseY),newBall.getWorldCenter());
371                     shotSound.play();
372                 }
373             }
374         }
375
376         Slider {
377             id: power
378             minimumValue: 1
379             maximumValue: 100
380             value: 50
381             width: 200
382             height: 50
383             x: 230
384             y: 90
385         }
386
387         DebugDraw {
388             id: debugDraw
389             anchors.fill: parent
390             world: world
391             opacity: 1
392             visible: false
393         }
394
395         SoundEffect {
396             id: shotSound
397             source: "sounds/cannon.wav"
398         }
399         SoundEffect {
400             id: gearSound
401             source: "sounds/gear.wav"
402         }
403     }
404 }