Advertisement
  1. Code
  2. Games

Membuat 'Flux': Game Flash Sederhana Dengan Mekanika Gravitasi

Scroll to top
Read Time: 20 min

() translation by (you can also view the original English article)

Dalam tutorial ini, saya akan menjelaskan langkah-langkah utama dan alur kerja untuk membuat game survival ruang sederhana, berdasarkan mekanika gravitasi yang dijelaskan dalam tutorial sebelumnya. Game ini ditulis dalam AS3 menggunakan FlashDevelop.


Memainkan permainan

Gunakan tombol panah kiri dan kanan untuk manuver kapal Anda, atas dan bawah tombol panah untuk menambah atau mengurangi ukuran Medan magnet yang dihasilkan, dan spasi untuk reverse polaritas. Mengumpulkan kristal putih untuk meningkatkan pasokan bahan bakar Anda - tapi menghindari yang merah, karena mereka menggunakannya. Tidak memukul batu, atau itu permainan berakhir!

Dalam tutorial ini, kita tidak benar-benar membuat permainan lengkap ditampilkan di atas; kita akan hanya memulai di atasnya, dengan membuat versi yang sangat sederhana dengan grafis primitif dan hanya satu jenis objek. Namun, pada akhir, Anda harus belajar cukup mampu untuk menambahkan fitur-fitur lainnya Anda sendiri!

Permainan itu sendiri sangat sederhana dalam kondisi saat - Lihatlah kritik ini untuk tips tentang bagaimana Anda dapat mengambil itu dari demo sederhana untuk permainan lengkap!


Mari kita mulai!

Mengatur proyek AS3 baru di FlashDevelop, dan menetapkan ukurannya untuk 550x600px.

1
2
 package 
3
{
4
  [SWF(width = "550", height = "600")]
5
	
6
	public class Main extends Sprite
7
	{
8
	
9
	}
10
}

Langkah 1: Mengidentifikasi objek permainan

Ada enam objek dalam partikel yang Anda dapat mengidentifikasi dari permainan di atas:

  • Pasokan energi - diwakili oleh objek bentuk oval putih
  • Asteroid - diwakili oleh batu-seperti objek
  • Konsumen energi - diwakili oleh bintang merah yang dibatasi dengan lampu hijau.
  • Bintang - latar belakang
  • Kisaran indikator - diwakili oleh lingkaran putih
  • Kapal - pemain objek

Tentu saja Anda dapat menambahkan objek lain untuk membuat permainan lebih interaktif atau menambahkan fitur baru. Untuk tutorial ini kita akan hanya membuat


Langkah 2: Kelas energi

Dari benda-benda yang kita diidentifikasi, empat dari mereka benar-benar bekerja dalam cara yang sama: dengan jatuh dari atas ke bawah.

Mereka adalah:

  • Bintang-bintang
  • Pasokan energi
  • Konsumen energi
  • Asteroid

Dalam tutorial ini, kita hanya akan membuat objek "energi supply", dari empat di atas. Jadi mari kita mulai dengan menciptakan objek-objek ini dan membuat mereka jatuh, dengan posisi pemijahan acak dan kecepatan.

Mulailah dengan membuat kelas energi:

1
2
	package  
3
	{
4
		import flash.display.MovieClip;
5
		import flash.events.Event;
6
7
		public class Energy extends MovieClip
8
		{
9
			private var rSpeed:Number = 0;
10
			
11
			public function Energy(speed:Number)
12
			{		
13
				graphics.beginFill(0x321312);
14
				graphics.drawCircle(0, 0 , 8);
15
				
16
				rSpeed = speed;
17
			}
18
			
19
			// we will call this every frame

20
			public function move():void
21
			{
22
				this.y += rSpeed;
23
				//rotation speed is linked to moving speed

24
				this.rotation += rSpeed / 8;
25
			}
26
		}
27
	}

Langkah 3: Kelas GameScreen

Kelas ini akhirnya akan menguasai sebagian besar aspek-aspek permainan kami, termasuk gerakan pemain dan loop permainan.

Membuat kelas:

1
2
package  
3
{
4
	
5
	public class GameScreen extends MovieClip
6
	{
7
8
		public function GameScreen()
9
		{
10
		
11
		}
12
	}
13
}

Itu yang kita butuhkan untuk sekarang.


Langkah 4: Memperbarui kelas utama

Kita sekarang akan membuat sebuah instance dari GameScreen dalam utama:

