gpt4 book ai didi

java - 如果定义了一个带参数的构造函数,为什么我的代码不使用默认的非参数化构造函数?

转载 作者:行者123 更新时间:2023-11-29 06:35:28 25 4
gpt4 key购买 nike

好的,我有我的主类,它从我的框架中加载所有内容。我现在遇到的麻烦是我的碰撞检测;我明白了,所以如果它撞到什么东西,就会发生什么事。我有一个在 GameScreen 类中调用 GameOverUI 的方法,但我想在我的 Enemy.class 中使用它。我为该对象创建了一个新实例,但它说它未定义。我没有得到的是该类没有定义,但名为 GameScreen 的方法由 (Game game) 定义。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import android.graphics.Color;
import android.graphics.Paint;

import com.vaughanslater.framework.Game;
import com.vaughanslater.framework.Graphics;
import com.vaughanslater.framework.Image;
import com.vaughanslater.framework.Input.TouchEvent;
import com.vaughanslater.framework.Screen;

public class GameScreen extends Screen {
enum GameState {
Ready, Running, Paused, GameOver
}

GameState state = GameState.Ready;

// Variable Setup

private static Background bg1, bg2;
private static Robot robot;
public static Heliboy hb, hb2;

private Image currentSprite, character, character2, character3, heliboy,
heliboy2, heliboy3, heliboy4, heliboy5;
private Animation anim, hanim;

private ArrayList tilearray = new ArrayList();

int livesLeft = 1;
Paint paint, paint2;

public GameScreen(Game game) {
super(game);

// Initialize game objects here

bg1 = new Background(0, 0);
bg2 = new Background(2160, 0);
robot = new Robot();
hb = new Heliboy(340, 360);
hb2 = new Heliboy(700, 360);

character = Assets.character;
character2 = Assets.character2;
character3 = Assets.character3;

heliboy = Assets.heliboy;
heliboy2 = Assets.heliboy2;
heliboy3 = Assets.heliboy3;
heliboy4 = Assets.heliboy4;
heliboy5 = Assets.heliboy5;

anim = new Animation();
anim.addFrame(character, 1250);
anim.addFrame(character2, 50);
anim.addFrame(character3, 50);
anim.addFrame(character2, 50);

hanim = new Animation();
hanim.addFrame(heliboy, 100);
hanim.addFrame(heliboy2, 100);
hanim.addFrame(heliboy3, 100);
hanim.addFrame(heliboy4, 100);
hanim.addFrame(heliboy5, 100);
hanim.addFrame(heliboy4, 100);
hanim.addFrame(heliboy3, 100);
hanim.addFrame(heliboy2, 100);

currentSprite = anim.getImage();

loadMap();

// Defining a paint object
paint = new Paint();
paint.setTextSize(30);
paint.setTextAlign(Paint.Align.CENTER);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);

paint2 = new Paint();
paint2.setTextSize(100);
paint2.setTextAlign(Paint.Align.CENTER);
paint2.setAntiAlias(true);
paint2.setColor(Color.WHITE);

}

private void loadMap() {
ArrayList lines = new ArrayList();
int width = 0;
int height = 0;

Scanner scanner = new Scanner(SampleGame.map);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();

// no more lines to read
if (line == null) {
break;
}

if (!line.startsWith("!")) {
lines.add(line);
width = Math.max(width, line.length());

}
}
height = lines.size();

for (int j = 0; j < 12; j++) {
String line = (String) lines.get(j);
for (int i = 0; i < width; i++) {

if (i < line.length()) {
char ch = line.charAt(i);
Tile t = new Tile(i, j, Character.getNumericValue(ch));
tilearray.add(t);
}

}
}

}

@Override
public void update(float deltaTime) {

List touchEvents = game.getInput().getTouchEvents();

// We have four separate update methods in this example.
// Depending on the state of the game, we call different update methods.
// Refer to Unit 3's code. We did a similar thing without separating the
// update methods.

if (state == GameState.Ready)
updateReady(touchEvents);
if (state == GameState.Running)
updateRunning(touchEvents, deltaTime);
if (state == GameState.Paused)
updatePaused(touchEvents);
if (state == GameState.GameOver)
updateGameOver(touchEvents);
}

private void updateReady(List touchEvents) {

// This example starts with a "Ready" screen.
// When the user touches the screen, the game begins.
// state now becomes GameState.Running.
// Now the updateRunning() method will be called!

if (touchEvents.size() > 0)
state = GameState.Running;
}

private void updateRunning(List touchEvents, float deltaTime) {

// This is identical to the update() method from our Unit 2/3 game.

// 1. All touch input is handled here:
int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = (TouchEvent) touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN) {

if (event.x > 400) {
robot.jump();
currentSprite = anim.getImage();
robot.setDucked(false);
}

else if (inBounds(event, 0, 350, 65, 65)) {

if (robot.isDucked() == false && robot.isJumped() == false
&& robot.isReadyToFire()) {
robot.shoot();
}
}

else if (event.x < 400
&& robot.isJumped() == false) {
currentSprite = Assets.characterDown;
robot.setDucked(true);
robot.setSpeedX(0);

}

//if (event.x > 400) {
// Move right.
// robot.moveRight();
// robot.setMovingRight(true);
//}

}

