抽象公共类,复用公共方法为多个对象

今天学习如何实现愤怒的小鸟,用到了JBox2D构建物理世界(这个不是这篇文章重点,但是很谢谢这个开源玩意)

一般一个独立的物体的实体类

import org.jbox2d.dynamics.Body;

import org.liky.angrybird.util.Globals;

import org.liky.angrybird.util.ImageUtils;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Point;

public class Bird {

private Body body;

private float r;

private int type;

public Bird(int type) {

switch (type) {

case 1:

r = Globals.PIECE_WIDTH / 2;

break;

}

this.type = type;

}

public void draw(Canvas canvas, Paint paint, Point nowPosition) {

canvas.save();

canvas.rotate((float) (body.getAngle() * 180 / Math.PI),

body.getPosition().x * Globals.RATE + nowPosition.x,

body.getPosition().y * Globals.RATE + nowPosition.y);

canvas.drawBitmap(ImageUtils.getBirdImg(type), body.getPosition().x

* Globals.RATE - r + nowPosition.x, body.getPosition().y

* Globals.RATE - r + nowPosition.y, paint);

if (Globals.birdCenterFlag) {

// 保证正在飞行的鸟的坐标在屏幕正中

nowPosition.x = (int) -(body.getPosition().x * Globals.RATE - Globals.SCREEN_WIDTH / 2);

nowPosition.y = (int) -(body.getPosition().y * Globals.RATE - Globals.SCREEN_HEIGHT / 2);

if (nowPosition.x > 0) {

nowPosition.x = 0;

}

if (nowPosition.y > 0) {

nowPosition.y = 0;

}

if (nowPosition.x < -Globals.SCREEN_WIDTH) {

nowPosition.x = -Globals.SCREEN_WIDTH;

}

if (nowPosition.y < -Globals.SCREEN_HEIGHT) {

nowPosition.y = -Globals.SCREEN_HEIGHT;

}

}

canvas.restore();

}

public Body getBody() {

return body;

}

public void setBody(Body body) {

this.body = body;

this.body.m_userData = this;

}

public int getType() {

return type;

}

public void setType(int type) {

this.type = type;

}

public float getR() {

return r;

}

public void setR(float r) {

this.r = r;

}

}

当我们构建多个物体的时候,假如它们有共同性,提出公共方法为抽象类(至少有一个抽象方法)

import org.jbox2d.dynamics.Body;

import org.liky.angrybird.util.Globals;

import org.liky.angrybird.util.JBoxUtils;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Point;

public abstract class Item {

private Body body;

private float width;

private float height;

private float life = 500;

private int animIndex = 0;

private int countDown = 2;

// 记录销毁时的坐标,以及弧度

private float[] destoryPoint;

private float destoryAngle;

public void draw(Canvas canvas, Paint paint, Point nowPosition) {

// 前后的画布操作,在这里实现

// 旋转画布

canvas.save();

if (life > 0) {

canvas.rotate((float) (body.getAngle() * 180 / Math.PI),

body.getPosition().x * Globals.RATE + nowPosition.x,

body.getPosition().y * Globals.RATE + nowPosition.y);

} else {

// canvas.rotate((float) (destoryAngle * 180 / Math.PI),

// body.getPosition().x * Globals.RATE + nowPosition.x,

// body.getPosition().y * Globals.RATE + nowPosition.y);

}

drawItem(canvas, paint, nowPosition);//只要重新实现这里就可以了

canvas.restore();

}

public abstract void drawItem(Canvas canvas, Paint paint, Point nowPosition);

public Body getBody() {

return body;

}

public void setBody(Body body) {

this.body = body;

this.body.m_userData = this;

}

public float getWidth() {

return width;

}

public void setWidth(float width) {

this.width = width;

}

public float getHeight() {

return height;

}

public void setHeight(float height) {

this.height = height;

}

public float getLife() {

return life;

}

public void setLife(float life) {

this.life = life;

if (life <= 0) {

if (destoryPoint == null) {

destoryPoint = new float[2];

destoryPoint[0] = body.getPosition().x * Globals.RATE;

destoryPoint[1] = body.getPosition().y * Globals.RATE;

destoryAngle = body.getAngle();

}

// 当生命小于0时,需要将body销毁

JBoxUtils.world.destroyBody(body);

}

}

public int getAnimIndex() {

return animIndex;

}

public void setAnimIndex(int animIndex) {

this.animIndex = animIndex;

}

public int getCountDown() {

return countDown;

}

public void setCountDown(int countDown) {

this.countDown = countDown;

}

public float[] getDestoryPoint() {

return destoryPoint;

}

public void setDestoryPoint(float[] destoryPoint) {

this.destoryPoint = destoryPoint;

}

public float getDestoryAngle() {

return destoryAngle;

}

public void setDestoryAngle(float destoryAngle) {

this.destoryAngle = destoryAngle;

}

}

package org.liky.angrybird.vo;

import org.jbox2d.dynamics.Body;

import org.liky.angrybird.util.Globals;

import org.liky.angrybird.util.ImageUtils;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Point;

