From 5e71aee5623bb6ddbafca227c2523cb2eabc3324 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Fri, 17 Jun 2022 15:18:38 -0500 Subject: [PATCH] Pixel perfect collision systems implemented Co-authored-by: r3cp3ct <45179536+r3cp3ct@users.noreply.github.com> Co-authored-by: sigonasr2 --- sprites/knife-swing.gif | Bin 434 -> 435 bytes src/sig/RabiClone.java | 79 ++++++++++++++++----- src/sig/engine/objects/AnimatedObject.java | 7 +- src/sig/objects/Erinoah.java | 8 ++- src/sig/objects/Player.java | 5 +- src/sig/objects/weapons/KnifeSwing.java | 9 ++- 6 files changed, 79 insertions(+), 29 deletions(-) diff --git a/sprites/knife-swing.gif b/sprites/knife-swing.gif index cc25404bba9efd58104bd89c21e5c0a55b1372ec..fbebff52f459ecb289d907fd02b42edf551894b0 100644 GIT binary patch delta 333 zcmdnQyqTHD-P6s&GI0Te0>e_yi99LwmYnXiLplsV0J4jL?S{jI0uLRj{u4`zPUcw6 zzp$djYi-o}8x!9P)c>7ZWBX=DrPKSWcb{rzpSynVe?e7KL``dCLw$2sXlt8)scT1P ze_rf_?!ewYpIOe6CeP`Onmc34tm&T1OXn|Gxhj0s)TO@5y*IYa-?n|lvhAA#Hm%#e zqS5Pc?SbP5_lKRDz3bfRL+8$H*yns=;YOF67uMg{bM?{VCr_U}4_Wi-^-)uWi-%t% zz4`q1&if@FlfS&a{Qc6;Pv5p0edAM@T^aH~GUmjFg@@Y(l)dJ7Y+Q7-Tf$h1hl#-& E0J=7jDgXcg delta 332 zcmdnYyos5|-P6s&JaGYo0>e^?i99Lw|7i(y7=Qp|7X#aMhY1B9I#T^7mK2@Lv6_Ej zMTytisP#7{z89!JJGaL6jYXx?`>J=J_Dnxlp8md}psG2%wx+(ZqNO{qtv$T6!L2lQ zN^V_FUw`PtNltxH3nCX~&YB%Ocha&MA*)-LWzXv9R9IabyluJv&S@EIqMPRL+3S1w zh|jV8J!?-M_c(jb{lcl!y?b~1Ex&Q}`nIe0A3S{Y_{meJl`mc%+80n_UEkAxHg0nKY_1_^oX;Yx6?0<4!o%$X%3gCkHZD5aEwP=2k--`O>}S^N diff --git a/src/sig/RabiClone.java b/src/sig/RabiClone.java index 155067d..e64d19e 100644 --- a/src/sig/RabiClone.java +++ b/src/sig/RabiClone.java @@ -41,6 +41,8 @@ public class RabiClone { public static JFrame f; public static List OBJ = new ArrayList(); + public static List FRIENDLY_OBJ = new ArrayList(); + public static List ENEMY_OBJ = new ArrayList(); public static boolean COLLISION[] = new boolean[(Tile.TILE_WIDTH*Map.MAP_WIDTH)*(Tile.TILE_HEIGHT*Map.MAP_HEIGHT)]; public static int BASE_WIDTH = 512; @@ -133,27 +135,15 @@ public class RabiClone { lastControllerScan = System.currentTimeMillis(); } - Arrays.fill(PLAYER_COLLISION,false); - Arrays.fill(ENEMY_COLLISION,false); + FRIENDLY_OBJ.clear(); + ENEMY_OBJ.clear(); for (int i = 0; i < OBJ.size(); i++) { if (OBJ.get(i) instanceof RenderedObject) { RenderedObject r = (RenderedObject)OBJ.get(i); if (r.isFriendlyObject()) { - if (OBJ.get(i) instanceof AnimatedObject) { - AnimatedObject a = ((AnimatedObject)OBJ.get(i)); - double xpos = a.getX()-level_renderer.getX()-a.getAnimatedSpr().getWidth()/2; - double ypos = a.getY()-level_renderer.getY()-a.getAnimatedSpr().getHeight()/2; - int xindex = (int)a.getCurrentFrame()%a.getAnimatedSpr().getFrame_count(); - int yindex = ((int)a.getCurrentFrame()%a.getAnimatedSpr().getFrame_count())/a.getAnimatedSpr().getFrame_count(); - for (int y=0;y=0&&indexx1&&y4>y1) //Rectangular collision detected, now check on a pixel level. + { + int sx1,sy1,w,h; + sx1 = (int)Math.max(x1,x3); + sy1 = (int)Math.max(y1,y3); + w = (int)Math.min(x2,x4)-sx1-1; + h = (int)Math.min(y2,y4)-sy1-1; + int offsetX_r1=(int)(x1>x3?0:x3-x1); + int offsetY_r1=(int)(y1>y3?0:y3-y1); + int offsetX_r2=(int)(x3>x1?0:x1-x3); + int offsetY_r2=(int)(y3>y1?0:y1-y3); + + byte[] arr1=e.getAnimatedSpr().getBi_array(); + int xFrame1 = (int)e.getCurrentFrame()%(e.getAnimatedSpr().getCanvasWidth()/e.getAnimatedSpr().getWidth()); + int yFrame1 = ((int)e.getCurrentFrame()/(e.getAnimatedSpr().getCanvasWidth()/e.getAnimatedSpr().getWidth()))%(e.getAnimatedSpr().getCanvasHeight()/e.getAnimatedSpr().getHeight()); + byte[] arr2=f.getAnimatedSpr().getBi_array(); + int xFrame2 = (int)f.getCurrentFrame()%(f.getAnimatedSpr().getCanvasWidth()/f.getAnimatedSpr().getWidth()); + int yFrame2 = ((int)f.getCurrentFrame()/(f.getAnimatedSpr().getCanvasWidth()/f.getAnimatedSpr().getWidth()))%(f.getAnimatedSpr().getCanvasHeight()/f.getAnimatedSpr().getHeight()); + + + if (w>0&&h>0) { + for (int yy1=offsetY_r1;yy1 i ? j - 1 : j)] = CONTROLLERS[i]; diff --git a/src/sig/engine/objects/AnimatedObject.java b/src/sig/engine/objects/AnimatedObject.java index 9906e3e..8d91fbe 100644 --- a/src/sig/engine/objects/AnimatedObject.java +++ b/src/sig/engine/objects/AnimatedObject.java @@ -2,8 +2,9 @@ package sig.engine.objects; import sig.engine.AnimatedSprite; import sig.engine.Panel; +import sig.objects.actor.RenderedObject; -public abstract class AnimatedObject extends Object{ +public abstract class AnimatedObject extends Object implements RenderedObject{ double currentFrame; double animationSpd; @@ -43,5 +44,9 @@ public abstract class AnimatedObject extends Object{ public void setAnimatedSpr(AnimatedSprite animatedSpr) { this.animatedSpr = animatedSpr; } + + public void collisionEvent(AnimatedObject obj) { + + } } diff --git a/src/sig/objects/Erinoah.java b/src/sig/objects/Erinoah.java index 67ad805..8d450c8 100644 --- a/src/sig/objects/Erinoah.java +++ b/src/sig/objects/Erinoah.java @@ -4,8 +4,10 @@ import sig.RabiClone; import sig.engine.Rectangle; import sig.engine.Sprite; import sig.engine.Transform; +import sig.engine.objects.AnimatedObject; import sig.objects.actor.PhysicsObject; import sig.objects.actor.RenderedObject; +import sig.objects.weapons.KnifeSwing; public class Erinoah extends PhysicsObject implements RenderedObject{ @@ -37,7 +39,7 @@ public class Erinoah extends PhysicsObject implements RenderedObject{ @Override public void update(double updateMult) { super.update(updateMult); - lastMoved+=updateMult; + /*lastMoved+=updateMult; lastJumped+=updateMult; if (lastMoved>5) { switch ((int)(Math.random()*3)) { @@ -62,7 +64,7 @@ public class Erinoah extends PhysicsObject implements RenderedObject{ lastJumped=0; } } - moveTimer-=updateMult; + moveTimer-=updateMult;*/ } @Override @@ -87,5 +89,5 @@ public class Erinoah extends PhysicsObject implements RenderedObject{ @Override public boolean isFriendlyObject() { return false; - } + } } diff --git a/src/sig/objects/Player.java b/src/sig/objects/Player.java index 9b930b1..2609969 100644 --- a/src/sig/objects/Player.java +++ b/src/sig/objects/Player.java @@ -6,16 +6,16 @@ import sig.engine.Panel; import sig.engine.Rectangle; import sig.engine.Sprite; import sig.engine.Transform; +import sig.engine.objects.AnimatedObject; import sig.map.Map; import sig.map.Tile; import sig.map.View; import sig.objects.actor.PhysicsObject; -import sig.objects.actor.RenderedObject; import sig.objects.actor.State; import sig.objects.weapons.KnifeSwing; import sig.utils.TimeUtils; -public class Player extends PhysicsObject implements RenderedObject{ +public class Player extends PhysicsObject{ final static boolean LEFT = false; final static boolean RIGHT = true; final static long jump_fall_AnimationWaitTime = TimeUtils.millisToNanos(200); @@ -372,4 +372,5 @@ public class Player extends PhysicsObject implements RenderedObject{ public boolean isFriendlyObject() { return true; } + } diff --git a/src/sig/objects/weapons/KnifeSwing.java b/src/sig/objects/weapons/KnifeSwing.java index 223ab49..8ec5052 100644 --- a/src/sig/objects/weapons/KnifeSwing.java +++ b/src/sig/objects/weapons/KnifeSwing.java @@ -4,10 +4,9 @@ import sig.engine.AnimatedSprite; import sig.engine.Panel; import sig.engine.Transform; import sig.objects.actor.AttachableObject; -import sig.objects.actor.RenderedObject; import sig.engine.objects.Object; -public class KnifeSwing extends AttachableObject implements RenderedObject{ +public class KnifeSwing extends AttachableObject{ final byte frameCount = 5; //Number of frames before animation ends. @@ -23,9 +22,9 @@ public class KnifeSwing extends AttachableObject implements RenderedObject{ return; } if (getSpriteTransform()==Transform.HORIZONTAL) { - setX(getAttachedObject().getX()-getAnimatedSpr().getWidth()/2); - } else { setX(getAttachedObject().getX()+getAnimatedSpr().getWidth()/2); + } else { + setX(getAttachedObject().getX()-getAnimatedSpr().getWidth()/2); } setY(getAttachedObject().getY()); } @@ -36,7 +35,7 @@ public class KnifeSwing extends AttachableObject implements RenderedObject{ @Override public Transform getSpriteTransform() { - return getAttached().getSpriteTransform()==Transform.HORIZONTAL||getAttached().getSpriteTransform()==Transform.HORIZ_VERTIC?Transform.NONE:Transform.HORIZONTAL; + return getAttached().getSpriteTransform(); } @Override