Friday, September 10, 2010

Tutorial: Simple game with HTML5 Canvas - part 1

Check other language versions: [RUSSIAN]


Tutorial: Simple game with HTML5 Canvas
Part 1 - Introduction & Background
Part 2 - Character & Animation
Part 3 - Physics & Controls
Part 4 - Platforms & Collisions
Part 5 - Scrolling & Game States

If you are interested in news and updates of that tutorial just follow me on twitter: [MichalBe's Twitter]

Because 10KApart is closed now, and we are all waiting for the results, it is good time to remind my very simple "Stairs to heaven" game and explain in details how it was made.

INTRODUCTION
StH is very simple clone of Doodle Jump, but to be honest I was inspired by Icy Tower and discover DJ after I submit StH to the competition. Never mind.
The goal is to control little angel & jump on the two kinds of platforms - orange (regular ones) and green (super high jump springboards). The game ends when the angel falls down to the bottom of the screen. Try it: [Stairs to heaven].
I create that game in about 8hours and later, after playing more and more, I discover few bugs so in this tutorial I want to fix it all. Let's do it!

Part 1. BACKGROUND
Because whole game, including images and scripts, couldn't be over 10K, I didn't want to use image on the background. It was cheaper to draw some generic-like stuff using canvas drawing functions.
First of all we need little HTML, nothing special, just one canvas element with some unique id, little bit of CSS and include of not existing yet game.js:
<html>
  <head>
    <title>Simple game with HTML5 Canvas</title>
  <style>
  body {
    margin:0px;
    padding:0px;
    text-align:center;
  }

  canvas{
    outline:0;
    border:1px solid #000;
    margin-left: auto;
    margin-right: auto;
  }
  </style>
  </head>
  <body>
    <canvas id='c'></canvas>
    <script src="game.js"></script>
  </body>
</html>
That's all in HTML we will need during this tutorial.
Ok, so let's create some Javascript.
First of all we need to create few global (for now, I know that global = evil) variables & change canvas attributes. That will be enough:
var width = 320,
//width of the canvas
  height = 500,
//height of the canvas

  c = document.getElementById('c'), 
//canvas itself 

  ctx = c.getContext('2d');
//and two-dimensional graphic context of the
//canvas, the only one supported by all 
//browsers for now

c.width = width;
c.height = height;
//setting canvas size 
First of all its important to understand one thing about canvas - it is not possible to move objects in the canvas surface. It's necessarily to clear it, whole or in the parts, on each frame. To achieve this, let's create clear() function.
var clear = function(){
  ctx.fillStyle = '#d0e7f9';
//set active color to #d0e... (nice blue)
//UPDATE - as 'Ped7g' noticed - using clearRect() in here is useless, we cover whole surface of the canvas with blue rectangle two lines below. I just forget to remove that line
//ctx.clearRect(0, 0, width, height);
//clear whole surface
  ctx.beginPath();
//start drawing
  ctx.rect(0, 0, width, height);
//draw rectangle from point (0, 0) to
//(width, height) covering whole canvas
  ctx.closePath();
//end drawing
  ctx.fill();
//fill rectangle with active
//color selected before
}
One colored clear background is boring as hell, so let's draw some clouds on it. Maybe not regular clouds, but simple, semitransparent circles imitating clouds. First we will draw some in random places of the canvas, each with different size and transparency. We will keep all the informations about circles in 2d array (there are no two-dimensional arrays in JS, best way to solve this is just put one Array into another).
var howManyCircles = 10, circles = [];

for (var i = 0; i < howManyCircles; i++) 
  circles.push([Math.random() * width, Math.random() * height, Math.random() * 100, Math.random() / 2]);
//add information about circles into
//the 'circles' Array. It is x & y positions, 
//radius from 0-100 and transparency 
//from 0-0.5 (0 is invisible, 1 no transparency)

var DrawCircles = function(){
  for (var i = 0; i < howManyCircles; i++) {
    ctx.fillStyle = 'rgba(255, 255, 255, ' + circles[i][3] + ')';
//white color with transparency in rgba
    ctx.beginPath();
    ctx.arc(circles[i][0], circles[i][1], circles[i][2], 0, Math.PI * 2, true);
//arc(x, y, radius, startAngle, endAngle, anticlockwise)
//circle has always PI*2 end angle
    ctx.closePath();
    ctx.fill();
  }
};
Nice, but boring less only a little. Why are the clouds standing still? Lets make a tiny little function with one Number type argument, which moves clouds down given number of pixels, and when particular circle disappears under the canvas, it will moves it on the top with changed position X, radius and transparency:
var MoveCircles = function(deltaY){
  for (var i = 0; i < howManyCircles; i++) {
    if (circles[i][1] - circles[i][2] > height) {
//the circle is under the screen so we change
//informations about it 
      circles[i][0] = Math.random() * width;
      circles[i][2] = Math.random() * 100;
      circles[i][1] = 0 - circles[i][2];
      circles[i][3] = Math.random() / 2;
    } else {
//move circle deltaY pixels down
      circles[i][1] += deltaY;
    }
  }
};
Now, last but not least, let's create main game loop and connect everything we create for now in there. Each frame will clear the screen, move circles 5px lower, draw them and after 1/50sec call another frame. I use two setTimeouts except one setInterval, but I'm not pretty sure why:). I know that there was some performance issues in IE back in the days or something. Also don't forget to add gLoop variable to that declared at the beginning.
var width = 320,  
//width of the canvas  
  height = 500,  
