2016-06-12 2 views
0

Для проекта финального класса Greenfoot я решил сделать игру под названием «Doggie the Super Catcher». В основном эта игра состоит в том, что актер, Doggie, попытается изо всех сил поймать клеверы и специальные угощения, которые, кажется, падают с деревьев, бегу назад и вперед по экрану (с помощью ввода левой и правой стрелки клавиатуры пользователя, конечно). Тем не менее, дело в том, что я хочу создать несколько уровней, и что я хочу, чтобы у меня появился первый мир (названный GameWorld), который появится на первом уровне, который находится в другом мире. Как я должен это делать? Другими словами, я не могу передать одни и те же вещи от GameWorld до Level1, который включает в себя клеверы, конфеты и табло, когда выполняется определенное условие (т. Е. Достигается определенное количество очков)? FYI: Я использовал отдельного актера для табло (надеюсь, это поможет ...). Кто-нибудь из вас знает дорогу? Благодарю.Отображение того же содержимого в другом мире Greenfoot

import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) 

public class Doggie extends Actor 
{ 

// Declare arrays of Greenfoot images for animation 
private GreenfootImage[] runningLeft; 
private GreenfootImage[] runningRight; 

// Declare Greenfoot images for standing still facing left and right 
private GreenfootImage standingStill; 
private GreenfootImage standingLeft; 
private GreenfootImage standingRight; 

// 
boolean facingLeft; 

// Integers that help control the speed of movement and animation 
private int animationCounter; 
private int animationDelay; 
private int animationDelayCounter; 
private int animationSpeed; 

Clover c; 
SpecialTreat1 c1; 
SpecialTreat2 c2; 

public Doggie() 
{ 
    String fileName; 
    String fileNamePrefix = "left0"; 
    String fileNameSuffix = ".png"; 

    runningLeft = new GreenfootImage[3]; 
    runningRight = new GreenfootImage[3]; 

    for (int imageCounter = 0; imageCounter < runningLeft.length; imageCounter++) 
    { 
     fileName = fileNamePrefix + (imageCounter + 1) + fileNameSuffix; 
     runningLeft[imageCounter] = new GreenfootImage(fileName); 
     runningRight[imageCounter] = new GreenfootImage (runningLeft[imageCounter]); 
     runningRight[imageCounter].mirrorHorizontally(); 
    } 

    standingStill = new GreenfootImage ("still01.png"); 
    standingLeft = new GreenfootImage ("left01.png"); 
    standingRight = new GreenfootImage (standingLeft); 
    standingRight.mirrorHorizontally(); 

    facingLeft = true; 

    animationSpeed = 5; 

    animationDelay = 6; 

    animationDelayCounter = 0; 

    animationCounter = 0; 
} 

/** 
* Act - do whatever the Doggie wants to do. This method is called whenever 
* the 'Act' or 'Run' button gets pressed in the environment. 
*/ 
public void act() 
{ 
    animationDelayCounter++; 
    if (animationDelayCounter == animationDelay) 
    { 
     animationCounter++; 
     animationDelayCounter = 0; 
    } 

    if (animationCounter > runningRight.length - 1) 
     animationCounter = 0; 

    c = (Clover)getOneIntersectingObject(Clover.class); 
    c1 = (SpecialTreat1)getOneIntersectingObject(SpecialTreat1.class); 
    c2 = (SpecialTreat2)getOneIntersectingObject(SpecialTreat2.class); 

    if (c != null) 
    { 
     c.collect(); 
     GameWorld gW = (GameWorld)getWorld(); 
     gW.showPoints(); 
    } 

    if (c1 != null) 
    { 
     c1.collect(); 
     GameWorld gW = (GameWorld)getWorld(); 
     gW.showPoints(); 
    } 

    if (c2 != null) 
    { 
     c2.collect(); 
     GameWorld gW = (GameWorld)getWorld(); 
     gW.showPoints(); 
    } 
} 

public void runLeft() 
{ 
    if (!(facingLeft)) 
     animationCounter = 0; 

    facingLeft = true; 

    setImage (runningLeft[animationCounter]); 
    setLocation (getX() - animationSpeed, getY()); 
} 

public void runRight() 
{ 
    if (facingLeft) 
     animationCounter = 0; 

    facingLeft = false; 

    setImage (runningRight[animationCounter]); 
    setLocation (getX() + animationSpeed, getY()); 
} 

public void standStill() 
{ 
    if (facingLeft) 
    { 
     setImage(standingLeft); 
    } 
    else 
     setImage(standingRight); 
    animationCounter = 0; 
    animationDelayCounter = 0; 
} 

} 
+0

И жаль, что я не комментировал этот код еще. :( –

ответ

0

В Greenfoot уровни обычно реализуются путем использования разных миров. Таким образом, вы могли бы:

class Level1 extends World 
{ 
    ... 
} 

И

class Level2 extends World 
{ 
    ... 
} 

Они оба будут появляться непосредственно под мир на диаграмме классов. Если вы хотите поделиться кодом между вашими уровнями (например, они оба порождают клеверы), вам, вероятно, нужен общий родительский класс. Таким образом, вы могли бы:

class DoggieWorld extends World 
{ 
    public void spawnClovers(int speed) 
    { 
     if (Greenfoot.getRandomNumber(1000) < speed) 
      addObject(new Clover(), Greenfoot.getRandomNumber(getWidth()), 0); 
    } 
} 

Тогда у вас есть два класса уровня, каждый из которых распространяется DoggieWorld (не просто World), что позволяет вызвать метод spawnClovers от каждого:

class Level1 extends DoggieWorld 
{ 
    public void act() 
    { 
     spawnClovers(20); 
    } 
} 

class Level2 extends DoggieWorld 
{ 
    public void act() 
    { 
     spawnClovers(50); 
    } 
} 

Я не Не хочу делать этот ответ слишком долго, но, надеюсь, это дает общую идею: иметь общий родительский класс, который наследует оба класса уровней (используя extends), а затем оба класса уровня могут вызывать методы из общего родителя.

Редактировать: извините, я думаю, что я просто понял более четко, что вы также хотите перенести актеров между мирами при переключении уровня. Вы можете сделать это, пройдя всех актеров интересующего вас типа и удалив их из существующего мира и добавив их в новый мир. Например. включить этот вид метода в Level1:

public void changeLevel() 
{ 
    World nextLevel = new Level2(); 
    for (Clover c : getObjects(Clover.class)) 
    { 
     // Must ask for position before removing from world: 
     int x = c.getX(); 
     int y = c.getY(); 
     removeObject(c); 
     nextLevel.addObject(c, x, y); 
    } 
    Greenfoot.setWorld(nextLevel); 
} 

Надежда, что помогает

+0

ОК. Спасибо за быстрый ответ, но у меня есть еще один вопрос: означает ли это, что все частные переменные, объявленные в DoggieWorld, а также его конструктор будут наследоваться непосредственно подклассами Level1 и Level2? Если это так, это означает, что мне не нужно помещать какие-либо конструкторы или переменные в Level1 и Level2, правильно, полагая, что я передаю всех актеров именно так, как они были в новом мире? –

+0

Ой, подождите. что я, но почему-то, я не знаю, почему моя публичная переменная «оценка» (объявленная в DoggieWorld) игнорируется программой, когда я пытался использовать ее в состоянии в Level1 .... :( –

+0

О, неважно. Работала над вашей идеей в течение нескольких часов, и теперь, наконец, я получил ее! Большое спасибо !!!: P –

Смежные вопросы