It is common practice to allow users to set various information via web-form and send it to another component. It is possible with Burster plugin too.
Get the user data
You can gather data from user using web form, for example you can allow the user to specify a texture of your game object. To do this just use standard form to get the texture file:
<form enctype="multipart/form-data" action="uploader.php" method="POST">
Upload your own texture: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
The uploader.php file moves uploaded file to the server, to the directory available to the Burster plugin.
session_start();
$sid = session_id();
$target_path = "uploads/$sid.jpg";
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
} else{
die("There was an error uploading the file, please try again!");
}
header("location: blends/test.php");
?>
The code firstly gets the session id - this identifier is latter used as a filename. The possibility that the session identifier is very low, so users have low chances to overwrite their files. After the file was moved to the directory accessible by Burster, the browser is redirected to the site with blend file embeded (see:
embeding blends article).
Receiving data in blend
The most important thing is receiving the data in blend file. Before the Burster player will start you need to create valid parameters list - the example test.php file is listed below:
<?php
session_start();
$sid = session_id();
echo "
<body style=\"background: #000\"> <OBJECT classid=\"CLSID:8318DE8B-B213-426b-B1B6-0A2589859898\"
width=\"800\"
height=\"600\"
session=\"$sid\"
>
<PARAM name=\"type\" value=\"application/x-burster\"/>
<PARAM name=\"src\" value=\"test.blend\"/>
<strong><PARAM name=\"session\" value=\"$sid\"/> </strong>
<embed type=\"application/x-burster\"
src=\"test.blend\"
width=\"800\"
height=\"600\"
session=\"$sid\"
>
</embed>
</OBJECT>
";
?>
The additional parameter - session - is filed with user session identifier. As you remember from previous section, this parameter was used to create the file name that your blend should use. The rest of code is standard embeding code.
Now, in blend file i added to the logic bricks element that runs folowing Python code:
obj = GameLogic.getCurrentController().owner
try:
# Check if the texture was set
obj["Texture"]
except:
print "----- Loading and setting the user defined testure ----"
import sys
session = None
# sys.argv contains all parameters passed to the Burster player.
# parameters are passed as "name=value" - so you need to
# find the '=' sign and read the parameter name and value.
# After standard parameters passed to the plugin the '-' sign is passed.
#This sign marks that following parameters are custom parameters.
for arg in sys.argv:
if session=="read":
param = arg
eqs = param.find("=")
name = param[0:eqs]
value = param[eqs+1:]
if name=="session":
session = value
print name, value
if arg=="-":
session = "read"
print session
import VideoTexture
matID = VideoTexture.materialID(obj, "MAdisplayer")
texture = VideoTexture.Texture(obj, matID, 0)
fname = "http://kroliszewski.pl/itech/uploads/"+str(session)+".jpg"
print "Fname: ", fname
texture.source = VideoTexture.ImageFFmpeg(fname)
texture.refresh(False)
obj["Texture"] = texture
The script firstly checks if it is executed first time (the obj["Texture"] property is set to the user texture). Then the script finds parameter named "session". The value of the session parameter is the file name of the texture. After that, the script reads the texture from url and sets it to the object in scene.
You can download the source blend file
here.
Following link
http://kroliszewski.pl/itech/ shows how it works in practice.
Comments
So you can set the game state into GameLogic object using python: GameLogic.someVariable = value.
Then you could load the GameLogic.globalDict and all variables you have stored will be reloaded.
For whole blender files this will be possibly harder to do. I don't know if there is "save blend" function in game api...