SDL_RenderSetScale
会相应地缩放坐标,直到与SDL_RenderCopyEx
一起使用轮换。 SDL似乎应用缩放预旋转,因此旋转纹理的宽高比是错误的。例如,旋转90度的纹理将使x和y缩放反转。我试图计算一个公式来抵消这种缩放,但结果并不好。
我还注意到,使用SDL_RenderDrawLine
绘制的直线根据缩放绘制了不同的厚度,但每个屏幕像素仍然绘制了对角线。
还有其他人有这个问题吗?还有另一种方法来获得理想的结果吗?有没有计划修复SDL2所以缩放效果始终如一?
答案 0 :(得分:2)
var appscope = function() {
var that = this;
function col(c) {
var self = this;
this.view = ko.observable(false);
// *** Not subscribing here
}
var myModel = function(data) {
var viewSub; // ***
var self = this;
self.viewdata = ko.observableArray(data);
self.target=ko.observable(null);
var c = new col([]); // ***
self.target(c); // ***
subScribeCol(c); // ***
self.target.subscribe(function(newCol) { // ***
viewSub.dispose(); // ***
subcribeCol(); // ***
}); // ***
self.updateCol = function() {
console.log("updatecol called")
};
function subscribeCol(c) {
viewSub = c.view.subscribe(function(newValue) { // ***
self.updateCol(); // ***
}); // ***
}
};
return {
myModel: myModel
};
}();
(function(appscope) {
var vm = new appscope.myModel([mydata]);
ko.applyBindings(vm);
})(appscope);
......你会看到问题。
您可能希望原来的方形纹理现在是一个宽矩形,但它是一个高大的矩形。
在旋转之前应用缩放 - 而我个人希望在旋转之后应用缩放,因为SDL_RenderSetScale()的整个点似乎是允许选择独立坐标系,但是如果宽高比两个坐标系不同,那么任何旋转的纹理都会显示错误。
罗尼
答案 1 :(得分:2)
这个问题是四年前提出的,但我仍然面临这个问题。因此,如果有人经过,这是我的答案。
Lignum关于SDL版本控制的假设是错误的。实际上,我正在使用SDL 2.0.9,这个问题仍然很重要。正如Ronnie所指出的,只有在不保留长宽比的情况下才会出现此问题(在Lignum代码示例中,当沿x和y轴的比例因子相等时,长宽比得以保留)。
恐怕唯一的解决方案是避免SDL_RenderSetScale并在SDL_RenderCopyEx中手动缩放目标矩形的坐标。
答案 2 :(得分:1)
使用此代码,我担心我无法重现此问题:
SDL_RenderSetScale(renderer, 4.0f, 4.0f);
SDL_Rect rect = { 16, 16, 128, 128 };
SDL_RenderCopyEx(renderer, tex, NULL, &rect, 90.0, NULL, SDL_FLIP_NONE);
这完全正常,图像旋转了90°,缩放了4倍。由于在我的回复前2年被问到,我认为这可能是SDL 2.0.3中的一个错误,因为我正在使用SDL 2.0.5。
如果最新版本发生这种情况,并非所有希望都会丢失。使用SDL_RenderSetScale
的另一种方法是简单地将目标矩形的宽度和高度乘以所需的比例,根据我的经验,这也适用。考虑到你将矩形直接传递给SDL_RenderCopyEx
这一事实,该功能在转动时应该牢记这一点。