1
2
package 
3
{
4
	import flash.display.Sprite;
5
	import flash.events.Event;
6
7
	[SWF(width = "550", height = "600")]
8
	 
9
	public class Main extends Sprite 
10
	{
11
		private var game:GameScreen;
12
		
13
		public function Main():void 
14
		{
15
			// don't display a yellow rectangle on the screen at startup

16
			stage.stageFocusRect = false;
17
			
18
			game = new GameScreen();
19
			addChild(game);
20
			
21
			// give keyboard focus to the game screen immediately

22
			stage.focus = game;
23
		}
24
	}
25
}

Mengapa repot-repot? Yah, dengan cara ini, itu akan lebih mudah untuk menambah layar tambahan kemudian jika kita ingin (seperti preloader, layar judul, Permainan atas layar...).


Langkah 5: Memperkenalkan kelas Manajer

Untuk menghindari GameScreen kelas menjadi terlalu berantakan, kita akan menggunakan kelas terpisah untuk mengelola setiap objek.

Masing-masing manajer kelas akan berisi semua fungsi yang berhubungan dengan, dan berinteraksi dengan, suatu obyek tertentu. Di sini adalah kelas EnergyManager:

1
2
package  
3
{
4
	import flash.display.MovieClip;
5
	
6
	public class EnergyManager
7
	{
8
		// this Vector will store all instances of the Energy class

9
		private var energyList:Vector.<Energy>	
10
		private var gameScreen:GameScreen;
11
		
12
		public function EnergyManager(gs:GameScreen) 
13
		{
14
			gameScreen = gs;
15
			energyList = new Vector.<Energy>;	
16
		}
17
	}
18
}

Perhatikan bahwa kita memerlukan referensi ke GameScreen untuk dilewatkan ke konstruktor, dan kami menyimpan referensi ini dalam variabel pribadi. Kami juga menyiapkan vektor untuk menyimpan referensi untuk semua benda energi.

Sejauh kelas berisi tidak ada fungsi lain; kami akan menambahkan mereka nanti.


Langkah 6: Menciptakan energi

Menambahkan di bawah fungsi untuk menciptakan energi, ini adalah hanya fungsi; kita akan memanggil fungsi kemudian dari GameScreen kelas:

1
2
	public function createEnergy(number:int):void	
3
	{
4
		var energy:Energy;
5
		for (var i:int = 0; i < number; i++) {		
6
7
			energy = new Energy(4);				
8
				
9
			gameScreen.addEnergyToScreen(energy);
10
				
11
			energyList.push(energy);				
12
	
13
			energy.x = Calculation.generateRandomValue(30, 520);		
14
			energy.y = Calculation.generateRandomValue( -150, -20); 
15
		}
16
	}

Kami membuat pasokan energi baru dengan kecepatan 4, menambahkannya ke daftar tampilan (melalui GameScreen), tambahkan ke vektor dari semua energi objek bahwa kami hanya dibuat, dan mengatur posisi titik acak dalam batas-batas tertentu.

