Paperscope dan paperjs

Jadi saya mencoba membuat proyek dengan dua elemen kanvas, masing-masing dengan skrip kertasnya sendiri, dan dengan tombol di bagian luar masing-masing elemen yang mengontrol fungsi tertentu di dalam keduanya.

Di bawah dokumentasi di bawah Paperscript, dikatakan:

Harap diperhatikan: Saat menyertakan lebih dari satu PaperScript dalam satu halaman, setiap skrip akan berjalan >dalam cakupannya sendiri dan tidak akan melihat objek dan fungsi yang dideklarasikan di >yang lain. Agar PaperScript dapat berkomunikasi dengan kode PaperScript atau >JavaScript lain, lihat tutorial tentang Interoperabilitas PaperScript.

...yang sangat disayangkan karena tutorialnya berbunyi sebagai berikut:

Segera hadir!

Saya terjebak dengan sangat cepat dalam proses ini. Saya telah mencoba menempatkan fungsi dalam lingkup global, memanggilnya dari luar kanvasnya, dan melihatnya dicetak di kanvas yang salah. Saya sudah mencoba mengekspor fungsi melalui modul dan sepertinya menjalankan fungsinya (?!?!). Dan yang terburuk, objek 'paper.projects' adalah array dengan satu (!) proyek di dalamnya, kanvas pertama.

Jadi saya bingung.

Adakah yang tahu cara melakukan ini?

EDIT: Jadi rupanya ada jawaban ini tetapi saya tidak mengerti bagaimana hal itu membuat saya bisa menelepon fungsi dalam lingkup PaperScript dari skrip lingkup global.

Sepertinya itu skrip untuk memanggil fungsi global di PaperScope, yang tidak berfungsi untuk saya jika saya mencoba membuat tombol luar melakukan sesuatu.

Jelas saya melewatkan sesuatu.

EDIT KEDUA: Saya telah bermain-main dengan berbagai fungsi global, baik di window.global atau hanya duduk sendiri tanpa deklarasi var... tetapi yang tampaknya terjadi adalah ketika saya mencoba memanggil fungsi yang telah saya definisikan, katakan sebagai :

globals.makecircle = function () {
    var o = new Path.Circle({
        radius: 50,
        center: new Point (200,200)
    })
}

dalam lingkup utama, ini akan segera berjalan di jendela yang salah seperti di jendela yang benar. Juga ada penundaan luar biasa sebelum dijalankan yang tidak dapat saya pahami.

EDIT KETIGA: Untuk kejelasan.

Saya memiliki firstcanvas.js yang dilampirkan ke canvas1 di HTML saya, saya memiliki secondcanvas.js yang dilampirkan ke canvas2. Keduanya direferensikan sebagai tipe paperscript, seperti:

<script type="text/paperscript" src="scripts/firstcanvas.js" canvas="canvas1"></script>
        <script type="text/paperscript" src="scripts/secondcanvas.js" canvas="canvas2"></script>

Saya membuat objek window.globals seperti yang disarankan Jurg. Saya menyebutnya dari main.js dengan sebuah tombol, seperti:

window.globals = {}
`$('document').ready($('#dfs').on('click', window.globals.makecircle))`

Saya menambahkan fungsi ini ke global di firstcanvas.js seperti di atas.

Jika saya baru-baru ini mengeklik kanvas2, mengeklik tombol dengan id='DFS' akan menyebabkan fungsi berjalan, sangat tertunda, di kanvas2.

Dan paper.projects tidak mencantumkan kedua proyek tersebut, jadi saya tidak dapat menggunakan fungsi activate().


person Joshua Penman    schedule 20.01.2015    source sumber
comment
Berikan contoh masalah yang sebenarnya Anda hadapi.   -  person Etheryte    schedule 20.01.2015
comment
Itu kurang jelas?   -  person Joshua Penman    schedule 20.01.2015
comment
Anda tidak menunjukkan kode yang menunjukkan masalah Anda.   -  person Etheryte    schedule 20.01.2015
comment
Yay, suara negatif pertama saya! Saya anggota nyata SO sekarang. Saya pikir sudah jelas apa yang saya tanyakan tetapi mungkin hanya kepada saya. Ini lebih baik?   -  person Joshua Penman    schedule 20.01.2015


Jawaban (1)


Oke! SELESAI!!!

Berikut cara mereferensikan/mengaktifkan cakupan yang dibuat PaperScript dari cakupan global. Meskipun tidak ada cakupan cakupan yang dapat diakses pengguna (yang saya tahu), PaperScope.get(id) akan mengambilnya. Untuk beberapa alasan saya menemukan PaperScope.get(0) sudah terisi, dan dua elemen kanvas/PaperScript saya sebenarnya mengacu pada cakupan dengan id 1 dan 2.

Karena itu:

pscope1 = PaperScope.get(1)
pscope2 = PaperScope.get(2)

Lalu, di fungsi mana pun saya ingin melakukan sesuatu di kanvas pertama saya:

pscope1.activate()

// cool paper.js graphics stuff

pscope1.view.update()

Baris terakhir adalah karena paper.js tidak akan secara otomatis memperbarui tampilan yang tidak berinteraksi dengan pengguna.

Terima kasih kepada Jurg Lehni atas petunjuk untuk menggunakan .activate().

PS Pastikan objek skrip kertas Anda dibuat sebelum menggunakan PaperScope.get. Saya menggunakan JQuery $('document').ready() yang bagus untuk ini...

PPS Satu lagi pukulan kecil dari Jurg Lehni sendiri: Di ​​dalam PaperScript, this akan menunjuk ke cakupan saat ini. Anda bisa menggunakannya dan menyimpannya di objek global.

person Joshua Penman    schedule 20.01.2015
comment
kamulah orangnya!! :D Terima kasih!! - person Edmond Tamas; 12.10.2015