if (event.type == TouchEvent.TOUCH_UP) {

if (event.x < 400) {
currentSprite = anim.getImage();
robot.setDucked(false);

}

if (inBounds(event, 0, 0, 35, 35)) {
pause();

}

if (event.x > 400) {
// Move right.
robot.stopRight();
}
}

}

// 2. Check miscellaneous events like death:

if (livesLeft == 0) {
state = GameState.GameOver;
}

// 3. Call individual update() methods here.
// This is where all the game updates happen.
// For example, robot.update();
robot.update();
if (robot.isJumped()) {
currentSprite = Assets.characterJump;
} else if (robot.isJumped() == false && robot.isDucked() == false) {
currentSprite = anim.getImage();
}

ArrayList projectiles = robot.getProjectiles();
for (int i = 0; i < projectiles.size(); i++) {
Projectile p = (Projectile) projectiles.get(i);
if (p.isVisible() == true) {
p.update();
} else {
projectiles.remove(i);
}
}

updateTiles();
hb.update();
hb2.update();
bg1.update();
bg2.update();
animate();

if (robot.getCenterY() > 500) {
state = GameState.GameOver;
}
}

private boolean inBounds(TouchEvent event, int x, int y, int width,
int height) {
if (event.x > x && event.x < x + width - 1 && event.y > y
&& event.y < y + height - 1)
return true;
else
return false;
}

private void updatePaused(List touchEvents) {
int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = (TouchEvent) touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_UP) {
if (inBounds(event, 0, 0, 800, 240)) {

if (!inBounds(event, 0, 0, 35, 35)) {
resume();
}
}

if (inBounds(event, 0, 240, 800, 240)) {
nullify();
goToMenu();
}
}
}
}

private void updateGameOver(List touchEvents) {
int len = touchEvents.size();
for (int i = 0; i < len; i++) {
TouchEvent event = (TouchEvent) touchEvents.get(i);
if (event.type == TouchEvent.TOUCH_DOWN) {
if (inBounds(event, 0, 0, 800, 480)) {
nullify();
game.setScreen(new MainMenuScreen(game));
return;
}
}
}

}

private void updateTiles() {

for (int i = 0; i < tilearray.size(); i++) {
Tile t = (Tile) tilearray.get(i);
t.update();
}

}

@Override
public void paint(float deltaTime) {
Graphics g = game.getGraphics();

g.drawImage(Assets.background, bg1.getBgX(), bg1.getBgY());
g.drawImage(Assets.background, bg2.getBgX(), bg2.getBgY());
paintTiles(g);

ArrayList projectiles = robot.getProjectiles();
for (int i = 0; i < projectiles.size(); i++) {
Projectile p = (Projectile) projectiles.get(i);
g.drawRect(p.getX(), p.getY(), 10, 5, Color.YELLOW);
}
// First draw the game elements.

g.drawImage(currentSprite, robot.getCenterX() - -15,
robot.getCenterY() - -17);
g.drawImage(hanim.getImage(), hb.getCenterX() - 48,
hb.getCenterY() - 48);
g.drawImage(hanim.getImage(), hb2.getCenterX() - 48,
hb2.getCenterY() - 48);

// Example:
// g.drawImage(Assets.background, 0, 0);
// g.drawImage(Assets.character, characterX, characterY);

// Secondly, draw the UI above the game elements.
if (state == GameState.Ready)
drawReadyUI();
if (state == GameState.Running)
drawRunningUI();
if (state == GameState.Paused)
drawPausedUI();
if (state == GameState.GameOver)
drawGameOverUI();

}

private void paintTiles(Graphics g) {
for (int i = 0; i < tilearray.size(); i++) {
Tile t = (Tile) tilearray.get(i);
if (t.type != 0) {
g.drawImage(t.getTileImage(), t.getTileX(), t.getTileY());
}
}
}

public void animate() {
anim.update(10);
hanim.update(50);
}

private void nullify() {

// Set all variables to null. You will be recreating them in the
// constructor.
paint = null;
bg1 = null;
bg2 = null;
robot = null;
hb = null;
hb2 = null;
currentSprite = null;
character = null;
character2 = null;
character3 = null;
heliboy = null;
heliboy2 = null;
heliboy3 = null;
heliboy4 = null;
heliboy5 = null;
anim = null;
hanim = null;

// Call garbage collector to clean up memory.
System.gc();

}

private void drawReadyUI() {
Graphics g = game.getGraphics();

g.drawARGB(155, 0, 0, 0);
g.drawString("Tap to Start.", 400, 240, paint);

}

private void drawRunningUI() {
Graphics g = game.getGraphics();
//g.drawImage(Assets.button, 0, 285, 0, 0, 65, 65);
//g.drawImage(Assets.button, 0, 350, 0, 65, 65, 65);
//g.drawImage(Assets.button, 0, 415, 0, 130, 65, 65);
g.drawImage(Assets.button, 0, 0, 0, 195, 35, 35);

}