Calculation.generateRandomValue (#, #) adalah fungsi statis kita tidak menulis belum, jadi mari kita melakukan itu sekarang. Membuat kelas baru yang disebut perhitungan dan menambahkan fungsi ini:

1
2
	public static function generateRandomValue(min:Number, max:Number):Number
3
	{
4
		var randomValue:Number = min + (Math.random() * (max - min));
5
			
6
		return randomValue;
7
	}

Fungsi ini akan menghasilkan angka acak antara dua nilai yang dilewatkan ke. Untuk informasi lebih lanjut tentang cara kerjanya, lihat tips cepat ini. Karena ini adalah fungsi statis, kita tidak perlu untuk menciptakan sebuah contoh perhitungan untuk menyebutnya.

Sekarang, apa adalah bahwa fungsi addEnergyToScreen()? Kami belum ditetapkan bahwa belum, jadi mari kita lakukan sekarang. Menambahkan ini ke GameScreen:

1
2
		public function addEnergyToScreen(energy:Energy):void
3
		{
4
			addChild(energy);
5
		}

Itu hanya menambah contoh berlalu energi ke dalam tampilan daftar. Mari kita juga membuat sebuah fungsi yang sesuai untuk menghapus objek tertentu energi dari layar:

1
2
		public function removeEnergyFromScreen(energy:Energy):void
3
		{
4
			if (energy.parent == this)
5
			{
6
				removeChild(energy);
7
			}
8
		}

Langkah 7: Pemijahan energi

Mari kita menetapkan timer yang mendefinisikan interval untuk setiap hal ikan bertelur. Kode ini berjalan dalam fungsi constructor GameScreen's:

1
2
energyM = new EnergyManager(this);	//remember to pass a reference to the game screen

3
								
4
var spawnTimer:Timer = new Timer(3000, 0);
5
spawnTimer.addEventListener(TimerEvent.TIMER, spawnEnergy);
6
spawnTimer.start();

Jadi, setiap tiga detik, timer akan memanggil spawnEnergy(). Mari kita menulis bahwa fungsi sekarang:

1
2
	private function spawnEnergy(e:TimerEvent):void
3
	{
4
		energyM.createEnergy(4);    // create 4 energies

5
	}

Langkah 8: Membuat pemain

Mari kita gunakan lingkaran lain, lebih besar untuk mewakili pemain. Merasa bebas untuk mengimpor gambar untuk digunakan sebagai gantinya:

1
2
public function Player() 
3
		{
4
			graphics.beginFill(0x7ebff1);
5
			graphics.drawCircle(0, 0, 20);

Tambahkan kode ini ke GameScreen untuk menambahkan pemain ke layar:

1
2
// in the variable definitions

3
public var player:Player;
1
2
// in the constructor function

3
player = new Player;
4
addChild(player);
5
player.x = 275;
6
player.y = 450;

Sejauh ini kita harus memiliki beberapa pasokan energi yang jatuh beberapa detik, dan pemain yang muncul di tengah layar:

playerandenergy.playerandenergy.playerandenergy.

Langkah 9: Bergerak pemain

Pada dasarnya ada dua cara untuk menerapkan gerakan:

  1. Menggunakan Boolean (benar/salah) nilai - benar = bergerak, palsu = tidak bergerak. Bila tombol panah kanan ditekan, nilai untuk "bergerak tepat" akan berubah ke true. Di setiap bingkai update, "bergerak benar" benar, kita meningkatkan objek x-nilai.
  2. Menggunakan langsung update setiap frame - ketika tombol panah kanan ditekan, objek disuruh untuk menggerakkan kanan segera, dengan meningkatkan nilai x.

Metode kedua tidak mengakibatkan halus gerakan ketika tombol ditekan terus-menerus, tetapi metode pertama tidak - sehingga kita akan gunakan metode pertama.

Ada tiga langkah sederhana untuk melakukan hal ini:

  1. Buat dua variabel Boolean, satu untuk memindahkan tepat dan satu untuk memindahkan kiri.
    1
    2
    	private var moveRight:Boolean = false;
    
    3
    	private var moveLeft:Boolean = false;
    
  2. Beralih Boolean ketika tombol ditekan atau dirilis:
    1
    2
    		addEventListener(Event.ENTER_FRAME, update);
    
    3
    		addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);
    
    4
    		addEventListener(KeyboardEvent.KEY_UP, KeyUpHandler);
    
    5
    	}
    
    6
    		
    
    7
    	private function KeyDownHandler(e:KeyboardEvent):void
    
    8
    	{
    
    9
    		if (e.keyCode == Keyboard.RIGHT) {
    
    10
    			moveRight = true;
    
    11
    		}
    
    12
    		if (e.keyCode == Keyboard.LEFT) {
    
    13
    			moveLeft = true;
    
    14
    		}
    
    15
    		if (e.keyCode == Keyboard.SPACE) {
    
    16
    			if (isGravityPushing == true) {
    
    17
    				isGravityPushing = false;
    
    18
    			} else  {
    
    19
    				isGravityPushing = true;
    
    20
    			}
    
    21
    		}
    
    22
    	}
    
    23
    		
    
    24
    	private function KeyUpHandler(e:KeyboardEvent):void
    
    25
    	{
    
    26
    		if (e.keyCode == Keyboard.RIGHT) {
    
    27
    			moveRight = false;
    
    28
    		}
    
    29
    		if (e.keyCode == Keyboard.LEFT) {
    
    30
    			moveLeft = false;
    
    31
    		}
    
    32
    	}
    
  3. Berdasarkan Boolean ini, benar-benar memindahkan pemain setiap bingkai:

    Jangan lupa untuk terlebih dahulu membuat mendengarkan fungsi dari acara bingkai enter, "memperbarui":

    1
    2
    //call this function every frame
    
    
    3
    private function update(e:Event):void
    
    4
    	if (moveRight == true) {
    
    5
    		player.x += 6;
    
    6
    	}
    
    7
    	if (moveLeft == true) {
    
    8
    		player.x -= 6;
    
    9
    	}
    

    Mempertahankan pemain dalam batas-batas layar:

    1
    2
    	if (player.x >= 525) {
    
    3
    		moveRight = false;
    
    4
    	}
    
    5
    	if (player.x <= 20) {
    
    6
    		moveLeft = false;
    
    7
    	}
    

