滚动数组

Scrolling through an array

所以我在 GameMaker 中有一个项目,它有一个聊天框。此消息存储在一个数组中。我希望能够滚动浏览此数组,以便查看之前的聊天消息。

这是我目前拥有的:

创建活动

chatLog[0] = "";
chatIndex  = 0;

步骤事件

if (chatIndex > 0) {
    if (mouse_wheel_down()) {
        chatIndex--;
    }
}

if (chatIndex < array_length_1d(chatLog) - 1) {
    if (mouse_wheel_up()) {
        chatIndex++;
    }
}

var _maxLines = 5;
for (i = 0; i < _maxLines; i++) {
    if (i > (array_length_1d(chatLog) - 1)) { exit; }

    var _chatLength = array_length_1d(chatLog) - 1;
    draw_text(0, 50 - chatHeight, chatLog[_chatLength - i + chatIndex]);
}

首先,为了方便将消息添加到前面/从后面删除它们(一旦有太多),我们假设日志是一个列表,第 0 项是最新的消息,

chatLog = ds_list_create();
chatIndex = 0;
for (var i = 1; i <= 15; i++) {
    ds_list_insert(chatLog, 0, "message " + string(i));
}

然后,Step 绘制事件可以使用列表中的信息来限制滚动偏移范围和绘制项目:

var maxLines = 5;
// scrolling:
var dz = (mouse_wheel_up() - mouse_wheel_down()) * 3;
if (dz != 0) {
    chatIndex = clamp(chatIndex + dz, 0, ds_list_size(chatLog) - maxLines);
}
// drawing:
var i = chatIndex;
var _x = 40;
var _y = 200;
repeat (maxLines) {
    var m = chatLog[|i++];
    if (m == undefined) break; // reached the end of the list
    draw_text(_x, _y, m);
    _y -= string_height(m); // draw the next item above the current one
}

live demo