فصل اول روز سوم : اجرای پاسخ گویی به کلیدها

دانلود نسخه PDF :دانلود

در این بخش می خواهیم کدهایی به برنامه اضافه کنیم تا به فشردن کلیدهای صفحه کلید پاسخ دهد.

در زیر نحوه رسیدن به این هدف توضیح داده شده است :

  • برای آن که بازی ما به فشردن کلید ها پاسخ دهد نیاز آست تا متدی با عنوان پاسخ گو (listener) به کدها اضافه کنیم تا وظیفه این کار را بر عهده داشته باشد.
  • لذا برای انجام بند ۱ ، ما تنها کافیست تا واسطه KeyListener  (implement KeyListener)را در کلاس شروع به کار ببریم سپس در متد init(); ، KeyListener را اضافه کنیم.
  • همان طور که می دانید اجرای یک واسطه ملزم به این است که تمامی متدهای موجود در آن را در برنامه پیاده سازی کنیم. درست مثل واسطه Runnable در بخش قبل که نیاز بود متد run(); آن را اضافه کنیم. این واسطه دارای سه متد برای پیاده سازی است که عبارت اند از : keyPressed(); ، keyReleased() و keyTyped() .

خوب بیاید با اجرای واسطه KeyListener کار را شروع کنیم.

  • ابتدا به جایی که کلاس شروع را تعریف کرده اید رفته و در ادامه آن مثل زیر KeyListener را اضافه کنید.

بعد از اضافه کردن ,KeyListener به انتهای خط شکل آن به صورت زیر خواهد بود:

public class ShoroClass extends Applet implements Runnable,KeyListener {…

با اضافه کردن این مورد شاهد خواهیم بود که اکلیپس خطا خواهد گرفت. دلیل آن اضافه نکردن متدهای این واسطه می باشد.

  • در این جا یک بار کلیدهای Ctrl+Space+O را با هم فشار دهید تا اطمینان حاصل شود که کلاس KeyListener به پروژه اضافه شده است.

اما هنوز باید خطا در برنامه وجود داشته باشد. دلیل آن همان طور که گفته شد اضافه نکردن متدهاست. برای رفع این خطا مطابق شکل زیر ابتدا روی عکس لامپ کلیک کرده و سپس گزینه مورد نظر را انتخاب کنید.

