cocos2d-地图滚动

本文介绍了在cocos2d中如何实现地图滚动功能,主要利用cocos.layer.scrolling模块的ScrollingManager,通过set_focus()设置焦点位置,并要求ScrollableLayer定义.px_width和.px_height属性以调整显示画面。查看提供的简化版代码示例了解具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地图滚动可以使用如下模块实现

Module cocos.layer.scrolling

通过ScrollingManager的set_focus()来设定焦点的位置。

需要给ScrollableLayer定义.px_width和.px_height两个属性

这样Manager就用这两个值来显示画面。

详细情况参照下面代码中注释

代码示例(自带代码的简化版test_scrolling_manager_without_tiles.py)

#-*- encoding:utf-8 -*-
import cocos
from pyglet.window import key
import cocos.euclid as eu

class SquareLand(cocos.layer.ScrollableLayer):
    is_event_handler = True
    def __init__(self):
        super(SquareLand, self).__init__()

        #定义世界地图的宽和高
        self.px_width = 1000 + 4*98 #1392
        self.px_height = 1000

        #为了缩短后面代码的长度
        px_width = self.px_width
        px_height = self.px_height

        #下面的代码中定义了两个图层,一个大的一个稍微小的
        #这两个背景重叠起来就形成了一个带有边框的地图效果
        bg = cocos.layer.ColorLayer(170,170,0,255,width=px_width,
                                    height=px_height)
        self.add(bg, z=0)
        
        margin = int(px_width*0.01)
        #print 'margin',margin
        self.margin = margin
        bg = cocos.layer.ColorLayer(0,170,170,255,width=px_width-2*margin,
                                    height=px_height-2*margin)
        bg.position = (margin,margin)
        self.add(bg, z=1)
            
        #定义用户精灵
        self.player = cocos.sprite.Sprite("grossinis_sister1.png")
        self.player.position = (self.player.width/2,self.player.height/2)
        self.player.fastness = 200
        
        self.add(self.player, z=4)

        #这里定义一个字典,来表示按钮是否别按下
        self.buttons = { #button state : current value, 0 not pressed, 1 pressed
            key.LEFT:0,
            key.RIGHT:0,
            key.UP:0,
            key.DOWN:0
            }

        #每一帧都会更新player的状态,具体参照step函数
        self.schedule(self.step)

    def on_enter(self):
        #获取scroller的指针,用来设置set_focus,注意要调用父类的on_enter
        super(SquareLand,self).on_enter()
        self.scroller = self.get_ancestor(cocos.layer.ScrollingManager)
        
    def on_key_press(self,k,modifiers):
        #请注意这里的小技巧
        if k in self.buttons:
            self.buttons[k] = 1
            
    def on_key_release(self, k, modifiers):
        if k in self.buttons:
            self.buttons[k] = 0
            
    #用来判断是否到达地图的边缘,如果到达边缘则不会继续移动
    def clamp(self, actor, new_pos):
        x,y = new_pos
        if  x-actor.width/2<self.margin:
            x = self.margin + actor.width/2
        elif x+actor.width/2>self.px_width-self.margin:
            x = self.px_width-self.margin-actor.width/2
        if  y-actor.height/2<self.margin:
            y = self.margin + actor.height/2
        elif y+actor.height/2>self.px_height-self.margin:
            y = self.px_height-self.margin-actor.height/2
        return x,y
    
    def step( self, dt ):
        btns = self.buttons
        #请注意这里用来移动的小技巧
        move_dir = eu.Vector2(btns[key.RIGHT]-btns[key.LEFT],
                              btns[key.UP]-btns[key.DOWN])
        changed = False
        if move_dir:
            new_pos = self.player.position + self.player.fastness*dt*move_dir.normalize()
            new_pos = self.clamp(self.player, new_pos)

            self.player.position = new_pos
            changed = True

        if changed:
            self.update_after_change()

    def update_after_change(self):
        self.scroller.set_focus(*self.player.position) 

if __name__ == '__main__':
    cocos.director.director.init(1024,768)#view_rectangle
    scene = cocos.scene.Scene()
    world_layer = SquareLand()
    scroller = cocos.layer.ScrollingManager()
    scroller.add(world_layer)
    scene.add(scroller)
    cocos.director.director.run(scene)


《本节完》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值