Berikut adalah bagaimana semua itu terlihat, di tempat:

1
2
package
3
{
4
    import flash.display.MovieClip;
5
    import flash.events.Event;
6
    import flash.events.TimerEvent;
7
    import flash.ui.Keyboard;
8
    import flash.utils.Timer;
9
    import flash.events.KeyboardEvent;
10
 
11
    public class GameScreen
12
    {
13
        public var player:Player;
14
 
15
        private var energyM:EnergyManager;
16
 
17
        private var moveRight:Boolean = false;
18
        private var moveLeft:Boolean = false;
19
        private var isGravityPushing:Boolean = true;
20
 
21
        private var returnedPower:int = 0;
22
 
23
        private var scoreText:Text;
24
        private var totalScore:int=0;
25
        private var score:Text;
26
 
27
        public function GameScreen()
28
        {
29
            scoreText = new Text("Score :");
30
            addChild(scoreText);
31
 
32
            energyM = new EnergyManager;
33
 
34
            var spawnTimer:Timer = new Timer(3000, 0);
35
            spawnTimer.addEventListener(TimerEvent.TIMER, spawnEnergy);
36
            spawnTimer.start();
37
 
38
            player = new Player;
39
            addChild(player);
40
            player.x = 275;
41
            player.y = 450;
42
 
43
            addEventListener(Event.ENTER_FRAME, update);
44
            addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler);
45
            addEventListener(KeyboardEvent.KEY_UP, KeyUpHandler);
46
        }
47
48
	private function KeyDownHandler(e:KeyboardEvent):void
49
	{
50
		if (e.keyCode == Keyboard.RIGHT) {
51
			moveRight = true;
52
		}
53
		if (e.keyCode == Keyboard.LEFT) {
54
			moveLeft = true;
55
		}
56
		if (e.keyCode == Keyboard.SPACE) {
57
			if (isGravityPushing == true) {
58
				isGravityPushing = false;
59
			}else if (isGravityPushing == false) {
60
				isGravityPushing = true;
61
			}
62
		}
63
	}
64
		
65
	private function KeyUpHandler(e:KeyboardEvent):void
66
	{
67
		if (e.keyCode == Keyboard.RIGHT) {
68
			moveRight = false;
69
		}
70
		if (e.keyCode == Keyboard.LEFT) {
71
			moveLeft = false;
72
		}
73
	}
74
75
	private function update(e:Event):void
76
	{
77
		if (player.x >= 525) {
78
			moveRight = false;
79
		}
80
		if (player.x <= 20) {
81
			moveLeft = false;
82
		}
83
		if (moveRight == true) {
84
			player.x += 6;
85
		}
86
		if (moveLeft == true) {
87
			player.x -= 6;
88
		}
89
	}
90
    }
91
}

Langkah 10: Memindahkan pasokan energi

Saat ini, pasokan energi pemijahan tetapi tidak bergerak. Kita akan menggunakan fungsi GameScreen.update() untuk membuat mereka bergerak, sejak beroperasi setiap bingkai.

Tambahkan kode ini ke GameScreen.update():

1
2
			energyM.moveAll();  // will make every energy object move

Sekarang tentu saja kita perlu membuat EnergyManager.moveAll() fungsi, sehingga menambahkan ini ke EnergyManager.as:

1
2
		public function moveAll():void
3
		{
4
			for (var i:int = 0; i < energyList.length; i++) {
5
				var energyS:Energy = energyList[i];
6
				energyS.move();
7
			}
8
		}

Langkah 10: Deteksi tumbukan

Kita akan perlu untuk memeriksa tabrakan antara setiap objek energi dan pemain. (Jika Anda mengembangkan permainan lebih lanjut, Anda harus memeriksa ini untuk asteroid dan konsumen energi, tetapi tidak untuk bintang.)

