Files
2022-04-11 17:17:23 +03:00

106 lines
4.4 KiB
Objective-C

#import "Entity.h"
@implementation Entity
@synthesize isBlockedFromLeft, isBlockedFromRight, isBlockedFromUp, isBlockedFromDown;
@synthesize blockedFromLeftBy, blockedFromRightBy, blockedFromUpBy, blockedFromDownBy;
-(void)resetCollisions {
self.isBlockedFromLeft = self.isBlockedFromRight = self.isBlockedFromUp = self.isBlockedFromDown = false;
self.blockedFromLeftBy = self.blockedFromRightBy = self.blockedFromUpBy = self.blockedFromDownBy = nil;
}
-(void)checkCollisionWith:(Entity *)secondEntity {
if ((lround(self.position.x - secondEntity.size.width-1) < lround(secondEntity.position.x))&&
(lround(self.position.x - secondEntity.size.width+1) > lround(secondEntity.position.x))) {
if ((lround(self.position.y + secondEntity.size.height) > lround(secondEntity.position.y))&&
((lround(self.position.y - secondEntity.size.height) < lround(secondEntity.position.y)))) {
self.isBlockedFromLeft = true;
blockedFromLeftBy = secondEntity;
}
}
if ((lround(self.position.x + self.size.width-1) < lround(secondEntity.position.x))&&
(lround(self.position.x + self.size.width+1) > lround(secondEntity.position.x))) {
if ((lround(self.position.y + secondEntity.size.height) > lround(secondEntity.position.y))&&
((lround(self.position.y - secondEntity.size.height) < lround(secondEntity.position.y))))
{
self.isBlockedFromRight = true;
blockedFromRightBy = secondEntity;
}
}
if ((lround(self.position.x - self.size.width) < lround(secondEntity.position.x))&&
(lround(self.position.x + self.size.width) > (secondEntity.position.x))) {
if ((lround(self.position.y + self.size.height*0.75) < lround(secondEntity.position.y))&&
(lround(self.position.y + self.size.height+1) > lround(secondEntity.position.y))) {
self.isBlockedFromUp = true;
blockedFromUpBy = secondEntity;
}
}
if ((lround(self.position.x - self.size.width+1) < lround(secondEntity.position.x))&&
(lround(self.position.x + self.size.width-1) > (secondEntity.position.x))) {
if ((lround(self.position.y - secondEntity.size.height-1) <= lround(secondEntity.position.y))&&
(lround(self.position.y - secondEntity.size.height+1) >= lround(secondEntity.position.y))) {
self.isBlockedFromDown = true;
blockedFromDownBy = secondEntity;
}
}
}
-(void)checkCollisionWithRoomWithWidth:(CGFloat)roomWidth {
if (lround(self.position.x) == 0) {
self.isBlockedFromLeft = true;
}
if (lround(self.position.x) == lround(roomWidth - TILE_SIZE)) {
self.isBlockedFromRight = true;
}
if (lround(self.position.y) == 0) {
self.isBlockedFromDown = true;
}
}
-(void)moveLeft {
if (![self actionForKey:@"move"]) {
SKAction *moveLeft = [SKAction moveByX:-TILE_SIZE y:0 duration: (self.isBlockedFromLeft) ? 0.7 : 0.4];
if ((!self.isBlockedFromLeft)||
(!(self.blockedFromRightBy.isBlockedFromLeft)&&(!self.blockedFromRightBy.isBlockedFromUp))) {
[self runAction:moveLeft withKey:@"move"];
[self.blockedFromLeftBy runAction:moveLeft];
}
}
}
-(void)moveRight {
if (![self actionForKey:@"move"]) {
SKAction *moveRight = [SKAction moveByX:+TILE_SIZE y:0 duration: (self.isBlockedFromRight) ? 0.7 : 0.4];
if ((!self.isBlockedFromRight)||
(!(self.blockedFromRightBy.isBlockedFromRight)&&(!self.blockedFromRightBy.isBlockedFromUp))) {
[self runAction:moveRight withKey:@"move"];
[self.blockedFromRightBy runAction:moveRight];
}
}
}
-(void)fall {
if (!self.isBlockedFromDown) {
SKAction *fall = [SKAction moveByX:0 y:-TILE_SIZE*0.5 duration:0.1];
SKAction *idle = [SKAction moveByX:0 y:0 duration:0.4];
if ((![self actionForKey:@"fall"])&&(![self actionForKey:@"jump"])) {
[self runAction:fall withKey:@"fall"];
[self runAction:idle withKey:@"afterFallIdle"];
}
}
}
-(void)jump {
if (self.isBlockedFromDown) {
SKAction *jump = [SKAction moveByX:0 y:+TILE_SIZE*1.5 duration:0.15];
SKAction *pauseAfterJump = [SKAction moveByX:0 y:0 duration:0.2];
if (![self actionForKey:@"jump"]) {
[self runAction:jump];
[self runAction:pauseAfterJump withKey:@"jump"];
}
}
}
@end