  • با انجام این کار سه متد نامبرده به پروژه شما اضافه خواهد شد.
  • در انتها برای آن که به KeyListener بفهمانیم که متد های آن در این کلاس تعریف شده در متد init(); این عبارت را اضافه خواهیم نمود.

addKeyListener(this);

در این جا کلاس شروع ما به شکل زیر خواهد بود:

package codeandroid;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class ShoroClass extends Applet implements Runnable,KeyListener {
	@Override
	public void init() {
		setSize(800, 480);
		setBackground(Color.BLACK);
		setFocusable(true);
		addKeyListener(this);
		Frame frame = (Frame) this.getParent().getParent();
		frame.setTitle("بازی ربات");

	}

	@Override
	public void start() {
		Thread thread = new Thread(this);
		thread.start();
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void run() {
		while (true) {

			repaint();// این خط متد پینت را فراخوانی میکند

			try {
				Thread.sleep(17);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}

از این سه متد که اضافه کردیم دو متد آن معرّف خود  می باشند. یکی هنگام فشردن کلید و دیگری هنگام رها شدن کلید فراخوانی می شوند. و اما سومی که در اینجا کاربردی نخواهد داشت.

۱-۳-۱-            پاسخ گویی به فشردن کلیدها

در بازی ما فعلا ۵ کلید نیاز خواهد بود. چهار کلید برای جابجایی و حرکت ربات و یک کلید برای پرش. برای حرکت ربات از کلیدهای فلش دار روی صفحه کلید استفاده میکنیم و برای پرش از اسپیس.

ابتدا با متد keyPressed(); که هنگام فشردن کلید صدا زده می شود آغاز میکنیم. داخل این متد یک switch/case ایجاد خواهیم نمود تا هنگام فشردن کلید کار مناسب را انجام دهد.

@Override
	public void keyPressed(KeyEvent arg0) {
		switch (arg0.getKeyCode()) {
		case KeyEvent.VK_UP:
		break;
		case KeyEvent.VK_DOWN:
		break;
		case KeyEvent.VK_LEFT:
		break;
		case KeyEvent.VK_RIGHT:
		break;
		case KeyEvent.VK_SPACE:
		break;
		}
		
} 

همان طور که می بینید این متد یک ورودی به نام arg0 دارد که از نوع KeyEvent می باشد. با کمک این متغیر می توان تشخیص داد که کدام کلید فشار داده شده است. در داخل شرط switch با کمک این متغیر کد کلید فشرده شده را می گیریم سپس با توجه به کد، case مربوط به آن اجرا می شود. به طور مثال این عبارت KeyEvent.VK_UP

مربوط به کلید بالا می باشد و اگر کاربر کاید بالا را فشرده باشد این case اجرا خواهد شد.

۱-۳-۲-            پاسخ گویی به رها کردن کلید

متد keyReleased(); هنگامی که کاربر کلید را رها میکند فراخوانی می شود. در اینجا نیز برای آن که تشخیص داده شود کاربر کدام کلید را رها کرده از ساختار switch/case به همان شکل متد فشردن کلید استفاده خواهیم نمود.

@Override
	public void keyReleased(KeyEvent arg0) {
		switch (arg0.getKeyCode()) {
		case KeyEvent.VK_UP:
		break;
		case KeyEvent.VK_DOWN:
		break;
		case KeyEvent.VK_LEFT:
		break;
		case KeyEvent.VK_RIGHT:
		break;
		case KeyEvent.VK_SPACE:
		break;
		}
		
	}

هم اکنون از آن جا که هنوز شخصیت بازی ما طراحی نشده است. فشردن این کلید ها بی معنی است اما برای آن که درستی اجرای آن را آزمایش کنیم کدهایی را اضافه میکنیم تا وقتی کاربر کلیدی را فشرد در کنسول متن مربوط به آن نشان داده شود. کدهای با پس زمینه رنگی را به برنامه اضافه کنید:

package codeandroid;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class ShoroClass extends Applet implements Runnable, KeyListener {
	@Override
	public void init() {
		setSize(800, 480);
		setBackground(Color.BLACK);
		setFocusable(true);
		addKeyListener(this);
		Frame frame = (Frame) this.getParent().getParent();
		frame.setTitle("بازی ربات");

	}

	@Override
	public void start() {
		Thread thread = new Thread(this);
		thread.start();
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub

	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void run() {
		while (true) {

			repaint();// این خط متد پینت را فراخوانی میکند

			try {
				Thread.sleep(17);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

	@Override
	public void keyPressed(KeyEvent e) {
		switch (e.getKeyCode()) {
		case KeyEvent.VK_UP:
			System.out.println("حرکت به بالا");
			break;
		case KeyEvent.VK_DOWN:
			System.out.println("حرکت به پایین");
			break;
		case KeyEvent.VK_LEFT:
			System.out.println("حرکت به چپ");
			break;
		case KeyEvent.VK_RIGHT:
			System.out.println("حرکت به راست");
			break;
		case KeyEvent.VK_SPACE:
			System.out.println("پرش");
			break;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		switch (e.getKeyCode()) {
		case KeyEvent.VK_UP:
			System.out.println("توقف حرکت به بالا");
			break;
		case KeyEvent.VK_DOWN:
			System.out.println("توقف حرکت به پایین");
			break;
		case KeyEvent.VK_LEFT:
			System.out.println("توقف حرکت به چپ");
			break;
		case KeyEvent.VK_RIGHT:
			System.out.println("توقف حرکت به راست");
			break;
		case KeyEvent.VK_SPACE:

			System.out.println("توقف پرش");
			break;
		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}
}

با اضافه کردن این کد ها و اجرای بازی با فشردن و رها کردن کلید ها شاهد درج متن هایی شبیه شکل زیر در کنسول خواهیم بود.

پایان بخش سوم.

دانلود نسخه PDF :دانلود

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *