- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发 C# XNA 游戏,并有以下代码根据线性插值的结果更新 Sprite 的 alpha 级别:
class AlphaProcess : GameProcess {
Sprite sprite;
public Sprite Sprite {
get { return sprite; }
set { sprite = value; }
}
float start;
public float Start {
get { return start; }
set { start = value;}
}
...<snip>...
public override void Update(float elapsed) {
if (FirstUpdate) {
Start = sprite.Alpha;
FirstUpdate = false;
}
Time += elapsed;
if (Time >= Duration)
Finished = true;
sprite.Alpha = MathHelper.Lerp(start,end,Time/Duration);
}
}
'Start' (float), 'FirstUpdate' (bool), 'Time' (float), 'Duration' (float) 都是类 AlphaProcess 的字段。 “Sprite”是一个包含比例、位置、方向、旋转等细节的类。
“更新”方法每秒调用 60 次,计算指定时间段内 Sprite 的新 alpha 值。完成后,GameProcess 将从队列中移除。
这段代码工作正常,但它非常具体。我拥有的 Sprite 类包含许多属性,可以方便地在固定时间段内进行 lerp(旋转、位置(用于缓入和缓出))。其中许多变量也是 float 。创建多个“GameProcess”扩展类来做几乎相同的事情,只是在不同的变量上,这似乎很愚蠢。但是,我想不出如何最好地重构它,以便我可以只拥有一个指向正在修改的浮点值的指针,而不是特定的 Sprite ,它是 alpha/旋转/缩放/任何值。
我已经完成了有关 SO 的 C# 引用/值/参数传递问题,并且知道在 C# 中您不能将引用存储为字段。调用 Update 的“GameProcessQueue”对正在更新的“GameProcess”的内部结构一无所知。 有没有一种更聪明的方法可以做到这一点,以便我可以概括/抽象类以更新另一个类的字段(就像这里,使用“Sprite”的“Alpha”字段)?
最佳答案
您的主要问题是您的 AlphaProcess 类的内聚性较低。它具有三个主要作用,Tweening、Lerping 和获取/设置 Sprite Alpha 值。为了改进您的设计,您需要将它们拆分为单独的解耦类。
目标:将您的 AlphaProcess 变成 TweenProcess。
不是传递给它一个 Sprite ,而是传递给它一个接口(interface),通过它它可以获取和设置它希望操作的 float 。并且不是直接调用 Lerp,而是将它传递给一个接口(interface)或委托(delegate)给一个 Tween 函数。 (我使用接口(interface)而不是委托(delegate),因为我发现委托(delegate)经常会产生垃圾,这会导致您的游戏卡顿。)
补间类是:
interface IFloatPropertySource
{
float FloatProperty { get; set; }
}
interface ITweenFunction
{
float Tween(float start, float end, float t);
}
class TweenProcess : GameProcess
{
float start;
IFloatPropertySource floatSource;
ITweenFunction tweenFunction;
public TweenProcess(IFloatPropertySource floatSource, ITweenFunction tweenFunction)
{
this.floatSource = floatSource;
this.tweenFunction = tweenFunction;
}
public override void Update(float elapsed) {
if (FirstUpdate) {
start = floatSource.FloatProperty;
FirstUpdate = false;
}
Time += elapsed;
if (Time >= Duration)
Finished = true;
floatSource.FloatProperty = tweenFunction.Tween(start, end, Time / Duration);
}
}
获取/设置 alpha 的类是:
class SpriteAlphaSource : IFloatPropertySource
{
Sprite sprite;
public SpriteAlphaSource(Sprite sprite)
{
this.sprite = sprite;
}
public float FloatProperty
{
get
{
return sprite.Alpha;
}
set
{
sprite.Alpha = value;
}
}
}
我知道你有点想避免上这门课。但是围绕它的所有方法,比如通过反射,都非常昂贵。在具有比 sprite 更多的可呈现对象的项目中,您可能希望将其与 sprite 分离并使其在 IRenderable 等基础接口(interface)上运行。
lerping 机制是:
class Lerp : ITweenFunction
{
public float Tween(float start, float end, float t)
{
return MathHelper.Lerp(start, end, t);
}
}
关于C# 类组织/结构 - 概括执行循环线性插值的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091098/
我正在寻找一种简单的方法来编写函数 mapAndUnzip :: (Functor f) => (a -> (b,c)) -> f a -> (f b, f c) 我并不完全相信 Functor是一个
我的代码是这样的: if(country == china) { getCNData(); } else { getDefaultDataForallCountries(); } 现在我需要为其他国家
在处理使用类型类模式的 Scala 项目时,我遇到了语言如何实现模式的严重问题:由于 Scala 类型类实现必须由程序员而不是语言管理,因此任何变量属于一个类型类永远不会被注解为父类型,除非它的类型类
我正在尝试在 R 中创建一个公式,其形式为 输出~Var1+Var2+Var3 用于模型。它的工作方式似乎是你给你想要预测的变量名,波浪号,你想用作预测变量的变量名,然后在后面的参数中你给出包含这些变
我正在使用一堆类型的宏: #define Q31_TO_Q30 (31-30) #define Q31_TO_Q20 (31-20) #define Q25_TO_Q15 (25-15) etc. 我
为了提高工作效率,我使用以下函数来了解我必须为哪些函数设置别名,因为我最常使用它们: function mu() { if [[ $# -eq 0 ]]; then histo
我有几个文本框。我想在每次按下回车键时将用户指向下一个文本框。文本框已正确设置 Tabindex。 我有这样的东西: private void textBox_Description_KeyPres
有什么方法可以将列约束应用于我的所有 GridPanes 列。我有各种 GridPane 控件,我希望它们共享以下列约束: 可以用css来实现吗? 编辑 我最终做了这样的事情。但它不起作用(我的列宽
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我正在做一个 JavaScript 游戏作业,只是尝试玩一下 Canvas 。我的任务是使用激光源、镜子和目标物体进行激光游戏。 我刚刚做了一个丑陋的硬编码示例: 'use strict'; func
我正在尝试从任何公共(public) REST API 获取响应并对其进行处理(解析并放入数据结构)。从 API 获取此响应时,我想使用一些分页功能。我提到了this ,该问题讨论了特定 API 的分
我有一个与 Guice 的机器人腿示例非常相似的用例,只是我不知道我有多少条“腿”。因此我不能使用机器人腿示例所需的注释。 我希望使用 Guice 的 Multibindings 扩展将所有这些“腿”
(按标题道歉,我不能做得更好) 我的问题是找到一些通用的结构或“标准”函数来执行下一件事: xmap :: (a -> b) -> f a -> g b 然后,我们不仅可以映射元素,还可以映射整个结构
haskell 中是否有一个函数可以概括 Maybe 和 Either 函数? 例如,我正在想象一个这样的函数: generalizedFunc :: SOMETHING m => b -> (a -
下面函数模板的目标是取任意unordered_map并产生一个新的unordered_map与 key_type和 mapped_type倒。下面的函数适用于 std::unorderd_map .我
我是一名优秀的程序员,十分优秀!