//height of the canvas  
  gLoop,
(...) //rest of the code goes here

var GameLoop = function(){
  clear();
  MoveCircles(5);
  DrawCircles();
  gLoop = setTimeout(GameLoop, 1000 / 50);
}
GameLoop();
According to Luis Giribone's comment below, I avoid Intervals and use Timeouts instead intentionally - Interval is called every 1000/fps seconds - even if the previous one disn't not finished yet. If you use Timeout, it will call another one only after previous was finished. I hope it is clear now. I also want to thanks Ped7g, author of Whiskas & Pedigree Javascript ad game for catching mistakes. Final result of that part should looks like this: [Simple game with HTML5 Canvas part 1], and sources are available on my Github account: [MichalBe] Tutorial: Simple game with HTML5 Canvas Part 1 - Introduction & Background Part 2 - Character & Animation Part 3 - Physics & Controls Part 4 - Platforms & Collisions Part 5 - Scrolling & Game States

340 comments:

  1. You are the man! Thanks for posting this great series!

    ReplyDelete
  2. Excellent tutorial! I am doing game-coding tutorials for some 10 years by now, and it's one of the most thorough, and well written! Many Thanks!

    P.S. Post Part 5 (The Scroll) - I beg You!

    ReplyDelete
  3. Great article, thanks for posting this! I've definitely learned quite a bit, and I plan to follow along.

    Thanks again!

    ReplyDelete
  4. This is just great, really like how you broke it down. I'll be having a go myself for sure!

    ReplyDelete
  5. why do you do "ctx.clearRect(0, 0, width, height);" to clear whole surface, when you fill up whole by blue just after that (i.e. clearing it twice effectively)

    Does it solve some browser quirk? (tried to patch it here for ff3.6, works OK without the clearRect)

    ReplyDelete
  6. ck ck ck...
    can be used as background ... awesome
    thanks for tutor^^
    salam from si bloglang anu ganteng kalem tea

    ReplyDelete
  7. Awesome tuts! Thanks for posting.

    Just wondering, is there any specific reasoning behind you placing your functions within variables?

    I find it easier just to write them as functions, but I'm n00by so I don't know if there's logic behind it.

    ReplyDelete
  8. Thanks, nice to hear someone likes it:). You can find useful information about declaring functions for example in here: http://zazaq.com/2010/08/07/javascript-function-declaration-vs-function-expression/

    ReplyDelete
  9. i made only a simple change to avoid setTimeouts
    // game init obj
    var GameLoop = function(){
    clear();
    moveCircles(5);
    drawCircles();
    }
    //end of code init the game
    gLoop = setInterval( GameLoop, 1000/fps );
    so i don't set a timeout every GameLoop
    and is the same code to clear the interval.
    Thanks for the tutorial, great game!

    ReplyDelete
  10. Avoiding Intervals and using Timeouts instead was my point in here - Interval is called every 1000/fps seconds - even if the previous one did not finished yet. If you use Timeout, it will call another one only after previous was finished.

    ReplyDelete
  11. wow, hard to see that point,
    thanks for the clarification :)

    ReplyDelete
  12. you're welcome, that are tutorials for:)

    ReplyDelete
  13. It doesn't do anything. I copy and pasted it and it didn't work. it just shows a blank box that is the wrong size in my chrome tab.

    ReplyDelete
  14. So you are doing something in the wrong way. Try the code from repo.

    ReplyDelete
  15. How can I make the circles move on the x axis instead? :)

    ReplyDelete
  16. Thanks. I got it working now. Now I'm just trying to understand some of the code that I wrote here and why it works the way it does.

    ReplyDelete
  17. On the circles.push([]) why does it have the [] inside the () of the push?

    ReplyDelete
  18. How do we make the clouds go different speeds between like 1 and 10?

    ReplyDelete
  19. I mean how do you make each cloud have it's own individual speed? Like one like would go 5px the other would go 10px for example.

    ReplyDelete
  20. the answer is still the same - each cloud should have its own deltaY

    ReplyDelete
  21. I see. This code thing is sooooo logical.

    ReplyDelete
  22. Excellent tutorial! Everything works and it's perfect for a beginner with Canvas/JS.

    One question - is there any reason you put comments under your statements? It was just slightly difficult to read for me, that's all.

    ReplyDelete
  23. It's a useful tutorial!!!
    But just want to ask what is the usage for the game.js?You didn't mention it.

    ReplyDelete
  24. You have to put all the javaScript code inside this file.

    ReplyDelete
  25. Oh I see, thanks!!
    But I just see the source code in your example, all the javaScript code put in the HTML file but not the game.js?

    ReplyDelete
  26. Check github:
    https://github.com/michalbe/Simple-game-with-HTML5-Canvas
    everything is in .js file.

    ReplyDelete
  27. Thanx man. First for your great tutorial, second for jsbin :).

    ReplyDelete
  28. im pretty sure i did everything right, but i only get a blue screen and no clouds. Any suggestions?

    ReplyDelete
    Replies
    1. Same here. I dont see any cloud either.

      Delete
  29. Why do you make functions using var and not
    function funcname()?

    ReplyDelete
  30. Thanks for this great introduction to game development using HTML5 canvas, I managed to create this game after reading your post ! :)

    http://ole.im/tetris

    ReplyDelete
  31. Great tutorials thanks html 5 games coding so simple than flash games

    ReplyDelete
  32. Thanks for your tutorial. I learned lots from here like a e-book. Keep up your work.

    ReplyDelete
  33. Wonderful training cheers html page Five video games code consequently straightforward as compared to thumb games.

    ReplyDelete
  34. Thanks for the great tutorial. I really think that HTML5 will prove to be the future of online games and am excited to see what all the developers there will do with the technology.

    ReplyDelete
  35. This comment has been removed by the author.

    ReplyDelete
  36. This is a great tutorial.

    For the ones interested in this subject, I've created two premium courses in Udemy:

    http://www.udemy.com/html5-game-development

    http://www.udemy.com/create-a-html5-game-from-scratch/

    ReplyDelete
    Replies
    1. yes this is a great tutorial. and thanks FariAzz for link, this is a helpfull. thanks

      Delete
  37. I may be missing something because it is not working for me, any idea=?

    ReplyDelete
  38. Thanks for this awesome tutorial, I just finished this first step without any issues, it was also well explained :)

    ReplyDelete
  39. thanks for this html5 tutorial, thanks for sharing.

    ReplyDelete
  40. Thanks for sharing.
    I just finished this game.
    This's game: ungdungdohoa.com/demo/rabbit

    ReplyDelete
  41. another good tutorial

    http://www.binarytides.com/make-html5-game-box2d-javascript-tutorial/

    ReplyDelete
  42. I had a goal to learn how to make a game for web in one night. You sir have made that possible, thank you ^.^

    ReplyDelete
  43. My code isn't working. I just see a blue screen, but no clouds. Please help. I even copied the code, but it's not working.

    ReplyDelete
    Replies
    1. And how do you think I can help you without the code?

      Delete
    2. This was the only way I could get the clouds to work and stuff. But it's only placing one cloud at a time. I had to change a couple of things to get it to work, but the forloop for Draw Circles isn't working ('cause I should see at least 10 circles, I think, at a time).

      window.onload = GameLoop;

      var width = 320
      var height = 500

      var c = document.getElementById('c');
      var ctx = c.getContext('2d');

      function clear() {
      ctx.fillStyle = "#5A89CF";
      ctx.beginPath();
      ctx.fillRect(0, 0, 320, 500);
      ctx.closePath();
      }

      var howManyCircles = 10, circles = [Math.random() * width, Math.random() * height, Math.random() * 100, Math.random() / 2];

      function DrawCircles(){
      for (var i = 0; i < howManyCircles; i++){
      ctx.fillStyle = "rgba(255, 255, 255, 0.5)";
      ctx.beginPath();
      ctx.arc(circles[0], circles[1], circles[2], 0, Math.PI * 2, true);
      // arc(x, y, radius, startAngle, endAngle(full circle), anticlockwise(true);
      ctx.closePath();
      ctx.fill();
      }
      };

      function MoveCircles(deltaY){
      for (var i = 0; i < howManyCircles; i++) {
      if(circles[1] - circles[2] > height){
      circles[0] = Math.random() * width;
      circles[2] = Math.random() * 100;
      circles [1] = 0 - circles[2];
      circles[3] = Math.random() / 2;
      } else {
      circles[1] += deltaY;
      }
      }
      };

      function GameLoop(){
      clear();
      MoveCircles(1);
      DrawCircles();
      gLoop = setTimeout(GameLoop, 1000/50);
      }

      Delete
  44. Uche, did you manage to get everything working?

    ReplyDelete
  45. HI, lovely tutorial, Anybody know how to get this game controls to work on a mobile device

    I've changed the onmousemove to ontouchmove but it only moves the character one way, and not the other any ideas?

    thanks

    ReplyDelete
    Replies
    1. Hey,
      It should work without any modifications.
      Cheers.

      Delete
    2. thanks for reply, sorry I should have been more clear, Im using cocoonJS to build this game as native on mobile which works brilliantly! but its the controls that don't work :[

      Delete
  46. hey, thank for great toturial, maybey you want create ebook or pdf with this tots? i want to create mmo rpg free game and this will be good start an motivation ;)

    ReplyDelete
  47. So where exactly would you put the javascript, after you put the tag or inside the html coding

    ReplyDelete
  48. Awesome, simply awesome!
    Thanks for the post, I have learned few new things from i html5

    ReplyDelete
  49. Hi,
    Thank you so much for this tutorial.
    I've been learning Processing.js those days, and I wanted to use it to process a game into a webpage. I've been having a hard time trying to find out how to do it with Wordpress... It turned out to be impossible with my website, so I got pretty frustrated.
    So thanks again showing me it's just possible with a simpler method, I think I'll be able to make my game all in HTML5 + JavaScript ant forget about Processing.js for a while ^^

    ReplyDelete


  50. Great Post ! HTML5 tutorial with simple and easy examples, Covering HTML5 Introduction, Semantic Elements,Attributes,Canvas,SVG,Multimedia,Video,Audio,Plug-ins,YouTube Videos, Geolocation, Drag and Drop, Local Storage, Coding Conventions / Style Guide. HTML5 Tutorial & CSS3 Tutorial.

    ReplyDelete
  51. hi can someone tell me how the file structure works and how they named there files ?

    ReplyDelete
  52. I was able to find good information from your blog posts.

    HTML5 Development

    ReplyDelete
  53. Nice Post Explained everything in detailed and Clearly.If it is possible please share us some html Video Tutorials

    ReplyDelete
  54. I had only learned how to do simulations using the R programming language but the three dimension flight simulator is one of a kind and I am looking forward to learning it. I will, therefore, bookmark this site so that I can visit occasionally to learn the simulation skills. Find time and check our professional writing site by clicking on Format my Paper.

    ReplyDelete
  55. Nice Blog!!!

    Please check thois link now if you want to play casino online!!!
    Thanks!!! GOOD LUCK!!!

    บาคาร่าออนไลน์
    จีคลับ

    ReplyDelete
  56. Thank you for posting this tutorial in detail with all parts of development. It is easy to learn and useful to a new learner.

    ReplyDelete
  57. WoW dude you do great work, the all background file you have posted, It will not help me only but others also. i am happy to come again and see your blog stuff.
    Thankyou very much

    ReplyDelete
  58. Rasakan sensasi permainan yang menakjubkan dan nikmati bonus yang kami sediakan untuk anda .

    Hanya Dengan 1 USER ID anda dapat memainkan 7 GAMES !!
    BandarPoker | PokerOnline | CapsaSusun | DominoQQ | BandarQ | AduQ | SAKONG

    Mari bermain bersama RUBYQQ , kami Agen Judi Poker Online Terbaik .
    HOT PROMO DARI RUBYQQ yang di berikan RUBYQQ untuk para pemain judi poker online yang telah bergabung bersama kami :

    ☆ Bonus Referral 10% + 10% ( Seumur Hidup )
    ☆ Bonus Turn Over 0,5% DI BAGIKAN SETIAP HARI !!
    ☆ NO ROBOT & ADMIN
    ☆ 100% Fair Play Member Vs Member
    ☆ Proses Deposit & Withdraw 1-2 Menit .

    Untuk informasi lebih lengkap silahkan Hubungi Customer Service kami
    BBM : 2B8938F7
    FACEBOOK : rubyqq
    SKYPE : RUBY QQ

    ReplyDelete
  59. I am thankful to this blog giving unique and helpful knowledge about this topic, I read your blog now share great information here. This blog increse my knowledge source .
    เรียน igcse ที่ไหนดี

    ReplyDelete
  60. Hey Thanks for adding this post. We have also more than 50 licensed html 5 games. Html5 games, html5 game licesing, Construct 2 games source code and html5 games source code

    ReplyDelete

  61. articles that are good, see also this interesting article in: bandar togel

    ReplyDelete
  62. very interesting content of this article give inspiration thanks : raja poker

    ReplyDelete
  63. Grouptoto yaitu Bandar Togel|Agen Judi Togel Pasaran Togel hongkong Terpercaya – Saat ini kita ke step selanjutnya yakni satu keterangan mengenai Permainan Shio. Permainan Shio yaitu type permainan yang cuma menebak dengan sekumpulan angka-angka yang jatuh pada shio-shio atau simbol spesifik. Bermain shio ini bukanlah bermakna kita bermain dengan tahayul. Pengertian shio ini sesungguhnya begitu simpel dimana kebetulan saja menurut kalender penanggalan Cina kuno, siklus masa kehidupan di muka bumi ini tercermin oleh 12 shio yang berada di muka bumi. Serta dari penjumlahan angka-angka spesifik dari 00 – 99 termasuk juga pada shio-shio itu. Narasi tentang kenapa cuma ada 12 shio ada juga asal usulnya itu. Angka Shio yaitu angka-angka yang telah terdaftar diatas. Ada yang jumlahnya 9 angka, ada yang cuma 8 angka. Jadi tidak seimbang. Tidak sempat ada satu perubahan angka-angka shio. Yang beralih yaitu satu posisi shionya di th. demikian ke th. demikian. Bila th. ini 2011 yaitu th. Kelinci Emas jadi mereka yang lahir pada th. ini 2011 peruntungannya sama juga dengan mereka yang lahir th. 1903, 1915, 1927, 1939, 1951, 1963, 1975, 1987, 1999 itu. Jadi bila kita berikan 1999 + 12 jadi jatuhnya yaitu di th. 2011. Akan tetapi bukanlah 11 nya yang di ambil. Itu tidak punya pengaruh sekalipun. Memahami? permainan shio pada suatu permainan Bandar Togel Terpercaya begitu banyak dimainkan dengan menebak angka serta nomor shio dari angka 1 s/d angka 12 dengan semasing menebak seperti angka usia yang berada di dalam permainan shio itu.

    Permainan Agen Togel Terpercaya serta Bandar Togel Online dengan menebak shio yaitu menebak kurang lebih angka apa yang juga akan keluar pada Pasaran Togel Hongkong atau Togel Singapura serta jatuh pada suatu shio itu. Contoh : bila permainan Agen Togel Online di hari Senin ini keluar dengan angka 2015, jadi bermakna juga akan jatuh ke shio Kelinci. Yang kita ambillah yaitu dengan susunan 2D-nya seperti kepala serta ekor yaitu : 15. Pemain yang menempatkan shio Kelinci jadi mereka juga akan menang serta juga akan memperoleh hadiah dari Agen Togel serta Bandar Togel yang mereka mainkan. Contoh beda ada juga Katakanlah pada suatu angka Togel On-line sore kelak yang keluar 2835. Ini bermakna keluar dengan permainan Shio Babi. Karna angka 35 ada di grup angka-angka Shio Babi itu. Memahami? Jadi permainan shio dalam permainan Togel On-line yang sesungguhnya yaitu dengan menebak beberapa angka dengan Live Number. Cuma saja lebih seru karna dapat mencermati permainan Shio itu dengan hasil yang juga akan di keluarkan. Cobalah Anda saksikan serta tekuni sekali lagi kalau permainan shio-shio ini ada titik celahnya yang seringkali dimaksud dengan satu plus minus 12. Kelak juga akan kita ulas selanjutnya yang berada di celah-celah angka permainan Togel Online. Mungkin saja bila Anda sukai bermain didalam satu permainan Shio-Shio jadi cobalah saksikan pada suatu alur binatang-binatang yang ada mungkin saja ada hubungan namun bermainlah didalam satu tehnik yang semakin banyak didalam satu alur Live Number atau pada suatu Angka Mati. Bukanlah main di shio namun di permainan 4D. Cuma saja kita pakai shio jadi tehnik untuk dapat bisa memotong nomor. Anda dapat cobanya bermain didalam permainan shio etrsebut untuk dapat memperoleh satu keuntungan yang begitu besar didalam bermain permainan itu persisnya anda bermain didalam satu Agen Togel On-line yang terpercaya pastinya.

    ReplyDelete


  64. want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
    poker online betting

    ReplyDelete
  65. want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
    Bandar togel Hongkong

    ReplyDelete
  66. very interesting content of this article give inspiration thanks dewa poker

    ReplyDelete


  67. want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
    bandar Togel sgp yang paling aman

    ReplyDelete
  68. want to read this interesting article for this month immediately click my article and get a great experience after reading my article on:
    bandar judi poker online yang paling aman

    ReplyDelete



  69. good artikel , i really like you artikel, pleas klik my artickey add Bandar togel Hongkong

    ReplyDelete

  70. very good article, do not forget to visit other interesting articles at: berita terbaru

    ReplyDelete
  71. 365mimpi Bandar Togel Online dan Agen Togel Terpercaya dengan Pasaran Togel Online Terlengkap, Togel Singapura, Togel Hongkong, dengan Result Togel Online Live

    Agen Togel
    Togel Singapore
    Bandar Togel
    Judi Togel
    Togel Terpercaya
    Togel Sydney
    Togel USA
    Togel Hongkong
    Agen Togel Terpercaya
    Togel Macau
    Situs Togel
    Togel Online
    Togel Filipina
    Daftar 365Mimpi
    365Mimpi

    ReplyDelete
  72. very good this article I really like the article you publish thanks.
    togel sgp

    ReplyDelete
  73. i love reading this article so beautiful!!great job!
    http://gainfreestuff.com/ 

    ReplyDelete
  74. I really like the article in this block is short but interesting to understand.
    togel online

    ReplyDelete
  75. I really like this article is really simple but this is amazingly good
    togel sgp

    ReplyDelete
  76. HTML5 is the highest new version of hypertext markup language. In this release also provided to the user some APIs that support drawing objects easily such as: Canvas, SVG and WebGL.
    Vietnamese hair
    Vietnam hair

    ReplyDelete
  77. Thank you for good content. For the choice of investment.
    lsm99

    ReplyDelete
  78. SAHABATPOOLS adalah Situs Taruhan Togel Online Terpercaya yang sangat berpengalaman dalam judi togel online serta banyak diplih oleh agen darat dan para pecinta judi togel online di Indonesia. Sahabatpools.io menyediakan pasaran untuk Taruhan Togel SGP / Singapore , Togel Sydney, Togel HK / Hongkong Terpercaya, Bangkok, Praha, Kyoto & Gangnam.

    www.Sahabatpools.io juga memberikan kemudahan bagi pecinta togel online untuk mengakses situs ini dari via mobile / handphone WAP serta staf profesional yang memberikan pelayanan 24 jam setiap harinya. Sahabatpools.io juga bisa membantu dalam membuat Akun Togel Online dan Daftar Akun Togel. sahabatpools.io juga menjamin keamanan akun togel member dan memberikan kenyamanan serta kemudahan transaksi, sahabatpools memberikan bukti bukan hanya sekedar janji.

    Sahabatpools.io Memberikan bonus cashback sampai 2% - 5% dan Bonus Referal dari 1% - 2%, jadi tunggu apa lagi mari bergabung bersama agen darat lain nya dan dapatkan semua promo nya, tidak hanya itu saja jika bermain di www.sahabatpools.io anda tidak perlu pusing akan limit bet dan batas line karna di sahabatpools.io semua nya bebas, dan kami juga akan mendangar jika ada keluahan dari anda biar kami bisa memperbaiki nya dan akan buat anda nyaman dan aman. Keluhan SERTA kenyaman anda bermain adalah MOTTO dari Sahabatpools.io


    Transaksi deposit & withdraw aman, mudah, cepat dan terpercaya.
    VIA BANK BCA-BNI-BRI-MANDIRI.

    Untuk lebih jelasnya silahkan hubungi :
    WA : +66656407677
    PIN BBM : D8627CB6
    ID LINE : sahabatpools.com

    ReplyDelete
  79. well! Thanks for providing a good stuff related to DevOps Explination is good, nice Article
    anyone want to learn advance devops tools or devops online training
    DevOps Online Training
    DevOps Online Training hyderabad

    ReplyDelete
  80. This is great.. I really like the way of your explanation.. Thanks for sharing..
    DevOps Online Training

    ReplyDelete
  81. เลเซอร์หน้าใส เป็นอีกหนึ่งสิ่งใหม่ทางความสวยงามที่ช่วยฟื้นฟูผิวหนังที่แห้งกระด้าง บริเวณใบหน้าหมองคล้ำให้กลับมาแจ่มใสมองสดชื่น ผ่องใสภายในช่วงระยะเวลาอันเร็ว นับว่าเป็นทางลัดความสวยงามที่กำลังเป็นที่นิยมสูง ช่วยดูแลผิวให้ขาวกระจ่างขาวสวยใส จากการลดลางเลือนริ้วรอยจุดด่างดำได้อย่างมีคุณภาพ

    เลเซอร์หน้าใส
    เลเซอร์ลดริ้วรอย
    เลเซอร์รอยสิว

    ReplyDelete
  82. มาเด้ เป็นอย่างไร? เป็นส่วนประกอบของสารสกัดที่มาจากธรรมชาติมีทั้งยังวิตามินรวม ธาตุ เอนเหล้าองุ่นแล้วก็เชลล์บรรเทา
    มีทั้งยังพลาสเซนต้าและก็คอลลาเจนโดนสารทั้งหมดจำเป็นจะต้องผ่านขั้นตอนตระเตรียมสูตรยาแบบ(Homeopathy)
    เป็นศาสตร์การบำบัดที่มีต้นกำเนิดมาจาก สหพันธ์สาธารณรัฐเยอรมนี โดยกานศึกษาและทำการค้นพบของแพทย์ ซามุเอลฮาเนมัน แก่มากยิ่งกว่า 200
    ปีโดยมีวิธีการบรรเทาว่า (ใช้สิ่งที่คล้ายคลึงกันมารักษาสิ่งที่คล้ายคลึงกัน) หรือการนำเอาสารที่เป็นต้นเหตุของอาการนั้นๆ

    มาเด้
    มาเด้ หน้าใส
    ฉีดมาเด้ ที่ไหนดี

    ReplyDelete
  83. Nice article!!!

    Thank you for sharing

    ReplyDelete
  84. Thank you for valuable article,

    Waiting for new articles and more info!!!

    ReplyDelete
  85. Well written post. I appreciate your guidance for sharing about Windows Azure . I really need to know about it. Great work!
    Blockchain Training in Hyderabad

    ReplyDelete
  86. Which is the best training institute for PLC, SCADA, and DCS, and where is it located in India?
    LIVEWIRE is in association with 250+ corporates, who grab candidates from our centres when they match their job requirement. We offer all these opening to the students.Get trained through an ISO certified institute. Our course completion certificate and material are globally recognized. If you want to more details contact us: #LivewireVelachery, #PLCTraininginChennai,#PLCTrainingInstituteinChennai,#PLCTraininginVelachery, 9384409662

    ReplyDelete
  87. a very useful website, very good to always remember and must be taken care of thanks for the information.

    Bisnis Kuliner Online

    Bisnis Online Indonesia

    ReplyDelete
  88. I am not very good at writing, after I saw this very good website, I became excited to write smarter.

    Perawatn Kacer Untuk Lomba

    Pecinta Burung

    ReplyDelete
  89. A very good website, I have never found a website like this, it always works.

    Game Online Android Terbaik di Dunia

    Daftar Game Steam

    ReplyDelete
  90. Great delivery. Outstanding arguments. Keep up the great spirit.
    Manfaat memancing
    Pecinta mancing

    ReplyDelete
  91. Thank u for this information
    http://www.mistltd.com

    ReplyDelete
  92. As technology grows, we have to be updated in our domain to sustain in the IT industry. Your post made
    me impressed in the way of your writing.

    ReplyDelete
  93. The article on this site is very interesting, thank you
    Selamat datang di LENOVOPOKER ™ Top 1 Judi Online
    Promo Terbaru LENOVOPOKER :
    - Bonus New Member Depo +20%
    - Bonus All Member Next Depo +5%
    - Bonus All Member Refferal 30%
    - Bonus All Member Rollingan 0.5%
    Contact : BBM : LENOVO88
    WA : +6281375260652
    Agen Domino 99
    Bandar Poker
    Agen Ceme
    Bandar Ceme
    Judi Poker Terpercaya

    ReplyDelete
  94. Awesome write-up
    interesting articles and this is my first first reading a very interesting


    AGENTANGKASONLINE

    judi tangkas

    Agen Tangkas

    ReplyDelete
  95. thanks for Providing a Good Information
    anyone want to learn advance devops tools or devops online training visit:
    DevOps Training
    DevOps Online Training
    DevOps Training institute in Hyderabad

    ReplyDelete
  96. Really great post, Thank you for sharing This knowledge.Excellently written article, if only all bloggers offered the same level of content as you, the internet would be a much better place. Please keep it up!
    AWS Training in pune
    AWS Online Training

    ReplyDelete
  97. Its really an Excellent post. I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog. Thanks for sharing....
    AWS Training in Bangalore
    AWS training in sholinganallur
    AWS training in Tambaram
    AWS training in Velachery

    ReplyDelete
  98. This comment has been removed by the author.

    ReplyDelete
  99. This comment has been removed by the author.

    ReplyDelete
  100. The best forum that I have never seen before with useful content and very informative.


    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]







    The best forum that I have never seen before with useful content and very informative.


    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]









    ReplyDelete
  101. The best forum that I have never seen before with useful content and very informative.


    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]

    [url=https://digitalfloats.com]Digital Marketing Course in Hyderabad[/url]








    ReplyDelete
  102. Hi, saya donny. Saya mau kenalin Situs Judi Agen BandarQ Terbaik di Indonesia. Kunjungi situsnya di http://ligaqq.online/

    ReplyDelete
  103. very informative blog and useful article thank you for sharing with us , keep posting learn more about aws with cloud computing, AWS Online Training

    ReplyDelete
  104. Its very informative blog and useful article thank you for sharing with us , keep posting learn
    Data Science online Course


    dot NET Course

    ReplyDelete
  105. I love reading your articles. Thank you very much. Write more.

    ReplyDelete
  106. Very useful information for people, I think this is what everyone needs.

    ReplyDelete
  107. This comment has been removed by the author.

    ReplyDelete
  108. The data that you provided in the blog is informative and effective.Thank you for sharing the article.
    Best HTML5 Training Institute

    ReplyDelete
  109. STEPSBOBET เว็บแทงบอลออนไลน์ คาสิโนออนไลน์ ที่ดีที่สุดอันดับ 1 สมัคร sbobet แทงบอลสเต็ป กีฬาออนไลน์ บาคาร่าออนไลน์ สล็อตออนไลน์ ครบวงจร ให้บริการเดิมพันออนไลน์ทุกประเภท มีความน่าเชื่อถือ
    เว็บแทงบอลออนไลน์อันดับ 1
    สมัคร sbobet
    สมัคร Lsm99
    สมัคร Sclub
    สมัคร Ace333
    สมัคร League88 ลีค88
    สมัคร Gclub
    สมัคร King99

    ReplyDelete
  110. This comment has been removed by the author.

    ReplyDelete
  111. TT4D | TOGEL TERPERCAYA | AGEN TOGEL ONLINE TERPERCAYA

    Agen Togel Online Terpercaya Dengan Fiture-fiture Terbaik sebagai berikut :
    • BBFS Sampai 10 Digit
    • Hadiah Prize 4D dan 3D Semua Pasaran
    • Tersedia Live Games dan Sbobet Bola atau Casino
    • Bonus Referral Sebesar 0,5% dari Semua Pemasangan Seumur Hidup
    • Lomba Dengan Hadiah Jutaan Rupiah dan Juga Lomba GRATIS SALDO 5.000 / Pasaran Setiap Hari

    Hadiah & Diskon TT4D TOGEL TERPERCAYA :
    • HADIAH 4D x 3.000 ( 65% )
    • HADIAH 3D x 400 ( 59% )
    • HADIAH 2D x 70 ( 29% )

    Hadiah Hiburan Jackpot 4D & 3D Semua Pasaran :
    Prize I : x 3 Juta ( 4D ) | x 400 Ribu ( 3D )
    Prize II : 200 Ribu ( 4D ) | 20 Ribu ( 3D )
    Prize III : 100 Ribu ( 4D ) | 10 Ribu ( 3D )
    Started Prize : 55 Ribu ( Hanya 4D )
    Consolation : 25 Ribu ( Hanya 4D )

    Pasaran Tutup Terlama TT4D Togel Terpercaya :
    • Vietnam Tutup Jam 11.00 WIB dan Result Jam 11.30 WIB
    • Sydney Tutup Jam 13.30 WIB dan Result Jam 13.50 WIB
    • Las Vegas Tutup Jam 15.30 WIB dan Result Jam 16.00 WIB
    • Singapore Tutup Jam 17.25 WIB dan Result Jam 17.45 WIB
    • Lemacau Tutup Jam 19.30 WIB dan Result Jam 20.00 WIB
    • Hongkong Tutup Jam 22.40 WIB dan Result Jam 23.00 WIB

    Website Login / Daftar TT4D:
    TT4D.VIP

    Kontak Official :
    - Pin BBM : TT4DOK
    - WA : +855963240368

    ReplyDelete
  112. This comment has been removed by the author.

    ReplyDelete

  113. Great Article. Thanks for sharing info.

    https://www.exltech.in/java-training.html

    ReplyDelete

  114. Thank for sharing very valuable information.nice article.keep posting.For more information visit
    aws online training

    ReplyDelete
  115. If you are fed of searching jobs in Assam - You can check this fresh content at Sarkari Sakori | Sarkari Naukri in UP

    ReplyDelete
  116. For Freejobalert we suggest you to visit freejobalert website

    ReplyDelete
  117. Excellent Tutorial

    ReplyDelete
  118. Thankx alot for the post. i got great code help about HTML 5

    ReplyDelete
  119. I really appreciate your article. the post has excellent tips which are useful. this post is good in regards of both knowledge as well as information iTunes Gift Card Codes

    ReplyDelete
  120. Hey guys I just want to say that I got an official notification that iTunes is providing us free gift cards codes iTunes Gift Card Codes

    ReplyDelete
  121. Very nice collection of blog you have shared here I have read your article so informative I liked so much, thank you very much for sharing
    Digital Marketing Courses In Rohini

    ReplyDelete
  122. Thanks for Sharing this useful information. Get sharepoint apps development from veelead solutions

    ReplyDelete

  123. Get the most advanced AWS Course by Professional expert. Just attend a FREE Demo session.
    For further details call us @ 9884412301 | 9600112302
    AWS training in chennai | AWS training in velachery

    ReplyDelete
  124. Nice article.
    For the best python training in bangalore, Visit:
    Python training in Bangalore

    ReplyDelete
  125. Visit here for more about Hadoop training in bangalore -> Big data and hadoop training in bangalore

    ReplyDelete
  126. One of the Main topic of Web Design ,which we need to know during that time... today i got this blog so thanku so much for sharing this.. i ll share this with new people...

    ReplyDelete
  127. Thank you for sharing wonderful information with us to get some idea about that content. check it once through
    Google Cloud Platform Training
    GCP Online Training

    ReplyDelete
  128. nice share thank,visit my web
    Sakuratogel adalah situs bandar togel singapore terbaik dan terpercaya yang memberikan kenyamanan kepada para member pecinta togel online atau singapore prize,sakuratogel juga memanjakan member nya dengan memberikan bonus deposit setiap hari nya,dan bukan hanya itu saja,diskon dan hadiah paling tinggi.

    ayo bergabung sekarang juga bersama sakuratogel,klik link dibawah ini :

    http://sakuratogel.xyz/

    ReplyDelete
  129. This comment has been removed by the author.

    ReplyDelete

  130. It’s awesome that you want to share those tips with us. I assume lot of us that commented on this post are just starting to search for different ways of blog promotion and this sounds promising. This is definitely the article that I will try to follow when I comment on others blogs. Cheers

    Data Science Training in Hyderabad

    Hadoop Training in Hyderabad

    Java Training in Hyderabad

    Python online Training in Hyderabad

    Tableau online Training in Hyderabad

    Blockchain online Training in Hyderabad

    informatica online Training in Hyderabad

    devops online Training

    ReplyDelete
  131. Thanks for provide great informatic and looking beautiful blog
    Thanks for the information. It's very useful. If any one is looking for the best piano teacher in Singapore
    great article
    http://makeland.link/higaming/
    http://mbc1588.cafe24.com
    http://makeland.link/crazyslot/
    https://mbc1588.cafe24.com
    https://bet365kor1.com/
    https://ocn2001.com/

    ReplyDelete