游戏角色创建:游戏引擎、图像角色与行为
立即解锁
发布时间: 2025-08-24 01:33:49 阅读量: 1 订阅数: 2 

### 游戏角色创建:游戏引擎、图像角色与行为
在游戏开发中,游戏角色的创建和管理是至关重要的环节。下面将详细介绍游戏控制器(GameController)和角色(Actor)类的相关内容,包括它们的功能、实现方式以及如何协同工作。
#### 1. 游戏控制器类(GameController)
游戏控制器类负责协调游戏中的角色,并将每个角色渲染到屏幕上。它还提供了添加和移除角色的机制。以下是 `GameController.h` 的代码:
```objc
#import <UIKit/UIKit.h>
#import <QuartzCore/CADisplayLink.h>
#import "Actor.h"
@interface GameController : UIViewController {
IBOutlet UIView* actorsView;
CADisplayLink* displayLink;
NSMutableSet* actors;
NSMutableDictionary* actorClassToActorSet;
NSMutableSet* actorsToBeAdded;
NSMutableSet* actorsToBeRemoved;
BOOL workComplete;
}
@property (nonatomic) long stepNumber;
@property (nonatomic) CGSize gameAreaSize;
@property (nonatomic) BOOL isSetup;
@property (nonatomic, retain) NSMutableArray* sortedActorClasses;
-(BOOL)doSetup;
-(void)displayLinkCalled;
-(void)updateScene;
-(void)removeActor:(Actor*)actor;
-(void)addActor:(Actor*)actor;
-(void)updateViewForActor:(Actor*)actor;
-(void)doAddActors;
-(void)doRemoveActors;
-(NSMutableSet*)actorsOfType:(Class)class;
@end
```
- **成员变量说明**:
- `actorsView`:包含游戏中每个角色视图的 `UIView`。
- `displayLink`:用于定期调用更新场景的任务。
- `actors`:存储游戏中所有角色的集合。
- `actorClassToActorSet`:用于跟踪特定类型的角色。
- `actorsToBeAdded` 和 `actorsToBeRemoved`:分别用于跟踪在游戏单步中创建的角色和当前步骤后应移除的角色。
- `workComplete`:用于调试,后续会详细解释。
- **属性说明**:
- `stepNumber`:记录游戏开始后经过的步数。
- `gameAreaSize`:游戏区域的大小。
- `isSetup`:记录 `GameController` 是否已设置。
- `sortedActorClasses`:告诉 `GameController` 应跟踪哪些类型的角色。
#### 2. 设置游戏控制器
`doSetup` 任务用于设置 `GameController`,以下是其代码:
```objc
-(BOOL)doSetup
{
if (!isSetup){
gameAreaSize = CGSizeMake(1024, 768);
actors = [NSMutableSet new];
actorsToBeAdded = [NSMutableSet new];
actorsToBeRemoved = [NSMutableSet new];
stepNumber = 0;
workComplete = true;
displayLink = [CADisplayLink displayLinkWithTarget:self
selector:@selector(displayLinkCalled)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[displayLink setFrameInterval:1];
isSetup = YES;
return YES;
}
return NO;
}
```
设置步骤如下:
1. 检查 `isSetup` 变量,如果未设置,则进行设置。
2. 设置 `gameAreaSize` 为默认大小。
3. 初始化 `actors`、`actorsToBeAdded` 和 `actorsToBeRemoved` 集合。
4. 将 `stepNumber` 设置为 0。
5. 设置 `workComplete` 为 `true`。
6. 创建 `CADisplayLink` 并设置其调用 `displayLinkCalled` 方法。
7. 将 `displayLink` 添加到运行循环中,并设置帧间隔为 1。
8. 将 `isSetup` 设置为 `YES`。
#### 3. 调用 `displayLinkCalled` 和 `updateScene`
`CADisplayLink` 调用 `displayLinkCalled` 方法,该方法再调用 `updateScene` 方法,代码如下:
```objc
-(void)displayLinkCalled{
if (workComplete){
workComplete = false;
@try {
[self updateScene];
workComplete = true;
}
@catch (NSException *exception) {
NSLog(@"%@", [exception reason]);
NSLog(@"%@", [exception userInfo]);//break point here
}
}
}
```
`displayLinkCalled` 方法只有在 `workComplete` 为 `true` 时才会调用 `updateScene` 方法。如果 `updateScene` 抛出异常,会记录异常信息,并且 `workComplete` 不会重置为 `true`,这会导致游戏停止。在生产环境中,可以根据需求修改此行为。
#### 4. 更新 `updateScene`
`updateScene` 方法用于更新游戏场景,代码如下:
```objc
-(void)updateScene{
for (Actor* actor in actors){
[actor step:self];
}
for (Actor* actor in actors){
for (NSObject<Behavior>* behavoir in [actor behaviors]){
[behavoir applyToActor:actor In:self];
}
}
for (Actor* actor in actors){
[self updateViewForActor:actor];
}
[self doAddActors];
[self doRemoveActors];
stepNumber++;
}
```
该方法的执行步骤如下:
1. 遍历所有角色,调用每个角色的 `step` 方法,让角色应用自定义代码。
2. 再次遍历所有角色,应用每个角色关联的行为。
3. 第三次遍历所有角色,调用 `updateViewForActor` 方法更新角色的 `UIView`。
4. 调用 `doAddActors` 和 `doRemoveActors` 方法添加和移除角色。
5. 增加 `stepNumber`。
#### 5. 调用 `doAddActors` 和 `doRemoveActors`
`doAddActors` 和 `doRemoveActors` 方法分别用于添加和移除角色,代码如下:
```objc
-(void)doAddActors{
for (Actor* actor in actorsToBeAdded){
[actors addObject:actor];
UIView* view = [[actor representation] getViewForActor:actor In:self];
[view setFrame:CGRectMake(0, 0, 0, 0)];
[actorsView addSubview:view];
NSMutableSet* sorted = [actorClassToActorSet valueForKey:[[actor class]
description]];
[sorted addObject:actor];
}
[actorsToBeAdded removeAllObjects];
}
-(void)doRemoveActors{
for (Actor* actor in actorsToBeRemoved){
UIView* view = [[actor representation] getViewForActor:actor In:self];
[view removeFromSuperview];
NSMutableSet* sorted = [actorClassToActorSet va
```
0
0
复制全文
相关推荐










