我正在制作一个需要许多x,y和z坐标的游戏,它们都有自己的功能。我需要在另一个函数中使用x或y函数来使它运行该函数。我并没有尝试protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this);
@Override
protected onCreate(Bundle bundle) {
handlerFlashGlobe.sendEmptyMessageDelayed(0, 700);
}
/**
* private static handler so there are no leaked activities.
*/
protected static class MyGlobeFlasherHandler extends Handler {
private final WeakReference<HomeBase> activity;
public MyGlobeFlasherHandler(HomeBase activity) {
this.activity = new WeakReference<HomeBase>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (activity.get() != null) {
if (activity.get().shadedGlobe) {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
} else {
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
}
activity.get().shadedGlobe = !activity.get().shadedGlobe;
sendEmptyMessageDelayed(0, 700);
}
}
}
其中的函数,而只是将def
放在它前面并使代码运行。它们都是相同的if
但不同的缩进。
有些人可以告诉我为什么在没有获得
class
的情况下我无法在另一个函数中重新运行该代码。
这是我的代码片段。
unresolved reference
在这种情况下,
def within_y(co1,co2): if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \ or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \ or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \ or (co2.y2 > co1.y1 and co2.y2 < co1.y1): return True else: return False def collided_left(co1, co2): if within_y(co1, co2): if co1.x1 <= co2.x2 and co1.x1 >= co2.x1: return True return False
会返回错误
谢谢大家,我还在学习语法和基本的python。
这是我的新代码。
if within_y(co1, co2):
我有另一个类可以完成所有视觉效果,在这个问题中不需要。
我也忘了说这是一个火柴人游戏,你需要在一些平台上跳一个火柴人来到门口。
答案 0 :(得分:1)
这是一个范围问题。在类中定义函数时,它的名称不能从类中定义的其他函数访问。相反,您需要通过类名(或类的实例)访问它,并将该函数作为属性。
将您对within_y
的通话更改为Coords.within_y
应该有效。但我不确定这个简单的修复是否真的是最好的修复。
在类中定义函数时,通常它是一个在类的实例上调用的方法。例如:
class Foo():
def bar(self):
print("bar")
def quux(self):
print("quux")
self.bar()
print("quuux")
f = Foo()
f.bar() # prints bar
f.quux() # prints quux, then bar, then quuux, each on its own line
由于您的within_y
和各种collided_X
函数看起来像是Coords
实例作为第一个参数,因此您已经可以将它们用作方法。因此,您可以致电Coords.within_y(co1, co2)
而不是co1.within_y(co2)
。所以这是修改代码的另一种方法,只需要很少的更改。
但是,如果您更改参数名称以使co1
为self
而co2
为其他内容(如{{{}},则会更自然(对于Python代码) 1}},也许)。命名方法other
的第一个参数是一种约定,因此您并不总是需要遵循它,但这样做会使您的代码更容易理解为读取它的任何其他人。任何看到self
的人都会立即知道他们正在阅读方法,def foo(self)
是调用该方法的实例。
答案 1 :(得分:0)
你可以将一个函数放在另一个函数中 - 这使它成为一个只能在外部函数内立即调用的本地函数 - 如果你正确地缩进它。您也可以直接返回逻辑表达式的值,而不是编写如下内容:
if logical_expression:
return True
else:
return False
最后,在Python中,通常可以通过在括号中包含表达式(或子表达式)来拆分长行,这通常会使它们更易读,更容易扩展或稍后编辑。
以下是您的代码执行所有这些操作时的样子:
def collided_left(co1, co2):
def within_y(co1,co2):
return ((co1.y1 > co2.y1 and co1.y1 < co2.y2) or
(co1.y2 > co2.y1 and co1.y2 < co2.y2) or
(co2.y1 > co1.y1 and co2.y1 < co1.y2) or
(co2.y2 > co1.y1 and co2.y2 < co1.y1))
return (within_y(co1, co2) and
(co1.x1 <= co2.x2 and co1.x1 >= co2.x1))