Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using UnityEngine;
- namespace Game {
- public class SpriteCollider {
- public List<Vector2> LeftColliderPoints { get; set; }
- public List<Vector2> RightColliderPoints { get; set; }
- private Texture2D texture2D;
- private float x;
- private float y;
- public SpriteCollider(Sprite s, float x, float y) {
- texture2D = RotateImage(TextureFromSprite(s), 90);
- LeftColliderPoints = new List<Vector2>();
- RightColliderPoints = new List<Vector2>();
- this.x = x;
- this.y = y;
- GenerateCollider();
- }
- public static Texture2D TextureFromSprite(Sprite sprite) {
- if (sprite.rect.width != sprite.texture.width) {
- Texture2D newText = new Texture2D((int)sprite.rect.width, (int)sprite.rect.height);
- Color[] newColors = sprite.texture.GetPixels((int)sprite.textureRect.x,
- (int)sprite.textureRect.y,
- (int)sprite.textureRect.width,
- (int)sprite.textureRect.height);
- newText.SetPixels(newColors);
- newText.Apply();
- return newText;
- } else return sprite.texture;
- }
- private void GenerateCollider() {
- for (float i = 0; i <= texture2D.height; i++) {
- for (float j = 0; j <= texture2D.width; j++)
- if (texture2D.GetPixel((int)i, (int)j).a != 0) {
- float x = j - texture2D.width / 2f;
- float y = -i + texture2D.width / 2f;
- x = x / 300f;
- y = y / 300f;
- LeftColliderPoints.Add(new Vector2(this.x + x, this.y + y));
- break;
- }
- }
- for (float i = 0; i <= texture2D.height; i++) {
- for (float j = texture2D.width; j >=0; j--)
- if (texture2D.GetPixel((int)i, (int)j).a != 0) {
- float x = j - texture2D.width / 2f;
- float y = -i + texture2D.width / 2f;
- x = x / 300f;
- y = y / 300f;
- RightColliderPoints.Add(new Vector2(this.x + x, this.y + y));
- break;
- }
- }
- }
- public void DrawCollider() {
- for (int i = 0; i < LeftColliderPoints.Count - 1; i++) {
- Debug.DrawLine(LeftColliderPoints[i], LeftColliderPoints[i + 1], Color.blue);
- }
- for (int i = 0; i < RightColliderPoints.Count - 1; i++) {
- Debug.DrawLine(RightColliderPoints[i], RightColliderPoints[i + 1], Color.red);
- }
- }
- private static Texture2D RotateImage(Texture2D originTexture, int angle) {
- Texture2D result;
- result = new Texture2D(originTexture.width, originTexture.height);
- Color32[] pix1 = result.GetPixels32();
- Color32[] pix2 = originTexture.GetPixels32();
- int W = originTexture.width;
- int H = originTexture.height;
- int x = 0;
- int y = 0;
- Color32[] pix3 = rotateSquare(pix2, (Math.PI / 180 * (double)angle), originTexture);
- for (int j = 0; j < H; j++) {
- for (var i = 0; i < W; i++) {
- //pix1[result.width/2 - originTexture.width/2 + x + i + result.width*(result.height/2-originTexture.height/2+j+y)] = pix2[i + j*originTexture.width];
- pix1[result.width / 2 - W / 2 + x + i + result.width * (result.height / 2 - H / 2 + j + y)] = pix3[i + j * W];
- }
- }
- result.SetPixels32(pix1);
- result.Apply();
- return result;
- }
- private static Color32[] rotateSquare(Color32[] arr, double phi, Texture2D originTexture) {
- int x;
- int y;
- int i;
- int j;
- double sn = Math.Sin(phi);
- double cs = Math.Cos(phi);
- Color32[] arr2 = originTexture.GetPixels32();
- int W = originTexture.width;
- int H = originTexture.height;
- int xc = W / 2;
- int yc = H / 2;
- for (j = 0; j < H; j++) {
- for (i = 0; i < W; i++) {
- arr2[j * W + i] = new Color32(0, 0, 0, 0);
- x = (int)(cs * (i - xc) + sn * (j - yc) + xc);
- y = (int)(-sn * (i - xc) + cs * (j - yc) + yc);
- if ((x > -1) && (x < W) && (y > -1) && (y < H)) {
- arr2[j * W + i] = arr[y * W + x];
- }
- }
- }
- return arr2;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement