我刚刚读了一些关于主题的相关问题,所以我会尽量不重复这些问题.
我最近开始重新审视一个我在两三年前开始的学习项目 - 一个Mega Man引擎的C++端口.是的我用过撕裂的精灵.我还使用游戏引擎库进行绘图,音乐和输入.
我的原始代码是残暴的.虽然它可以(但几乎没有)被称为OO,但它完全忽略了这一点.我开始添加类似接口的东西,并删除了大量重复的代码.有一些我不确定的事情,因为游戏设计有时变得非常复杂.
代表我的游戏库的对象目前是全局的(我知道全局变量通常很糟糕),因为许多对象可能会依赖它来加载艺术或音乐.什么是将该对象从全局范围中拉出来的最佳方法,而不必将50个参数传递给否则将直接使用它的所有内容?
下一个问题:众所周知,Mega Man会射出许多小小的白色射弹.目前,Player对象负责他发射的Projectile对象,更新它们的位置等(字面意思是,在Player :: Update()方法中,每次镜头调用一次Projectile :: Update()方法).这是错误的方法吗?我的第一个改进是让所有这些对象实现了DrawingObject接口,这样我的游戏就可以绘制所有内容.为Updates做同样的事情意味着我将玩家的控制权从玩家手中夺走并将其交给更广泛的Game对象.我对此犹豫不决的原因是它感觉像上帝对象反模式.或者我误解了反模式?还有其他复杂性 - 射弹如果离开可见屏幕就会死亡,因此任何更新射弹的调用都需要调用者能够访问屏幕对象.
这一切都是现在,当我到达他们时,我会回来遇到更多问题.第一篇文章结束!
我在让我的游戏引擎在我兄弟的机器上运行时遇到了问题,该机器运行的是64位Windows 7.我正在使用32位XP SP2进行开发.
我的应用程序使用XNA,FMOD.NET和我在C#中完全编写的另一个dll.一切都针对x86,而不是AnyCPU.我已经读过,这是XNA工作所必需的,因为没有64位的xna框架.我将FMOD.NET重新编译为x86,并确保使用32位版本的本机dll.所以我没有看到任何问题.
然而,当他试图运行我的应用程序时,它给出了一个神秘的错误,但并非闻所未闻.
A FileNotFoundException具有空文件名,并且堆栈跟踪的顶部位于我的主窗体构造函数中.信息是The specified module could not be found. (Exception from HRESULT: 0x8007007E)
我在网上发现了一些关于这个错误的线索,所有这些都是非常模糊,混合和模糊的反应,并没有真正帮助我.大多数提醒人们瞄准x86.有人说检查他们是否有必要的所有dll.
我给了我的兄弟Microsoft.Xna.Framework.dll,但他是否需要安装整个XNA可再发行组件包?当我拿走他寄给他的所有内容并将其粘贴在一个随机目录中时,它对我来说仍然运行良好.我在VS2008中开发了游戏,而不是在游戏工作室,使用XNA 3.0和使用XNA绘图的Windows窗体控件,这是我在msdn教程中找到的.如果可能的话,我还想避免要求完整的安装程序.
任何见解?请?
在我的Web应用程序中,用户可以输入文本数据.此数据可以显示给其他用户,原始作者也可以返回并编辑他们的数据.我正在寻找安全地逃避这些数据的正确方法.
我只是在进行sql清理,因此所有内容都会在读取时存储.假设我在数据库中有"似曾相识".或者,更加极端,一个<script>标签.这可能是有效的,甚至不是恶意的输入.
我正在htmlentities()出路以确保一切都被逃脱.问题是html和输入字段对待事物的方式不同.我想确保它在HTML中是安全的,但是作者在编辑文本时会看到他们在输入字段中输入的内容.我也使用jQuery动态填充表单字段和数据.
如果我这样做:
<p><?=htmlentities("déjà vu");?></p>
<input type=text value="<?=htmlentities("déjà vu");?>">
Run Code Online (Sandbox Code Playgroud)
页面源放入déjà vu两个地方(我不得不反击或者你会看到"似曾相识"!)问题是输出<p>是正确的,但输入只显示转义文本.如果用户重新提交表单,他们会双重逃避并破坏他们的输入.
我知道我仍然需要清理进入该领域的文本,否则你可以结束价值报价并做坏事.我找到的唯一解决方案就是这个.我再次使用jQuery.
var temp = $("<div></div>").html("<?=htmlentities("déjà vu");?>");
$("input").val(temp.html());
Run Code Online (Sandbox Code Playgroud)
这有效,因为它导致div将转义的文本作为编码字符读取,然后jquery将这些编码的字符复制到输入标记,并进行适当保留.
所以我的问题是:这仍然是安全的,还是某处有安全漏洞?更重要的是,这是唯一/正确的方法吗?我是否遗漏了有关html和字符编码如何工作的问题,这使得这个问题难以解决?
这实际上是错误的,我过度简化了我的例子,以至于它不起作用.问题实际上是因为我使用jQuery的val()将文本插入到字段中.
<input>
<script>$("input").val("<?=htmlentities("déjà vu");?>");</script>
Run Code Online (Sandbox Code Playgroud)
这样做的原因是表单是动态的 - 用户可以随意添加或删除字段,因此它们是在页面加载后生成的.
所以似乎jQuery正在逃避数据进入输入,但它还不够好 - 如果我自己不做任何事情,用户仍然可以放入</script>标签,查杀代码并插入恶意代码.但是这里有另一个论点要做.由于只有原作者才能在输入框中看到文字,我是否应该打扰?基本上他们可以执行XSS攻击的唯一人就是他们自己.
虽然我找不到任何东西,我想我会仔细检查 - memcache是否支持交易?
如果不是,我敢打赌是可能的答案,那么在具有事务的环境中使用memcache的正确方法是什么?每次计划更新时都不必读取数据库,即使数据在缓存中,只是为了设置锁定?例如,更新某些数据的脚本如下所示:
我认为您必须在运行更新查询后更新缓存,以防您遇到死锁并需要回滚.但是你也应该在提交之前更新缓存,以防任何其他线程等待读取你的数据,并且可能在你之前用更新的数据意外更新它的缓存,导致你现在已经过时的数据覆盖了它.
这是正确的步骤顺序吗?有没有办法不必在读取更新数据库?
这个问题有点类似于this one,但不完全相同。我有一个 C# 游戏引擎,我正在与一些想要使用我的引擎的人一起工作。最初我设计了引擎,以便所有资产都是外部的——非程序员可以创建艺术、音乐、xml 设置等,并且任何人都可以修改现有游戏,并在彼此之间共享。基本上包括引擎本身在内的整个事情都是开源的。
我正在与之合作的小组(目前仅有的两个使用我的引擎的项目之一)想要关闭他们的资产,以便无法修改它们。尽管这违反了我的原则,但我不想拒绝他们,因为我已经与他们合作了一段时间,而且市场非常小(对于像我这样的引擎以及这些引擎的用户而言)。
有没有办法,也许是一些可用的软件,可以将一个exe和一堆其他任意文件粉碎成一个exe,而不仅仅是一个存档?我希望最终 exe 的行为就像它运行第一个 exe 一样,其中包含一些引用捆绑文件的命令行参数。例如,运行bundle.exe就像运行一样,original.exe --project_path=/project但项目文件在包内,无法从中检索。
我原来的 exe 是用 C# 编写的。我怀疑这很重要。
所以我们都知道Kohana 3的文档绝对是可怕的.那么如何构建以下查询,我有"玩家"和"龙"模型?
SELECT * FROM `dragons` JOIN `players` ON (`dragons`.`player_id` = `players`.`player_id`) WHERE `uid` IN (1,2,3) ORDER BY `dragons`.`id` ASC
Run Code Online (Sandbox Code Playgroud)
我可以ORM::factory('dragon')->join("players")->on("dragons.player_id", "=", "players.player_id")用来进入连接部分,但我不能做这个in条款.inKohana 3的ORM 没有功能.我尝试了这个where函数,但它在第三个参数周围加上引号,所以我的ID列表变成了一个字符串,查询变得无效.那我该怎么办?我无法弄清楚如何将自定义的SQL位添加到我的ORM加载查询中.同样,因为文档不存在.
我现在能想到的唯一方法就是加载所有合适的玩家,循环播放它们并获取它们的龙.但这看起来真的很愚蠢 - 比必要的查询更多.我以前觉得这样,使用ORM会在查询结束时使事情变得非常低效,以便使代码更容易编码.这是真的?
我需要一些帮助来优化数学重码的一部分.我已完成分析,并隔离了慢速方法.问题是单独的线路并不慢,但它们被称为很多次,所以我需要在这里捏微秒.
此代码用于在执行NTSC过滤后转换像素数据.我已经在行旁边提供了性能分析数据作为总运行时间的百分比,因此您可以看到需要工作的内容.这个功能总共约占我运行时间的一半(自我占48%,有孩子占53%).
// byte[] ntscOutput;
// ushort[] filtered; - the pixels are ushort, because of the texture color depth
int f_i = 0;
int row = 0;
for (int i = 0; i < 269440; i++) // 3.77 %
{
int joined = (ntscOutput[f_i + 1] << 8) + ntscOutput[f_i]; // 6.6 %
f_i += 2; // 1.88 %
filtered[i] = (ushort)joined; // 2.8 %
ushort red = (ushort)(joined & 0xf800); // }
ushort green = (ushort)(joined & 0x7e0); // …Run Code Online (Sandbox Code Playgroud) 如果答案是"这是不可能的",那就没关系.我不会沮丧.但我想知道,在使用C#制作游戏时,是否有任何方法可以模仿控制台模拟器的"保存状态"功能.据我所知,仿真器有点容易,它们只是转储虚拟化内存,指令指针等所有内容.因此,他们可以完全相同的方式恢复,在游戏代码中与之前完全相同的位置.我知道我无法从相同的代码行恢复,但有没有办法可以维持整个游戏状态而无需手动保存每个变量?我希望每次在游戏中添加一些内容时都不需要扩展或修改.
我猜如果有任何可行的方法,它会使用ap/invoke ...
我只是对此感到好奇,因为对我来说这样做可能太麻烦了.我想知道如何让自定义类型的每个文件在Windows资源管理器中都有不同的描述性图标.一个典型的例子就是Photoshop的.psd文件.Windows本身并不知道psd是什么(我假设?),但不知何故,在Windows中浏览时,文件图标是psd本身的缩略图.
这是怎么做到的?从编程角度和操作系统角度来看,我都很好奇.例如,当Windows看到.psd时,它如何获取缩略图?Adobe是否在魔术位置安装了一些单独的实用程序,Windows用它来生成文件的缩略图?
我们的系统工程师利用一切机会提醒每个人他讨厌MySQL的程度,以及他喜欢postgres以及我们需要切换的程度.他的抱怨有时看起来很合理,但最近他们把这种抱怨包括在内.他现在声称的一件事是"InnoDB并不真正做交易.它只是假装." 是的,这是直接引用.实际上,他声称innodb中所有与事务相关的命令实际上都是NOP.这是对他刚刚在五分钟前说过的话的解释:
"我最近发现了这一点,因为我把所有东西都保存在一个事务中.我去做了回滚,它不会让我.经过一些挖掘后我发现innodb中的所有事务命令实际上都是NOP."
这对我来说听起来非常荒谬.这意味着没有人能够使用innodb成功回滚交易,或者实际上甚至已经执行了一次交易.这意味着innodb的开发者是完全撒谎,并认为我们都愚蠢到可以堕落他们的伪造.
有丝毫的可能吗,他的主张有多少真理?或许,有一种扭曲的方式来解释这一点,听起来并不那么疯狂?
编辑澄清:我不是想咆哮.我问,因为我无法找到他的主张的证据,他是否完全错了,或者是否有一些我应该知道的事实.
有FMOD经验的人可以阻止我失去它.我不能让这些同步点表现出来.我有一些游戏音乐,包括两个部分,一个介绍和一个循环.它们是独立的声音,在介绍结束后,它开始循环部分,永远重复.我在介绍的最后设置了一个同步点来触发循环.它工作得很好,直到我尝试停止并重新启动音乐(例如当播放器死亡时).无论如何,同步点一旦重新开始介绍就会坚持触发,即使它是在介绍结束时设置的.效果是音乐的两个部分同时播放 - 而且似乎在单个频道上,因为我告诉它重用频道.这甚至可能吗?这是我的一些代码(注意系统,介绍,循环和通道是成员变量):
public void Play()
{
if (intro != null)
{
CHANNELINDEX index = (channel == null) ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE;
system.playSound(index, intro, false, ref channel);
uint length = 0;
intro.getLength(ref length, TIMEUNIT.MS);
intro.addSyncPoint(length, TIMEUNIT.MS, "StartLoop", ref loopPtr);
channel.setCallback(callback);
}
else system.playSound(CHANNELINDEX.FREE, loop, false, ref channel);
Playing = true;
}
Run Code Online (Sandbox Code Playgroud)
这是同步点:
private FMOD.RESULT SyncCallback(IntPtr c, CHANNEL_CALLBACKTYPE type, IntPtr a, IntPtr b)
{
if (Playing)
{
RESULT result = intro.getSyncPoint(0, ref loopPtr);
intro.deleteSyncPoint(loopPtr);
system.playSound(CHANNELINDEX.REUSE, loop, false, ref channel);
}
return …Run Code Online (Sandbox Code Playgroud) 我已经阅读了我能找到的所有其他 jQuery 验证问题,但没有任何帮助。我正在尝试做一些应该如此简单但不显眼的验证让我想在我的所有四个显示器上打一个洞(嫉妒?)
我有一个形式为 a 的字段select,另一个作为日期选择器。When the select takes on a certain value, the date becomes required. 对于所有其他选择值,日期是可选的。当页面第一次加载时,日期是可选的——也就是说,Required模型元数据中没有属性。
这是我的脚本块以及我需要帮助的漏洞:
<script type="text/javascript">
function DateRequirement() {
if ($("#StatusID").val() == 602) {
$("#DateOfFirstCoverage").attr("data-val-required", "A date is required for current members.");
// some kind of re-validating here?
}
else if ($("#DateOfFirstCoverage").attr("data-val-required") !== undefined) {
$("#DateOfFirstCoverage").rules("remove", "required");
// some kind of re-validating here?
}
}
$("#StatusID").change(DateRequirement);
$(document).ready(DateRequirement);
</script>
Run Code Online (Sandbox Code Playgroud)
仅供参考,我尝试了其他添加需求的方法,例如使用.rules("add", { required: true }),但仍然存在问题。这是我的问题列表:
.rules所需的添加方法,我得到设置未定义的错误。很多 SO 答案都说您需要先重新验证表单,我尝试过,但尽管它消除了错误,但该字段仍然不是必需的。当我尝试运行以下代码时,我收到此消息(语法错误,意外的T_STRING,期待','或';'):
<html>
<head>
</head>
<body>
<title>Num One Website</title>
<?
$con = mysql_connect("","","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("", $con);
$result1 = mysql_query("SELECT * FROM Students") ;
echo "<form action='ConfirmEnter.php' method='post'>";
echo "<input type="Radio" name="mark" value="mt">"."MidTerm<br>";
echo "<input type="Radio" name="mark" value="pr">"."Project<br>";
echo "<input type="Radio" name="mark" value="fi">"."Final<br>";
echo "<table border cellpadding=3>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>MidTerm</th>";
echo "<th>Project</th>";
echo "<th>Final</th>";
echo "<th>Total</th>". "</tr>";
$count=1;
while($row1 = mysql_fetch_array($result1))
{
echo "<tr>";
echo "<td><input name='ID[]' readonly='readonly' value='". $row1['ID'] …Run Code Online (Sandbox Code Playgroud) c# ×4
php ×3
transactions ×2
.net ×1
64-bit ×1
audio ×1
bundle ×1
c++ ×1
distribution ×1
escaping ×1
exe ×1
fmod ×1
html ×1
innodb ×1
jquery ×1
kohana ×1
kohana-3 ×1
math ×1
memcached ×1
oop ×1
optimization ×1
orm ×1
save ×1
sql ×1
state ×1
syntax-error ×1
thumbnails ×1
windows ×1
xna ×1
xss ×1