Tempat terbaik untuk menangani pemeriksaan yang ada di dalam EnergyManager, dipicu setiap bingkai oleh GameScreen.

Satu hal yang perlu dipertimbangkan: tumbukan cek akan antara dua lingkaran, sehingga hitTestObject() tidak ideal. Sebaliknya, kita akan menggunakan metode yang dijelaskan dalam tutorial ini.

Kita dapat menulis fungsi sebagai berikut:

1
2
	public function checkCollision(p:Player):int
3
	{
4
		// energy transferred due to collision

5
		var energyTransfer:int = 0;
6
		
7
		for (var i:int = 0; i < energyList.length; i++) {
8
			var energyS:Energy = energyList[i];
9
			
10
			var newX:Number = p.x - energyS.x;
11
			var newY:Number = p.y - energyS.y;
12
				
13
			var distance:Number = Math.sqrt(newX * newX + newY * newY);
14
				
15
			if (distance <= 28) {
16
				gameScreen.removeEnergyFromScreen(energyS);
17
				energyList.splice(i, 1);
18
				// for this simple game, we'll always transfer 1 unit

19
				// but you could alter this based on speed of collision

20
				// or any other factor

21
				energyTransfer = 1;
22
			}
23
		}
24
		return energyTransfer;
25
	}
  • Garis 32: dicatat bahwa kita melewati dalam rujukan kepada pemain, sehingga kita dapat mengakses posisinya.
  • Jalur 38: Necro adalah singkatan energi Supply.
  • Line 40 & 41: menemukan perbedaan di x - dan y koordinat pemain dan pasokan energi yang kita saat ini memeriksa.
  • Baris 43: menghitung jarak antara objek melalui Pythagoras.
  • Baris 45: Periksa tabrakan; 28 adalah jumlah dari jari-jari dua objek (radius pemain adalah 20, energi radius adalah 8).
  • Line 46 & 47: menghapus pasokan energi dari layar dan vektor.
  • Jalur 51: Tambahkan maksimal satu unit energi per frame.

Anda bisa mengubah jalur 51 untuk energyTransfer + = 1, untuk memungkinkan pemain untuk menyerap lebih dari satu objek energi sekaligus. Terserah kepada Anda - mencobanya dan melihat bagaimana hal itu mempengaruhi permainan.


Langkah 11: Panggilan tabrakan deteksi rutin

Kita perlu memeriksa tabrakan setiap bingkai, jadi kita harus memanggil fungsi kami hanya menulis dari GameScreen.update().

Pertama, kita perlu membuat sebuah integer variabel untuk menyimpan nilai transfer energi dari fungsi deteksi tabrakan. Kita akan menggunakan nilai ini untuk meningkatkan energi kapal dan menambah Skor pemain.

1
2
private var returnedPower:int = 0;
1
2
returnedPower = energyM.checkCollision(player);

Langkah 12: Hukum Newton mengenai gravitasi

Sebelum kita pergi ke menciptakan Permainan montir untuk fungsi 'Push' dan 'Menarik' kapal, saya ingin memperkenalkan konsep fisika yang didasarkan montir.

Idenya adalah untuk menarik objek ke arah pemain dengan gaya. Hukum gravitasi Universal Newton memberikan kita formula matematika yang besar (dan sederhana) yang kita dapat menggunakan untuk ini, dimana angkatan ini tentu gaya gravitasi:

G adalah hanya beberapa, dan kita bisa mengaturnya untuk apa pun yang kita sukai. Demikian pula, kita dapat mengatur massa setiap objek dalam permainan untuk setiap nilai yang kita sukai. Gravitasi terjadi di jarak yang tak terbatas, tetapi dalam permainan kami, kita akan memiliki cut-off point (dilambangkan oleh lingkaran putih dalam demo dari awal tutorial).

Dua hal yang paling penting untuk dicatat tentang formula ini adalah:

  • Kekuatan tergantung di alun-alun jarak antara dua objek (jadi jika objek adalah dua kali lebih jauh, kekuatan yang satu-seperempat kuat).
  • Arah kekuatan adalah sepanjang garis langsung menghubungkan dua objek melalui ruang.

Langkah 13: Merevisi konsep-konsep matematika

Sebelum kita mulai pengkodean mekanika gamenya untuk fungsi 'Push' dan 'Menarik', mari kita menjadi jelas pada apa yang kita inginkan itu harus dilakukan:

frameWorkframeWorkframeWork

