我正在使用three.js创建一个类似于此的 Minecraft纹理编辑器.我只是试图获得基本的点击和绘画功能,但我似乎无法弄明白.我目前每个立方体的每个面都有纹理,并通过制作具有以下功能的着色器材料来应用它们.
this.createBodyShaderTexture = function(part, update)
{
sides = ['left', 'right', 'top', 'bottom', 'front', 'back'];
images = [];
for (i = 0; i < sides.length; i++)
{
images[i] = 'img/'+part+'/'+sides[i]+'.png';
}
texCube = new THREE.ImageUtils.loadTextureCube(images);
texCube.magFilter = THREE.NearestFilter;
texCube.minFilter = THREE.LinearMipMapLinearFilter;
if (update)
{
texCube.needsUpdate = true;
console.log(texCube);
}
return texCube;
}
this.createBodyShaderMaterial = function(part, update)
{
shader = THREE.ShaderLib['cube'];
shader.uniforms['tCube'].value = this.createBodyShaderTexture(part, update);
shader.fragmentShader = document.getElementById("fshader").innerHTML;
shader.vertexShader = document.getElementById("vshader").innerHTML;
material = new THREE.ShaderMaterial({fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: shader.uniforms}); …Run Code Online (Sandbox Code Playgroud) 我正在尝试基于OOP设计我的网站,但我遇到了如何设计数据库连接的麻烦.目前,我正在抽象类Connector中创建一个私有静态PDO对象.显然,任何需要与数据库交互的东西都会扩展这个类.我一直在翻转如何确保脚本中只有一个连接或PDO对象,因为某些页面需要多个扩展Connector的类.许多人似乎为此目的推荐了Singleton模式,但我目前这样做的方式似乎也完成了同样的事情.
这是我目前的代码.
abstract class Connector
{
private static $dbh;
public function __construct()
{
try
{
self::$dbh = new PDO(...);
self::$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
die($e->getMessage());
}
}
public function getDB()
{
return self::$dbh;
}
}
Run Code Online (Sandbox Code Playgroud)
然后任何子类都会像这样使用它.
class Subclass extends Connector
{
public function interactWithDB()
{
$stmt = $this->getDB()->prepare(...);
// etc...
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我认为子类的每个实例都应该始终访问同一个PDO实例.这段代码是否真的有意义,或者我是否以某种方式误解了静态属性?这是不好的设计/实践,还是Singleton有更多的优势?
如果有什么不清楚的话请评论,谢谢!
编辑:
Connector类并不仅仅是为了保存PDO对象而存在.它的析构函数关闭连接(使其为null)并且它包含isValueTaken等函数,它检查数据库中是否已有值.它具有以下抽象功能
abstract function retrieveData();
abstract function setData();
Run Code Online (Sandbox Code Playgroud)
例如,我有一个扩展Connector的User类.它定义了setData()来在数据库中注册用户.我不知道这是否会对回应产生影响.