Piszę grę na Androida i mam klasę Bullet która jest poruszającą sie kulką-pociskiem, chce teraz mieć klasę RotateBullet któa dziedziczy z Bullet i będzie to kulka która będzie się poruszała. Chcę też aby kulki były rozróżnialne na moje i przeciwnika, więc mam klasy HeroBullet i EnemyBullet(mają na przykład inne metody służące do usuwania). No i teraz jak chcę mieć rotującą się kulkę przeciwnika to przydało by się zrobić kulkę która ma dwa dziedziczenia, no ale w javie tak nie można, ale na pewno musi być jakiś trick którego nie znam. Z góry dzięki za pomoc.
package com.example.user.bulletfalls;
import android.content.Context;
import android.graphics.Point;
import android.widget.FrameLayout;
import com.example.user.bulletfalls.JsonClasses.Bullets.JsonBullet;
public abstract class Bullet extends ViewElement {
boolean collisionAble;
public Bullet(Context context, int power, int speed, Point startingPoint, int width, int height, int randeringFrequency, int imageResource, FrameLayout frame,GameController controller,boolean collisionAble) {
super(context, power, speed, startingPoint, width, height, randeringFrequency, imageResource,frame);
this.controller=controller;
this.collisionAble=collisionAble;
}
public Bullet(Context context, JsonBullet jsonBullet)
{
super(context,jsonBullet);
this.collisionAble=jsonBullet.isCollisionAble();
}
public boolean isCollisionAble() {
return collisionAble;
}
public void setCollisionAble(boolean collisionAble) {
this.collisionAble = collisionAble;
}
abstract public void destroy();
protected void move()
{
((Game)this.getContext()).setX(this,(int)(getX()+speed));
if(getX()+getWidth()>frame.getWidth()||getX()<0||getY()+getHeight()>frame.getHeight()||getY()<0)
{
destroy();
}
}
}
public class RotateBulletHero extends HeroBullet {
int rotationSpeed;
public RotateBulletHero(Context context, int power, int speed, Point startingPoint, int width, int height, int randeringFrequency, int imageResource, FrameLayout frame, GameController controller, boolean collisionAble,int rotationSpeed) {
super(context, power, speed, startingPoint, width, height, randeringFrequency, imageResource, frame, controller, collisionAble);
this.rotationSpeed=rotationSpeed;
}
public RotateBulletHero(Context context, JsonBullet bullet) {
super(context, bullet);
}
@Override
public void move()
{
((Game)this.getContext()).setX(this,(int)(getX()+speed));
if(getX()+getWidth()>frame.getWidth()||getX()<0||getY()+getHeight()>frame.getHeight()||getY()<0)
{
destroy();
}
}
}
public class HeroBullet extends Bullet {
public HeroBullet(Context context, int power, int speed, Point startingPoint, int width, int height, int randeringFrequency, int imageResource, FrameLayout frame, GameController controller,boolean collisionAble) {
super(context, power, speed, startingPoint, width, height, randeringFrequency, imageResource, frame, controller,collisionAble);
}
public HeroBullet(Context context, JsonBullet bullet) {
super(context,bullet);
}
public void destroy()
{
controller.removeHeroBullet(this);
((Game)getContext()).removeObject(this);
}
@Override
public ViewElement clone() {
HeroBullet bullet= new HeroBullet(this.getContext(),this.power,this.speed,this.startingPoint,this.width,this.height,this.randeringFrequency,imageResources,this.frame,this.controller,this.collisionAble);
return bullet;
}
}
public class EnemyBullet extends Bullet {
public EnemyBullet(Context context, int power, int speed, Point startingPoint, int width, int height, int randeringFrequency, int imageResource, FrameLayout frame, GameController controller,boolean collisionAble) {
super(context, power, speed, startingPoint, width, height, randeringFrequency, imageResource, frame, controller,collisionAble);
if(speed>0)
{
this.speed=speed*(-1);
}
}
public EnemyBullet(Context context, JsonBullet bullet) {
super(context,bullet);
}
@Override
public void destroy() {
((Game)getContext()).removeObject(this);
controller.removeEnemyBullet(this);
}
@Override
public ViewElement clone() {
EnemyBullet bullet= new EnemyBullet(this.getContext(),this.power,this.speed,this.startingPoint,this.width,this.height,this.randeringFrequency,imageResources,this.frame,this.controller,this.collisionAble);
return bullet;
}
}
BulletService
jest IMO średnią nazwą na serwis, bo rozmywa odpowiedzialność (coś w styluBulletManager
). Lepiej mieć wiele małych serwisów (BulletCollider
,BulletMover
itd.).Service
na zasadzeBulletMovementService
czyBulletCollisionService
vpiotrMap<PlayerId, List<Bullet>> bullets;
- jak rozumiem po wystrzeleniu gracz może jeszcze różne rzeczy robić z kulami? Sterować nimi? Wywołać autodestrukcję? Jest jakiś inny cel tak mocnego związku? Bo pomove()
raczej widać że to bardziej szkodzi niż pomaga.friendly-fire
, czyli nie kolidować ze sobą pocisków tego samego gracza. Pytanie czy lepsza taka asocjacja, czy lepsza referencja do gracza w obiekcieBullet
Collidable
, a nieCollisionable
(jakkolwiek by tego drugiego nie pisać)