Pada dasarnya, kita want A (pemain) untuk mengerahkan kekuatan tertentu pada B (kristal), dan memindahkan B menuju A berdasarkan bahwa gaya.

Kita harus merevisi beberapa konsep:

  • Flash hanya berfungsi di radian, bukan derajat.
  • Sistem koordinat Flash memiliki sumbu yang terbalik: turun berarti peningkatan y.
  • Kita bisa mendapatkan sudut garis yang menghubungkan A ke B menggunakan Math.atan2 (B.y - A.y, B.x - A.x).
  • Kita dapat menggunakan trigonometri untuk mengetahui berapa banyak kita perlu bergerak B sepanjang setiap sumbu, berdasarkan sudut ini dan Angkatan:
    • B.x + = (Force*Math.cos(angle));
    • B.y + = (Force*Math.sin(angle));
  • Kita dapat menggunakan teorema Pythagoras's untuk mengetahui jarak antara dua objek:

Untuk selengkapnya, lihat tutorial gravitasi dalam tindakan dan trigonometri untuk pengembang permainan Flash.


Langkah 14: Menerapkan mendorong dan menarik

Berdasarkan penjelasan sebelumnya, kita dapat datang dengan garis besar untuk kode kita yang menarik setiap kristal ke kapal:

  1. Menemukan perbedaan di x dan y antara kapal dan kristal tertentu.
  2. Menemukan sudut antara mereka, dalam radian.
  3. Mencari jarak antara mereka, menggunakan Pythagoras.
  4. Memeriksa apakah objek dalam bidang gravitasi kapal.
  5. Jika demikian, menghitung gaya gravitasi, dan...
  6. .. .apply Angkatan, mengubah x dan y nilai Crystal.

Contoh kode:

1
2
	public function gravityPull(p:Player): void
3
	{
4
		for (var i:int = 0; i < energyList.length; i++) {
5
			var energyS:Energy = energyList[i];
6
				
7
			var nX:Number = (p.x - energyS.x);
8
			var nY:Number = (p.y - energyS.y);
9
			
10
			var angle:Number = Math.atan2(nY, nX);
11
				
12
			var r:Number =  Math.sqrt(nX * nX + nY * nY);
13
				
14
			if (r <= 250) {
15
				var f:Number = (4 * 50 * 10) / (r * r); 				
16
				energyS.x += f * Math.cos(angle);
17
				energyS.y += f * Math.sin(angle);
18
			}
19
		}
20
	}
  • Line 53: mendapatkan referensi untuk pemain.
  • Line 55: kita loop melalui setiap objek energi.
  • Line 61: menemukan sudut antara kapal dan energi.
  • Line 63: menemukan jarak antara mereka, juga.
  • Line 65: memeriksa apakah energi dalam kapal Angkatan lapangan.
  • Jalur 67: menggunakan rumus:
    • 4 = G, "terus-menerus gravitasi" Aku telah memilih.
    • 50 = m1, massa kapal pemain.
    • 10 = m2, massa objek energi.
  • Line 69: menerapkan gerakan.

Inilah timelapse menampilkan bagaimana ini terlihat:

Perhatikan bahwa energi bergerak cepat semakin dekat sampai ke kapal, berkat r-squared istilah.

Kita dapat menerapkan fungsi mendorong hanya dengan membuat kekuatan negatif:

1
2
	public function gravityPull(p:Player): void
3
	{
4
		for (var i:int = 0; i < energyList.length; i++) {
5
			var energyS:Energy = energyList[i];
6
				
7
			var nX:Number = (p.x - energyS.x);
8
			var nY:Number = (p.y - energyS.y);
9
			
10
			var angle:Number = Math.atan2(nY, nX);
11
				
12
			var r:Number =  Math.sqrt(nX * nX + nY * nY);
13
				
14
			if (r <= 250) {
15
				var f:Number = (4 * 50 * 10) / (r * r); 				
16
				energyS.x -= f * Math.cos(angle);
17
				energyS.y -= f * Math.sin(angle);
18
			}
19
		}
20
	}

Di sini objek bergerak lebih lambat karena mendapat lebih jauh dari pemain, karena kekuatan mendapat lebih lemah.


Langkah 15: Oleskan montir

Tentu saja bahwa Anda akan memerlukan fungsi ini akan dijalankan setiap bingkai oleh GameScreen - tetapi sebelum itu, kita perlu menggunakan Boolean fungsi untuk beralih antara dua fungsi:

