Hi Chris,
here is a little code example. To find that bug you need to drag some boxes on the platform (they will be removed correctly), then let one box fall on the ground and drag (and hold) a new box into to the scene at once. If you restart the scene now, all entities are removed except the EntityBaseDraggable object.
Here is the source code:
Box.qml
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
import VPlay 1.0
import Box2D 1.0
EntityBaseDraggable {
id: box
entityType: "rectangle"
entityId: "box"
colliderComponent: boxCollider
selectionMouseArea.anchors.fill: rect
gridSize: 1
height: 20
width: 20
dragOffset: Qt.point(0,0)
allowedToBuild: true
property alias sWidth: rect.width
property alias sHeight: rect.height
property bool isPlaced:false;
showRectangleWhenBuildingNotAllowed: false
Rectangle {
id: rect
width: 30
height: 30
color: "yellow"
}
BoxCollider {
id: boxCollider
anchors.fill:rect
density:100
friction: 1.6
restitution: 0
fixture.onBeginContact: {
if(!isPlaced) {
rect.color = "red"; allowedToBuild = false;}}
fixture.onEndContact: {
rect.color = "yellow"; allowedToBuild = true}
}
}
BoxPreview.qml
import QtQuick 1.1
import VPlay 1.0
import Box2D 1.0
BuildEntityButton {
id: ballPreview
toCreateEntityType: "Box.qml"
width: 20
height: 20
property int shapeWidth: 20
property int shapeHeight: 20
creationProperties: {
"sWidth": shapeWidth,
"sHeight": shapeHeight,
"isPlaced":true
}
onEntityPressed: {
createdEntity.isPlaced = false;
}
Rectangle {
height: 20
width: 20
color: "yellow"
anchors.fill: parent
}
}
GameOverScene.qml
// import QtQuick 1.0 // to target S60 5th Edition or Maemo 5
import QtQuick 1.1
import VPlay 1.0
import Box2D 1.0
Scene {
id: gameOverScene
Button {
text: "Restart"
anchors.centerIn: parent
onClicked: {
entityManager.removeAllEntities();
scene.state = "game"
}
}
}
main.qml
import VPlay 1.0
import Box2D 1.0
import QtQuick 1.1
GameWindow {
id: window
// the size of the Window can be changed at runtime by pressing the number keys 1-6 with QML window active
// the content of the logical scene size (480x320) gets scaled to the window size based on the scaleMode
width: 960
height: 640
EntityManager {
id: entityManager
entityContainer: scene
}
GameOverScene {
id: gameOverScene
opacity: 0
}
Scene {
id: scene
opacity: 0
Row {
spacing: 5
anchors {
top: parent.top
horizontalCenter: parent.horizontalCenter
}
BoxPreview{shapeHeight: 50; shapeWidth: 50}
BoxPreview{shapeHeight: 50; shapeWidth: 50}
BoxPreview{shapeHeight: 50; shapeWidth: 50}
}
// platform (here you can place shapes)
Rectangle {
width: 50
height: 10
x: 100
y: parent.height / 2
color: "blue"
BoxCollider {
anchors.fill: parent
bodyType: Body.Static
}
}
// ground (if shape falls on ground, game is over)
Rectangle {
width: parent.width
height: 5
color: "grey"
anchors.bottom: parent.bottom
BoxCollider {
anchors.fill: parent
bodyType: Body.Static
fixture.onBeginContact: {
scene.state = "gameOver"
}
}
}
PhysicsWorld {
id: physicsWorld
gravity.y: -9.81
z: 10
updatesPerSecondForPhysics: 60
velocityIterations: 5
positionIterations: 5
}
onStateChanged: {
if (state === "gameOver")
activeScene = gameOverScene
else if (state === "game")
activeScene = scene
}
state: "game"
states: [
State {
name: "game"
PropertyChanges {target: scene; opacity:1}
},
State {
name: "gameOver"
PropertyChanges {target: gameOverScene; opacity:1}
}
]
}
}
Cheers!