【问题标题】:Game Maker - Mouse Click image_index CheckingGame Maker - 鼠标点击 image_index 检查
【发布时间】:2016-06-11 01:12:53
【问题描述】:

我有这个精灵:spr_meteoriteLv3,它有两个子图像,索引分别为 image_index 0 和 1。

我有这些对象:obj_meteoriteLv3obj_tempMeteoriteLv3obj_score。对象obj_meteoriteLv3 从上方生成,具有随机位置、随机数量和随机子图像。对象obj_tempMeteoriteLv3 生成obj_meteoriteLv3s。当玩家点击陨石时,程序会检查该对象的image_index 的值。

obj_meteoriteLv3 有这些事件:

创建事件:将sprite_index更改为spr_meteoriteLv3,然后开始向下移动。

鼠标左键事件:销毁self实例,并检查image_index: if image_index == 0 then score += 5;否则score -= 5)。

obj_tempMeteoriteLv3 有这些事件:

创建事件:将警报 0 设置为 3600,将变量 exist 设置为 1,将变量 add 设置为 1。

警报 0:将变量 add 设置为 0,并销毁 obj_meteoriteLv3 实例。

警报 1:将变量 exist 设置为 1。

Step Event:如果是(exist == 1),那么如果是(add == 1),则创建obj_meteoriteLv3的实例,将变量exist设置为0,并将Alarm 1设置为10。

obj_score 有这些事件:

创建事件:将 score 设置为 0。

绘制事件:绘制score的值。

问题是,无论点击陨石image_index有哪个子图,分数总会加5分。这就像else 条件不起作用。我怎样才能解决这个问题?请解释你的答案。谢谢。

我添加了一些图片以便更好地理解。 Link 1Link 2

【问题讨论】:

    标签: image mouse game-maker


    【解决方案1】:

    在 obj_meteoriteLv3 中它被销毁它可以执行其余的代码块。将“销毁实例”移至底部。

    在 obj_tempMeteoriteLv3 中,“add”和“exist”两个变量都不是必需的,而是有-

    创建事件-

    警报[0] = 3600

    警报[1] = 10

    报警[0]事件-

    destroy_instance

    警报[1] 事件

    创建obj_meteoriteLv3的实例

    警报[1] = 10

    【讨论】:

    • 首先,我想确保我做对了。我将所有image_index 检查条件移动到Destroy Event。所以,我在Left-Pressed Mouse Event 中只有Destroy Instance 操作。你是这个意思吗?程序运行不正常。我没有点击陨石,但是分数是递增的。即使光标没有悬停在陨石上方,分数也会增加。
    • 当他们出界时得分,我误解了。将销毁事件中的所有内容移回左键单击事件并将“销毁实例”移动到最底部
    • 我试过了,没区别。另外,当我使用你的警报事件时,2分钟后,陨石不会停止产卵。所以,我使用了 var addexist
    【解决方案2】:

    可能,当您点击时,每颗陨石都会被触发。 在陨石的左击事件中,您没有检查光标是否在精灵上。您必须使用 position_meeting 函数,将鼠标位置和要单击的实例传递给该函数。 它看起来像:

    if (position_meeting(mouse_x, mouse_y, id))
    {
        //your destroy code
    }
    

    此外,当 instance_destroy();行被读取,下面的代码被忽略,程序跳转到destroy_event。 William 解释的很好,建议更改代码行的顺序,但也可以直接在destroy事件中更改分数。

    我想补充一点,在每个陨石实例中检查点击并不是性能的最佳选择。

    我的建议是使用单个对象来检查点击(例如,您的播放器或陨石生成器),您将在其中检查点击,如果触摸陨石,您将触发它的销毁事件。在这种情况下,您将增加分数并检查精灵。

    您的点击事件如下所示:

    with (instance_position(mouse_x, mouse_y, obj_meteoriteLv3))
    {
        instance_destroy();
    }
    

    在陨石破坏事件中,您将检查 image_index 并相应地更改分数。

    编辑:为什么分数没有改变

    我相信您没有将分数声明为全局变量,而是作为实例变量。因此,当您在其他对象中写入“score = ...”时,它会创建一个新的 score 变量,与先例无关。

    你有两个选择:

    1 - 在 obj_score 的 create 事件中声明 score 为全局变量:

    全局变量分数;
    score = //你的起始分数

    请注意,不能在其初始化行上设置全局变量。

    2 - 通过分数对象改变分数:

    每当分数必须改变时:

    obj_score.score = ...

    【讨论】:

    • 我已经尝试使用这个link中的方法。方法和你说的差不多。但是,它不起作用。
    • 您能否解释一下它在哪些方面不起作用,描述不应该发生的情况?
    • 在我上面的问题和我提供的链接中,我都解释了我的问题。在链接中,您可以查看我的第一条评论。
    • 对不起,我没有注意到你是在另一个线程上提出问题的人。所以你说liggiorgio的代码不起作用?我读了它并没有发现任何问题,除了分数改变的那一行。我能想象的唯一问题是他在哪里写了“score = ...”,你必须确保一个名为 score 的全局变量存在,否则它将不起作用。为了更好的可读性,我会在我的答案中写下这个。
    猜你喜欢
    • 1970-01-01
    • 2020-04-18
    • 2021-09-06
    • 2015-08-03
    相关资源
    最近更新 更多