1.0下的Sprite

 
 * Sprite.java
 *
 * Copyright 2001 SkyArts. All Rights Reserved.
 */
import javax.microedition.lcdui.*;

/**
 * Sprite类(显示贴图零件)
 *
 * @author  Hideki Yonekawa
 * @version 1.0
 */
abstract class Sprite {
 /** 储存了X坐标的变量 */
 protected int    x;
 /** 储存了Y坐标的变量 */
 protected int    y;
 /** 储存横宽的变量 */
 protected int    width;
 /** 储存高度的变量 */
 protected int    height;

 /** 代表是否为Alive状态的标志变量 */
 protected boolean   isAlive    = true;
 /** 代表是否为Hit状态的标志变量 */
 protected boolean   isHit    = false;
 /** 储存了TicK计数的变量 */
 protected int    tickCount   = 0;

 /**
  * 设定X坐标的方法
  * @param x 要设定的X坐标值
  */
 void setX(int x) {
  this.x = x;
 }

 /**
  * 传回X坐标的方法
  * @return int 被设定的X坐标值
  */
 int getX() {
  return x;
 }

 /**
  * 设定Y坐标的方法
  * @param y 要设定的y坐标值
  */
 void setY(int y) {
  this.y = y;
 }

 /**
  * 传回Y坐标值的方法
  * @return int 被设定的Y坐标值
  */
 int getY() {
  return y;
 }

 /**
  * 传回横宽的方法
  * @return int 横宽值
  */
 int getWidth() {
  return width;
 }

 /**
  * 传回高度的方法
  * @return int 高度值
  */
 int getHeight() {
  return height;
 }

 /**
  * 设定Alive状态的方法
  * @param isAlive Alive状态的话就是true、不是Alive状态就是false
  */
 void setAlive(boolean isAlive) {
  this.isAlive = isAlive;
 }

 /**
  * 传回Alive状态的方法
  * @return boolean Alive状态就是true、不是Alive状态就是false
  */
 boolean isAlive() {
  return isAlive;
 }

 /**
  * 设定Hit状态的方法
  * @param isAlive Hit状态就是true、不是Hit状态就是false
  */
 void setHit(boolean isHit) {
  this.isHit = isHit;
  tickCount  = 0;
 }

 /**
  * 传回Hit状态的方法
  * @return boolean Hit状态就是true、不是Hit状态就是false
  */
 boolean isHit() {
  return isHit;
 }

 /**
  * 传回这个Sprite(this)是否有与其他Sprite重叠的方法
  * @return boolean 有重叠的话就是true、没有重叠的话是false
  */
 boolean isOverlaps(Sprite otherSprite) {
  if( (otherSprite.getX() <= x && otherSprite.getX() + otherSprite.getWidth() >= x) || //右
   (otherSprite.getX() >= x && otherSprite.getX() <= x + width) ) {   //左
   if( (otherSprite.getY() <= y && otherSprite.getY() + otherSprite.getHeight() >= y) ||//上
    (otherSprite.getY() >= y && otherSprite.getY() <= y + height) ) {  //下
    return true;
   }
  }
  return false;
 }

 /** 要移动Sprite所调用的方法 */
 abstract void doMove();

 /** 要描绘Sprite所调用的方法 */
 abstract void doDraw(Graphics g);
}

在Unity DOTS 1.0中,可以使用ECS(Entity Component System)来播放帧动画。以下是一个简单的例子: 1. 创建一个帧动画组件 ```csharp public struct FrameAnimationComponent : IComponentData { public int currentFrame; public int maxFrame; public float timePerFrame; public float elapsedTime; } ``` 这个组件包含了当前帧、最大帧数、每帧持续时间以及已经经过的时间。 2. 创建一个帧动画系统 ```csharp [UpdateInGroup(typeof(PresentationSystemGroup))] public class FrameAnimationSystem : SystemBase { protected override void OnUpdate() { float deltaTime = Time.DeltaTime; Entities.ForEach((ref FrameAnimationComponent animationComponent) => { animationComponent.elapsedTime += deltaTime; if (animationComponent.elapsedTime >= animationComponent.timePerFrame) { animationComponent.currentFrame++; animationComponent.elapsedTime = 0f; if (animationComponent.currentFrame >= animationComponent.maxFrame) { animationComponent.currentFrame = 0; } } }).ScheduleParallel(); } } ``` 这个系统会遍历所有包含了帧动画组件的实体,更新它们的当前帧,同时检查是否到达最大帧数,如果是则重置为0。 3. 创建一个帧动画渲染系统 ```csharp [UpdateInGroup(typeof(PresentationSystemGroup))] public class FrameAnimationRenderSystem : SystemBase { private EntityQuery frameAnimationQuery; private Material material; protected override void OnCreate() { frameAnimationQuery = GetEntityQuery(ComponentType.ReadOnly<FrameAnimationComponent>(), ComponentType.ReadOnly<SpriteRenderer>()); material = Resources.Load<Material>("FrameAnimationMaterial"); // 用于渲染帧动画的材质 } protected override void OnUpdate() { var sprites = GetComponentDataFromEntity<SpriteRenderer>(true); var frameAnimations = GetComponentDataFromEntity<FrameAnimationComponent>(true); Entities.WithoutBurst().ForEach((Entity entity, ref DynamicBuffer<SpriteBufferElement> spriteBuffer) => { if (!frameAnimations.HasComponent(entity)) { return; } var animation = frameAnimations[entity]; var sprite = sprites[entity]; int frameIndex = animation.currentFrame * sprite.numSubMeshes; for (int i = 0; i < sprite.numSubMeshes; i++) { spriteBuffer[i] = new SpriteBufferElement { sprite = sprite.subMeshes[i].sprites[frameIndex + i], material = material }; } }).WithStructuralChanges().Run(); } } ``` 这个系统会遍历所有包含了帧动画组件和SpriteRenderer组件的实体,根据当前帧数和SpriteRenderer的子网格数来更新DynamicBuffer中的SpriteBufferElement,这样就可以渲染出帧动画了。 需要注意的是,这个例子仅适用于单个SpriteRenderer组件中包含了整个帧动画的情况。如果需要对不同的子网格分别播放帧动画,则需要做一些修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值