利用blocks实现delegate方法

两个对象在通信时,利用block,其中一个类声明一个block,另一个类包含前一个类的对象,通过设置block函数,把回调函数的实现传递给第一个类

dog.h

#import <Foundation/Foundation.h>

@interface dog : NSObject
{
  @public
    int _ID;
    NSTimer  *timer;
    int barkCount;
    void (^BarkCallBack)(dog *thisDog,int count);
}
@property(assign,nonatomic) int ID;

-(void)setBark:(void (^)(dog *thisDog,int count))eachBark;
@end



dog.m:

#import "dog.h"

@implementation dog

-(id)init
{
    self=[super init];
    if(self)
    {
        NSLog(@"dog init start");
        barkCount=0;
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(bark:) userInfo:nil repeats:YES];
        //timer=[NSTimer timerWithTimeInterval:1 target:self selector:@selector(bark:) userInfo:nil repeats:YES];
    }
    return self;
}
-(void)bark:(NSTimer *)timer
{
    barkCount++;
    NSLog(@"dog %d bark count %d",self.ID,barkCount);
    
    if (BarkCallBack) {
        BarkCallBack(self,barkCount);
    }
}

-(void)setBark:(void (^)(dog *thisDog,int count))eachBark
{
    [eachBark release];
    BarkCallBack=[eachBark copy];
}
-(void)dealloc
{
    [super dealloc];
}

person.h

#import <Foundation/Foundation.h>
#import "dog.h"
@interface person : NSObject
@property(nonatomic,retain)dog *dobObj;

@end

person.m:

#import "person.h"

@implementation person

-(void)setDobObj:(dog *)dobObj
{
  if(_dobObj!=dobObj)
  {
      [_dobObj release];
      _dobObj=[dobObj retain];
      [_dobObj setBark:^(dog *thisDog, int count) {
          NSLog(@"person dog %d count %d",thisDog.ID,count);
      }];
  }
}
@end

main函数:

#import <Foundation/Foundation.h>
#import "person.h"
#import "dog.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        person *andy=[[person alloc] init];
        dog  *heibei=[[dog alloc] init];
        heibei.ID=10;
        
        andy.dobObj=heibei;
        
        while (1) {
            [[NSRunLoop currentRunLoop] run];
        }
        [heibei release];
        NSLog(@"Hello, World!");
        
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
俄罗斯方块是一款非常经典的游戏,下面介绍如何利用JavaFx实现俄罗斯方块游戏。 1. 创建一个JavaFx项目,然后创建一个类来表示方块,包括颜色和坐标等属性。 ```java public class Block { private int x; private int y; private Color color; public Block(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; } public int getX() { return x; } public int getY() { return y; } public Color getColor() { return color; } // 其他方法,例如移动等 } ``` 2. 创建一个类来表示方块组,包括方块组中的所有方块。 ```java public class BlockGroup { private List<Block> blocks; public BlockGroup(List<Block> blocks) { this.blocks = blocks; } public List<Block> getBlocks() { return blocks; } // 其他方法,例如移动等 } ``` 3. 创建一个类来表示游戏区域,包括游戏区域中的所有方块组。 ```java public class GameArea { private int width; private int height; private List<BlockGroup> blockGroups; public GameArea(int width, int height) { this.width = width; this.height = height; this.blockGroups = new ArrayList<>(); } public void addBlockGroup(BlockGroup blockGroup) { blockGroups.add(blockGroup); } // 其他方法,例如消除行等 } ``` 4. 创建一个类来表示游戏界面,包括游戏界面中的所有组件。 ```java public class GamePanel extends Pane { private GameArea gameArea; private BlockGroup currentBlockGroup; public GamePanel(GameArea gameArea) { this.gameArea = gameArea; setPrefSize(gameArea.getWidth(), gameArea.getHeight()); } public void setCurrentBlockGroup(BlockGroup currentBlockGroup) { this.currentBlockGroup = currentBlockGroup; } // 其他方法,例如绘制等 } ``` 5. 创建一个类来表示游戏控制器,包括游戏的主要逻辑。 ```java public class GameController { private GameArea gameArea; private GamePanel gamePanel; private BlockGroup currentBlockGroup; public GameController(GameArea gameArea, GamePanel gamePanel) { this.gameArea = gameArea; this.gamePanel = gamePanel; this.currentBlockGroup = generateRandomBlockGroup(); gamePanel.setCurrentBlockGroup(currentBlockGroup); gameArea.addBlockGroup(currentBlockGroup); gamePanel.draw(); } private BlockGroup generateRandomBlockGroup() { // 生成随机的方块组 } public void moveCurrentBlockGroupDown() { // 将当前方块组向下移动一格 } public void moveCurrentBlockGroupLeft() { // 将当前方块组向左移动一格 } public void moveCurrentBlockGroupRight() { // 将当前方块组向右移动一格 } public void rotateCurrentBlockGroup() { // 将当前方块组旋转一定角度 } public void start() { // 开始游戏,不断地将当前方块组向下移动,并检测是否能够消除行 } } ``` 6. 在主类中创建游戏区域、游戏界面和游戏控制器,并启动游戏。 ```java public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { GameArea gameArea = new GameArea(300, 600); GamePanel gamePanel = new GamePanel(gameArea); GameController gameController = new GameController(gameArea, gamePanel); Scene scene = new Scene(gamePanel, gameArea.getWidth(), gameArea.getHeight()); primaryStage.setScene(scene); primaryStage.show(); gameController.start(); } public static void main(String[] args) { launch(args); } } ``` 以上就是利用JavaFx实现俄罗斯方块游戏的基本步骤,具体实现细节可能会有所不同,可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值