CodeGym /وبلاگ جاوا /Random-FA /بخش بازی در CodeGym: مدیریت رویداد
John Squirrels
مرحله
San Francisco

بخش بازی در CodeGym: مدیریت رویداد

در گروه منتشر شد
«بازی‌ها» از CodeGym بخش جدیدی با وظایف جالب بزرگ است که در آن نسخه‌های خود را از بازی‌های محبوب ایجاد می‌کنید. ساده است: هر پروژه بازی به وظایف فرعی تقسیم می شود. آنها را یکی یکی کامل کنید و بازی تمام می شود. می توانید آن را در شبکه های اجتماعی به اشتراک بگذارید و دوستان خود را به بازی دعوت کنید. در این مقاله، روش های مدیریت رویداد مورد استفاده برای نوشتن بازی ها را بخش "بازی ها" در CodeGym: مدیریت رویداد - 1به تفصیل شرح خواهیم داد .

1. کار با ماوس

موتور بازی دو روش برای کار با ماوس دارد:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

شما به سادگی این متدها را در کلاس خود که ارث می‌برند Game، اعلام می‌کنید و هر کدی را که می‌خواهید به آنها اضافه می‌کنید. وقتی کاربر روی دکمه های ماوس کلیک کند، موتور بازی آنها را صدا می کند.
  1. onMouseLeftClick(int x, int y)- هنگامی که دکمه سمت چپ ماوس کلیک می شود توسط موتور فراخوانی می شود. پارامترهای آن مختصات سلول زمین بازی است که در آن کلیک رخ داده است. سلول بالا سمت چپ دارای مختصات (0، 0) است. برای استفاده از آن باید این روش را نادیده بگیرید.

  2. onMouseRightClick(int x, int y)- هنگامی که دکمه سمت راست ماوس کلیک می شود، فراخوانی می شود. این روش مانند onMouseLeftClick(int x, int y)روش عمل می کند.

در اینجا نمونه ای از استفاده از این روش ها آورده شده است:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onMouseLeftClick(int x, int y) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. کار با صفحه کلید

موتور بازی دو روش برای کار با صفحه کلید دارد:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

اگر می خواهید زمانی که کاربر کلیدی را فشار می دهد اتفاقی بیفتد، این متدها را در کلاس خود که Game را به ارث می برند، اعلام کنید و کد خود را به آنها اضافه کنید. هنگامی که کاربر کلیدی را فشار داده یا رها می کند، موتور بازی آنها را صدا می کند.
  1. onKeyPress(Key key)- هنگامی که هر کلیدی فشار داده می شود، فراخوانی می شود. پارامتر کلید، کلید فشار داده شده (یا Key.UNKNOWN) است.

  2. onKeyReleased(Key key)- هنگامی که هر کلیدی آزاد می شود، فراخوانی می شود. پارامتر کلید، کلید مربوطه (یا Key.UNKNOWN) است.

در اینجا نمونه ای از استفاده از این روش ها آورده شده است:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onKeyPress(Key key) {
        // When the space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
مهم! در نسخه فعلی موتور بازی، نوع Key دارای یک مجموعه محدود از نه مقدار است:
ارزش کلید توسط کاربر فشار داده شده است
Key.ENTER کاربر Enter را فشار داد
کلید.فرار کاربر Esc را فشار داد
کلید. مکث کاربر Pause را فشار داد
کلید.فضا کاربر Space را فشار داد
کلید.چپ کاربر کلید فلش سمت چپ را فشار داد
کلید.راست کاربر کلید پیکان سمت راست را فشار داد
Key.UP کاربر کلید فلش رو به بالا را فشار داد
کلید. پایین کاربر کلید پایین را فشار داد
کلید.ناشناخته کاربر کلیدی غیر از موارد بالا را فشار داد

3. کار با تایمر

بسیاری از بازی ها در زمان واقعی اتفاق می افتند، یعنی حتی اگر کاربر هیچ کاری انجام ندهد، باز هم اتفاقاتی در بازی رخ می دهد. برای اینکه بتوانید چنین بازی هایی را پیاده سازی کنید، یک تایمر به موتور بازی اضافه کردیم. چیزی شبیه به این کار می کند: شما تایمر را روشن می کنید و فاصله تایمر را تنظیم می کنید. مثلا 500 میلی ثانیه. سپس هر نیم ثانیه موتور بازی onTurnTimer()متد را فراخوانی می کند. بارها و بارها برای همیشه - تا زمانی که تایمر خاموش شود. پس چگونه از تایمر استفاده می کنید؟
  1. تایمر را روشن کنید.

    برای انجام این کار، روش خاصی وجود دارد void setTurnTimer(int timeMs). این روش فاصله بین تماس ها را بر حسب میلی ثانیه (1 میلی ثانیه = 1/1000 ثانیه) به عنوان آرگومان می گیرد. فقط باید یک بار آن را فراخوانی کنید و موتور بازی onTurn()هر بار Ms میلی ثانیه شروع به فراخوانی روش می کند.

  2. روش onTurn(int) را لغو کنید.

    برای انجام این کار، باید void onTurn(int step)متدی را در کلاسی که ارث بری می کند، اعلام کنید Game. این روش توسط موتور بازی فراخوانی خواهد شد. علاوه بر این، با هر تماس، موتور بازی یک شناسه متوالی برای تماس (1، 2، 3، ...) را به روش ارسال می کند.

  3. تایمر را خاموش کنید.

    اگر دیگر نیازی به تایمر نیست، مثلاً وقتی کاربر بازی را کامل کرد، می‌توانید آن را خاموش کنید. برای انجام این کار، فقط باید stopTurnTimer()متد را فراخوانی کنید.

  4. تایمر را تسریع یا تغییر دهید.

    در برخی بازی‌ها، سرعت رخ دادن رویدادها دائماً در حال افزایش است، بنابراین سریع‌تر کردن تایمر (کاهش زمان بین تماس‌ها) راحت است. هیچ چیز نمی تواند ساده تر باشد: setTurnTimer(int timeMs)یک بار دیگر با یک مقدار جدید تماس بگیرید و زمان بین onTurn()تماس ها تغییر خواهد کرد.

مثلا:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {@Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }}
در این مثال ساده، یک فیلد ایجاد کردیم که 3 خانه در 3 خانه است. سپس یک تایمر را شروع کردیم که onTurn()هر نیم ثانیه متد را فراخوانی می کند. هر نیم ثانیه، رنگ سلول تغییر می کند، اما محتوای آن تغییر نمی کند. پس از 50 ثانیه، رنگ دیگر تغییر نخواهد کرد. فعلاً همین است! اگر می‌خواهید درباره بخش «بازی‌ها» اطلاعات بیشتری کسب کنید، در اینجا چند سند مفید وجود دارد که می‌تواند کمک کند:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION