gpt4 book ai didi

iphone - 如何与 cocos2d iphone 进行像素完美碰撞

转载 作者:行者123 更新时间:2023-12-03 21:18:46 25 4
gpt4 key购买 nike

我正在使用 Cocos2D v0.99 在 iPhone 上制作太空入侵者克隆。我已经有了框架,但仍有很多东西我不知道。我被困的步骤归结为碰撞。我需要做两件事:

1) 我需要与使用 spritesheet 进行动画处理的 CCSprite 舰队进行像素完美碰撞。2)我需要与底座进行类似的像素完美碰撞,但我还需要删除底座的一些像素。

我找到了一些资源(http://groups.google.com/group/cocos2d-iphone-discuss/browse_thread/thread/f6e734e00d863f5e/41768952a1bcca0e?lnk=gst&q=image+mask)并尝试使用 CCMutableTexture2D,但是它在这个 cocos2d 版本上运行得不太好。

我目前的方法是尝试修复 CCMutableTexture2D,但我正在努力将 Sprite 纹理数据放入 MutableTexture 中。

这是执行此操作的最佳方法还是我缺少其他一些技术?

谢谢。

-----更新-----

我设法使用此处的颜色混合方法使其在模拟器中工作:http://www.cocos2d-iphone.org/forum/topic/18522

我还设法使用 CCRenderTexture 和混合函数通过 RenderMask 类(见下文)执行像素删除操作。

但是...设备上的冲突检测失败。我认为掩蔽效果还不错。我最好的猜测是我正在使用的东西不是 OpenGL ES(或者我没有正确设置某些东西。我的代码是:

rt = [CCRenderTexture renderTextureWithWidth:480  height:320];
[rt beginWithClear:0 g:0 b:0 a:0];

[rm visit];

// Read pixels
ccColor4B *buffer = malloc( sizeof(ccColor4B) * numPixels );

glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
[_rt end];

// loop through pixels
for(unsigned int i=0; i<numPixels; i++)
{
ccColor4B color = buffer[i];

if ((float)color.a >0) {
[self doSomeStuff];
}
}

那么,OpenGL ES 支持 glReadPixels() 吗?或者,有更好的方法吗?

//RenderMask.h

//
// RenderMask.h
//

#import <UIKit/UIKit.h>
#import <stdlib.h>
#import "cocos2d.h"

@interface RenderMask : CCRenderTexture {
@public
NSMutableArray *sprites;
NSMutableArray *spriteMasks;
int currentSprite;
float frameInterval; //How fast this animates
}

-(void) initArrays;
-(void) drawCurrent;
-(void) addSpriteMask: (CCSprite*)spriteMask;
-(void) addSprite: (CCSprite*)sprite;

@property(nonatomic, retain) NSMutableArray *sprites;
@property(nonatomic, retain) NSMutableArray *spriteMasks;
@property(readwrite, assign) int currentSprite;
@property(readwrite, assign) float frameInterval;

@end

//RenderMask.m

//
// RenderMask.m
//

#import "RenderMask.h"
#import "CCActionInterval.h"

@implementation RenderMask

@synthesize sprites, spriteMasks, currentSprite, frameInterval;

-(void) initArrays {
sprites = [[NSMutableArray alloc] init];
spriteMasks = [[NSMutableArray alloc] init];
currentSprite = 0;
frameInterval = 0.1f;
}

-(void) drawCurrent {
[self clear:0.0f g:0.0f b:0.0f a:0.0f];

[self begin];
//Limit drawing to the alpha channel

NSValue *spriteValue = [sprites objectAtIndex:0];
CCSprite *sprite = (CCSprite*)[spriteValue pointerValue];
[sprite setOpacityModifyRGB:NO];
[sprite visit];

glColorMask(1.0f, 1.0f, 1.0f, 1.0f);

NSLog(@"spriteMasks size: %u", [spriteMasks count]);

for(NSValue *value in spriteMasks){
CCSprite *spriteMask = (CCSprite*)[value pointerValue];
[sprite setOpacityModifyRGB:NO];
[spriteMask visit];
}

glColorMask(1.0f, 1.0f, 1.0f, 1.0f);
[self end];
}

-(void) addSpriteMask: (CCSprite*)spriteMask {
NSLog(@"Adding spriteMask!!!");
[spriteMask retain];
[spriteMasks addObject:[NSValue valueWithPointer:spriteMask] ];
}

-(void) addSprite: (CCSprite*)sprite {
NSLog(@"Adding sprite!!!");
[sprite retain];
[sprites addObject:[NSValue valueWithPointer:sprite] ];
}

-(void) runAnimation {
NSLog(@"running animation");
[self drawCurrent];
currentSprite = currentSprite + 1;
if(currentSprite >= [sprites count]){
currentSprite = 0;
}

CCActionInterval * runAction = [CCCallFunc actionWithTarget:self selector:@selector(runAnimation)];
CCActionInterval * delayAndRunAction = [CCSequence actions:[CCDelayTime actionWithDuration:frameInterval], runAction, nil];
[self runAction:delayAndRunAction];
}

@end

此外,这段代码存在非常严重的性能问题,但我可能可以解决这个问题。

谢谢。

----- 更新(再次)------

我现在有一个部分工作的流程,其中数据结构是基于基础初始化构建的,并用作碰撞查找。它在 50% 的时间内工作,但随后因 malloc EXC_BAD_ACCESS 错误而崩溃,直到我打开 Zombies 和 XCode 中的所有各种 malloc 调试选项。现在,我遇到了持续的崩溃

CGContextClearRect(imageContext, CGRectMake(0, 0, contextWidth, contextHeight));

我通过这样做来实现这一点(为了清楚起见,省略了几行):

CGImageRef image = [UIImage imageNamed:@"aspeaker.png"].CGImage;
imageContext = CGBitmapContextCreate(theData, width, height, 8, 4 * width, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big);
NSLog(@"imageContext: %@",imageContext);
CGContextClearRect(imageContext, CGRectMake(0, 0, width, height));
CGContextTranslateCTM(imageContext, 0, height - imageSize.height);
CGContextDrawImage(imageContext, CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)), image);
CGContextRelease(imageContext);

调试控制台显示:

2011-09-12 10:49:07.753 Invaders[1341:c803] imageContext: <CGContext 0x7f798fa0>
Invaders(1341,0xad06c2c0) malloc: protecting edges
Invaders(1341,0xad06c2c0) malloc: recording malloc stacks to disk using standard recorder
Invaders(1341,0xad06c2c0) malloc: enabling scribbling to detect mods to free blocks

我读过一些关于在正确线程上的内容,但看起来都在线程 1 上。

任何有关如何调试 malloc 错误的想法或良好资源的链接将非常感激。

谢谢

马丁

-----另一个更新-----

通过谷歌搜索得出的一件事是,正确连接 OpenGL 上下文存在一些复杂性(http://stackoverflow.com/questions/4459415/problem-with-opengles-to-show-an-image )我只是使用 cocos2d 0.99 基础,所以这可能是问题吗?如果是这样,我该如何解决 *&%@£$ 问题?

最佳答案

我建议让物理引擎处理碰撞,cocos2d与chipmunk和box2D集成得很好,这个引擎可以通过回调为你处理碰撞。

关于iphone - 如何与 cocos2d iphone 进行像素完美碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com