public class Wood extends Item {

public Wood(Body body) {

setBody(body);

setWidth(Globals.PIECE_WIDTH * 3);

setHeight(Globals.PIECE_HEIGHT / 2);

setLife(100);

}

public void drawItem(Canvas canvas, Paint paint, Point nowPosition) {

if (getLife() > 300) {

canvas.drawBitmap(ImageUtils.getWood(0), getBody().getPosition().x

* Globals.RATE - getWidth() / 2 + nowPosition.x, getBody()

.getPosition().y

* Globals.RATE

- getHeight()

/ 2

+ nowPosition.y, paint);

} else if (getLife() > 100) {

canvas.drawBitmap(ImageUtils.getWood(1), getBody().getPosition().x

* Globals.RATE - getWidth() / 2 + nowPosition.x, getBody()

.getPosition().y

* Globals.RATE

- getHeight()

/ 2

+ nowPosition.y, paint);

} else if (getLife() > 0) {

canvas.drawBitmap(ImageUtils.getWood(2), getBody().getPosition().x

* Globals.RATE - getWidth() / 2 + nowPosition.x, getBody()

.getPosition().y

* Globals.RATE

- getHeight()

/ 2

+ nowPosition.y, paint);

} else {

setCountDown(getCountDown() - 1);

if (getCountDown() == 0) {

setCountDown(2);

setAnimIndex(getAnimIndex() + 1);

if (getAnimIndex() == 15) {

setAnimIndex(14);

}

}

canvas.drawBitmap(ImageUtils.getWoodDestory(getAnimIndex()),

getDestoryPoint()[0] - Globals.PIECE_WIDTH / 2

+ nowPosition.x, getDestoryPoint()[1]

- Globals.PIECE_HEIGHT + nowPosition.y, paint);

}

}

}

抽象公共类,复用公共方法为多个对象

时间: 2024-12-23 13:22:38

抽象公共类,复用公共方法为多个对象的相关文章

JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象

public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 = null; c1.eat(); System.out.println(c1.age); c2 = c1; c2.eat(); } } class Chicken{ int color; char sex; int age; void eat(){ System.out.println("chik

流畅python学习笔记:第十一章:抽象基类

__getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克牌的例子来看下 class FrenchDeck:     ranks=[str(n) for n in range(2,11)] + list('JQKA')     suits='spades diamonds clubs hearts'.split()     def __init__(sel

python(七):元类与抽象基类

一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(object): def __init__(self, *args, **kwargs): self.name, self.age, self.gender = args[:3] def __new__(cls, *args, **kwargs): print("__new__ has called.

D20_2.1类中的方法

无参的普通方法 : 只能用类调用绑定方法: (1)绑定到对象:在调用时,自动传递self对象参数, 对象可直接调用,类调用的话需要传参obj (2)绑定到类 :在调用时,自动传递cls这个类参数, 括号里面有没有cls,self,都可以用不带参数的类或对象调用静态方法: 无论是对象还是类都可以调用,把方法作为普通方法进行使用 class Dog(): def __init__(self,name): self.name = name # 无参普通方法(不能被对象调用) def eat(): pr

Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 16. 在公共类中使用访问方法而不是公共属性 有时候,你可能会试图写一些退化的类(degenerate classes),除了集中实例属性之外别无用处: // Degene

C# 实现模拟登录功能,实现公共类分享。

前言 最近在研究模拟登录的各种方法, 主要想要实现的两个功能是: 1.点击按钮可以直接跳转并登录到某一个系统中. 2.抓取某一个系统中某一个页面中的特定数据. 为此在网上查了许多的资料,首先了解到自身对http协议基础知识的欠缺,初步了解后,明白想要实现模拟登录首先要学会抓包这一项基本的技能,关于抓包这里就不详细介绍了,向大家推荐一款软件fiddler,一款不错的抓包软件. 首先客户端向服务端请求无非两种类型get或post,所以我们要了解在登录某一个系统时post的地址,以及需要post的参数

Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

Android公共库--图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一些android公共库,包含缓存(图片缓存.预取缓存.网络缓存).公共View(下拉及底部加载更多ListView.底部加载更多ScrollView.滑动一页Gallery).及Android常用工具类(网络.下载.shell.文件.json等等). TrineaAndroidCommon已开源,地

偷懒小工具 - Excel导出公共类

说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Excel大体格式如图 很简单的列表,标题加背景色,然后不同类型,显示方式不一样.对齐方式不一样.不同页面除了内容以外,大体形式都差不多. 当时本来是想直接用NPOI,IRow ICell.这样进行拼接页面,最简单也最方便. 但是很多页面,都进行这种类似的设计.我实在是懒得做这种重复功能.所以花了一点时间,整理了一下帮助类. 使用 做好这个帮助类以后只要进行两点调用 1.制作导出Excel的数据模

CodeSmith公共类维护

CodeSmith在使用过程中,我们经常会出现同一个方法在不同的页面调用,如果我们在每个页面都写一个这样的方法,那么代码量非常大,同时如果以后需要修改也要在每个页面分别去修改,这无疑是劳命伤财,如果能够有更好的方法那么又何乐而不为呢.下面提供两种方式: 方法一: 1.创建公共类comm.cs,类里面的内容如下: public string getData() { return "abc"; } 2.调用的cst文件内容如下: <%@ CodeTemplate Language=&