Java 矩形';s定位/工作不正确
我正在Android Studio中尝试用Libgdx制作一个简单的游戏,玩家可以左右移动一艘宇宙飞船,避开屏幕上随机出现的小行星。一切正常,除了矩形在小行星上的位置不正确,或者在碰撞后没有记录重叠以结束游戏 目前,只有当一颗小行星落下时,玩家坐在游戏的右手边,游戏才会结束,任何其他位置(即使靠近右手边)都不做任何事情 任何帮助都将不胜感激 我有这艘船的等级:Java 矩形';s定位/工作不正确,java,android,libgdx,Java,Android,Libgdx,我正在Android Studio中尝试用Libgdx制作一个简单的游戏,玩家可以左右移动一艘宇宙飞船,避开屏幕上随机出现的小行星。一切正常,除了矩形在小行星上的位置不正确,或者在碰撞后没有记录重叠以结束游戏 目前,只有当一颗小行星落下时,玩家坐在游戏的右手边,游戏才会结束,任何其他位置(即使靠近右手边)都不做任何事情 任何帮助都将不胜感激 我有这艘船的等级: package com.mygdx.game.Sprites; import com.badlogic.gdx.gra
package com.mygdx.game.Sprites;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector3;
import com.mygdx.game.Game2;
public class Ship {
private static int gravity;
private static int MOVEMENT = 50;
private Vector3 position;
private Vector3 velocity;
private Rectangle bounds;
private Texture ship;
public Ship(int x, int y){
position = new Vector3(x, y, 0);
velocity = new Vector3(0, 0, 0);
ship = new Texture("Ship3.png");
bounds = new Rectangle(x, y, ship.getWidth(), ship.getHeight());
// - 10 maybe for shape not being square
}
public void update(float dt){
velocity.add(gravity, 0, 0);
velocity.scl(dt);
position.add(velocity.x, MOVEMENT*dt, 0);
if (position.x < 0)
position.x = 0;
if(position.x + ship.getWidth() >= Game2.WIDTH/2) {
position.x = Game2.WIDTH/2 - ship.getWidth();
bounds.setPosition(position.x, position.y);
}
}
public Vector3 getPosition() {
return position;
}
public Texture getTexture() {
return ship;
}
public void turnLeft(){
gravity = -100;
}
public void turnRight() {
gravity = 100;
}
public Rectangle getBounds(){
return bounds;
}
public boolean collides(Rectangle asta){
return asta.overlaps(bounds);
}
}
我的游戏状态:
package com.mygdx.game.States;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Array;
import com.mygdx.game.Game2;
import com.mygdx.game.Sprites.Asta;
import com.mygdx.game.Sprites.Ship;
public class PlayState extends State {
private static final int ASTA_SPACING = 125;
private static final int ASTA_COUNT = 4;
private Ship ship;
private Texture background;
private Array<Asta> astas;
public PlayState(GameStateManager gsm) {
super(gsm);
ship = new Ship(Game2.WIDTH/4, Game2.HEIGHT/8);
cam.setToOrtho(false, Game2.WIDTH/2, Game2.HEIGHT/2);
// /2
background = new Texture("Background1.png");
astas = new Array<Asta>();
for (int i = 0; i <= ASTA_COUNT; i++){
astas.add(new Asta(i * ASTA_SPACING + Asta.ASTA_HEIGHT));
}
}
@Override
protected void handleInput() {
if (Gdx.input.justTouched())
ship.turnLeft();
{
if (Gdx.input.getX() > Gdx.graphics.getWidth() / 2)
{
ship.turnRight();
}
else
{
ship.turnLeft();
}
}
}
@Override
public void update(float dt) {
handleInput();
ship.update(dt);
cam.position .y = ship.getPosition().y+50 ;
//moves the camera focus around the ship;
for (Asta asta: astas){
if (cam.position.y - (cam.viewportHeight/2) > asta.getPosRightAsta().y + asta.getRightasta().getHeight()){
asta.reposition(asta.getPosRightAsta().y + ((Asta.ASTA_HEIGHT + ASTA_SPACING) * ASTA_COUNT));
}
if (asta.collides(ship.getBounds()))
gsm.set(new MenuState(gsm));
}
cam.update();
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(background, 0, cam.position.y - (cam.viewportHeight / 2), Game2.WIDTH /2, Game2.HEIGHT /2);
///2
sb.draw(ship.getTexture(), ship.getPosition().x, ship.getPosition().y);
for (Asta asta : astas) {
sb.draw(asta.getRightasta(), asta.getPosRightAsta().x, asta.getPosRightAsta().y);
sb.draw(asta.getLeftasta(), asta.getPosLeftAsta().x, asta.getPosRightAsta().y);}
sb.end();
}
@Override
public void dispose () {
}
}
package com.mygdx.game.States;
导入com.badlogic.gdx.gdx;
导入com.badlogic.gdx.graphics.Texture;
导入com.badlogic.gdx.graphics.g2d.SpriteBatch;
导入com.badlogic.gdx.utils.Array;
导入com.mygdx.game.Game2;
导入com.mygdx.game.Sprites.Asta;
导入com.mygdx.game.Sprites.Ship;
公共类PlayState扩展了状态{
专用静态最终int ASTA_间距=125;
私有静态最终int ASTA_计数=4;
私人船舶;
私有纹理背景;
专用阵列ASTA;
公共播放状态(GameStateManager gsm){
超级(gsm);
船=新船(游戏2.WIDTH/4,游戏2.HEIGHT/8);
凸轮设置为(假,Game2.WIDTH/2,Game2.HEIGHT/2);
// /2
背景=新纹理(“Background1.png”);
astas=新数组();
对于(int i=0;i Gdx.graphics.getWidth()/2)
{
船舶右转();
}
其他的
{
船舶左转弯();
}
}
}
@凌驾
公共无效更新(浮动dt){
handleInput();
船舶更新(dt);
cam.position.y=ship.getPosition().y+50;
//围绕船舶移动相机焦点;
对于(Asta Asta:astas){
如果(cam.position.y-(cam.viewportHeight/2)>asta.getPosRightAsta().y+asta.getRightasta().getHeight()){
asta.resposition(asta.getPosRightAsta().y+((asta.asta_高度+asta_间距)*asta_计数));
}
if(asta.collides(ship.getBounds()))
gsm.set(新菜单(gsm));
}
cam.update();
}
@凌驾
公共无效渲染(SpriteBatch sb){
sb.设置投影矩阵(凸轮组合);
某人开始做某事;
sb绘制(背景,0,cam.position.y-(cam.viewportHeight/2),Game2.WIDTH/2,Game2.HEIGHT/2);
///2
绘制(ship.getTexture(),ship.getPosition().x,ship.getPosition().y);
对于(Asta Asta:astas){
sb.draw(asta.getRightasta(),asta.getPosRightAsta().x,asta.getPosRightAsta().y);
sb.draw(asta.getLeftasta(),asta.getPosLeftAsta().x,asta.getPosRightAsta().y);}
(某人结束);
}
@凌驾
公共空间处置(){
}
}
你的小行星是静止的吗
如果没有它们运动的代码在哪里?对不起,我必须奇怪地解释一下,小行星静止不动/是静止的,当飞船在屏幕上向上移动时,一旦小行星进入屏幕下方,它们就会被重新定位到顶部,“公共空间重新定位(浮动y)”会执行此操作
package com.mygdx.game.States;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Array;
import com.mygdx.game.Game2;
import com.mygdx.game.Sprites.Asta;
import com.mygdx.game.Sprites.Ship;
public class PlayState extends State {
private static final int ASTA_SPACING = 125;
private static final int ASTA_COUNT = 4;
private Ship ship;
private Texture background;
private Array<Asta> astas;
public PlayState(GameStateManager gsm) {
super(gsm);
ship = new Ship(Game2.WIDTH/4, Game2.HEIGHT/8);
cam.setToOrtho(false, Game2.WIDTH/2, Game2.HEIGHT/2);
// /2
background = new Texture("Background1.png");
astas = new Array<Asta>();
for (int i = 0; i <= ASTA_COUNT; i++){
astas.add(new Asta(i * ASTA_SPACING + Asta.ASTA_HEIGHT));
}
}
@Override
protected void handleInput() {
if (Gdx.input.justTouched())
ship.turnLeft();
{
if (Gdx.input.getX() > Gdx.graphics.getWidth() / 2)
{
ship.turnRight();
}
else
{
ship.turnLeft();
}
}
}
@Override
public void update(float dt) {
handleInput();
ship.update(dt);
cam.position .y = ship.getPosition().y+50 ;
//moves the camera focus around the ship;
for (Asta asta: astas){
if (cam.position.y - (cam.viewportHeight/2) > asta.getPosRightAsta().y + asta.getRightasta().getHeight()){
asta.reposition(asta.getPosRightAsta().y + ((Asta.ASTA_HEIGHT + ASTA_SPACING) * ASTA_COUNT));
}
if (asta.collides(ship.getBounds()))
gsm.set(new MenuState(gsm));
}
cam.update();
}
@Override
public void render(SpriteBatch sb) {
sb.setProjectionMatrix(cam.combined);
sb.begin();
sb.draw(background, 0, cam.position.y - (cam.viewportHeight / 2), Game2.WIDTH /2, Game2.HEIGHT /2);
///2
sb.draw(ship.getTexture(), ship.getPosition().x, ship.getPosition().y);
for (Asta asta : astas) {
sb.draw(asta.getRightasta(), asta.getPosRightAsta().x, asta.getPosRightAsta().y);
sb.draw(asta.getLeftasta(), asta.getPosLeftAsta().x, asta.getPosRightAsta().y);}
sb.end();
}
@Override
public void dispose () {
}
}