1
2
private var isGravityPushing:Boolean = true;  // hitting space toggles it

Kita akan menggunakan benar untuk 'Push' dan palsu untuk 'Tarik'.

Di dalam KeyDownHandler():

1
2
	if (e.keyCode == Keyboard.SPACE) {
3
		if (isGravityPushing == true) {
4
			isGravityPushing = false;
5
		} else if (isGravityPushing == false) {
6
			isGravityPushing = true;
7
		}
8
	}

Setelah itu, Anda akan memiliki untuk memeriksa setiap frame Boolean. Menambahkan ini ke update() akan membuat:

1
2
	if (isGravityPushing == true) {
3
		energyM.gravityPull(player);
4
	}
5
	if (isGravityPushing == false) {
6
		energyM.gravityPush(player);
7
	}

Langkah 16: modifikasi

Anda mungkin menemukan bahwa gerakan tidak terlihat begitu baik. Ini bisa menjadi karena kekuatan tidak cukup ideal, atau karena istilah r-squared.

Saya ingin mengubah formula seperti begitu:

1
2
var f:Number = (0.8 * 50 * 10) / r;

Seperti yang Anda lihat, saya sudah dikurangi nilai "G" untuk 0.8, dan mengubah Angkatan bergantung hanya pada jarak antara objek, daripada jarak kuadrat.

Mencobanya dan melihat jika Anda menikmati perubahan. Anda selalu dapat mengubahnya namun Anda suka.


Langkah 17: Kelas teks

Kita akan perlu untuk menunjukkan beberapa teks pada layar, untuk menunjukkan nilai dan kapal sisa kekuatan.

Untuk tujuan ini, kita akan membangun kelas baru, teks:

1
2
package  
3
{
4
	import flash.display.MovieClip;
5
	import flash.text.TextField;
6
	import flash.events.Event;
7
	import flash.text.TextFormat;
8
9
	import flash.text.TextFormatAlign;
10
11
	public class Text extends MovieClip
12
	{
13
		public var _scoreText:TextField= new TextField();
14
		
15
		public function Text(string:String)
16
		{	
17
			var myScoreFormat:TextFormat = new TextFormat(); //Format changeable

18
			myScoreFormat.size = 24;		
19
			
20
			myScoreFormat.align = TextFormatAlign.LEFT;
21
			myScoreFormat.color = (0x131313);
22
			
23
			_scoreText.defaultTextFormat = myScoreFormat;
24
			
25
			_scoreText.text = string;
26
			
27
			addChild(_scoreText);
28
		}
29
30
		public function updateText(string:String)
31
		{
32
			_scoreText.text = string;
33
		}
34
	}
35
}

Sangat sederhana; Hal ini pada dasarnya sebuah movieklip dengan bidang teks di dalamnya.


Langkah 18: Menambahkan kekuatan untuk pemain

Untuk memberikan beberapa tantangan permainan, kami akan membuat kapal kekuatan terbiasa perlahan-lahan, sehingga pemain harus mengumpulkan energi objek untuk mengisi ulang.

Untuk membuat kapal kekuatan muncul di kapal itu sendiri, kita hanya dapat menambahkan contoh teks ke objek kapal tampilan daftar.

Menyatakan variabel ini dalam kelas kapal tersebut:

1
2
public var totalPower:Number = 100;  // ship starts with this much power

3
private var powerText:Text;

Kita akan perlu untuk menjaga jumlah daya (baik disimpan dan ditampilkan) diperbarui setiap bingkai, sehingga menambahkan fungsi baru untuk pemain:

Pertama, dalam konstruktor:

1
2
			// add a new text object if it doesn't already exist

3
			if (!powerText) {
4
				powerText = new Text(String(int(totalPower))); 
5
				addChild(powerText);	
6
				powerText.x -= 20;			//Adjust position

7
				powerText.y -= 16;
8
			}

Dan kemudian...

1
2
	public function updatePower():void
3
		{
4
			// fps = 24, so this makes power decrease by 1/sec

5
			totalPower -= 1 / 24;		
6
			powerText.updateText(String(int(totalPower)));
7
		}

Kekuatan akan berkurang setiap bingkai oleh 1/24 unit, berarti itu akan mengurangi dengan satu unit penuh setiap detik.

Kita perlu membuat ini menjalankan setiap bingkai, jadi Tambahkan baris ini untuk GameScreen.update():

1
2
player.updatePower();

Langkah 19: Membuat energi meningkatkan daya

