Делаю так:
Код: Выделить всё
T.print(20, 20, T.TK_ALIGN_CENTER, 'text text text')
Модератор: Apromix
Код: Выделить всё
T.print(20, 20, T.TK_ALIGN_CENTER, 'text text text')
Версия 0.15.3
А мне нужно
Не понял вопроса
Код: Выделить всё
local ExtendedBasics = require "ExtendedBasics":init(BL_BASE)
local ExtendedInterlayer = require "ExtendedInterlayer"
Код: Выделить всё
local BL_BASE = [[C:\Devel\BearLibTerminal_0.15.3]]
local BL_LIB = BL_BASE..[[\Windows32]]
package.cpath = BL_LIB..[[\?.dll;]] .. package.cpath
Дело в том, что здесь у print лишь две возможные сигнатуры:Apromix писал(а):А как в lua вывести текст в центр? Делаю так:
Код: Выделить всё
print(x, y, s)
print(x, y, w, h, align, s)
Код: Выделить всё
T.print(0, 0, 40, 40, T.TK_ALIGN_CENTER, 'text text text')
Код: Выделить всё
T.print(20, 20, 0, 0, T.TK_ALIGN_CENTER, 'text text text')
Код: Выделить всё
> lua52 test1.wlua
lua52: luaterminal_print: invalid number or types of arguments
stack traceback:
[C]: in function 'print'
test1.wlua:5: in main chunk
[C]: in ?
Код: Выделить всё
// #cgo LDFLAGS: -lBearLibTerminal
Код: Выделить всё
$ sudo echo "/path/to/libbearterminal.so" > /etc/ld.so.conf.d/libbearterminal.conf && sudo ldconfig
Код: Выделить всё
// #cgo LDFLAGS: -L. -Wl,-rpath -Wl,./ -lBearLibTerminal
// #include <stdlib.h>
// #include <BearLibTerminal.h>
import "C"
Код: Выделить всё
go build -o test
Код: Выделить всё
objdump -p test | grep RPATH
Код: Выделить всё
RPATH ./
Код: Выделить всё
package main
import "runtime"
...
// Рецепт чтобы убежать от [fatal] 'refresh' was not called from the main thread
// https://github.com/golang/go/wiki/LockOSThread
func init() {
runtime.LockOSThread()
}
type GameState struct {
Mainfunc chan func()
}
// do запускает функцию f в контексте main thread.
func (g *GameState) Do(f func()) {
done := make(chan struct{}, 1)
g.Mainfunc <- func() {
f()
f = nil //zero pointer в замыкание
done <- struct{}{}
}
<-done
}
var State = GameState{
Mainfunc: make(chan func()), //блокирующий канал(!)
}
// И где-то в Main Loop делаем примерно так:
func MainLoop(state *GameState) {
...
for {
//В этом select обработка ввода, рендер, пеерколючение состояний интерфейса итп
select {
...
case f <-State.Mainfunc:
f() //выполняем в main thread вызовы в сишную библиотеку
break
}
...
}
...
Код: Выделить всё
package item
import "main"
import blt "some.repo.ru/user/bearlibterminal"
//в эту переменную при инициализации ставится ссылка на глобальный State
var State *main.GameState
//функция скажем поднятия особенного предмета...
func (item *SpecialItem) Pickup() {
....
//выполняем строго в main thread
State.Do(func() {
renderSuperEffect()
})
}
...
//тут собственно отрисовка эффекта
func renderSuperEffect() {
...
blt.Layer(0)
blt.Print(x,y, "WAAAGH")
...
}
Думаю я это даже в официальную версию включу, только разве что вместо "." наверное стоит использовать "./lib". Ну и надо посмотреть как в CGO задавать флаги (точнее, переменные) не перетирая -- разработчик может захотеть определить их самостоятельно в окружении сборки.thefish писал(а):Код: Выделить всё
#cgo LDFLAGS: -L. -Wl,-rpath -Wl,./ -lBearLibTerminal
В целом, единственное корректное универсальное решение. Эдакий пул потоков наоборот =). Есть мысль, что такую функциональность можно встроить в библиотеку -- в конце концов, Go не единственное место, где может захотеться многопоточности -- но у решения на стороне программы есть один неочевидный плюс в "атомарности" выполнения действий. Если просто "в лоб" сделать интерфейс библиотеки опционально многопоточным, то параллельные вызовы color/layer/put/print и т. д. смешаются в недетерминированную кучу.thefish писал(а):Лекарство тут ровно одно - вызывать сишные foreign functions из main thread. Для реализации этого требования мне показалась полезной следующая конструкция:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость