Magic_Game/samples/Samples/Demo4.h

198 lines
3.8 KiB
C
Raw Normal View History

2019-03-18 15:00:58 +08:00
// Copyright (C) 2019 Nomango
#pragma once
#include "common.h"
// <20>ϻ<EFBFBD>
2019-04-11 14:40:54 +08:00
KGE_DECLARE_SMART_PTR(Tiger);
2019-03-18 15:00:58 +08:00
class Tiger
: public Sprite
{
FramesPtr run_frames; // <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>֡
FramesPtr stand_frames; // վ<><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡
bool facing_left; // <20><EFBFBD><E6B3AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B3AF>
bool running; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>
Direction running_direction; // <20>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
public:
Tiger()
{
// <20><>ȡͼƬԭʼ<D4AD><CABC>С
ImagePtr image = new Image(L"res/tiger.png");
Size source_size = image->GetSize();
// <20><><EFBFBD><EFBFBD>ÿ֡ͼƬ<CDBC><C6AC>С
Size frame_size = { source_size.x / 5, source_size.y / 3 };
// <20><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
run_frames = new Frames;
for (int i = 0; i < 6; ++i)
{
Point pos = { (i % 5) * frame_size.x, (i / 5) * frame_size.y };
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
run_frames->Add(frame);
}
stand_frames = new Frames;
for (int i = 0; i < 6; ++i)
{
Point pos = { ((i + 1) % 5) * frame_size.x, ((i + 1) / 5 + 1) * frame_size.y };
ImagePtr frame = new Image(L"res/tiger.png", Rect{ pos, frame_size });
stand_frames->Add(frame);
}
// ִ<>ж<EFBFBD><D0B6><EFBFBD>
AddAction(
Tween::Animation(stand_frames)
.SetDuration(1000)
.SetLoops(-1)
2019-03-18 15:00:58 +08:00
);
// <20><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddListener(Event::KeyDown, MakeClosure(this, &Tiger::OnKeyDown));
AddListener(Event::KeyUp, MakeClosure(this, &Tiger::OnKeyUp));
2019-03-18 15:00:58 +08:00
// Ĭ<>Ϸ<EFBFBD><CFB7><EFBFBD>Ϊ Left
facing_left = true;
running = false;
// <20><><EFBFBD><EFBFBD>ê<EFBFBD><C3AA>
SetAnchor(0.5f, 0.5f);
}
void OnKeyDown(Event const& e)
{
if (e.key.code == KeyCode::Left)
Run(Direction::Left);
else if (e.key.code == KeyCode::Right)
Run(Direction::Right);
else if (e.key.code == KeyCode::Up)
Run(Direction::Up);
else if (e.key.code == KeyCode::Down)
Run(Direction::Down);
}
void OnKeyUp(Event const& e)
{
switch (e.key.code)
{
case KeyCode::Left:
case KeyCode::Right:
case KeyCode::Up:
case KeyCode::Down:
StopRun();
break;
}
}
void Run(Direction d)
{
if (!running)
{
running = true;
StopAllActions();
// ִ<><D6B4><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>
AddAction(
Tween::Animation(run_frames)
.SetDuration(500)
.SetLoops(-1)
2019-03-18 15:00:58 +08:00
);
}
running_direction = d;
if (running_direction == Direction::Left)
{
facing_left = true;
}
else if (running_direction == Direction::Right)
{
facing_left = false;
}
// <20><><EFBFBD>ſ<EFBFBD><C5BF>Ե<EFBFBD><D4B5><EFBFBD>ͼƬ<CDBC><C6AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1 ͼƬ<CDBC>ᷴת
SetScaleX(facing_left ? 1.0f : -1.0f);
}
void StopRun()
{
if (running)
{
running = false;
StopAllActions();
// ִ<><D6B4>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
AddAction(
Tween::Animation(stand_frames)
.SetDuration(1000)
.SetLoops(-1)
2019-03-18 15:00:58 +08:00
);
}
}
void OnUpdate(Duration dt)
{
if (running)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
// OnUpdate <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ȶ<EFBFBD><C8B6><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ȶ<EFBFBD>
// ÿ<><C3BF><EFBFBD>ƶ<EFBFBD> 150 <20><><EFBFBD><EFBFBD>, Ӧ<><D3A6><EFBFBD><EFBFBD> dt <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
const float moving_per_sec = 150;
const float distance = moving_per_sec * dt.Seconds();
switch (running_direction)
{
case Direction::Up:
Move(0, -distance);
break;
case Direction::Down:
Move(0, distance);
break;
case Direction::Left:
Move(-distance, 0);
break;
case Direction::Right:
Move(distance, 0);
break;
}
}
}
};
class Demo4
: public Scene
{
public:
static ScenePtr Create(ResLoader* loader)
2019-03-18 15:00:58 +08:00
{
return new Demo4;
}
Demo4()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SpritePtr bg = new Sprite(L"res/spring_forest.jpg");
bg->SetSize(GetSize());
2019-03-18 15:00:58 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD>
TigerPtr tiger = new Tiger;
// <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>Ͼ<EFBFBD><CFBE><EFBFBD><EFBFBD><EFBFBD>ʾ
tiger->SetAnchor(0.5f, 0.5f);
tiger->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
// <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TextPtr text = new Text(L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD><EFBFBD>ƶ<EFBFBD>");
// <20><><EFBFBD>ýڵ<C3BD><DAB5><EFBFBD>СΪ<D0A1><CEAA><EFBFBD>ֲ<EFBFBD><D6B2>ִ<EFBFBD>С
text->SetSize(text->GetLayoutSize());
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
text->SetAnchor(0.5f, 0.5f);
text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT - 80);
text->SetAlignment(TextAlign::Center);
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
this->AddChild(bg);
2019-03-18 15:00:58 +08:00
this->AddChild(tiger);
this->AddChild(text);
}
};