Ketika kapal bertabrakan dengan objek energi, kami menginginkannya untuk meningkatkan kekuatan.

Dalam GameScreen.update(), tambahkan baris yang disorot:

1
2
returnedPower = energyM.checkCollision(player);
3
player.totalPower += returnedPower;

Ingat Anda dapat mengubah berapa banyak daya dikembalikan dalam fungsi EnergyManager.checkCollision().


Langkah 20: Menyiapkan Skor

Sekali lagi, kita akan membutuhkan kelas teks. Saat ini, kami akan menampilkan "Nilai" dan kemudian nilai.

Di sini, kami akan memerlukan ketiga variabel lain:

  • Teks "Nilai".
  • Skor nilai teks.
  • Variabel untuk menyimpan nilai sebenarnya.

Menyatakan di kelas GameScreen ini:

1
2
private var scoreText:Text;
3
private var totalScore:int = 0;
4
private var score:Text;

Dalam konstruktor, tambahkan kode ini:

1
2
scoreText = new Text("Score :");
3
addChild(scoreText);
4
5
score = new Text(String(totalScore));
6
addChild(score);
7
score.x = scoreText.x + 100;   //Positioning it beside the "Score : " Text.

8
score.y += 2;

Sekarang, dalam fungsi update() akan membuat, menambahkan ini:

1
2
score.updateText(String(totalScore));

Thats it - kami telah membuat versi dasar dari permainan di atas!

Lihat (Anda mungkin perlu untuk reload halaman):


Fitur tambahan dan Polishing

Latar Ruang

Mungkin Anda juga ingin latar belakang dengan gambar tertanam dan bintang-bintang. Menambahkan ini ke kelas utama Anda:

1
2
[Embed(source = "/../lib/SpaceBackground.jpg")]	//embed

3
		private var backgroundImage:Class; //This line must come immediately after the embed

4
5
		private var bgImage:Bitmap = new backgroundImage();		
6
		private var numOfStars:int = 70;

Sekarang membuat kelas bintang:

1
2
package assets 
3
{
4
	import flash.display.MovieClip;
5
	import flash.events.Event;
6
7
	public class Star extends MovieClip
8
	{
9
		private var speed:Number;
10
		
11
		public function Star(alpha:Number, size:Number, speed1:Number) 
12
		{
13
			graphics.beginFill(0xCCCCCC);
14
			graphics.drawCircle(0, 0, size);
15
			
16
			speed = speed1;
17
		}
18
		
19
		// make sure you call this every frame

20
		private function moveDown():void
21
		{
22
			this.y += speed;
23
			
24
			if (this.y >= 600) {
25
				this.y = 0;
26
			}
27
		}
28
	}
29
}

Dalam konstruktor Main(), tambahkan ini membuat bintang-bintang:

1
2
3
for (var i:int = 0; i < numOfStars; i++) {
4
		createStars();
5
}

Berikut adalah sebenarnya createStars() fungsi:

1
2
3
private function createStars():void
4
{
5
	var star:Star = new Star(
6
		Math.random(), 
7
		Calculations.getRandomValue(1, 2), 
8
		Calculations.getRandomValue(2, 5)
9
	);  //random alpha, size and speed

10
			
11
	addChild(star);
12
			
13
	star.x = Calculations.getRandomValue(0, 550);
14
	star.y = Calculations.getRandomValue(0, 600);
15
}

Dengan alpha acak, ukuran, posisi, dan kecepatan, latar belakang pseudo-3D dapat dihasilkan.

Berbagai indikator

Berbagai indikator lingkaran dapat dilakukan hanya dengan membuat lingkaran lain dan menambahkannya ke daftar layar kapal, seperti bagaimana Anda menambahkan teks indikator kekuatan. Pastikan lingkaran berpusat pada kapal, dan memiliki radius sama dengan kapal push/pull jangkauan.

Tambahkan transparansi (alpha nilai) ke lingkaran dengan kode di bawah ini:

1
2
			graphics.beginFill(0xCCCCCC, 0.1);

Mencoba menambahkan kontrol tambahan yang membuat rentang yang menambah atau mengurangi ketika panah atas dan bawah tombol ditekan.


Kesimpulan

Saya harap Anda menikmati tutorial ini! Harap meninggalkan komentar Anda.

Next: Membaca kritik ini untuk panduan mengambil fluks dari demo sederhana untuk permainan lengkap!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.