106 lines
4.4 KiB
Objective-C
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
|