Java 2d游戏问题
我用Slick2d库创建了2d java游戏。这个游戏是关于白色(玩家)和红色(敌人)方块的。在640 x 640游戏板上,红色的追白色的,你的任务是从红色的跑开,四处移动。。。很简单 我的问题是,我只定义了1个敌人追击者,我想被更多的人追击。我希望它就像当我按下“N”键时,另一个红色方块出现并开始追赶我。我再次按下“N”键,所以从现在起3个红色方块在追我。我希望它是这样的,我可以无限次地按下“N”,然后更多的红色方块出现 假设我得到了void init,render,update。我没有复制整个代码(因为它看起来很凌乱),但这不是重点,因为游戏运行正常Java 2d游戏问题,java,sprite,game-engine,Java,Sprite,Game Engine,我用Slick2d库创建了2d java游戏。这个游戏是关于白色(玩家)和红色(敌人)方块的。在640 x 640游戏板上,红色的追白色的,你的任务是从红色的跑开,四处移动。。。很简单 我的问题是,我只定义了1个敌人追击者,我想被更多的人追击。我希望它就像当我按下“N”键时,另一个红色方块出现并开始追赶我。我再次按下“N”键,所以从现在起3个红色方块在追我。我希望它是这样的,我可以无限次地按下“N”,然后更多的红色方块出现 假设我得到了void init,render,update。我没有复制整
public class PlayTestState extends BasicGameState {
// moving method stands for moving WHITE square (player moves it with arrows)
void moving(Input input) {
if (input.isKeyDown(Input.KEY_UP)) {
// human = movingUp;
mainPositionY -= .5f;
if (mainPositionY < 32) {
mainPositionY += .5f;
}
}
if (input.isKeyDown(Input.KEY_DOWN)) {
// human = movingUp;
mainPositionY += .5f;
if (mainPositionY > 576) {
mainPositionY -= .5f;
}
}
if (input.isKeyDown(Input.KEY_LEFT)) {
// human = movingUp;
mainPositionX -= .5f;
if (mainPositionX < 32) {
mainPositionX += .5f;
}
}
if (input.isKeyDown(Input.KEY_RIGHT)) {
// human = movingUp;
mainPositionX += .5f;
if (mainPositionX > 576) {
mainPositionX -= .5f;
}
}
}
Image you, enemy;
double mainCharacterSpeed = 0.5;
double enemyCharacterSpeed = 0.3;
float mainPositionX = 320; // stands for white square (player) start position
float mainPositionY = 320;
float enemyPositionX = 320; // stands for red square (enemy - computer) start position
float enemyPositionY = 96;
//that chase method stands for red square chasing after white one
void chase() {
if (enemyPositionY < mainPositionY)
enemyPositionY += enemyCharacterSpeed;
if (enemyPositionX > mainPositionX)
enemyPositionX -= enemyCharacterSpeed;
if (enemyPositionX < mainPositionX)
enemyPositionX += enemyCharacterSpeed;
if (enemyPositionY > mainPositionY)
enemyPositionY -= enemyCharacterSpeed;
}
public void init(GameContainer gc, StateBasedGame sbg)
throws SlickException {
you = new Image("res/draws/mainCharacter.png");
enemy = new Image ("res/draws/enemyCharacter.png");
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
throws SlickException {
you.draw(mainPositionX, mainPositionY);
enemy.draw(enemyPositionX, enemyPositionY);
}
public void update(GameContainer gc, StateBasedGame sbg, int delta)
throws SlickException {
Input input = gc.getInput();
moving(input);
}
}
}
public类PlayTestState扩展了BasicGameState{
//移动法代表移动白色方块(玩家用箭头移动)
无效移动(输入){
if(input.isKeyDown(input.KEY_UP)){
//人类=移动;
主位置Y-=0.5f;
如果(主位置Y<32){
主位置Y+=0.5f;
}
}
if(input.isKeyDown(input.KEY_DOWN)){
//人类=移动;
主位置Y+=0.5f;
如果(主位置Y>576){
主位置Y-=0.5f;
}
}
if(input.isKeyDown(input.KEY_左)){
//人类=移动;
主位置X-=0.5f;
如果(主位置X<32){
主位置X+=0.5f;
}
}
if(input.isKeyDown(input.KEY_RIGHT)){
//人类=移动;
主位置X+=0.5f;
如果(主位置X>576){
主位置X-=0.5f;
}
}
}
想象你,敌人;
双主字符速度=0.5;
双enemyCharacterSpeed=0.3;
float main positionx=320;//表示白方块(玩家)开始位置
浮动主位置Y=320;
float enemyPositionX=320;//表示红方块(敌人-计算机)起始位置
漂浮灌肠位y=96;
//那个追逐法代表红场追逐白场
void chase(){
如果(enemyPositionYmainPositionX)
enemyPositionX-=enemyCharacterSpeed;
如果(enemyPositionXmainPositionY)
灌肠位置-=灌肠特征速度;
}
public void init(GameContainer gc、StateBasedGame sbg)
抛出异常{
you=新图像(“res/draws/mainCharacter.png”);
敌人=新图像(“res/draws/enemyCharacter.png”);
}
公共void渲染(GameContainer gc、StateBasedGame sbg、Graphics g)
抛出异常{
绘制(主位置X、主位置Y);
敌人.抽签(灌肠姿势X,灌肠姿势Y);
}
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)
抛出异常{
Input=gc.getInput();
移动(输入);
}
}
}
有什么办法吗?
我必须用敌方对象制作某种数组列表吗?对于初学者来说,这是一个常见的障碍,以一种明智而灵活的方式分割状态。当您需要某个对象的多个实例(如此处的敌人)时,您不能以一对一的关系将此类实体的状态直接绑定到游戏状态 因此,首先,将敌国划分为单独的敌国:
class Enemy {
float x, y;
Image image = ...
// creates an enemy
public Enemy(float x, float y) {
this.x = x;
this.y = y;
}
// draws this enemy
public void render(...) {
...
}
}
并通过将enemyPositionX和enemyPositionY替换为以下内容,将游戏状态更改为容纳多个敌人:
class GameState {
List<Enemy> enemies = new ArrayList<>();
}
现在让你的render()方法处理敌人列表,因此改变游戏状态的render()以将敌人的渲染委托给它的render方法:
public void render(...) {
you.draw(...);
for (Enemy enemy : enemies) {
enemy.render(...);
}
}
现在添加一个新敌人就像创建最初的敌人一样简单:敌人。添加(新敌人(x,y))
你仍然希望敌人追逐玩家,因此追逐方法也进入敌人类。并将要追踪的位置作为参数接收:
public void chase(float mainPositionX, float mainPositionY) {
...
}
然后在循环中从游戏状态调用它,就像在render()中一样:
关键是将状态放在单独的对象中并管理它们之间的关系。还有很多简化的可能性(例如,使用继承来利用玩家和敌人之间的共同点)。我把它留给你去探索。是的。类似于if(input==“N”)敌人。添加(new敌军());然后更新整个列表。但是如果一个敌人有一些由enemyPositionX、enemyPositionY定义的位置参数,那么另一个敌人也有相同的参数,这将使他处于相同的位置:/仔细看看Bene暗示了什么;你需要从游戏状态中移除敌人的位置,创建一个类敌人,并让游戏状态保存一个敌人实例列表。我也这么想,但不知道如何将这些游戏状态类与enemyClass连接起来。我想也许我能做到这一点:{我对这类事情非常熟悉:/
public void chase(float mainPositionX, float mainPositionY) {
...
}
for (Enemy enemy : enemies) {
enemy.chase(mainPositionX, mainPositionY);
}