private void drawPausedUI() {
Graphics g = game.getGraphics();
// Darken the entire screen so you can display the Paused screen.
g.drawARGB(155, 0, 0, 0);
g.drawString("Resume", 400, 165, paint2);
g.drawString("Menu", 400, 360, paint2);

}

public void drawGameOverUI() {
Graphics g = game.getGraphics();
g.drawRect(0, 0, 1281, 801, Color.BLACK);
g.drawString("GAME OVER.", 400, 240, paint2);
g.drawString("Tap to return.", 400, 290, paint);

}

@Override
public void pause() {
if (state == GameState.Running)
state = GameState.Paused;

}

@Override
public void resume() {
if (state == GameState.Paused)
state = GameState.Running;
}

public GameState getState() {
return state;
}

public void setState(GameState state) {
this.state = state;
}

@Override
public void dispose() {

}

@Override
public void backButton() {
pause();
}

private void goToMenu() {
// TODO Auto-generated method stub
game.setScreen(new MainMenuScreen(game));

}

public static Background getBg1() {
// TODO Auto-generated method stub
return bg1;
}

public static Background getBg2() {
// TODO Auto-generated method stub
return bg2;
}

public static Robot getRobot() {
// TODO Auto-generated method stub
return robot;
}


}

这也是我的敌人类:

import android.graphics.Rect;

public class Enemy {

private int power, centerX, speedX, centerY;
private Background bg = GameScreen.getBg1();
private Robot robot = GameScreen.getRobot();
public Rect r = new Rect(0, 0, 0, 0);
public int health = 5;
private int movementSpeed;

// Behavioural Methods
public void update() {
follow();
centerX += speedX;
speedX = bg.getSpeedX() * 5 + movementSpeed;
r.set(centerX - 25, centerY - 25, centerX + 25, centerY + 35);

if (Rect.intersects(r, Robot.yellowRed)) {
checkCollision();
}

}
private void checkCollision() {
if (Rect.intersects(r, Robot.rect) || Rect.intersects(r, Robot.rect2)
|| Rect.intersects(r, Robot.rect3)
|| Rect.intersects(r, Robot.rect4)) {
GameScreen state = new GameScreen(); // This is where it errors
}
}

public void follow() {

if (centerX < -95 || centerX > 810) {
movementSpeed = 0;
}

else if (Math.abs(robot.getCenterX() - centerX) < 5) {
movementSpeed = 0;
}

else {

if (robot.getCenterX() >= centerX) {
movementSpeed = 1;
} else {
movementSpeed = -1;
}
}

}

public void die() {

}

public void attack() {

}

public int getPower() {
return power;
}

public int getSpeedX() {
return speedX;
}

public int getCenterX() {
return centerX;
}

public int getCenterY() {
return centerY;
}

public Background getBg() {
return bg;
}

public void setPower(int power) {
this.power = power;
}

public void setSpeedX(int speedX) {
this.speedX = speedX;
}

public void setCenterX(int centerX) {
this.centerX = centerX;
}

public void setCenterY(int centerY) {
this.centerY = centerY;
}

public void setBg(Background bg) {
this.bg = bg;
}

所以这是错误的地方:

GameScreen state = new GameScreen(); // This is where it errors

我不明白,我不是在调用已定义的方法 GameScreen(Game game),而是在调用未定义的类。我想使用 drawGameOverUI();。

抱歉代码墙..至少你可以看到一切。

最佳答案

如果您定义任何构造函数,则永远不会使用默认构造函数。请定义 GameScreen() 的实现或删除 GameScreen(Game game) 的实现。

像这样定义一个默认构造函数-

  public GameScreen() {
super();

// Initialize game objects here

bg1 = new Background(0, 0);
bg2 = new Background(2160, 0);
robot = new Robot();
hb = new Heliboy(340, 360);
hb2 = new Heliboy(700, 360);

character = Assets.character;
character2 = Assets.character2;
character3 = Assets.character3;

heliboy = Assets.heliboy;
heliboy2 = Assets.heliboy2;
heliboy3 = Assets.heliboy3;
heliboy4 = Assets.heliboy4;
heliboy5 = Assets.heliboy5;

anim = new Animation();
anim.addFrame(character, 1250);
anim.addFrame(character2, 50);
anim.addFrame(character3, 50);
anim.addFrame(character2, 50);

hanim = new Animation();
hanim.addFrame(heliboy, 100);
hanim.addFrame(heliboy2, 100);
hanim.addFrame(heliboy3, 100);
hanim.addFrame(heliboy4, 100);
hanim.addFrame(heliboy5, 100);
hanim.addFrame(heliboy4, 100);
hanim.addFrame(heliboy3, 100);
hanim.addFrame(heliboy2, 100);

currentSprite = anim.getImage();

loadMap();

// Defining a paint object
paint = new Paint();
paint.setTextSize(30);
paint.setTextAlign(Paint.Align.CENTER);
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);

paint2 = new Paint();
paint2.setTextSize(100);
paint2.setTextAlign(Paint.Align.CENTER);
paint2.setAntiAlias(true);
paint2.setColor(Color.WHITE);

}

关于java - 如果定义了一个带参数的构造函数,为什么我的代码不使用默认的非参数化构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com