OwnLang << 1 ... 56 57 58 59 60 >> 12.12.2019 / 21:20 | | vl@volk Пользователь Сейчас: Offline
Имя: Владислав Откуда: Земля Регистрация: 26.12.2012
| aNNiMON, а если онли с GPlay ставил, всё норм работать будя?
__________________
знает толк |
13.12.2019 / 00:42 | | Alexandr Пользователь Сейчас: Offline
Имя: Александр Откуда: Днепр Регистрация: 01.07.2012
| Почему, время от времени оно вылетает с такой ошибкой? Открыть спойлер Закрыть спойлер use "canvas"
use "std"
use "math"
maxFPS = 30
frame_time = 1000 / maxFPS
dd = 0.5
max = 25
G = 100 // задаём константу методом подбора
dt = 0.33 // шаг вычисления
b = newarray(0)
def ball(x, y) = {
"x": x
"y": y
"r": 25
"m": 1
"dx": 0
"dy": 0
"color": #ff00a5a5
}
def collision(a, b) {
if((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) < (a.r/2 + b.r/2) * (a.r/2 + b.r/2))
return true
return false
}
canvas = showcanvas()
setOnTouchEvent(::touch)
a = ball(WIDTH/2, HEIGHT/2)
a.color = rand(#ffffffac)
a.m = 110
a.r += a.m / 2
b += a
while (true) {
canvas.setColor(#ff000000)
canvas.drawRect(0, 0, WIDTH, HEIGHT)
for(i = 0, i < length(b), i ++) {
canvas.setColor(b[i].color)
canvas.drawCircle(b[i].x, b[i].y, b[i].r)
//if (b[i].x - b[i].r < 0 || b[i].x + b[i].r > WIDTH) b[i].dx = -b[i].dx
//if (b[i].y - b[i].r < 0 || b[i].y + b[i].r > HEIGHT) b[i].dy = -b[i].dy
}
canvas.setColor(#ffffffff)
canvas.setTextSize(25)
canvas.drawText("m"+b[0].m, b[0].x, b[0].y)
repaint()
update()
sleep(frame_time)
}
def update(){
a = 0
ax = 0
ay = 0
dx = 0
dy = 0
r = 0
for (i = 0, i < length(b), i++)
for (j = 0, j < length(b), j++){
if (i == j) continue
if (collision(b[i], b[j])) {
if (b[i].m > b[j].m) {
b[i].m += b[j].m
b[i].r += b[j].r / 2
b = arraySplice(b, j, j)
} else {
b[j].m += b[i].m
b[j].r += b[i].r / 2
b = arraySplice(b, i, i)
}
continue
}
dx = b[j].x - b[i].x
dy = b[j].y - b[i].y
r = dx * dx + dy * dy // тут R^2
a = G * b[j].m / r
r = sqrt(r) // тут R
ax = a * dx / r // a * cos
ay = a * dy / r // a * sin
b[i].dx += ax * dt
b[i].dy += ay * dt
}
for (i = 0, i < length(b), i++){
b[i].x += b[i].dx * dt
b[i].y += b[i].dy * dt
}
}
def touch(e) {
if (e.action == Action.DOWN) {
a = ball(e.x, e.y)
a.color = rand(#ffffffac)
a.dx = rand(-5, 5)
a.dy = rand(-5, 5)
a.m = rand(1, 7)
a.r += a.m
b += a
}
}
Прикрепленные файлы: Screenshot_2019(…).png (87.62 кб.) Скачано 444 раза |
13.12.2019 / 14:07 | | aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Alexandr, ошибка где-то при обращении к массиву b на одной из строчек 75, 76, 78, 82 или 83. Предполагаю, это из-за того, что на 99 строке ссылка на массив b обновляется в тот самый момент, когда в потоке интерпретатора (а touch выполняется в ui-потоке) происходит обращение к элементам массива. Похоже, что нужно вводить блокировку на уровне языка. С arraySplice разберись чуток, там не так сложно. Тебе нужно вырезать только один i-ый/j-ый элемент, а пытаешься вырезать i/j таких. Из-за этого при "съедании" старого элемента у тебя пропадают все созданные после него. __________________
let live Изменено aNNiMON (13.12 / 14:10) (всего 3 раза) |
13.12.2019 / 14:36 | | Alexandr Пользователь Сейчас: Offline
Имя: Александр Откуда: Днепр Регистрация: 01.07.2012
| aNNiMON, Тебе нужно вырезать только один i-ый/j-ый элемент, а пытаешься вырезать i/j такихТогда для удаления одного элемента, нужно arraySplice(array, start, 1)? Прост думал что второй и третий параметры это start и end.
|
13.12.2019 / 15:03 | | Alexandr Пользователь Сейчас: Offline
Имя: Александр Откуда: Днепр Регистрация: 01.07.2012
| aNNiMON, Предполагаю, это из-за того, что на 99 строке ссылка на массив b обновляется в тот самый момент, когда в потоке интерпретатора (а touch выполняется в ui-потоке) происходит обращение к элементам массива.И как это можно по фиксить, здесь есть что-то подобное synchronized?
|
13.12.2019 / 15:51 | | aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Alexandr, Пост #513873 да, arraySplice(arr, i, 1) Пост #513874, можно попробовать три варианта. 1. Держать массив из N элементов и просто обнулять значения вместо удаления. 2. Переписать так, чтобы в момент прохода по циклам в update использовался другой массив. Таким образом, добавление новых элементов гарантированно не будет происходить в момент обновления. Но тогда нужно как-то информировать об удалении элемента. 3. Сделать отдельный массив для добавления. В onTouch будет добавляться элемент в этот массив, а потом после/перед циклами добавлять из него в массив b, а потом очищать. Получится как бы буфер добавления. И ещё, ты можешь вынести до цикла отрисовки. А очищать экран при помощи __________________
let live Изменено aNNiMON (13.12 / 16:14) (всего 2 раза) |
13.12.2019 / 16:19 | | Alexandr Пользователь Сейчас: Offline
Имя: Александр Откуда: Днепр Регистрация: 01.07.2012
| aNNiMON, ааа, благодарю!
|
13.12.2019 / 17:05 | | Alexandr Пользователь Сейчас: Offline
Имя: Александр Откуда: Днепр Регистрация: 01.07.2012
| Вообщем, я зделат ему буффер, теперь скриптек падает реже. Ошибки Ошибки Array or map expected. Got 1 in main at update: def() a = 0 ax = 0 ay = 0 dx = 0 dy = 0 r = 0 for i = 0, i < length(b), i ++ for j = 0, j < length(b), j ++ if i == j continue if collision(b[i], b[j]) if b[i, "m"] > b[j, "m"] b[i, "m"] += b[j, "m"] b[i, "r"] += b[j, "r"] / 2 b = arraySplice(b, j, 1)
else b[j, "m"] += b[i, "m"] b[j, "r"] += b[i, "r"] / 2 b = arraySplice(b, i, 1)
continue
dx = b[j, "x"] - b[i, "x"] dy = b[j, "y"] - b[i, "y"] r = dx * dx + dy * dy a = G * b[j, "m"] / r r = sqrt(r) ax = a * dx / r ay = a * dy / r b[i, "dx"] += ax * dt b[i, "dy"] += ay * dt
for i = 0, i < length(b), i ++ b[i, "x"] += b[i, "dx"] * dt b[i, "y"] += b[i, "dy"] * dt
com.annimon.ownlang.u.g: Array or map expected. Got 1 at com.annimon.ownlang.parser.j.k.a() at com.annimon.ownlang.parser.j.e.a() at com.annimon.ownlang.parser.j.e.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.parser.j.w.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.w.k3.a() at com.annimon.ownlang.modules.canvas.canvas.a() at com.annimon.ownlang.CanvasView.onTouchEvent() at android.view.View.dispatchTouchEvent(View.java:10060) at android.view.SurfaceView.dispatchTouchEvent(SurfaceView.java:316) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2638) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2265) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808) at android.app.Activity.dispatchTouchEvent(Activity.java:3129) at b.a.o.i.dispatchTouchEvent() at b.a.o.i.dispatchTouchEvent() at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:375) at android.view.View.dispatchPointerEvent(View.java:10280) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4449) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4317) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3917) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4010) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4067) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3917) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3878) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3886) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3859) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6261) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6231) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6192) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6364) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:189) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:323) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Array or map expected. Got number in function "collision" in Interpreter at "collision": def(a, b) if a["x"] - b["x"] * a["x"] - b["x"] + a["y"] - b["y"] * a["y"] - b["y"] < a["r"] / 2 + b["r"] / 2 * a["r"] / 2 + b["r"] / 2 return true return false at update: def() a = 0 ax = 0 ay = 0 dx = 0 dy = 0 r = 0 for i = 0, i < length(b), i ++ for j = 0, j < length(b), j ++ if i == j continue if collision(b[i], b[j]) if b[i, "m"] > b[j, "m"] b[i, "m"] += b[j, "m"] b[i, "r"] += b[j, "r"] / 2 b = arraySplice(b, j, 1)
else b[j, "m"] += b[i, "m"] b[j, "r"] += b[i, "r"] / 2 b = arraySplice(b, i, 1)
continue
dx = b[j, "x"] - b[i, "x"] dy = b[j, "y"] - b[i, "y"] r = dx * dx + dy * dy a = G * b[j, "m"] / r r = sqrt(r) ax = a * dx / r ay = a * dy / r b[i, "dx"] += ax * dt b[i, "dy"] += ay * dt
for i = 0, i < length(b), i ++ b[i, "x"] += b[i, "dx"] * dt b[i, "y"] += b[i, "dy"] * dt
java.lang.RuntimeException: Array or map expected. Got number in function "collision" at com.annimon.ownlang.parser.j.v.a() at com.annimon.ownlang.parser.j.w.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.parser.j.q.execute() at com.annimon.ownlang.parser.j.q.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.w.k3.a() at com.annimon.ownlang.parser.j.v.a() at com.annimon.ownlang.parser.j.o.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.parser.j.o0.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.MainActivity.a() at com.annimon.ownlang.c.run(lambda) at java.lang.Thread.run(Thread.java:761) Caused by: com.annimon.ownlang.u.g: Array or map expected. Got number at com.annimon.ownlang.parser.j.k.get() at com.annimon.ownlang.parser.j.k.a() at com.annimon.ownlang.parser.j.f.a() at com.annimon.ownlang.parser.j.f.a() at com.annimon.ownlang.parser.j.f.a() at com.annimon.ownlang.parser.j.j.b() at com.annimon.ownlang.parser.j.j.a() at com.annimon.ownlang.parser.j.w.execute() at com.annimon.ownlang.parser.j.g.execute() at com.annimon.ownlang.w.k3.a() ... 15 more
Прикрепленные файлы: StarSystem.own (2.22 кб.) Скачано 562 раза |
13.12.2019 / 17:31 | | vl@volk Пользователь Сейчас: Offline
Имя: Владислав Откуда: Земля Регистрация: 26.12.2012
| Тупа кафе, попробуй еще сделать деление на ноль в коде
__________________
знает толк |
13.12.2019 / 19:56 | | aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Alexandr, ты только g используешь при отрисовке, но в update у тебя используется b, как и в touch. Предлагаю завести массив buffer = [] В touch добавлять не в b, а в buffer А перед отрисовкой добавлять из буфера в b: if (!buffer.isEmpty()) {
b <<= buffer
buffer = []
}
__________________
let live Изменено aNNiMON (13.12 / 19:59) (всего 1 раз)
Прикрепленные файлы: x.own (1.95 кб.) Скачано 542 раза |
<< 1 ... 56 57 58 59 60 >> Всего сообщений: 600 Фильтровать сообщения Поиск по теме Файлы топика (60)
|