Bagi para developer melihat sesuatu dengan uang diakhir, yang artinya investasi diawal(uang, tenaga, waktu) untuk mendapatkan sebuah pendapatan yang melimpah diakhir yang melimpah. Namun bagi para user, menginginkan sebeuah program bagus dan dapat menghemat pengeluaran mereka dari segala macam program yang akan mereka gunakan.
Crack, Pirated(bajakan) sudah tidak asing lagi bagi para pengguna teknologi jaman sekarang. Mengapa bisa begitu? Jika kita telusuri lagi, semua berasal dari ketidaktahuan para user pada program yang mereka gunakan. Gak percaya? Bagi kalian yang berada di Jakarta, silahkan kunjungi beberapa tempat yang banyak menjual Komputer dan Laptop, jika ada orang awam membeli barang tersebut, langsung diinstall segala macam program didalamnya(OS, Office, PhotoEditting, Security, Games, dll). Dalam kasus ini user tidak tahu bahwa Komputer/Laptop mereka yang beli diinstall berbagai macam program aplikasi bajakan, yang mereka tahu tinggal pake.
Lantas haruskah sipenjual Komputer/Laptop disalahkan?
Tentu, seharusnya mereka memberi tahu kepada pembeli sebelumnya, harus menginstall aplikasi yang berlisensi dan jika mereka mao menggunakan bajakan silahkan download dari mbah google.
Adakah solusi untuk kita para user untuk menginstall aplikasi yang original(terutama mahasiswa yang keuangannya cukup untuk indomie *curhat dikit*)?
Tentu ada bro, kalau kalian punya uang lebih dan mao begaya dikit belilah yang branded, namun kalau tidak punya uang install lah yang open source.
Saya mao OS Windows, saya tidak suka linux. ada solusinya?
Buat mahasiswa, perlu kalian ketahui ada sebuah sebuah situs yang bernama dreamspark yang dimana mahasiswa dapat mendownload semua software oringinal seperti OS windows 8, cloud service seperti azure, dll yang dapat kalian akses gratis.
di dreamspark saya tidak bisa menemukan kampus/sekolah saya, masih bisakah saya mendownload aplikasinya?
tentu bisa, namun kalian harus membuktikan bahwa kalian adalah mahasiswa dari suatu kampus/sekolah. Sedikit cerita kampus saya tidak terdaftar di dreamspark, walau saya sudah tanya para dosen dan yang terkaitnya, mereka berkata kalau harusnya sudah ada. Namun apalah daya, dari pada saya emosi, mending saya buktikan aja dengan scan kartu mahasiswa dan mengirimnya kepada dreamspark.
IZero
Single Game Developer
Friday, October 28, 2016
Thursday, October 27, 2016
mengenal unreal engine
oke guys
pertama pasti kalian pada bingung kenapa bahasa saya sering berubah yang terkadang dari saya menjadi gue. semua itu dikarenakan stress membuat blog :D
Kembali kedalam pembahasan
apa itu unreal engine?
unreal engine adalah sebuah game engine yang sangat mantab menurut saya dalam pembuatan game, aplikasi, film. Dengan kata-kata yang saya sukai, yaitu:
pertama pasti kalian pada bingung kenapa bahasa saya sering berubah yang terkadang dari saya menjadi gue. semua itu dikarenakan stress membuat blog :D
Kembali kedalam pembahasan
apa itu unreal engine?
unreal engine adalah sebuah game engine yang sangat mantab menurut saya dalam pembuatan game, aplikasi, film. Dengan kata-kata yang saya sukai, yaitu:
IF YOU LOVE SOMETHING,
SET IT FREE
unreal engine 4 ini sebenernya bukanlah game engine baru dan bukanlah seri pertamanya, mari kita lihat sejarah singkatnya.
Unreal Engine 1 diciptakan oleh perusahaan bernama epic games pada tahun 1998 first person shooter unreal. 4 tahun kemudian Epic Games mengeluarkan lagi unreal engine 2, versi ke 2 ini sangatlah populer dikarenakan banyaknya game yang dirancang mendapatkan repurtasi sangat baik, salah satunya adalah game lineage 2 yang sampai sekarang masih ramai dimainkan(walau di indonesia udah mati). gak percaya? cek wikipedia
(sumber gambar wikipedia loh)
Oke kita skip unreal engine 2nya, karena jaman ini saya belum mengenal game engine(dulu kenal cma counter strike, age of empire dan the sims hahaha).
Tahun 2004, epic games mengeluarkan lagi versi ke 3 nya dari unreal engine. Kali ini unreal engine hanya support untuk pc, xbox 360 dan ps3, yang disusul android dan ios pada tahun 2010nya.
Apa saja sih game yang dihasilkan game engine ini? banyak sekali, berikut adalah game yang dikeluarkan oleh unreal engine 3:
DMC
(sumber gambar wikipedia loh :P)
Gears Of War
(sumber gambar wikipedia loh :P)
Infinity Blade
(sumber gambar wikipedia loh :P)
apakah kita masih bisa mendownload unreal engine 3 ini?
tentu masih bisa, Unreal Development Kit atau biasa dikenal dengan UDK dapat didownload diweb resminya disini loh. Namun, harus diingat UDK sudah tidak lagi disupport oleh epic games yang dikarenakan sudah ada penggantinya unreal engine 4.
Lanjut dengan Unreal engine 4 nya yang dikeluarkan pada tahun 2012, membuat para developer game ingin sekali mencicipi game engine ini. Namun, disayangkan karena game engine ini pada awalnya berbayar $19/bulan ditambah royalty 5% setiap 3 bulan ketika penjualan game sudah mencapai $3.000. Saat itu saya juga yang ingin mencicipi game engine ini mengurungkan niatnya, karena harus bayar $19/bulan sementara keuangan mahasiswa belum cukup bisa menutupi stock indomie.
5 maret 2015, epic games merubah harga unreal engine 4 ini dari $19 menjadi gratis, full source pula(woooow). Walau royalty tidak dihilangkan game engine ini menjadi game engine favorite saya sampai saat ini. kenapa? karena full source ditambah assetsnya itu loh yang banyak, apalagi ada program unreal dev grants buat para developer yang mengerjakan menciptakan karya ciptanya menggunakan unreal engine 4, dapat mereka danai $5.000 sampai $50.000 secara cuma-cuma loh(inget syarat harus pake unreal engine 4).
(sumber screenshoot dari web unreal engine 4 loh)
Mengapa mereka memberikan dana untuk pembuatan game kita secara cuma-cuma? semua itu dijawab dengan simplenya "we succeed when you succed" artinya kami sukses ketika anda sukses
(sumber screenshoot dari web unreal engine 4 loh)
Q : Apakah unreal engine 4 itu sekarang gratis?
A : Ya, unreal engine 4 bisa kalian gunakan secara gratis dengan ketentuan royalty 5% setiap 3 bulannya ketika penjualan game kalian sudah mencapai $3.000
Q : Penjualan game ke 2 saya belum mencapai $3.000, namun game ke 3 saya sudah melebihi $3.000, apakah saya harus membayar royalty kedua game saya?
A : Kamu hanya harus membayar penjualan game kamu yang sudah mencapai $3.000/gamenya, kalau belum sampai tidak ada ketentuan untuk kamu harus membayar.
Q : Saya developer dari game engine tetangga sebelah(sebut saja Udin engine) dan game saya juga dibuat dari Udin engine, apakah saya bisa mengikuti program unreal dev grants?
A : Sayangnya tidak bisa, karena hanya yang menggunakan unreal engine saja yang dapat mengikuti program ini :) :(.
Q : Saya ingin membuat game android, IOS, VR, google daydream. Apakah unreal engine mendukung platform tersebut?
A : tentu saja bro. Jangan khawatir, game engine raksasa ini mendukung semua platform kok. gak percaya? mari kita lihat screenshootnya
(sumber screenshoot dari web unreal engine 4 loh)
(sumber screenshoot dari web unreal engine 4 loh)
Q : Adakah tutorial yang bisa menuntun saya dalam pembuatan game ini?
A : Ada bro, gile banyak banget dan berikut adalah listnya:
- dokumentasi unreal engine (online)
- dokumentasi unreal engine (offline buat yang gak punya koneksi)
- tutorial dari unreal engine
- wiki
- Youtube channel Reuben Ward
- Youtube channel Mathew Wadstein
- Youtube channel PRDV Entertaiment
- Youtube channel Pyrodev
- Youtube channel EvilEyeGames
- Youtube channel Sky Blu Studios
- Youtube channel GameDevMan
- Youtube channel Virtus Learning Hub
- Youtube channel Kyle D.
- Youtube channel Tesla Dev (salah satu channel favorite saya dalam game developer)
- Youtube channel Ben Ormstad
- Youtube channel SG Creation
- Youtube channel Moize Opel
- Youtube channel Unreal Tefel
- Youtube channel Tottaly Unreal
- Youtube channel Peter L. Newton
- Youtube channel MrFantasicGhost
Q : Saya sudah mengikuti tutor yang ada diyoutube dengan teliti, namun kenapa saya menemui ada error sementara yang saya tonton tidak ada error sama sekali?
A : Periksa game enginemu, sesuaikan dengan tutorial yang kamu tonton
Q : Kenapa semua versi unreal engine 4 tidak sama?
A : Semua ini dikarenakan update perbaikan bug, penambahan fitur baru dan perubahan versi visual studio yang diterapkan setiap versinya.
Q : Saya melihat ada asset gretongan(gratis), namun ada yang bertulisan non commercial dan commercial. Apa perbedaannya?
A : non commercial assets adalah sebuah assets yang dapat kamu gunakan, namun kamu dilarang keras untuk menggunakannya sebagai alat komersial. Sementara itu, commercial adalah kebalikannya, kamu dapat menggunakannya menggunakannya sebagai alat komersial game kamu.
Q : Dimana saya bisa mendownload Unreal Engine 4?
A : Kamu dapat mendownload disitus resminya disini
Q : Ketika saya ingin mendownloadnya ada pilihan Get unreal engine, Get Unreal Tournament, Get UE4 Full Source. apa perbedaannya?
(sumber screenshoot dari web unreal engine 4 loh)
A : Saya akan menjelaskannya secara singkat sebagai berikut:
- Get Unreal engine adalah link untuk mendownload game engine a.k.a si unreal engine 4 itu sendiri
- Get Unreal Tournament adalah link untuk mendownload game Unreal Tournament yang gameplay nya cukup bagus kamu mainkan(bisa multiplayer loh)
- Get UE4 Full Source adalah link untuk mendownload game engine a.k.a si unreal engine 4 itu sendiri, namun yang ini adalah versi yang bisa kamu modifikasi(kalau ngerti. disarankan buat pemula jangan dimodif, karna dapat membuat otakmu bergetar) dan juga include dengan linux loh. Jadi bagi kalian yang menjalankan OS linux bisa mencicipi game engine ini.
Q : apa spek min dan recommended untuk bisa menjalankan game engine ini?
A : Berikut adalah min dan recommended speknya:
untuk windows
(sumber screenshoot dari web unreal engine 4 loh)
untuk mac
(sumber screenshoot dari web unreal engine 4 loh)
untuk linux
(sumber screenshoot dari web unreal engine 4 loh)
Q : Spek saya dibawah min, apakah masih bisa jalan?
A : Tentu, saya sendiri menggunakan laptop core i3, vga card nvidia 1gb dan ram 4gb. semua spek jalan asal bukan core2duo, dual core, vga card intel hd graphic, ram 2gb dan semua yang setara+dibawahnya.
Q : Bisakah game engine ini berjalan diwindows 10? saya takut ngebug
A : Bisa, dan itu adalah perntanyaan bodoh menurut saya. Kenapa bodoh? kalau kalian bilang takut bug dan tidak support, itu adalah kekhawatiran pengguna windows 10 pada perilisan awal(juli 2015). Saat itu saya menggunakan xampp pun masih suka bingung karena tidak bisa jalan diwindows 10, namun sekarang semuanya lancar-lancar saja tuh.
oke sekian pengenalan unreal engine 4, semoga bermanfaat guys ;) salam game developer
Internet provider yang sangat direkomendasikan
Kalian bosan membeli kuota internet yang sangat mahal dengan jumlah sedikit?
Ingin bisa berinternetan dirumah dengan cepat, unlimited dan murah?
Tidak usah khawatir, sekarang ada Biznet Home Internet. Dengan harga paket internet mulai dari RP.240.000(belum termasuk ppn 10%) sudah bisa mendapatkan kecepatan internet 25mbps, kalau kecepatan download kalian menggunakan eagleget atau idm bisa terlihat mencapai 3.125MBps loh. Berikut adalah daftar harga internet dari biznet:
biznet home internet(tanpa cable tv)
biznet home combo(include cable tv)
Saya hampir setahun ini menggunakan biznet yang 20mbps seharga RP.300.000, namun ketika ada update harga yang naik menjadi RP.360.000 kecepatannya pun ikut naik menjadi 50mbps(gile bener).
Q : Apa sih yang membedakan antara biznet dengan ISP yang lainnya?
A : Banyak, berikut adalah hasil yang saya dapat setelah hampir satu tahun memakai ISP dari biznet
Dari ketiga kelebihan tersebut adalah hasil yang saya dapat dari pengalaman saya sendiri dan saya tidak dibayar oleh biznet untuk mempromosikan atau membaguskan ISP dari mereka.
Cerita sedikit kenapa memilih biznet:
Awalnya saya adalah WiTer(Wifi Hunter) yang tiap hari nangkring diluar demi mendapatkan wifi dengan kecepatan tinggi. Akibat dari profesi dan hobi saya yang aneh ini, saya sering kali pulang malam hari sekitar jam 1-3 malam, padahal paginya harus kuliah(jangan ditanya, wifi kampus saya madesu dan harus adu memputus jaringan dengan yang lain agar dapat speed lebih) dan duit saya habis buat makan dan + ongkos.
Pada suatu ketika, anak kostan yang berada dirumah saya meminta untuk memasang internet.
Teman: Ayo dong kita pasang internet
Saya: Mahal ah, males
Teman: Gue patungan sama loe
Saya: Loe bayar setengahnya yah?!
Teman: Oke
Akhirnya saya setuju untuk memasang internet, walau saya tidak tahu ISP apa yang akan saya gunakan.
Saya: ISP apa yang bagus nih?
Teman: Pake *************** aja(nama disensorkan, anggap saja nama ISP itu adalah Tokenet), temen Gue kerja jadi telemarketingnya, gue kasih nomornya nih!!!
Saya: Ogah!!! gue males kalo telfon tokenet ntar abis banyak pulsa. Mending suruh temen loe telfon gue aja, nih nomor telfon gue(anggap nomor telfonnya +62871017416/389^10*25%).
Temen: Oke, nanti gue kasih ke doi.
1 minggu kemudian saya sedang berada dikampus mendapatkan telfon dari Marketingnya Tokenet(anggap saja namanya Junetong).
Junetong: halo, selamat siang
saya: iya saya sendiri. maaf ini siapa yah?
Junetong: saya Junetong dari tokenet(skip basa basi awal) saya mendengar dari teman saya yang katanya anda sedang membutuhkan jasa ISP yah?
saya: iya benar sekali mas, saya ingin memasang yang 10mbps dirumah saya.
Junetong: baik bapak untuk 10mbps harganya RP.360.000
saya: buset kaga salah tuh, beberapa hari yang lalu saya bertanya admin twitter tokenet katanya cma RP.270.000?
Junetong: oh maap pak untuk itu harga promo saja yang sudah habis
saya: ohh gitu yah(dalam hati saya gpplah cma promo abis doang mah) yaudah saya mao ambil paket 10mbps
Junetong: baik bapak saya minta alamat lengkapnya
(skip basa basi)
Junetong: baik bapak ditunggu sebentar yah
Setelah menunggu 5 menit Junetong berkata lagi
Junetong: bapak mohon maaf, untuk paket 10mbps diwilayah anda belum tercakup FO. kami menawarkan paket 3mbps belum FO seharga RP.250.000, mao tidak bapak?
saya: eh tong, kalo ngomong yang bener loe, masa rumah gue gak tercakup FO!?
Junetong: maaf pak, tapi sistem kami menunjukan wilayah anda tidak tercakup
saya: 5 meter dari pager rumah gue itu ada tiang yang biasa tokenet pasangin kabel FO ketetangga gue!!! tetangga gue cma cuma beda 5 meter juga dalam satu wilayah sama dan gang yang sama, gimana gak bisa belum tercakup wilayahya? mao maen-maen loe sama gue?!
saya: denger yah mas, dalam gang saya satu alamat, satu rt, satu rw, satu kelurahan, satu kecamatan dan dalam satu wilayah yang sama berjarak 5 meter tetangga saya memasang FO. Kalau dia beda wilayah saya maklumin, namun ini wilayah sama gimana bisa gak tercakup?! kalau loe mao maen-maen sama gue gak mempan, gue tau wilayah gue udah tercover.
Junetong: mao gimana lagi pak, wilayah anda tidak tercakup didalam sistem kami. gimana mas, mao ambil yang 3mbps?
saya: makasih, gak mao gue. 3mbps buat apa? kalah sama kecepatan internet dihp gue dan murah dari pada yang loe tawarin. bilang sama perusahaan loe tokenet, bikin sistem yang uptodate jangan loe pake sistem tahun 98 buat mastiin wilayah seseorang!(kesel asal jeblak bilang tahun 98)
Dengan kesal saya langsung tutup telefon dari dia. Jelang 1 jam, saya bertanya kepada teman-teman saya yang menggunakan ISP dari Tokenet
Teman kampus: jangan pasang dari Tokenet bang. harga mahal, internet sering down gak jelas terutama saat hujan, jika ditanyai selalu berlasan kabelnya ada yang putus. Emangnya mereka masang gak sesuai prosedur apa? Harga suka ngebengkak tanpa alasan, kadang dibilang kalau belom bayarlah, padahal udah gue bayar. Kadang internet gue mati sampe seminggu gak ada kabar jelas, kalau gak ditelfon tuh internet mati selamanya. Pulsa gue abis bisa RP.150.000 kalau telfon mereka, itupun bikin gue emosi bilang katanya besok mao dateng ngirim teknisi, ditunggu seminggu gak dateng dan gak ada kejelasan. banyak deh bang, jangan sampe deh loe pasang.
saya: astaga, setan amat tuh Tokenet. untung gue gak jadi masang
Temen kampus: iya bang, Tokenet brosur aja bagus, padahal mah ampas.
Setelah pulang dari kampus saya langsung ngomel-ngomel sama temen saya yang ada dirumah, karena temennya yang jadi telemarketingnya.
2 minggu kemudian saya menemukan solusi untuk semuanya, saya memilhat iklan Biznet disosmed. harganya sangatlah murah, ditambah wilayah saya ternyata sudah tercover(tercakup) FO miliknya.
senangnya bukan main sampai otak bergetar ala betelgeuse romanee-conti.
Ingin bisa berinternetan dirumah dengan cepat, unlimited dan murah?
Tidak usah khawatir, sekarang ada Biznet Home Internet. Dengan harga paket internet mulai dari RP.240.000(belum termasuk ppn 10%) sudah bisa mendapatkan kecepatan internet 25mbps, kalau kecepatan download kalian menggunakan eagleget atau idm bisa terlihat mencapai 3.125MBps loh. Berikut adalah daftar harga internet dari biznet:
biznet home internet(tanpa cable tv)
Cakupan Area: pulau jawa, batam, bali(screenshoot dari web biznethome.net)
Cakupan Area: JAMBI | PADANG | PALEMBANG(screenshoot dari web biznethome.net)
biznet home combo(include cable tv)
Cakupan Area: pulau jawa, batam, bali(screenshoot dari web biznethome.net)
Saya hampir setahun ini menggunakan biznet yang 20mbps seharga RP.300.000, namun ketika ada update harga yang naik menjadi RP.360.000 kecepatannya pun ikut naik menjadi 50mbps(gile bener).
Q : Apa sih yang membedakan antara biznet dengan ISP yang lainnya?
A : Banyak, berikut adalah hasil yang saya dapat setelah hampir satu tahun memakai ISP dari biznet
- Kecepatannya yang dasyat dan stabil(karna sudah mendukung Fiber Optic)
- Harganya yang murah(bisa dibandinginkan dengan ISP lain)
- Tidak asal memblokir web seperti yang dilakukan ISP lainnya
Dari ketiga kelebihan tersebut adalah hasil yang saya dapat dari pengalaman saya sendiri dan saya tidak dibayar oleh biznet untuk mempromosikan atau membaguskan ISP dari mereka.
Cerita sedikit kenapa memilih biznet:
Awalnya saya adalah WiTer(Wifi Hunter) yang tiap hari nangkring diluar demi mendapatkan wifi dengan kecepatan tinggi. Akibat dari profesi dan hobi saya yang aneh ini, saya sering kali pulang malam hari sekitar jam 1-3 malam, padahal paginya harus kuliah(jangan ditanya, wifi kampus saya madesu dan harus adu memputus jaringan dengan yang lain agar dapat speed lebih) dan duit saya habis buat makan dan + ongkos.
Pada suatu ketika, anak kostan yang berada dirumah saya meminta untuk memasang internet.
Teman: Ayo dong kita pasang internet
Saya: Mahal ah, males
Teman: Gue patungan sama loe
Saya: Loe bayar setengahnya yah?!
Teman: Oke
Akhirnya saya setuju untuk memasang internet, walau saya tidak tahu ISP apa yang akan saya gunakan.
Saya: ISP apa yang bagus nih?
Teman: Pake *************** aja(nama disensorkan, anggap saja nama ISP itu adalah Tokenet), temen Gue kerja jadi telemarketingnya, gue kasih nomornya nih!!!
Saya: Ogah!!! gue males kalo telfon tokenet ntar abis banyak pulsa. Mending suruh temen loe telfon gue aja, nih nomor telfon gue(anggap nomor telfonnya +62871017416/389^10*25%).
Temen: Oke, nanti gue kasih ke doi.
1 minggu kemudian saya sedang berada dikampus mendapatkan telfon dari Marketingnya Tokenet(anggap saja namanya Junetong).
Junetong: halo, selamat siang
saya: iya saya sendiri. maaf ini siapa yah?
Junetong: saya Junetong dari tokenet(skip basa basi awal) saya mendengar dari teman saya yang katanya anda sedang membutuhkan jasa ISP yah?
saya: iya benar sekali mas, saya ingin memasang yang 10mbps dirumah saya.
Junetong: baik bapak untuk 10mbps harganya RP.360.000
saya: buset kaga salah tuh, beberapa hari yang lalu saya bertanya admin twitter tokenet katanya cma RP.270.000?
Junetong: oh maap pak untuk itu harga promo saja yang sudah habis
saya: ohh gitu yah(dalam hati saya gpplah cma promo abis doang mah) yaudah saya mao ambil paket 10mbps
Junetong: baik bapak saya minta alamat lengkapnya
(skip basa basi)
Junetong: baik bapak ditunggu sebentar yah
Setelah menunggu 5 menit Junetong berkata lagi
Junetong: bapak mohon maaf, untuk paket 10mbps diwilayah anda belum tercakup FO. kami menawarkan paket 3mbps belum FO seharga RP.250.000, mao tidak bapak?
saya: eh tong, kalo ngomong yang bener loe, masa rumah gue gak tercakup FO!?
Junetong: maaf pak, tapi sistem kami menunjukan wilayah anda tidak tercakup
saya: 5 meter dari pager rumah gue itu ada tiang yang biasa tokenet pasangin kabel FO ketetangga gue!!! tetangga gue cma cuma beda 5 meter juga dalam satu wilayah sama dan gang yang sama, gimana gak bisa belum tercakup wilayahya? mao maen-maen loe sama gue?!
saya: denger yah mas, dalam gang saya satu alamat, satu rt, satu rw, satu kelurahan, satu kecamatan dan dalam satu wilayah yang sama berjarak 5 meter tetangga saya memasang FO. Kalau dia beda wilayah saya maklumin, namun ini wilayah sama gimana bisa gak tercakup?! kalau loe mao maen-maen sama gue gak mempan, gue tau wilayah gue udah tercover.
Junetong: mao gimana lagi pak, wilayah anda tidak tercakup didalam sistem kami. gimana mas, mao ambil yang 3mbps?
saya: makasih, gak mao gue. 3mbps buat apa? kalah sama kecepatan internet dihp gue dan murah dari pada yang loe tawarin. bilang sama perusahaan loe tokenet, bikin sistem yang uptodate jangan loe pake sistem tahun 98 buat mastiin wilayah seseorang!(kesel asal jeblak bilang tahun 98)
Dengan kesal saya langsung tutup telefon dari dia. Jelang 1 jam, saya bertanya kepada teman-teman saya yang menggunakan ISP dari Tokenet
Teman kampus: jangan pasang dari Tokenet bang. harga mahal, internet sering down gak jelas terutama saat hujan, jika ditanyai selalu berlasan kabelnya ada yang putus. Emangnya mereka masang gak sesuai prosedur apa? Harga suka ngebengkak tanpa alasan, kadang dibilang kalau belom bayarlah, padahal udah gue bayar. Kadang internet gue mati sampe seminggu gak ada kabar jelas, kalau gak ditelfon tuh internet mati selamanya. Pulsa gue abis bisa RP.150.000 kalau telfon mereka, itupun bikin gue emosi bilang katanya besok mao dateng ngirim teknisi, ditunggu seminggu gak dateng dan gak ada kejelasan. banyak deh bang, jangan sampe deh loe pasang.
saya: astaga, setan amat tuh Tokenet. untung gue gak jadi masang
Temen kampus: iya bang, Tokenet brosur aja bagus, padahal mah ampas.
Setelah pulang dari kampus saya langsung ngomel-ngomel sama temen saya yang ada dirumah, karena temennya yang jadi telemarketingnya.
2 minggu kemudian saya menemukan solusi untuk semuanya, saya memilhat iklan Biznet disosmed. harganya sangatlah murah, ditambah wilayah saya ternyata sudah tercover(tercakup) FO miliknya.
senangnya bukan main sampai otak bergetar ala betelgeuse romanee-conti.
(kira-kira seperti ini gayanya)
Lanjut, saya langsung mendaftar diri melalui webnya dan langsung mendapat no VA(virtual account) untuk pembayaran awalnya(saya tidak membayarnya). Satu hari setelah daftar, saya langsung dihubungi oleh biznet, untuk segera melakukan pembayaran diawal. langsung deh capcus saya bayar lewat atm. Hari berikutnya saya dihubungi lagi oleh biznet, kali ini dia bilang bahwa pemasangan akan dilakukan minggu depan tepat pada hari minggu. Namun, pada hari sabtu teknisi biznet menghubungi saya mengatakan bahwa hari itu dia akan melakukan pemasangan jam 4 sore(cepet amat yah pikir saya). Ternyata teknisi biznet datang lebih awal dari pada dugaan saya, dia bilang jam 4 sore, namun dia datang jam 11 siang(wow saya salut sekali dengan cepatnya layanan ini).
Skip 3bulan pemakaian ISP dari biznet saya melihat menyimpulkan:
- Internet terkadang down ditengah malam, ketika saya bertanya kepada yang berkait ia mengatakan bahwa maintenance dilakukan pada malam hari agar tidak mengganggu jam kerja pelanggan biznet(saya makin salut kepada biznet dalam mengambil langkah ini). Pagi harinya internet sudah lancar kembali.
- Internet Speed yang suka kelewatan mantab. Terkadang saya melihat kecepatan download saya melalui eagleget yang seharunya maximal adalah 2,4-2,5MB, ini malah sering 3,2MB terus(wow lagi hebatnya)
- Internet Speed akan berkurang ketika 1 minggu sebelum masa jatuh tempo pembayaran dan kita belum melakukan pembayaran(speed berukurang dari 20mbps menjadi 5-7mbps. yah masih kuat kok streaming youtube dilaptop tanpa buffer + 3 hp yang terkoneksi tidak mengalami koneksi yang lemot).
- Biznet tidak mengirim surat tagihan kerumah, melainkan akan mengirimkan tagihan keemail kita,
- Jika kita mengirim keluhan adanya trouble dalam internet kita, akan dibalas dengan cepat(paling lambat kurang dari 24jam)
- Saya ambil paket 20mbps seharga RP.300.000 yang sekarang menjadi 50mbps seharga RP.500.000 tidak include cable tv, menurut saya tidak masalah, karena saya masih bisa streaming tv dibrowser dan ingat(tidak ada buffer dengan kecepatan 50mbps, bahkan jika kalian sambil maen game dota 2 sekalipun)
sekian pembahasan isp yang saya sarankan, terutama untuk wilayah jakarta dan cerita saya mengapa memilih biznet. Jika ada trouble dengan isp dari biznet, harap langsung dihubungi lewat telefon atau email agar langsung diatasi sesegera mungkin.
mohon maaf kepada isp yang namanya saya samarkan menjadi tokenet jika ada kesalahan kata-kata, saya semua mengambil bahan tulisan dari cerita teman dan pengalaman saya ketika disedang berada dirumah teman saya yang memakai isp tokenet.
Amazon LumberYard Game Engine
Perusahaan raksasa yang bernama Amazon mengeluarkan sebuah game engine dengan nama "LumberYard". Menurut dari cryengine community, lumberyard adalah game engine yang 99,8% berasal dari cryengine 3,8 tech yang dibeli oleh perusahaan Amazon(mereka hanya memodifikasi 0,2% saja). Jadi jika kalian pernah/master dalam menggunakan game engine dari crytek a.k.a cryengine 3, maka lumberyard sangatlah mudah untuk kalian kuasai.
(screenshoot dari web amazon a.k,a lumberyard)
Q : Apakah game engine ini gratis(gretongan)?
A : Ya, game engine ini sangatlah gratis + full source bagi kalian yang ingin membuat game dari lumberyard ini.
Q : Apakah kita diwajibkan membayar royalty untuk game engine ini?
A : Tidak, kalian tidak perlu membayar royalty kepada amazon untuk setiap game yang kalian publikasikan. Kalian hanya membayar untuk AWS service yang akan kalian gunakan, yang artinya semuanya free free free free free free arrgh otak ku bergetar :V :D
Q : Apakah ada aset gretongan yang diberikan lumberyard?
A : Banyak aset yang dapat gunakan dalam game yang akan kalian dibuat seperti woodland asset, beach city, legacy sample(cryengine gamesdk)
(sumber gambar amazon lumberyard)
(sumber gambar amazon lumberyard)
(sumber gambar amazon lumberyard)
Q : Bahasa pemrograman apakah yang diterapkan oleh lumberyard?
A : Bahasa yang mereka gunakan adalah C++
Q : Apakah ada tutorial atau dokumentasi yang diberikan lumberyard ini?
A : Ada dan banyak, berikut adalah link yang akan membawa kalian menuju tutorial dan dokumentasi(tunggu adfly hingga memunculkan tulisan "harap tunggu" yang berada disebelah kanan atas berubah menjadi "lewati" lalu klik tombol "lewati" tersebut)
- tutorial amazon
- dokumentasi lumberyard
- youtube channel amazon gamedev tutorial
- youtube channel Good Enough Gaming
- youtube channel qubodupDev
- youtube channel my gaming life
- youtube channel omggomb
- facebook group lumberyard
Well, menurut saya game engine ini sangatlah bagus bagi kalian yang ingin menciptakan sebuah 3d game. bagi kalian yang berminat, segera download game engine ini dari website resminya Amazon Lumberyard beserta aset yang akan kalian downloadmya. Salam game developer :)
Thursday, July 21, 2016
SwingInterop
-buat project baru menggunakan JavaFx>JavaFx in Swing Application>masukan nama SwingInterop
-buatlah 2 class yang yang bernama SwingInterop dan SampleTableModel
-masukan script SampleTableModel.java
/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package swinginterop;
import java.util.Arrays;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.BarChart;
/**
* SampleTableModel
*/
public class SampleTableModel extends AbstractTableModel {
private static ObservableList<BarChart.Series> bcData;
private final String[] names = {"2007", "2008", "2009"};
private Object[][] data = {
{new Double(567), new Double(956), new Double(1154)},
{new Double(1292), new Double(1665), new Double(1927)},
{new Double(1292), new Double(2559), new Double(2774)}
};
public double getTickUnit() {
return 1000;
}
public List<String> getColumnNames() {
return Arrays.asList(names);
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public Object getValueAt(int row, int column) {
return data[row][column];
}
@Override
public String getColumnName(int column) {
return names[column];
}
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public void setValueAt(Object value, int row, int column) {
if (value instanceof Double) {
data[row][column] = (Double) value;
}
fireTableCellUpdated(row, column);
}
public ObservableList<BarChart.Series> getBarChartData() {
if (bcData == null) {
bcData = FXCollections.<BarChart.Series>observableArrayList();
for (int row = 0; row < getRowCount(); row++) {
ObservableList<BarChart.Data> series = FXCollections.<BarChart.Data>observableArrayList();
for (int column = 0; column < getColumnCount(); column++) {
series.add(new BarChart.Data(getColumnName(column), getValueAt(row, column)));
}
bcData.add(new BarChart.Series(series));
}
}
return bcData;
}
}
-masukan script SwingInterop.java
/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package swinginterop;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.Chart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
/**
* SwingInterop
*
* Note using the browser might require setting the properties
* - http.proxyHost
* - http.proxyPort
*
* e.g. -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080
*
*/
public class SwingInterop extends JApplet {
private static final int PANEL_WIDTH_INT = 675;
private static final int PANEL_HEIGHT_INT = 400;
private static final int TABLE_PANEL_HEIGHT_INT = 100;
private static JFXPanel chartFxPanel;
private static JFXPanel browserFxPanel;
private static SampleTableModel tableModel;
private Chart chart;
private Pane browser;
public void init() {
tableModel = new SampleTableModel();
// create javafx panel for charts
chartFxPanel = new JFXPanel();
chartFxPanel.setPreferredSize(new Dimension(PANEL_WIDTH_INT, PANEL_HEIGHT_INT));
// create javafx panel for browser
browserFxPanel = new JFXPanel();
//create tabbed pane
JTabbedPane tabbedPane = new JTabbedPane();
//JTable
JTable table = new JTable(tableModel);
table.setAutoCreateRowSorter(true);
table.setGridColor(Color.DARK_GRAY);
SwingInterop.DecimalFormatRenderer renderer = new SwingInterop.DecimalFormatRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
JScrollPane tablePanel = new JScrollPane(table);
tablePanel.setPreferredSize(new Dimension(PANEL_WIDTH_INT, TABLE_PANEL_HEIGHT_INT));
JPanel chartTablePanel = new JPanel();
chartTablePanel.setLayout(new BorderLayout());
//Split pane that holds both chart and table
JSplitPane jsplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
jsplitPane.setTopComponent(chartTablePanel);
jsplitPane.setBottomComponent(tablePanel);
jsplitPane.setDividerLocation(410);
chartTablePanel.add(chartFxPanel, BorderLayout.CENTER);
tabbedPane.addTab("JavaFX Chart and Swing JTable", jsplitPane);
tabbedPane.addTab("Web Browser", browserFxPanel);
add(tabbedPane, BorderLayout.CENTER);
// create JavaFX scene
Platform.runLater(new Runnable() {
public void run() {
createScene();
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {}
JFrame frame = new JFrame("JavaFX 2.0 in Swing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new SwingInterop();
applet.init();
frame.setContentPane(applet.getContentPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
applet.start();
}
});
}
private void createScene() {
chart = createBarChart();
chartFxPanel.setScene(new Scene(chart));
browser = createBrowser();
browserFxPanel.setScene(new Scene(browser));
}
private BarChart createBarChart() {
CategoryAxis xAxis = new CategoryAxis();
xAxis.setCategories(FXCollections.<String>observableArrayList(tableModel.getColumnNames()));
xAxis.setLabel("Year");
double tickUnit = tableModel.getTickUnit();
NumberAxis yAxis = new NumberAxis();
yAxis.setTickUnit(tickUnit);
yAxis.setLabel("Units Sold");
final BarChart chart = new BarChart(xAxis, yAxis, tableModel.getBarChartData());
tableModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.UPDATE) {
final int row = e.getFirstRow();
final int column = e.getColumn();
final Object value = ((SampleTableModel) e.getSource()).getValueAt(row, column);
Platform.runLater(new Runnable() {
public void run() {
XYChart.Series<String, Number> s = (XYChart.Series<String, Number>) chart.getData().get(row);
BarChart.Data data = s.getData().get(column);
data.setYValue(value);
}
});
}
}
});
return chart;
}
private Pane createBrowser() {
Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();
Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();
WebView view = new WebView();
view.setMinSize(widthDouble, heightDouble);
view.setPrefSize(widthDouble, heightDouble);
final WebEngine eng = view.getEngine();
final Label warningLabel = new Label("Do you need to specify web proxy information?");
eng.load("http://www.oracle.com/us/index.html");
ChangeListener handler = new ChangeListener<Number>() {
@Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (warningLabel.isVisible()) {
warningLabel.setVisible(false);
}
}
};
eng.getLoadWorker().progressProperty().addListener(handler);
final TextField locationField = new TextField("http://www.oracle.com/us/index.html");
locationField.setMaxHeight(Double.MAX_VALUE);
Button goButton = new Button("Go");
goButton.setDefaultButton(true);
EventHandler<ActionEvent> goAction = new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
eng.load(locationField.getText().startsWith("http://") ? locationField.getText()
: "http://" + locationField.getText());
}
};
goButton.setOnAction(goAction);
locationField.setOnAction(goAction);
eng.locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
locationField.setText(newValue);
}
});
GridPane grid = new GridPane();
grid.setPadding(new Insets(5));
grid.setVgap(5);
grid.setHgap(5);
GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
GridPane.setConstraints(goButton, 1, 0);
GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
GridPane.setConstraints(warningLabel, 0, 2, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
grid.getColumnConstraints().addAll(
new ColumnConstraints(widthDouble - 200, widthDouble - 200, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true),
new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true));
grid.getChildren().addAll(locationField, goButton, warningLabel, view);
return grid;
}
private static class DecimalFormatRenderer extends DefaultTableCellRenderer {
private static final DecimalFormat formatter = new DecimalFormat("#.0");
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
value = formatter.format((Number) value);
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
-buatlah 2 class yang yang bernama SwingInterop dan SampleTableModel
-masukan script SampleTableModel.java
/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package swinginterop;
import java.util.Arrays;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.chart.BarChart;
/**
* SampleTableModel
*/
public class SampleTableModel extends AbstractTableModel {
private static ObservableList<BarChart.Series> bcData;
private final String[] names = {"2007", "2008", "2009"};
private Object[][] data = {
{new Double(567), new Double(956), new Double(1154)},
{new Double(1292), new Double(1665), new Double(1927)},
{new Double(1292), new Double(2559), new Double(2774)}
};
public double getTickUnit() {
return 1000;
}
public List<String> getColumnNames() {
return Arrays.asList(names);
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public Object getValueAt(int row, int column) {
return data[row][column];
}
@Override
public String getColumnName(int column) {
return names[column];
}
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public void setValueAt(Object value, int row, int column) {
if (value instanceof Double) {
data[row][column] = (Double) value;
}
fireTableCellUpdated(row, column);
}
public ObservableList<BarChart.Series> getBarChartData() {
if (bcData == null) {
bcData = FXCollections.<BarChart.Series>observableArrayList();
for (int row = 0; row < getRowCount(); row++) {
ObservableList<BarChart.Data> series = FXCollections.<BarChart.Data>observableArrayList();
for (int column = 0; column < getColumnCount(); column++) {
series.add(new BarChart.Data(getColumnName(column), getValueAt(row, column)));
}
bcData.add(new BarChart.Series(series));
}
}
return bcData;
}
}
-masukan script SwingInterop.java
/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package swinginterop;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javafx.embed.swing.JFXPanel;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.Chart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
/**
* SwingInterop
*
* Note using the browser might require setting the properties
* - http.proxyHost
* - http.proxyPort
*
* e.g. -Dhttp.proxyHost=webcache.mydomain.com -Dhttp.proxyPort=8080
*
*/
public class SwingInterop extends JApplet {
private static final int PANEL_WIDTH_INT = 675;
private static final int PANEL_HEIGHT_INT = 400;
private static final int TABLE_PANEL_HEIGHT_INT = 100;
private static JFXPanel chartFxPanel;
private static JFXPanel browserFxPanel;
private static SampleTableModel tableModel;
private Chart chart;
private Pane browser;
public void init() {
tableModel = new SampleTableModel();
// create javafx panel for charts
chartFxPanel = new JFXPanel();
chartFxPanel.setPreferredSize(new Dimension(PANEL_WIDTH_INT, PANEL_HEIGHT_INT));
// create javafx panel for browser
browserFxPanel = new JFXPanel();
//create tabbed pane
JTabbedPane tabbedPane = new JTabbedPane();
//JTable
JTable table = new JTable(tableModel);
table.setAutoCreateRowSorter(true);
table.setGridColor(Color.DARK_GRAY);
SwingInterop.DecimalFormatRenderer renderer = new SwingInterop.DecimalFormatRenderer();
renderer.setHorizontalAlignment(JLabel.RIGHT);
for (int i = 0; i < table.getColumnCount(); i++) {
table.getColumnModel().getColumn(i).setCellRenderer(renderer);
}
JScrollPane tablePanel = new JScrollPane(table);
tablePanel.setPreferredSize(new Dimension(PANEL_WIDTH_INT, TABLE_PANEL_HEIGHT_INT));
JPanel chartTablePanel = new JPanel();
chartTablePanel.setLayout(new BorderLayout());
//Split pane that holds both chart and table
JSplitPane jsplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
jsplitPane.setTopComponent(chartTablePanel);
jsplitPane.setBottomComponent(tablePanel);
jsplitPane.setDividerLocation(410);
chartTablePanel.add(chartFxPanel, BorderLayout.CENTER);
tabbedPane.addTab("JavaFX Chart and Swing JTable", jsplitPane);
tabbedPane.addTab("Web Browser", browserFxPanel);
add(tabbedPane, BorderLayout.CENTER);
// create JavaFX scene
Platform.runLater(new Runnable() {
public void run() {
createScene();
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (Exception e) {}
JFrame frame = new JFrame("JavaFX 2.0 in Swing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet applet = new SwingInterop();
applet.init();
frame.setContentPane(applet.getContentPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
applet.start();
}
});
}
private void createScene() {
chart = createBarChart();
chartFxPanel.setScene(new Scene(chart));
browser = createBrowser();
browserFxPanel.setScene(new Scene(browser));
}
private BarChart createBarChart() {
CategoryAxis xAxis = new CategoryAxis();
xAxis.setCategories(FXCollections.<String>observableArrayList(tableModel.getColumnNames()));
xAxis.setLabel("Year");
double tickUnit = tableModel.getTickUnit();
NumberAxis yAxis = new NumberAxis();
yAxis.setTickUnit(tickUnit);
yAxis.setLabel("Units Sold");
final BarChart chart = new BarChart(xAxis, yAxis, tableModel.getBarChartData());
tableModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.UPDATE) {
final int row = e.getFirstRow();
final int column = e.getColumn();
final Object value = ((SampleTableModel) e.getSource()).getValueAt(row, column);
Platform.runLater(new Runnable() {
public void run() {
XYChart.Series<String, Number> s = (XYChart.Series<String, Number>) chart.getData().get(row);
BarChart.Data data = s.getData().get(column);
data.setYValue(value);
}
});
}
}
});
return chart;
}
private Pane createBrowser() {
Double widthDouble = new Integer(PANEL_WIDTH_INT).doubleValue();
Double heightDouble = new Integer(PANEL_HEIGHT_INT).doubleValue();
WebView view = new WebView();
view.setMinSize(widthDouble, heightDouble);
view.setPrefSize(widthDouble, heightDouble);
final WebEngine eng = view.getEngine();
final Label warningLabel = new Label("Do you need to specify web proxy information?");
eng.load("http://www.oracle.com/us/index.html");
ChangeListener handler = new ChangeListener<Number>() {
@Override public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
if (warningLabel.isVisible()) {
warningLabel.setVisible(false);
}
}
};
eng.getLoadWorker().progressProperty().addListener(handler);
final TextField locationField = new TextField("http://www.oracle.com/us/index.html");
locationField.setMaxHeight(Double.MAX_VALUE);
Button goButton = new Button("Go");
goButton.setDefaultButton(true);
EventHandler<ActionEvent> goAction = new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent event) {
eng.load(locationField.getText().startsWith("http://") ? locationField.getText()
: "http://" + locationField.getText());
}
};
goButton.setOnAction(goAction);
locationField.setOnAction(goAction);
eng.locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
locationField.setText(newValue);
}
});
GridPane grid = new GridPane();
grid.setPadding(new Insets(5));
grid.setVgap(5);
grid.setHgap(5);
GridPane.setConstraints(locationField, 0, 0, 1, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
GridPane.setConstraints(goButton, 1, 0);
GridPane.setConstraints(view, 0, 1, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.ALWAYS);
GridPane.setConstraints(warningLabel, 0, 2, 2, 1, HPos.CENTER, VPos.CENTER, Priority.ALWAYS, Priority.SOMETIMES);
grid.getColumnConstraints().addAll(
new ColumnConstraints(widthDouble - 200, widthDouble - 200, Double.MAX_VALUE, Priority.ALWAYS, HPos.CENTER, true),
new ColumnConstraints(40, 40, 40, Priority.NEVER, HPos.CENTER, true));
grid.getChildren().addAll(locationField, goButton, warningLabel, view);
return grid;
}
private static class DecimalFormatRenderer extends DefaultTableCellRenderer {
private static final DecimalFormat formatter = new DecimalFormat("#.0");
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
value = formatter.format((Number) value);
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}
}
Tuesday, July 19, 2016
Xylophone
-buat project javafx dengan nama Xylophone
-masukan 8 suara dengan format wav kedalam project
link download suara klik disini
-ketik codingan dibawah ini pada Xylophone.java:
package xylophone;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.media.AudioClip;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* A sample that demonstrates the basics of AudioClips.
*
* @see javafx.scene.media.AudioClip
* @resource Note1.wav
* @resource Note2.wav
* @resource Note3.wav
* @resource Note4.wav
* @resource Note5.wav
* @resource Note6.wav
* @resource Note7.wav
* @resource Note8.wav
*/
public final class Xylophone extends Application {
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setResizable(false);
primaryStage.setScene(new Scene(root, 480, 350));
final AudioClip bar1Note =
new AudioClip(Xylophone.class.getResource("Note1.wav").toString());
final AudioClip bar2Note =
new AudioClip(Xylophone.class.getResource("Note2.wav").toString());
final AudioClip bar3Note =
new AudioClip(Xylophone.class.getResource("Note3.wav").toString());
final AudioClip bar4Note =
new AudioClip(Xylophone.class.getResource("Note4.wav").toString());
final AudioClip bar5Note =
new AudioClip(Xylophone.class.getResource("Note5.wav").toString());
final AudioClip bar6Note =
new AudioClip(Xylophone.class.getResource("Note6.wav").toString());
final AudioClip bar7Note =
new AudioClip(Xylophone.class.getResource("Note7.wav").toString());
final AudioClip bar8Note =
new AudioClip(Xylophone.class.getResource("Note8.wav").toString());
Group rectangleGroup = new Group();
double xStart = 50.0;
double xOffset = 30.0;
double yPos = 180.0;
double barWidth = 22.0;
double barDepth = 7.0;
Group base1Group = createRectangle(new Color(0.2, 0.12, 0.1, 1.0),
xStart + 135, yPos + 20.0, barWidth*11.5, 10.0);
Group base2Group = createRectangle(new Color(0.2, 0.12, 0.1, 1.0),
xStart + 135, yPos - 20.0, barWidth*11.5, 10.0);
Group bar1Group = createRectangle(Color.PURPLE,
xStart + 1*xOffset, yPos, barWidth, 100.0);
Group bar2Group = createRectangle(Color.BLUEVIOLET,
xStart + 2*xOffset, yPos, barWidth, 95.0);
Group bar3Group = createRectangle(Color.BLUE,
xStart + 3*xOffset, yPos, barWidth, 90.0);
Group bar4Group = createRectangle(Color.GREEN,
xStart + 4*xOffset, yPos, barWidth, 85.0);
Group bar5Group = createRectangle(Color.GREENYELLOW,
xStart + 5*xOffset, yPos, barWidth, 80.0);
Group bar6Group = createRectangle(Color.YELLOW,
xStart + 6*xOffset, yPos, barWidth, 75.0);
Group bar7Group = createRectangle(Color.ORANGE,
xStart + 7*xOffset, yPos, barWidth, 70.0);
Group bar8Group = createRectangle(Color.RED,
xStart + 8*xOffset, yPos, barWidth, 65.0);
bar1Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar1Note.play(); }
});
bar2Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar2Note.play(); }
});
bar3Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar3Note.play(); }
});
bar4Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar4Note.play(); }
});
bar5Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar5Note.play(); }
});
bar6Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar6Note.play(); }
});
bar7Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar7Note.play(); }
});
bar8Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar8Note.play(); }
});
Light.Point light = new Light.Point();
light.setX(-20);
light.setY(-20);
light.setZ(100);
Lighting l = new Lighting();
l.setLight(light);
l.setSurfaceScale(1.0f);
bar1Group.setEffect(l);
bar2Group.setEffect(l);
bar3Group.setEffect(l);
bar4Group.setEffect(l);
bar5Group.setEffect(l);
bar6Group.setEffect(l);
bar7Group.setEffect(l);
bar8Group.setEffect(l);
rectangleGroup.getChildren().add(base1Group);
rectangleGroup.getChildren().add(base2Group);
rectangleGroup.getChildren().add(bar1Group);
rectangleGroup.getChildren().add(bar2Group);
rectangleGroup.getChildren().add(bar3Group);
rectangleGroup.getChildren().add(bar4Group);
rectangleGroup.getChildren().add(bar5Group);
rectangleGroup.getChildren().add(bar6Group);
rectangleGroup.getChildren().add(bar7Group);
rectangleGroup.getChildren().add(bar8Group);
rectangleGroup.setScaleX(1.8);
rectangleGroup.setScaleY(1.8);
rectangleGroup.setTranslateX(55.0);
Pane pane = new Pane();
pane.getChildren().add(rectangleGroup);
root.getChildren().add(pane);
}
public static Group createRectangle(Color color, double tx, double ty, double sx, double sy) {
Group squareGroup = new Group();
Rectangle squareShape = new Rectangle(1.0, 1.0);
squareShape.setFill(color);
squareShape.setTranslateX(-0.5);
squareShape.setTranslateY(-0.5);
squareGroup.getChildren().add(squareShape);
squareGroup.setTranslateX(tx);
squareGroup.setTranslateY(ty);
squareGroup.setScaleX(sx);
squareGroup.setScaleY(sy);
return squareGroup;
}
@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX
* application. main() serves only as fallback in case the
* application can not be launched through deployment artifacts,
* e.g., in IDEs with limited FX support. NetBeans ignores main().
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
-masukan 8 suara dengan format wav kedalam project
link download suara klik disini
-ketik codingan dibawah ini pada Xylophone.java:
package xylophone;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.media.AudioClip;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* A sample that demonstrates the basics of AudioClips.
*
* @see javafx.scene.media.AudioClip
* @resource Note1.wav
* @resource Note2.wav
* @resource Note3.wav
* @resource Note4.wav
* @resource Note5.wav
* @resource Note6.wav
* @resource Note7.wav
* @resource Note8.wav
*/
public final class Xylophone extends Application {
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setResizable(false);
primaryStage.setScene(new Scene(root, 480, 350));
final AudioClip bar1Note =
new AudioClip(Xylophone.class.getResource("Note1.wav").toString());
final AudioClip bar2Note =
new AudioClip(Xylophone.class.getResource("Note2.wav").toString());
final AudioClip bar3Note =
new AudioClip(Xylophone.class.getResource("Note3.wav").toString());
final AudioClip bar4Note =
new AudioClip(Xylophone.class.getResource("Note4.wav").toString());
final AudioClip bar5Note =
new AudioClip(Xylophone.class.getResource("Note5.wav").toString());
final AudioClip bar6Note =
new AudioClip(Xylophone.class.getResource("Note6.wav").toString());
final AudioClip bar7Note =
new AudioClip(Xylophone.class.getResource("Note7.wav").toString());
final AudioClip bar8Note =
new AudioClip(Xylophone.class.getResource("Note8.wav").toString());
Group rectangleGroup = new Group();
double xStart = 50.0;
double xOffset = 30.0;
double yPos = 180.0;
double barWidth = 22.0;
double barDepth = 7.0;
Group base1Group = createRectangle(new Color(0.2, 0.12, 0.1, 1.0),
xStart + 135, yPos + 20.0, barWidth*11.5, 10.0);
Group base2Group = createRectangle(new Color(0.2, 0.12, 0.1, 1.0),
xStart + 135, yPos - 20.0, barWidth*11.5, 10.0);
Group bar1Group = createRectangle(Color.PURPLE,
xStart + 1*xOffset, yPos, barWidth, 100.0);
Group bar2Group = createRectangle(Color.BLUEVIOLET,
xStart + 2*xOffset, yPos, barWidth, 95.0);
Group bar3Group = createRectangle(Color.BLUE,
xStart + 3*xOffset, yPos, barWidth, 90.0);
Group bar4Group = createRectangle(Color.GREEN,
xStart + 4*xOffset, yPos, barWidth, 85.0);
Group bar5Group = createRectangle(Color.GREENYELLOW,
xStart + 5*xOffset, yPos, barWidth, 80.0);
Group bar6Group = createRectangle(Color.YELLOW,
xStart + 6*xOffset, yPos, barWidth, 75.0);
Group bar7Group = createRectangle(Color.ORANGE,
xStart + 7*xOffset, yPos, barWidth, 70.0);
Group bar8Group = createRectangle(Color.RED,
xStart + 8*xOffset, yPos, barWidth, 65.0);
bar1Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar1Note.play(); }
});
bar2Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar2Note.play(); }
});
bar3Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar3Note.play(); }
});
bar4Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar4Note.play(); }
});
bar5Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar5Note.play(); }
});
bar6Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar6Note.play(); }
});
bar7Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar7Note.play(); }
});
bar8Group.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) { bar8Note.play(); }
});
Light.Point light = new Light.Point();
light.setX(-20);
light.setY(-20);
light.setZ(100);
Lighting l = new Lighting();
l.setLight(light);
l.setSurfaceScale(1.0f);
bar1Group.setEffect(l);
bar2Group.setEffect(l);
bar3Group.setEffect(l);
bar4Group.setEffect(l);
bar5Group.setEffect(l);
bar6Group.setEffect(l);
bar7Group.setEffect(l);
bar8Group.setEffect(l);
rectangleGroup.getChildren().add(base1Group);
rectangleGroup.getChildren().add(base2Group);
rectangleGroup.getChildren().add(bar1Group);
rectangleGroup.getChildren().add(bar2Group);
rectangleGroup.getChildren().add(bar3Group);
rectangleGroup.getChildren().add(bar4Group);
rectangleGroup.getChildren().add(bar5Group);
rectangleGroup.getChildren().add(bar6Group);
rectangleGroup.getChildren().add(bar7Group);
rectangleGroup.getChildren().add(bar8Group);
rectangleGroup.setScaleX(1.8);
rectangleGroup.setScaleY(1.8);
rectangleGroup.setTranslateX(55.0);
Pane pane = new Pane();
pane.getChildren().add(rectangleGroup);
root.getChildren().add(pane);
}
public static Group createRectangle(Color color, double tx, double ty, double sx, double sy) {
Group squareGroup = new Group();
Rectangle squareShape = new Rectangle(1.0, 1.0);
squareShape.setFill(color);
squareShape.setTranslateX(-0.5);
squareShape.setTranslateY(-0.5);
squareGroup.getChildren().add(squareShape);
squareGroup.setTranslateX(tx);
squareGroup.setTranslateY(ty);
squareGroup.setScaleX(sx);
squareGroup.setScaleY(sy);
return squareGroup;
}
@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX
* application. main() serves only as fallback in case the
* application can not be launched through deployment artifacts,
* e.g., in IDEs with limited FX support. NetBeans ignores main().
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
-jika berhasil maka akan muncul gambar seperti dibawah ini dan tekan setiap nada tangga untuk memainkan suara
Tuesday, June 21, 2016
buat game puzzlepieces menggunakan netbeans
dalam permainan ini kita akan membuatnya menggunakan javafx pada netbeans, berikut tutorialnya:
-klik new project
-pilih javafx>next
-masukan nama project PuzzlePieces
-masukan gambar dibawah ini kedalam project dengan cara drag atau dengan cara copy netbeansproject>PuzzlePieces>src>PuzzlePieces
-/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package puzzlepieces;
import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* A sample in which an image is broken into pieces to create a jigsaw puzzle.
*
* @see javafx.scene.shape.Path
* @see javafx.scene.image.Image
* @see javafx.scene.image.ImageView
* @see javafx.scene.control.Button
* @see javafx.scene.layout.Pane
* @see javafx.scene.input.MouseEvent
* @see javafx.scene.effect.DropShadow
* @resource PuzzlePieces-picture.jpg
*/
public class PuzzlePieces extends Application {
private Timeline timeline;
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));
// load puzzle image
Image image = new Image(getClass().getResourceAsStream(
"PuzzlePieces-picture.jpg"));
int numOfColumns = (int) (image.getWidth() / Piece.SIZE);
int numOfRows = (int) (image.getHeight() / Piece.SIZE);
// create desk
final Desk desk = new Desk(numOfColumns, numOfRows);
// create puzzle pieces
final List<Piece> pieces = new ArrayList<Piece>();
for (int col = 0; col < numOfColumns; col++) {
for (int row = 0; row < numOfRows; row++) {
int x = col * Piece.SIZE;
int y = row * Piece.SIZE;
final Piece piece = new Piece(image, x, y, row>0, col>0,
row<numOfRows -1, col < numOfColumns -1,
desk.getWidth(), desk.getHeight());
pieces.add(piece);
}
}
desk.getChildren().addAll(pieces);
// create button box
Button shuffleButton = new Button("Shuffle");
shuffleButton.setStyle("-fx-font-size: 2em;");
shuffleButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent actionEvent) {
if (timeline != null) timeline.stop();
timeline = new Timeline();
for (final Piece piece : pieces) {
piece.setActive();
double shuffleX = Math.random() *
(desk.getWidth() - Piece.SIZE + 48f ) -
24f - piece.getCorrectX();
double shuffleY = Math.random() *
(desk.getHeight() - Piece.SIZE + 30f ) -
15f - piece.getCorrectY();
timeline.getKeyFrames().add(
new KeyFrame(Duration.seconds(1),
new KeyValue(piece.translateXProperty(), shuffleX),
new KeyValue(piece.translateYProperty(), shuffleY)));
}
timeline.playFromStart();
}
});
Button solveButton = new Button("Solve");
solveButton.setStyle("-fx-font-size: 2em;");
solveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent actionEvent) {
if (timeline != null) timeline.stop();
timeline = new Timeline();
for (final Piece piece : pieces) {
piece.setInactive();
timeline.getKeyFrames().add(
new KeyFrame(Duration.seconds(1),
new KeyValue(piece.translateXProperty(), 0),
new KeyValue(piece.translateYProperty(), 0)));
}
timeline.playFromStart();
}
});
HBox buttonBox = new HBox(8);
buttonBox.getChildren().addAll(shuffleButton, solveButton);
// create vbox for desk and buttons
VBox vb = new VBox(10);
vb.getChildren().addAll(desk,buttonBox);
root.getChildren().addAll(vb);
}
/**
* Node that represents the playing area/ desktop where the puzzle pices sit
*/
public static class Desk extends Pane {
Desk(int numOfColumns, int numOfRows) {
setStyle("-fx-background-color: #cccccc; " +
"-fx-border-color: #464646; " +
"-fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.8) , 15, 0.0 , 0 , 4 );");
double DESK_WIDTH = Piece.SIZE * numOfColumns;
double DESK_HEIGHT = Piece.SIZE * numOfRows;
setPrefSize(DESK_WIDTH,DESK_HEIGHT);
setMaxSize(DESK_WIDTH, DESK_HEIGHT);
autosize();
// create path for lines
Path grid = new Path();
grid.setStroke(Color.rgb(70, 70, 70));
getChildren().add(grid);
// create vertical lines
for (int col = 0; col < numOfColumns - 1; col++) {
grid.getElements().addAll(
new MoveTo(Piece.SIZE + Piece.SIZE * col, 5),
new LineTo(Piece.SIZE + Piece.SIZE * col, Piece.SIZE * numOfRows - 5)
);
}
// create horizontal lines
for (int row = 0; row < numOfRows - 1; row++) {
grid.getElements().addAll(
new MoveTo(5, Piece.SIZE + Piece.SIZE * row),
new LineTo(Piece.SIZE * numOfColumns - 5, Piece.SIZE + Piece.SIZE * row)
);
}
}
@Override protected void layoutChildren() {}
}
/**
* Node that represents a puzzle piece
*/
public static class Piece extends Parent {
public static final int SIZE = 100;
private final double correctX;
private final double correctY;
private final boolean hasTopTab;
private final boolean hasLeftTab;
private final boolean hasBottomTab;
private final boolean hasRightTab;
private double startDragX;
private double startDragY;
private Shape pieceStroke;
private Shape pieceClip;
private ImageView imageView = new ImageView();
private Point2D dragAnchor;
public Piece(Image image, final double correctX, final double correctY,
boolean topTab, boolean leftTab, boolean bottomTab, boolean rightTab,
final double deskWidth, final double deskHeight) {
this.correctX = correctX;
this.correctY = correctY;
this.hasTopTab = topTab;
this.hasLeftTab = leftTab;
this.hasBottomTab = bottomTab;
this.hasRightTab = rightTab;
// configure clip
pieceClip = createPiece();
pieceClip.setFill(Color.WHITE);
pieceClip.setStroke(null);
// add a stroke
pieceStroke = createPiece();
pieceStroke.setFill(null);
pieceStroke.setStroke(Color.BLACK);
// create image view
imageView.setImage(image);
imageView.setClip(pieceClip);
setFocusTraversable(true);
getChildren().addAll(imageView, pieceStroke);
// turn on caching so the jigsaw piece is fasr to draw when dragging
setCache(true);
// start in inactive state
setInactive();
// add listeners to support dragging
setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
toFront();
startDragX = getTranslateX();
startDragY = getTranslateY();
dragAnchor = new Point2D(me.getSceneX(), me.getSceneY());
}
});
setOnMouseReleased(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
if (getTranslateX() < (10) && getTranslateX() > (- 10) &&
getTranslateY() < (10) && getTranslateY() > (- 10)) {
setTranslateX(0);
setTranslateY(0);
setInactive();
}
}
});
setOnMouseDragged(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
double newTranslateX = startDragX
+ me.getSceneX() - dragAnchor.getX();
double newTranslateY = startDragY
+ me.getSceneY() - dragAnchor.getY();
double minTranslateX = - 45f - correctX;
double maxTranslateX = (deskWidth - Piece.SIZE + 50f ) - correctX;
double minTranslateY = - 30f - correctY;
double maxTranslateY = (deskHeight - Piece.SIZE + 70f ) - correctY;
if ((newTranslateX> minTranslateX ) &&
(newTranslateX< maxTranslateX) &&
(newTranslateY> minTranslateY) &&
(newTranslateY< maxTranslateY)) {
setTranslateX(newTranslateX);
setTranslateY(newTranslateY);
}
}
});
}
private Shape createPiece() {
Shape shape = createPieceRectangle();
if (hasRightTab) {
shape = Shape.union(shape,
createPieceTab(69.5f, 0f, 10f, 17.5f, 50f, -12.5f, 11.5f,
25f, 56.25f, -14f, 6.25f, 56.25f, 14f, 6.25f));
}
if (hasBottomTab) {
shape = Shape.union(shape,
createPieceTab(0f, 69.5f, 17.5f, 10f, -12.5f, 50f, 25f,
11f, -14f, 56.25f, 6.25f, 14f, 56.25f, 6.25f));
}
if (hasLeftTab) {
shape = Shape.subtract(shape,
createPieceTab(-31f, 0f, 10f, 17.5f, -50f, -12.5f, 11f,
25f, -43.75f, -14f, 6.25f, -43.75f, 14f, 6.25f));
}
if (hasTopTab) {
shape = Shape.subtract(shape,
createPieceTab(0f, -31f, 17.5f, 10f, -12.5f, -50f, 25f,
12.5f, -14f, -43.75f, 6.25f, 14f, -43.75f, 6.25f));
}
shape.setTranslateX(correctX);
shape.setTranslateY(correctY);
shape.setLayoutX(50f);
shape.setLayoutY(50f);
return shape;
}
private Rectangle createPieceRectangle() {
Rectangle rec = new Rectangle();
rec.setX(-50);
rec.setY(-50);
rec.setWidth(SIZE);
rec.setHeight(SIZE);
return rec;
}
private Shape createPieceTab(double eclipseCenterX, double eclipseCenterY, double eclipseRadiusX, double eclipseRadiusY,
double rectangleX, double rectangleY, double rectangleWidth, double rectangleHeight,
double circle1CenterX, double circle1CenterY, double circle1Radius,
double circle2CenterX, double circle2CenterY, double circle2Radius) {
Ellipse e = new Ellipse(eclipseCenterX, eclipseCenterY, eclipseRadiusX, eclipseRadiusY);
Rectangle r = new Rectangle(rectangleX, rectangleY, rectangleWidth, rectangleHeight);
Shape tab = Shape.union(e, r);
Circle c1 = new Circle(circle1CenterX, circle1CenterY, circle1Radius);
tab = Shape.subtract(tab, c1);
Circle c2 = new Circle(circle2CenterX, circle2CenterY, circle2Radius);
tab = Shape.subtract(tab, c2);
return tab;
}
public void setActive() {
setDisable(false);
setEffect(new DropShadow());
toFront();
}
public void setInactive() {
setEffect(null);
setDisable(true);
toBack();
}
public double getCorrectX() { return correctX; }
public double getCorrectY() { return correctY; }
}
@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX
* application. main() serves only as fallback in case the
* application can not be launched through deployment artifacts,
* e.g., in IDEs with limited FX support. NetBeans ignores main().
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
-klik new project
-pilih javafx>next
-masukan nama project PuzzlePieces
-masukan gambar dibawah ini kedalam project dengan cara drag atau dengan cara copy netbeansproject>PuzzlePieces>src>PuzzlePieces
nama pitcure PuzzlePieces-picture.jpg
-/*
* Copyright (c) 2008, 2012 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle Corporation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package puzzlepieces;
import java.util.ArrayList;
import java.util.List;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
* A sample in which an image is broken into pieces to create a jigsaw puzzle.
*
* @see javafx.scene.shape.Path
* @see javafx.scene.image.Image
* @see javafx.scene.image.ImageView
* @see javafx.scene.control.Button
* @see javafx.scene.layout.Pane
* @see javafx.scene.input.MouseEvent
* @see javafx.scene.effect.DropShadow
* @resource PuzzlePieces-picture.jpg
*/
public class PuzzlePieces extends Application {
private Timeline timeline;
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));
// load puzzle image
Image image = new Image(getClass().getResourceAsStream(
"PuzzlePieces-picture.jpg"));
int numOfColumns = (int) (image.getWidth() / Piece.SIZE);
int numOfRows = (int) (image.getHeight() / Piece.SIZE);
// create desk
final Desk desk = new Desk(numOfColumns, numOfRows);
// create puzzle pieces
final List<Piece> pieces = new ArrayList<Piece>();
for (int col = 0; col < numOfColumns; col++) {
for (int row = 0; row < numOfRows; row++) {
int x = col * Piece.SIZE;
int y = row * Piece.SIZE;
final Piece piece = new Piece(image, x, y, row>0, col>0,
row<numOfRows -1, col < numOfColumns -1,
desk.getWidth(), desk.getHeight());
pieces.add(piece);
}
}
desk.getChildren().addAll(pieces);
// create button box
Button shuffleButton = new Button("Shuffle");
shuffleButton.setStyle("-fx-font-size: 2em;");
shuffleButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent actionEvent) {
if (timeline != null) timeline.stop();
timeline = new Timeline();
for (final Piece piece : pieces) {
piece.setActive();
double shuffleX = Math.random() *
(desk.getWidth() - Piece.SIZE + 48f ) -
24f - piece.getCorrectX();
double shuffleY = Math.random() *
(desk.getHeight() - Piece.SIZE + 30f ) -
15f - piece.getCorrectY();
timeline.getKeyFrames().add(
new KeyFrame(Duration.seconds(1),
new KeyValue(piece.translateXProperty(), shuffleX),
new KeyValue(piece.translateYProperty(), shuffleY)));
}
timeline.playFromStart();
}
});
Button solveButton = new Button("Solve");
solveButton.setStyle("-fx-font-size: 2em;");
solveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent actionEvent) {
if (timeline != null) timeline.stop();
timeline = new Timeline();
for (final Piece piece : pieces) {
piece.setInactive();
timeline.getKeyFrames().add(
new KeyFrame(Duration.seconds(1),
new KeyValue(piece.translateXProperty(), 0),
new KeyValue(piece.translateYProperty(), 0)));
}
timeline.playFromStart();
}
});
HBox buttonBox = new HBox(8);
buttonBox.getChildren().addAll(shuffleButton, solveButton);
// create vbox for desk and buttons
VBox vb = new VBox(10);
vb.getChildren().addAll(desk,buttonBox);
root.getChildren().addAll(vb);
}
/**
* Node that represents the playing area/ desktop where the puzzle pices sit
*/
public static class Desk extends Pane {
Desk(int numOfColumns, int numOfRows) {
setStyle("-fx-background-color: #cccccc; " +
"-fx-border-color: #464646; " +
"-fx-effect: innershadow( two-pass-box , rgba(0,0,0,0.8) , 15, 0.0 , 0 , 4 );");
double DESK_WIDTH = Piece.SIZE * numOfColumns;
double DESK_HEIGHT = Piece.SIZE * numOfRows;
setPrefSize(DESK_WIDTH,DESK_HEIGHT);
setMaxSize(DESK_WIDTH, DESK_HEIGHT);
autosize();
// create path for lines
Path grid = new Path();
grid.setStroke(Color.rgb(70, 70, 70));
getChildren().add(grid);
// create vertical lines
for (int col = 0; col < numOfColumns - 1; col++) {
grid.getElements().addAll(
new MoveTo(Piece.SIZE + Piece.SIZE * col, 5),
new LineTo(Piece.SIZE + Piece.SIZE * col, Piece.SIZE * numOfRows - 5)
);
}
// create horizontal lines
for (int row = 0; row < numOfRows - 1; row++) {
grid.getElements().addAll(
new MoveTo(5, Piece.SIZE + Piece.SIZE * row),
new LineTo(Piece.SIZE * numOfColumns - 5, Piece.SIZE + Piece.SIZE * row)
);
}
}
@Override protected void layoutChildren() {}
}
/**
* Node that represents a puzzle piece
*/
public static class Piece extends Parent {
public static final int SIZE = 100;
private final double correctX;
private final double correctY;
private final boolean hasTopTab;
private final boolean hasLeftTab;
private final boolean hasBottomTab;
private final boolean hasRightTab;
private double startDragX;
private double startDragY;
private Shape pieceStroke;
private Shape pieceClip;
private ImageView imageView = new ImageView();
private Point2D dragAnchor;
public Piece(Image image, final double correctX, final double correctY,
boolean topTab, boolean leftTab, boolean bottomTab, boolean rightTab,
final double deskWidth, final double deskHeight) {
this.correctX = correctX;
this.correctY = correctY;
this.hasTopTab = topTab;
this.hasLeftTab = leftTab;
this.hasBottomTab = bottomTab;
this.hasRightTab = rightTab;
// configure clip
pieceClip = createPiece();
pieceClip.setFill(Color.WHITE);
pieceClip.setStroke(null);
// add a stroke
pieceStroke = createPiece();
pieceStroke.setFill(null);
pieceStroke.setStroke(Color.BLACK);
// create image view
imageView.setImage(image);
imageView.setClip(pieceClip);
setFocusTraversable(true);
getChildren().addAll(imageView, pieceStroke);
// turn on caching so the jigsaw piece is fasr to draw when dragging
setCache(true);
// start in inactive state
setInactive();
// add listeners to support dragging
setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
toFront();
startDragX = getTranslateX();
startDragY = getTranslateY();
dragAnchor = new Point2D(me.getSceneX(), me.getSceneY());
}
});
setOnMouseReleased(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
if (getTranslateX() < (10) && getTranslateX() > (- 10) &&
getTranslateY() < (10) && getTranslateY() > (- 10)) {
setTranslateX(0);
setTranslateY(0);
setInactive();
}
}
});
setOnMouseDragged(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
double newTranslateX = startDragX
+ me.getSceneX() - dragAnchor.getX();
double newTranslateY = startDragY
+ me.getSceneY() - dragAnchor.getY();
double minTranslateX = - 45f - correctX;
double maxTranslateX = (deskWidth - Piece.SIZE + 50f ) - correctX;
double minTranslateY = - 30f - correctY;
double maxTranslateY = (deskHeight - Piece.SIZE + 70f ) - correctY;
if ((newTranslateX> minTranslateX ) &&
(newTranslateX< maxTranslateX) &&
(newTranslateY> minTranslateY) &&
(newTranslateY< maxTranslateY)) {
setTranslateX(newTranslateX);
setTranslateY(newTranslateY);
}
}
});
}
private Shape createPiece() {
Shape shape = createPieceRectangle();
if (hasRightTab) {
shape = Shape.union(shape,
createPieceTab(69.5f, 0f, 10f, 17.5f, 50f, -12.5f, 11.5f,
25f, 56.25f, -14f, 6.25f, 56.25f, 14f, 6.25f));
}
if (hasBottomTab) {
shape = Shape.union(shape,
createPieceTab(0f, 69.5f, 17.5f, 10f, -12.5f, 50f, 25f,
11f, -14f, 56.25f, 6.25f, 14f, 56.25f, 6.25f));
}
if (hasLeftTab) {
shape = Shape.subtract(shape,
createPieceTab(-31f, 0f, 10f, 17.5f, -50f, -12.5f, 11f,
25f, -43.75f, -14f, 6.25f, -43.75f, 14f, 6.25f));
}
if (hasTopTab) {
shape = Shape.subtract(shape,
createPieceTab(0f, -31f, 17.5f, 10f, -12.5f, -50f, 25f,
12.5f, -14f, -43.75f, 6.25f, 14f, -43.75f, 6.25f));
}
shape.setTranslateX(correctX);
shape.setTranslateY(correctY);
shape.setLayoutX(50f);
shape.setLayoutY(50f);
return shape;
}
private Rectangle createPieceRectangle() {
Rectangle rec = new Rectangle();
rec.setX(-50);
rec.setY(-50);
rec.setWidth(SIZE);
rec.setHeight(SIZE);
return rec;
}
private Shape createPieceTab(double eclipseCenterX, double eclipseCenterY, double eclipseRadiusX, double eclipseRadiusY,
double rectangleX, double rectangleY, double rectangleWidth, double rectangleHeight,
double circle1CenterX, double circle1CenterY, double circle1Radius,
double circle2CenterX, double circle2CenterY, double circle2Radius) {
Ellipse e = new Ellipse(eclipseCenterX, eclipseCenterY, eclipseRadiusX, eclipseRadiusY);
Rectangle r = new Rectangle(rectangleX, rectangleY, rectangleWidth, rectangleHeight);
Shape tab = Shape.union(e, r);
Circle c1 = new Circle(circle1CenterX, circle1CenterY, circle1Radius);
tab = Shape.subtract(tab, c1);
Circle c2 = new Circle(circle2CenterX, circle2CenterY, circle2Radius);
tab = Shape.subtract(tab, c2);
return tab;
}
public void setActive() {
setDisable(false);
setEffect(new DropShadow());
toFront();
}
public void setInactive() {
setEffect(null);
setDisable(true);
toBack();
}
public double getCorrectX() { return correctX; }
public double getCorrectY() { return correctY; }
}
@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
/**
* The main() method is ignored in correctly deployed JavaFX
* application. main() serves only as fallback in case the
* application can not be launched through deployment artifacts,
* e.g., in IDEs with limited FX support. NetBeans ignores main().
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
Subscribe to:
Comments (Atom)
Original VS Pirated? Solusi bagi user dan developer
Bagi para developer melihat sesuatu dengan uang diakhir, yang artinya investasi diawal(uang, tenaga, waktu) untuk mendapatkan sebuah pendapa...
-
oke guys pertama pasti kalian pada bingung kenapa bahasa saya sering berubah yang terkadang dari saya menjadi gue. semua itu dikarenakan st...
-
Perusahaan raksasa yang bernama Amazon mengeluarkan sebuah game engine dengan nama "LumberYard". Menurut dari cryengine community,...
-
Lapisan pelindung layar yang berguna agar lapisan kaca tidak mudah tertempel minyak atau kotoran dari jari. Sama seperti Gorilla Glass,...






















